OmniAICreator/Qiita-1.07M huggingface dataset:
【AtCoder 】PythonでABC257のAからC問題までを解いた

[AtCoder Beginner Contest 257](https://atcoder.jp/contests/abc257)に参加したので自分用のメモを残す。

- 利用言語 : Python

## A 問題
愚直に2重ループ
```python:Python
N, X = map(int, input().split())

alb = [chr(ord("A")+i) for i in range(26)]

cnt = 0
for a in alb:
    for _itr in range(N):
        ans = a
        cnt += 1
        if cnt == X:
            print(ans)
            exit()
```

## B 問題
はじめ問題の条件把握を誤解していた。 1時間くらい無駄にした。
```python:Python
import numpy as np

N, K, Q = map(int, input().split())
A = list(map(int, input().split()))
L = list(map(int, input().split()))

mass = np.zeros(N, dtype=int)
for i in range(len(A)):
    mass[A[i]-1] = i + 1

for i in range(len(L)):
        
    for j in range(len(mass)):
        if mass[j] == L[i]:
            if j != N - 1:
                if mass[j+1] == 0:
                    mass[j+1] = mass[j]
                    mass[j] = 0
            break

ans = []

for i in range(len(mass)):
    if mass[i] > 0:
        ans.append(i+1)

print(*ans)
```

## C 問題
愚直に子供大人を比較すると計算量としては $O(n^2)$ となりTLE起こす。
事前に体重でソートしておいて最大値を大人の人数に設定した後、体重が小さい方から子供に変換していき最大値となる箇所を探索する。そうすると計算量は$O(N\log{N})$まで減らせる。
```python:python
N=int(input())
S=input()
W=list(map(int,input().split()))
# 文字列は各文字が要素となるように分解される
l=zip(W,S)
# 各タプル先頭の要素でソート
l=sorted(l)
# W, S はタプル
W,S=zip(*l)

sum1 = 0
max1 = 0
# 大人の数
co = S.count('1')
# 子供の数
co1= len(S) - co
sum1 = co
# 左の人 (体重では無い！) から見ていく
for i in range(N):
    # 大人であれば
    if S[i]=="1":
        sum1-=1
    # 子であれば
    else:
        sum1+=1
    # 見ている人が末尾でないとき
    if i<N-1:
        # (ここ重要!) 連続して同じ体重でないとき
        if W[i]!=W[i+1]:
            max1=max(sum1,max1)
# 末尾の人とそれ以外までとの比較
max1=max(co1, co, max1)
print(max1)
```
pandasのDataFrameで列ごと、行ごとに処理をする方法

# やりたいこと・やり方
pandasのDataFrameにおいて、列の要素や行ごとにfor文を回すように処理したいことがあると思います。
そんな時はapply()を使えば良いと分かりました。

# 想定する場面
5人の学生が数学と英語のテストを受け、その合計点で合否判定を出す。

# ソースコード
```python:main.py
import pandas as pd

def absent_result(x):
    """未受験の場合は30点とする"""

    if x == "未受験":
        return 30
    else:
        return x

def calculate_total_score(row):
    """数学と英語の合計点を出す"""

    return row['数学'] + row['英語']

def judge_pass_or_failure(x):
    """数学と英語の合計点が100点以上を合格、100点未満を不合格とする"""

    if x >= 100:
        return '合格'
    else:
        return '不合格'

if __name__ == "__main__":
    # データ準備
    name = ['田中', '伊藤', '鈴木', '加藤', '島田']
    math_score = [70, 38, 25, 40, '未受験']
    english_score = [90, 56, 44, 24, 89]

    df = pd.DataFrame({
        '名前': name,
        '数学': math_score,
        '英語': english_score
    })

    # 元データの出力
    print("### 元データ ###")
    print(df)
    print("")

    # 未受験者の処理
    df['数学'] = df['数学'].apply(absent_result)
    # 数学と英語の合計点の算出
    df['合計点'] = df.apply(calculate_total_score, axis=1)
    # 成績順に並び替え
    df = df.sort_values('合計点', ascending=False)
    # 合否判定
    df['判定'] = df['合計点'].apply(judge_pass_or_failure)

    print("### 最終結果 ###")
    print(df)
```

# 出力結果
```
### 元データ ###
   名前   数学  英語
0  田中   70  90
1  伊藤   38  56
2  鈴木   25  44
3  加藤   40  24
4  島田  未受験  89

### 最終結果 ###
   名前  数学  英語  合計点   判定
0  田中  70  90  160   合格
4  島田  30  89  119   合格
1  伊藤  38  56   94  不合格
2  鈴木  25  44   69  不合格
3  加藤  40  24   64  不合格
```

# おわりに
4本目の記事になりました。最後までご覧いただきありがとうございました！
感想やアドバイス、何でもコメントお待ちしています。
[ruby] [paiza] 配列を扱う上での個人的な小ステップアップ

### はじめに
最近paizaをはじめました
完全なる初心者ですがアウトプットを兼ねて投稿しています

### 文字と整数の組のソート (paizaランク C 相当)の問題にて
**問題**
nに整数が入力され、その後n回分「文字」と「整数」の組が空白区切りで入力される
「整数」で昇順に並び替える

```ruby
n = gets.to_i
w = {}

n.times do
  line = gets.split(' ') 
  # ここが自分は使ってこなかった記述でした
  w[line[1].to_i] = line[0]
end

w = w.sort

w.each { |ele| puts ele[1] }
```
いつもはこうしていました
```ruby
n.times do |i|
  w[i] = gets.split(' ')
  #　中身=> {0=>["A", "1"], 1=>["B", "2"]}
end
```
これだといらない数字も配列に入っちゃうため扱いにくかったのですが、
上の例の中身は`{1=>"A", 2=>"B"}`になるので欲しかった情報だけ抜き出せるのですね

### 最後に
今回みたいに「数字」と「文字列」のようなパターンでは活躍してくれそうです

アルゴリズム難しいですがだんだん記述パターンを覚えてきて理解できるようになってきました！
閲覧いただきありがとうございました！
【Rails】部分テンプレートに気をつけたい話

こんにちは。

この前部分テンプレート関連でちょっと想定外のエラーに出くわしたので、記事にしてみました。


実行環境は以下の通りです
* Ruby3.1.0
* Rails7.0.2.2



# どんな問題？
別リソースのコントローラからviewファイルをrenderするとき、renderするviewファイルの中で部分テンプレートを呼び出している時に発生する問題です。

簡単にいうと部分テンプレートの呼び出し方には少し注意しましょうということですが、文字の説明だけだととても分かりにくいのでイメージとコードで説明していきます

# 具体的なコードとエラー内容

例えば店舗の詳細ページで、ステータス変更の処理があったとします。
さらに、詳細ページには他の店舗一覧の表示をしているとします（部分テンプレートで実装）
↓以下イメージ
![7c1bc31c2571ec548451c3a1a2af3343.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/3884fd9f-c525-0f53-5a70-034e7782da2a.gif)

詳細ページのコードは以下のようになってます

↓コントローラ
```ruby:shops_controller.rb
class ShopsController < ApplicationController
  # 他のアクションは略

  def show
    @shop = Shop.find(params[:id])
    @related_shops = Shop.order(created_at: :desc).limit(3).where.not(id: @shop)
  end
end
```

↓showのviewファイル
```slim:views/shops/show.html.slim
p style="color: green" = notice

== render @shop

= button_to 'openにする', shop_shop_status_path(@shop), method: :patch, class: 'btn btn-primary btn-sm'

div.mt-2
  = link_to "Edit this shop", edit_shop_path(@shop)
  ' |
  = link_to "Back to shops", shops_path

  = button_to "削除する", @shop, method: :delete, class: 'btn btn-danger btn-sm mt-2'

div.mt-3 style="background-color: #eee;"
  p 部分テンプレートエリア
  / ここに注目
  = render partial: 'shop', collection: @related_shops
```

↓shopの部分テンプレート
```slim:views/shops/_shop.html.slim
div id="#{dom_id shop}"
  p
    strong 店舗名:
    = shop.name
```


そしてステータス変更のコントローラは以下のようにしていたとします


```ruby:shop_statuses_controller.rb
class ShopStatusesController < ApplicationController
  def update
    @shop = Shop.find(params[:shop_id])
    if @shop.update(status: 'open')
      redirect_to @shop, notice: 'Openに変更しました'
    else
      @related_shops = Shop.order(created_at: :desc).limit(3).where.not(id: @shop)
      render 'shops/show', status: :unprocessable_entity
    end
  end
end
```
:::note warn
「ステータス変更だけならrender処理する必要ないじゃん」という意見が聞こえてきそうですが、いったんスルーしてください。例えば日付入力などが必要だとして入力値を保持させたいケースなどを想定していて、説明用にシンプルな構造にするためにこのようにしています（~~単に面倒だったということもありますが~~）
:::


このコードで普通にステータス変更に成功する場合は、問題なく動作します

試しに失敗のケースの動作チェックをしてみましょう（以下のようにして強制的に失敗処理を実行）

```diff_ruby
- if @shop.update(status: 'open')
+ if @shop.update(status: 'open') && false
```

これで更新処理しようとするとエラーになります
![スクリーンショット 2022-06-26 11.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/27c3fe6a-45e3-8b13-05cd-02c10fc7d938.png)



`Missing partial shop_statuses/_shop`と言われているので、どうやら更新処理をするコントローラ名と同じ`shop_statuses`ディレクトリ内でテンプレートファイルを探しているようです。


個人的には`shops/show.html.slim`のviewファイル内で呼び出している部分テンプレートなんだから、viewファイルの呼び出し元がどこであれ部分テンプレートは`shops/_shop.html.slim`を読み込むはずと思っていましたがそうではないみたいですね


# 解決策
ちゃんとパスを指定すれば直ります

```diff_slim
- = render partial: 'shop', collection: @related_shops
+ = render partial: 'shops/shop', collection: @related_shops
```

補足ですが、collectionオプションの省略形で書くとなぜか問題なく動作しました

```slim
= render @related_shops
```

Rails6のアプリでやったときはこの形ではダメだった気がするんですが、7からよしなにやってくれるようになったんですかね（うーん謎🤔）

Rails6だとダメだったよーとか、省略形だと内部的にどんな動きをしてるよーとか補足情報あればコメントいただけると嬉しいです。

# さいごに

エラー内容を読むとなんてことはない問題なんですが、こういう仕様になっているという参考になれば幸いです。
プログラミングを教えるのに必要なこと

こんにちは。数ヶ月新人さんにプログラミングを教えることがありましたので、そこで意識して良かったことをお伝えしていきます。

## 何があっても決して怒らない

未経験の新人さんはプログラミングができません。

なぜならば、現実世界とプログラムの世界は全く別のもので、現実世界を比喩して説明するにはプログラミングは難しすぎるからです。

そのため、できないという前提でやらないとこちらが腹を立ててしまいますし、教えられる側も不愉快です。だからこそ、どれだけ理解ができなくても怒ってはなりません。

「なぜできないんだ！」と考えるくらいなら「どうやったらできるようになるのか？」を考える方が１００倍生産的です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515562/06fb5097-406c-bc0e-9a86-0a40d8d77d11.png)

仏の心で教えましょう。
## 曖昧なことを伝えない

教えるに際して、「使用する言葉が明確でないまま説明をする」「なんとなく誤魔化して伝える」は厳禁です。

教えてみると分かるのですが、**曖昧なことを伝えても理解度は上がりません。むしろ下がります。**

よく分かんないまま1日が終わって次の日になっちゃった、次の日になると前日の内容の理解が曖昧なままで終わっているためな〜んにも分からんということになるのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515562/c557354d-e4a9-cd3a-0942-ae852bd48d7a.png)

Not Ambiguity.

## 教える範囲を120%理解してから教える

100パーセントでは教えられません。120パーセントです。

**新人さんは教えている範囲でないことを普通に聞いてくるためです。**

新しいことを学ぶ新人さんはいろいろなことに興味津々です。そのため、普通に事前に解消できる疑問は解消しておきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515562/ef713124-f1b9-613e-b5ff-15c4883124ae.png)

自分が学習するときは100点ではなく120点取れるようにしておきましょう。
IPythonの個人的に使うコマンド備忘録

# 概要
IPythonで個人的に使うコマンド類を忘れた時のためにメモしておく。

# 環境
```
$ python --version
Python 3.10.0
$ ipython --version
8.4.0
```

# 内容
## `%save` 今までのセッションの保存（.pyへ）
```Python:IPython
In [25]: %save -r tmp.py
```
`-r`はraw inputの意味。
追記する場合は、`-a`も付ければ良い。

## `%notebook` 今までのセッションの保存(.ipynbへ)
```Python:IPython
In [25]: %notebook tmp.ipynb
```

## `%edit` 複数行の入力・編集
```Python:IPython
In [32]: %edit
```
これでエディタが開くので適当なコードを入力して保存終了する。
```Python:IPython
In [32]: %edit
IPython will make a temporary file named: /var/folders/8h/jhj4lrhd1fv7xz3bxhdxxzyh0000gn/T/ipython_edit_d59j_wf5/ipython_edit_xzlshns7.py
Editing... done. Executing edited code...
0
3
6
Out[32]: 'for i in range(3):\n    j = i * 3;\n    print(j)\n'
```

## `!` シェルコマンド等の実行
```Python:IPython
In [33]: !vim tmp.py
```
` !less`なども、ちょっと覗きたい時に便利

# 感想
IPython notebook（現Jupyter notebook）は、かなり便利だけれど、さっとIPythonだけを立ち上げてゴニョゴニョしたい時が結構ある。

簡単にでも一度整理できてよかった。

(2022/07/01追記)
グラフをインタラクティブに確認しながら調整したいときは、`plt.ion()`が有効。

# 参考文献
https://ipython.readthedocs.io/en/stable/interactive/magics.html
NextJSのmiddleware.ts(Beta)の実装

## Inspiration
Nextでフロントを作っていたところ、サーバー側でクライアントのアクセスログを出力はできないか？について気になりました。
ぶっちゃけの話、各ページをレンダリングする際に`export async function getServerSideProps（）`の中にログを出力すれば問題ないですが、ページ数が大量になるとあまりにも非効率的、管理の手間が増えるのは目に見えるのでやめました。
その中、NextJsのミドルからアクセスログの出力はできないか。を調べたところBeta版の機能があることを確認、早速実装して期待通りの結果が取得できました。
まず、レファランス。

## Ref
- https://nextjs.org/docs/advanced-features/middleware
- https://nextjs.org/docs/api-reference/next/server
- https://nextjs.org/docs/api-reference/edge-runtime
※これはミドルが動く環境の制限事項になります。

## 実装
1. まず、追加のモジュールをインストール
  `npm install next@canary`

1. プロジェクトのRootDirに`middleware.ts`ファイルを作成

1. 下記のソースコードを記載します。

    ```Javascript
    import { NextRequest, userAgent } from 'next/server'

    const timestamp = () => `[${new Date().toUTCString()}]`
    const log = (...args: any) => console.log(timestamp(), ...args)

    export function middleware(req: NextRequest) {
      // Parse user agent
      const { device } = userAgent(req)

      log("nextURL : ", req.nextUrl)
    }
    ```

## 結果
サーバーのコンソールログからアクセスログを確認できます。

![スクリーンショット 2022-06-26 10.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089747/da75da04-e6c1-ae78-532b-1e3a182a49ec.png)

ただ、提供されているサンプルコードからだとより複雑な制御等も対応できるので使いこなすと助けになるかと想定してます。

## 終わりに
今回の実装で使ったソースコードはたいしたことをしてないので割愛します。ただ、下記のGitから公式が提供しているサンプルコードがあるので確認いただければと思います。

https://github.com/vercel/examples/tree/main/edge-functions

また、サーバー側の実行環境に制約(edge-runtime)があるので、使える機能等をよく調べてから機能の追加しないといけないようです。
この機能についていつ正式版に上がるかは確認してないですが、アプリのミドルから一括設定、制御ができるようになるので、より扱いやすくなるかと思います。
【AWS】データベースサービス群

# 立ち位置
やろうと思えばEC2上に自前でMySQL等のDB環境を用意することはもちろん可能。
ただ「自前主義」は当然ながら細々とした設定を自分で行わなければいけない。そこはAWS、その辺りを請け負ってくれるサービスがちゃんとある。

EC2+MySQL（自前主義） vs 　RDS（Amazon様のサービスに乗っかる）
お勉強目的とかではなく、サービスを運営したいと考えている人は基本的にRDSを使った方がいい。

https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=2744

# RDS (Relational Database Service)
AWSが提供するマネージドRDB(Relational Database)サービスのこと。
MySQL, MariaDB, PostgreSQL, Oracle, Microsoft SQL Serverなどのオンプレ環境でもお馴染みデータベースエンジンから好きなものを選択できる。

2014年からAmazon AuroraというAWSが独自開発したRDSも提供されている。
1. 自動バックアップ機能
1日1回自動的にバックアップ（DBスナップショット）をとってくれる。最大３５日間保存される。
2. リードレプリカ
マスターDBとは別に参照専用（Read-Only）のDBを用意すること。これがあることでちょっとしたことでマスターDBに負荷をかける必要が避けられる。カタカナで表記されると分かりづらいな。。。。英語でやってほしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/726c2ab4-fe33-c839-af1f-54b4cf5ee335.png)
画像引用：[Amazon RDS リードレプリカ](https://aws.amazon.com/jp/rds/features/read-replicas/)
2. ハードウェアメンテナンス＆障害時の復旧作業
マスター/スタンバイ構成になっているのも特徴。
自前でクラスタ構成を組むのは一苦労だが、この辺りも勝手にやってくれるのは有り難い。

ちなみにクラスタ構成とは。。。。
>クラスタ構成とは、複数のサーバを連携して利用者側から見て、全体のサーバが1台で構成されているように振舞うシステムのことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/adbde58c-78d2-8cde-02c7-f0210aa291e7.png)

障害時にはスタンドバイサーバが起動してくれる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/893444b7-d128-63b9-d157-7dcefa06dc8e.png)
　
引用：[クラスタとは?(クラスタ構成)【サーバ・ストレージの基礎】](https://masavlog.com/engineer/clustering/)


といった面倒なデータベース運用もAWSがやってくれるため、運用の効率化の観点から超便利。


## Aurora
RDSの中にあるサービスの1つと言う位置付け。ちょっと細かい違いはまだわかりません。。。
>対障害性はAuroraのほうが高い
RDSのほうが安いが、要件によってはシングルAZのAuroraもあり
Mysql、PostgreSql以外を使いたい場合は、RDS

参照：[RDSとAuroraを比較してみた
](https://chariosan.com/2019/09/01/rds_aurora_comparison/#Aurora)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/f2209f65-ce1d-59bd-44a9-be17dccd9876.png)
画像引用：[【AWS解説】Amazon AuroraとRDSは何が違う？違いやAurora特有の機能を説明](https://ryonotes.com/difference-between-amazon-rds-and-amazon-aurora/)


# DynamoDB
Amazonが提供するマネージドNoSQLデータベースサービス。
拡張性に優れたKey-Value型のデータベースを提供する。Firebaseと同じ。

## DynamoDB Accelerator (DAX)
CloudFront的なやつ。DynamoDBの前段にキャッシュクラスタを構成するもの。
もともとミリ秒単位での読み取りレスポンスが実現できるが、DAXを前段に置いてあげるとマイクロ秒単位での応答が可能になる。応答速度UPはもちろん、DynamoDBに対して直接アクセスする回数も減らせるのRCUリソースを圧迫せずに済む。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/05dde839-98bd-a726-521b-03c69c4928de.png)
画像引用：[Amazon DynamoDB Accelerator (DAX)](https://aws.amazon.com/jp/dynamodb/dax/)


## TTL(Time to Live)
期限切れデータの自動メンテナンスができる。
DynamoDB内の各項目でデータの有効期限を設定できる。有効期限を過ぎたら即時削除されるわけではなく、最大48時間以内に削除される。
【AWS】サービス一覧

# コンピューティングサービス
・EC2 (Amazon Elastic Compute Cloud)
・ECS (Amazon Elastic Container Service)
・Lambda (AWS Lambda)

※Elastic (≒flexible) 「柔軟性のある、拡張性のある」

# ストレージサービス
・Amazon EBS (Elastic Block Store)
・Amazon EFS
・Amazon S3 (Simple Storage Service)
・Amazon S3 Glacier
・AWS Storage Gateway



# データベースサービス

・[Amazon RDS (Relational Database Service)](https://qiita.com/morinskyy/items/76445a11415aa2e2447b)
・Amazon Redshift
↑の2つがRDB(Relational Database)のサービス。つまりSQLを使用したサービスってこと。

・Amazon DynamoDB (NoSQL)
・Amazon ElastiCache (NoSQL)
・Amazon Neptune (NoSQL)
・Amazon QLDB
・Amazon DocumentDB (NoSQL)
・Amazon Keyspaces (NoSQL)
・Amazon Timestream
【AWS】VPC、サブネット

# 1. VPC (Virtual Private Cloud)

VPCはAWS専用の仮想ネットワークのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/f8bbf307-c320-6c2c-6676-2f65b3806826.png)

はい、ピンとこないですね。
要はこれと同じこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/42ea0950-b5dc-f61d-dc4e-2495f2e36bc6.png)
画像引用：[今さらですが、自宅にネット環境あるならWifiでスマホ代節約。](https://kaizen.hatenablog.jp/entry/wi-fi-internet-setsuyaku)

集合住宅の中で自宅という空間でネットワークを作成するときと同じ。
ルータやゲートウェイ等のネットワーク機器が必要となるが、そこはAWS内で仮想的に用意してくれて、ネットワーク環境を構築できるようになっている。
AWS内に自分のための仮想空間を作成する。

# 2. サブネット
VPCという大きなネットワークの中に作成する小さなネットワーク群のこと。個々のサブネットには1つの仮想ルータがある。

>例えばVPCで全体のネットワーク空間を、下記のアドレス範囲で設定したとします。
10.0.0.0 /16
このアドレスの範囲内で、インターネットと通信できるパブリックなネットワークと、外部から遮断したいプライベートなネットワークを定義します。
10.0.1.0/24…パブリックサブネット
10.0.2.0/24…プライベートサブネット
このようにサブネットを利用することで、ネットワークごとに役割を与えることができ、管理しやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/54bcd3c1-0862-fff8-0336-14bf31cd83d2.png)
画像引用：[AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説](https://avinton.com/academy/aws/)


# 3. ルートテーブル
サブネットの設定まででアドレス設計は完了した。なのでその次はルーティング設計が必要。つまりサブネット内の通信がどの宛先のネットワークに対して、どのコンポーネント（IGWとかEC2とか）に転送されて欲しいかを設定する。

サブネット単位で指定してあげることができる。VPC内での通信経路を指定してあげるためのもの。以下の図が具体例として分かりやすい。

ルートテーブル１は「サブネット１」と「IGW」を紐づける経路決定
ルートテーブル２は「サブネット２」と「VGW」を紐づける経路決定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/050a8791-da89-7fd9-3ac8-ccd0304848fe.png)
画像引用：[VPCの構成まとめ](https://qiita.com/bobu_web/items/ab2c0d9180f016bdaa4a)


# インターネットゲートウェイ
>VPCが外部のネットワークと接続するために必要となるAWSのコンポーネントです。
そもそも、VPC内のインスタンスというのは、このインターネットゲートウェイがなければ同じVPC内のインスタンスとしかやり取りすることができません。もちろん、インターネットにもつながりません。
VPC内のインスタンスがインターネットに接続したり、オンプレのシステムと接続したりすることを可能にするゲートウェイが、インターネットゲートウェイなのです。
インターネットゲートウェイと直接やり取りできるのは、パブリックサブネット内のインスタンスで、プライベートサブネット内のインスタンスはインターネットゲートウェイとは直接接続しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/a4808d9c-2f93-423a-ad91-2a8c6353bc0a.png)
画像引用：[【AWS図解】インターネットGWとNAT GWの違い解説！](https://ryonotes.com/difference-between-internet-gateway-and-nat-gateway/)

# インターネットゲートウェイとVPCエンドポイントの違い
IGWの特殊バージョンがVPCエンドポイント
何がどう違うのかはよくわからない

# Direct Connect
自社サーバと専用線を使って直接繋ぐもの。VPNに比べて遅延やパケット損失率が低下するらしい。
何がどうすごいのかはよくわからない。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/9b920728-2ef6-9224-f12c-3cf3b4c1e280.png)
画像引用：[【ネットワーク】 「AWS Direct Connect」はどうやって使うの？](https://biz.nuro.jp/column/aws-mama-019/)



# 参考
・[AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説](https://avinton.com/academy/aws/)

・[AWS入門者がシステム構築を始めてみた(VPC編)についてまとめてみました。](https://recipe.kc-cloud.jp/archives/11819)

https://dev.classmethod.jp/articles/vpc-endpoint-gateway-type/

https://ryonotes.com/difference-between-internet-gateway-and-nat-gateway/

https://qiita.com/bobu_web/items/ab2c0d9180f016bdaa4a
Oracleがリソース容量不足で動かなくなったときに...

# はじめに
開発やシステム運用を続けていくと、データの利用量が少しずつ増えていって、ある日突然動かなくなる...そんな時に色々対応したことを書いていく

 - [x] 表領域の拡張
 - [x] アーカイブログ
 - [ ] ORA-01652/ORA-01653
 - [ ] 自動拡張の停止
 - [ ] 領域のサイズ見直し

# 対応内容
## 表領域の拡張
```sql:oraora_operation_tabelspace.sql
-- 表領域にデータファイルを追加(自動拡張OFF)　★：この箇所を見直し
ALTER TABLESPACE ★tablename ADD DATAFILE ★'c:\ORACLE\DATA\DEVELOP02.dbf' SIZE ★30G AUTOEXTEND OFF;
```
【参考サイト】
　◆【ORACLE】表領域を作成・変更・サイズ拡張・削除する方法
　　https://oreno-it.info/archives/4177
　　　★こういうまとめ方するとすごいわかりやすい！！
　◆表領域(TABLESPACE) | Oracle初心者でもスッキリわかる
　　https://sql-oracle.com/?cat=197
　◆Oracle表領域の作成（CREATE TABLESPACE）
　　http://database090212.com/oracle/manage6_9.html
　　　※一番下の参照リンクが後で使えるかも...

## アーカイブログ
```sql:oraora_operation_archivelog.sql
-- Oracleユーザーでコマンド起動
> rman target /

-- アーカイブログ状態確認
RMAN> list archivelog all;

-- 全アーカイブログ削除　※オプション有(3日前まで等)
RMAN> delete archivelog all;

-- アーカイブログ整合性チェック
--   ※rman で認識しているログファイルの実体がない場合などに検証が失敗
RMAN> crosscheck archivelog all;

-- チェック済アーカイブログ全削除
RMAN> delete expired archivelog all;
```
【参考サイト】
　◆rmanコマンドでアーカイブログを削除
　　https://www.sql-dbtips.com/redolog/delete-expired-archivelog-all/
　◆RMANでアーカイブファイルを削除するコマンドとシェルスクリプト | オラエーリックスマンの呟き
　　https://it-memo.info/?p=1413
　◆アーカイブログの削除方法まとめ（ORA-00257対処方法）
　　https://www.ashisuto.co.jp/db_blog/article/201803-archive-delete.html

# 参考サイト
後でまとめる際に参考にしたサイトをめもめも
　◆セグメント拡張エラーの対処法
　　https://atmarkit.itmedia.co.jp/ait/articles/0809/22/news115.html
　◆Oracle で dump を import するときに表領域を変更する方法
　　https://yohei-a.hatenablog.jp/entry/20100417/1271482051
　◆Oracleエラー対応（ORA-01652）：一時表領域枯渇時の調査方法及び解決策について
　　https://www.system-exe.co.jp/oracleerror05/
　　　※関連記事に他のエラーも含めて色々な対応方法があります！！
【Rails】投稿へのいいね！表示方法をコードにふりがな振ってまとめておく

# 処理の順序
1. 自分のログイン状況を判別して
2. 自分がその投稿に「いいね！」したかによって
3. 表示とリンクを変える

# 出来上がりの目標
まずは出来上がりの見た目をイメージします。
![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/a03a2de2-af29-630d-2d07-1a4cb293750b.jpeg)


# 準備したもの
この機能を実装するのに必要な最低限のファイルです

## モデル
**Postモデル** 投稿に関する情報を保存するdb
`id`カラム: 投稿id 投稿作成と同時に付与される

**Userモデル** ユーザーに関する情報を保存するdb
`id`カラム: ユーザーid 投稿作成と同時に付与される

**Likeモデル** いいね！に関する情報を保存するdb
`post_id`カラム: どの投稿へのいいね！か
`user_id`カラム: 誰によるいいね！か

## コントローラ
**postsコントローラ**
`show`アクション: 投稿詳細ページ いいね！を表示させるページでもある

**likesコントローラ**
`create`アクション: いいね！する
```ruby:likes_controller.rb
# createアクション内で
@like = Like.new(user_id: @current_user.id, post_id: params[:post_id])
@like.save
redirect_to("/posts/#{params[:post_id]}")
```

`destroy`アクション: いいね！を取り消す
```ruby:likes_controller.rb
# destroyアクション内で
@like = Like.find_by(user_id: @current_user.id, post_id: params[:post_id])
@like.destroy
redirect_to("/posts/#{params[:post_id]}")
```
上のコードにふりがなを振ったものがこちらです。
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/561a6bd6-f77c-7c6f-6858-42f147071129.jpeg)


**Applicationコントローラ** 元からあるコントローラ
`set_current_user`アクション: 現在ログイン中のユーザーを@変数に代入
```ruby:application_controller.rb
def set_current_user
  @current_user = User.find_by(id: session[:user_id])
end
```

## ビューファイル
`posts/show` /posts/:idに対してこのビューファイルを返します。
このファイル内で投稿内容や、その投稿に対していいね！しているかどうかを表示します。
```ruby:show.html.erb
<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
  <%= link_to(“いいね！済み”, “/likes/#{@post.id}/destroy” {method: “post”}) %>
<% else %>
   <%= link_to(“いいね！”, “/likes/#{@post.id}/create” {method: “post”}) %>
<% end %>
```
上のコードにふりがなを振ったものがこちらです。
![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/69ab8748-0e74-fe22-d857-eca38c2927b3.jpeg)


## ルーティング
ルーティングの設定は下記です。

```ruby:route.rb
# 投稿idに対して投稿詳細ページを表示する
get "posts/:id" => "posts#show"

# 投稿idを受け取りいいね！を作成する
post "likes/:post_id/create" => "likes#create"

# 投稿idを受け取りいいね！を削除する
post "likes/:post_id/destroy" => "likes#destroy"
```

# ポイント
+ Likeモデルにユーザーidと投稿idに対応するカラムを用意する
+ 現在ログイン中のユーザーを定義する
+ ビューファイル内でのLink_toで飛ばす先はpostなので`{method: "post"}`を忘れない
【AWS】リージョンとアベイラビリティゾーン(AZ)

# リージョンとアベイラビリティゾーン
リージョンはアベイラビリティゾーン（AZ）の集合体のこと。AWSがサービスを提供している拠点（国と地域）のことを指している。（東京、ソウル、、、、など）
AZは複数のデータセンターから構成されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/85750120-2e75-a24d-6a63-31e394760c09.png)

# AZが満たしているべき条件
AZは地理的・電源的に独立した場所に設置されている必要がある。
落雷や洪水、大雨といった局所的な災害に耐えうるようにAZ間は数十キロ程度離れて配置されている。
各AZは高速なネットワーク回線で接続されているため遅延はほとんどない。（なんと2ミリ秒以下）
電源的にも一箇所が停電したことで一斉にダウンすることがないようにしている。AZの中にはAWS自身が作成した発電所を使用しているところもある模様。

# DR (Disaster Recovery)
データセンター用語。地震や津波などの天災や、テロ、不正侵入などによりシステムが壊滅的な状況になった際に復旧・修復すること、また、その災害に備えたシステムや体制を指す。

# マルチAZ
上記を読んで「もしユーザが単一のAZしか利用していなかったらオンプレと変わらなくない？」と思う。そのために複数のAZを利用してシステムを構築する。これを「マルチAZ」と呼ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/24227a12-e4dc-597b-41bb-e35e7ccc1bb0.png)

# 具体例
以下だとどっちが望ましいかと思いますか？？
[要件]絶対に止まってはいけないシステムがあり、4台のEC2インスタンスが常に稼働している状態を維持する必要がある。単一のAZで障害が発生しても業務が継続できる必要がある。

1. ２つのAZに4台ずつのインスタンスを配置
1. ３つのAZに2台ずつのインスタンスを配置。

正解は「２」
「１」でも問題はないが、通常時8台ものEC２インスタンスが起動している状態となりコストオーバー。


# 参考
・[AWSの専門用語（リージョン、アベイラビリティゾーン、エッジロケーションとは）](https://security-blog-it.com/2174/)
・[Multi-AZとは?マルチAZ構成のメリット・デメリットについても解説](https://www.rworks.jp/cloud/aws/aws-column/aws-entry/22067/)
・[用語集｜DR/ディザスタリカバリ](https://www.idcf.jp/words/dr.html#:~:text=DR%E3%81%A8%E3%81%AF%E3%83%87%E3%82%A3%E3%82%B6%E3%82%B9%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA,%E3%82%84%E4%BD%93%E5%88%B6%E3%82%92%E6%8C%87%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
OnnxruntimeがpipでM1Macにinstallできない

# 現象

## 私の環境
```
ProductName:	macOS
ProductVersion:	12.3.1
BuildVersion:	21E258

Python 3.8.5
pip 22.1.2 
```
で`pip install onnxruntime`を実行したところ、以下のエラーメッセージが出てインストールできなかった。

```bash
ERROR: Could not find a version that satisfies the requirement onnxruntime
ERROR: No matching distribution found for onnxruntime
```

原因は調べたところ、どうやら予想通りM1チップに対応するonnxruntimeがなかった模様

# 解決策

onnxruntimeのソースコードをgithubから取ってきて、M1mac用にコンパイルすれば良い。
誰かが既に作ってくれていた。
[onnxruntime-silicon](https://github.com/cansik/onnxruntime-silicon)

下記コマンドでOK

```bash
pip install onnxruntime-silicon
```
Windows で LibreSSL を ビルドする

## 必要なアプリケーション

 * LibreSSL
 * Visual Studio
 * CMake

## アプリケーションのインストール

### LibreSSLの取得

以下のURLから LibreSSL 3.5.3のソースコードを取得します。

https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-3.5.3.tar.gz

### Visual Studioのインストール

Visual Stuido 2022 Commnunity を以下からダウンロードしてインストールします。

https://visualstudio.microsoft.com/ja/free-developer-offers/

### CMake のインストール

以下のURLから CMake 3.23.2 の Windows版 インストーラを取得し、インストールします。
   
https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-windows-x86_64.msi


## LibreSSLのビルド

### Visual Studio用 コマンドプロンプトを 起動

x64 Native Tools Command Prompt for VS 2022 を管理者権限で実行します。

### 圧縮ファイルの展開

LibreSSLの圧縮ファイルを展開します。

```
> tar xvf libressl-3.5.3.tar.gz
```

### Visual Studio のソリューションファイル(.sln)や .vcxproj ファイル の作成

cmake を実行して　Visual Studio のソリューションファイル(.sln)や .vcxproj ファイルを作成します。

```
> cd libressl-3.5.3
> mkdir build
> cd build
> cmake ..
```

### ビルド
作成された ソリューションファイルや.vcxproj ファイル MSBuild で　ビルドします。

```
> MSBuild LibreSSL.sln /t:rebuild /p:Configuration=Release -m
> MSBuild INSTALL.vcxproj /t:build /p:Configuration=Release
```

ビルドが終わると　C:\Program Files (x86)\LibreSSL　のフォルダに　作成されたファイルが格納されています。

## 参考情報

[LibreSSL を Visual Studio でビルドする](https://qiita.com/kinichiro/items/e33c089b4c986a02bee7)
踏み台サーバーを経由してSSHで接続する

# 秘密鍵ファイルをアップロードする
ターミナルを起動してください。
ターミナルで以下のコマンドを実行してください。
my-key.pemは、EC2インスタンス作成時にダウンロードしたpemファイルです。
XXX.XXX.XXX.XXXは、EC2インスタンスのパブリックアドレスです。
```
% scp -i my-key.pem my-key.pem ec2-user@XXX.XXX.XXX.XXX:~
```

# 踏み台サーバーから別のインスタンスにSSHで接続する
踏み台サーバーにログインしてください。
アップロードした秘密鍵ファイルのパーミッションを自分しか読めないように変更します。
```
$ chmod 400 my-key.pem
```

踏み台サーバーから別のインスタンスにログインします。
XXX.XXX.XXX.XXXは、ログインするEC2インスタンスのローカルアドレスです。
```
$ ssh -i my-key.pem ec2user@XXX.XXX.XXX.XXX
```

以上です。
Arduino UNOでI2Cアドレス0x40(8ビット0x80)にアスキー文字を出力する


目的
I2Cのテスト


![o_con548.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/65e768d5-c1ac-90d2-f2b2-7fb82895eb4f.jpeg)



https://qiita.com/caa45040/items/5032e6905c9425f41495


```c++


//I2C_A_z_UNO_1

#include <Arduino.h>
#include <Wire.h>

//初期化
void setup() {

  //GPIOの初期化
  pinMode(13, OUTPUT);

  //i2cの初期化
  Wire.begin(); //UNO

}//setup

int str1 = 32;

//メインループ
void loop() {

  digitalWrite(13, 1); //LED ON debug

  //I2Cに文字列を出力
  Wire.beginTransmission(0x40);
  Wire.write( str1 );
  Wire.endTransmission();
  delay(250);//0.25秒待つ

  str1++;
  if ( str1 >= (126 + 1) ) str1 = 32;

  digitalWrite(13, 0); //LED OFF debug
  delay(250);//0.25秒待つ

}//loop


```
別アカウントからスイッチしたユーザで、Cloud9で共有する場合に指定するユーザ名

# はじめに
Cloud9にある共有機能ですが、別のアカウントからスイッチしたユーザをどう設定するかわからなかったので、記事にしました。

# まとめ

- 別アカウントからスイッチしたユーザを、Cloud9の共有時に指定する場合は、`arn:aws:sts::123456789012:assumed-role/MyAssumedRole/MyAssumedRoleSession`を使う
    - `123456789012`は、スイッチ先のアカウントID
    - `MyAssumedRole`は、スイッチ先のロール名
    - `MyAssumedRoleSession`は、（だいたい）スイッチ元のユーザ名
        - 自分でセッション名を指定している場合はその文字列
    - `aws sts get-caller-identity`で表示されるArn


# 経緯

公式に記載されている方法は以下になります。

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/share-environment.html#share-environment-invite-user

> ロールを引き受けたユーザーまたはロールを引き受けたフェデレーティッドユーザーを招待するには、「arn:aws:sts::123456789012:assumed-role/MyAssumedRole/MyAssumedRoleSession」と入力します。123456789012 を AWS アカウント ID、MyAssumedRole を引き受けたロールの名前、MyAssumedRoleSession を引き受けたロールのセッション名で置き換えます。

最初、**引き受けたロールのセッション名**という言葉がわからず、何の文字列を指定したらいいかわかりませんでした。

そのあたり、以下のページを読んではっきりしました。

https://dev.classmethod.jp/articles/sts-sessionname

- そもそも、スイッチする際の`aws sts assume-role`で、`--role-session-name`としてロールのセッション名を指定する。
- コンソールでスイッチロールをした場合、IAMユーザ名が用いられる。
- 今までコンソールでしかスイッチしたことなかったので、**ロールのセッション名**というのを全く意識していなかった。

ということでした。

ちなみに私はいつも、以下のアドオンを使って切り替えています。便利なので使ってみてください。

https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl


# おわりに
知ってしまえば簡単なことでしたが、至るまでに結構時間がかかりましたので、同じように困っている方の助けになれば幸いです。
GitHubコマンドメモ

<h2>リポジトリ作成</h2>
現在いるディレクトリ下にクローンリポジトリを作成する。 

これすると、ディレクトリ内にリポジトリ名のディレクトリが作成される。
```
git clone {https://リポジトリのアドレス}
```

自身のブランチを指定してクローンする 
```
git clone -b ブランチ名 リポジトリのアドレス
```

<h2>ブランチ操作</h2>

```
ブランチ(ローカルの作業用ブランチ)を作成
git branch {ブランチ名} 
ブランチの移動
git checkout{ブランチ名} 
```
<h2>Git操作</h2>

add→commit→push
<p>add操作</p>

```
ファイルを全部コミットできるようにする（多分ローカルリポジトリに追加している）
git add .
変更箇所のみ（新規ファイルはaddされない）
git add -u
変更箇所のみ（新規ファイルもaddしたい）
git add -A
```
*git　add .はカレントディレクトリの変更のみaddするのに対して、
-u、-Aはリポジトリの変更全てをaddするという違い

<p>commit操作</p>

```
コメントと共にコミット
git commit -m “コメント”
```
<p>push操作</p>

```
プッシュは基本的にこれ（mainブランチで作業した場合）
git push main master

*補足
{name}のローカル作業ブランチから{ブランチ名}で設定した名前の
リモートブランチへpushされる（なければ新しく作成される）
git push {name} {ブランチ名}
```
<p>その他</p>

```
リポジトリ状況確認
git status 
リモートリポジトリのURL確認
git remote -v
```
DockerFileを利用した「Hello World」のブラウザへの出力方法

# やりたい事
ブラウザ（ホスト側）からのHTTPリクエストにより、Docker（コンテナ）上のアプリからのレスポンス「Hello World」をブラウザ（ホスト側）に出力したい

■前提
- DockerFileを利用すること
- WebサーバにはPythonのFlaskを利用
***
■補足
- 勝手に思っていることですが「ホスト」と「コンテナ」は別世界と捉えると理解しやすくなります
※違うかもしれませんが、現実世界とメタバース、みたいな関係？

- その別世界に対する「環境構築」までの手順は基本、ターミナルからのＣＵＩベース。
アプリの実行はブラウザ経由です。

# 知りたい事　
大きくは下記の点です

- DockerFileとアプリケーションファイルの関連性
- Dockerを利用したブラウザ経由の通信の仕組み

# STEP1：アプリケーションファイルを作ろう！
まずは、Docker関係なく、ローカル（ホスト側）で「Hello World」が出力されるAPファイル（hello.py）を用意

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

#Flaskオブジェクトを生成、[__name__]はおまじない的なやつ
app = Flask(__name__)

#ブラウザで[localhost]の仮想ディレクトリルートが指定された場合の挙動（hello worldを出力）
@app.route('/')
def hello():
    return 'hello world'

#webサーバを起動
if __name__ == '__main__':
    app.run(debug='true',host='0.0.0.0',port='8888')
```
**■ポイント**
- Docker（コンテナ）上で動作させるためには、app.run　の「host='0.0.0.0'」がめちゃポイント。
ローカル（ホスト側）だけの場合、これがなくても動作したのですが、Docker（コンテナ）上での場合は、これがわからず、躓きましたね。
　
そして、これが「知りたい事」に記載した`Dockerを利用したブラウザ経由の通信の仕組み`の部分の話になります。

**＜解説＞**
■「host='0.0.0.0'」がない場合
- デフォルトは「host='127.0.0.1'」として動作するようです。
つまり、「127.0.0.1（ローカルホスト）」からのリクエストに対して処理する、ということ。
- ホスト側からのリクエスト＝127.0.0.1でしょ？という思ってしまうのですが、これが間違い。

- 「ホスト」と「コンテナ」は別世界（別ネットワーク）であり、ルータでつながっていると思ってください。
- 「ホスト」側からのリクエストは「ルータ」を経由するときには「127.0.0.1」ではなく、別に割り当てられたＩＰアドレスとなってしまいます。
そのため、「127.0.0.1（ローカルホスト）」からのリクエストではないため、処理できない、ということ。

- 「host='0.0.0.0'」を設定することで、どこからのリクエストでも処理しますよ、になるのでこれが大事、ということ。

# STEP2：Dockerファイルを作ろう！
Dockerファイルとはアプリケーションを実行するための環境（※）をイメージとして作り出すための設計図のようなものです。
###### ※今回は下記の３つの手順で構築
- Pythonモジュール（Flask含む）の「コンテナ」という別世界へのインストール
- アプリケーションファイル（hello.py）の「コンテナ」という別世界へのコピー
- アプリケーションファイル（hello.py）の「コンテナ」という別世界での実行（webサーバの起ち上げ）
***
この設計図をもとに「build」コマンドを実行すると「image」が作られます。
その「image」を「run」コマンドで実行すると「コンテナ」が作成・起動されます。

`設計図　→　イメージ　→　コンテナ`　という流れですね。

```python:Dockerfile
from python:3.8
#ワークディレクトリを作成
workdir /var/www

#ホスト側のhello.pyをコンテナ側の[var/www]へコピー
copy ./src /var/www

run pip install flask

CMD python hello.py
```
# STEP3：Dockerイメージの作成　および　コンテナの作成・起動
powershellよりwslを起動し実行。
※本題ではないため、詳細は省略

**＜イメージの作成＞**
```:
docker build -t hello .
```
**＜コンテナの作成・起動＞**
```:
docker run -p 8888:8888 --name hello -v ${PWD}/src:/var/www hello:latest　
```
**■ポイント**
-  ポートの設定部分（-p）で、ローカル（ホスト側）の「8888番ポート」とDocker（コンテナ）上の「8888番ポート」をリンクせよという指示です

# STEP4：ローカル（ホスト側）からブラウザ経由で実施
こんな感じでできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/7e3df0fd-d742-0e58-8602-ee95115952af.png)

いかがでしたでしょうか。
Windows10でミラーリング処理を簡単に

# ミラーリングについての備忘録
フォルダの中身をバックアップする時のお悩みとして、例えば以下の例があります。
+ Windowsのエクスプローラでのフォルダのコピー(複製)では、フォルダのタイムスタンプが失われてしまう。
+ 代替データストリーム(Alternate Data Stream)をコピーするかどうかまで詳細に操作したい

そんなときに便利なのが
`robocopy`です。

## robocopy は便利・・・でも
`robocopy`は特定フォルダ内のファイルをミラーリングバックアップするのに役立ちます。

`robocopy <元フォルダ(ファイル)> <先フォルダ(ファイル)> /MIR /DCOPY:DAT`

という形で使用されてることが一般的です。
ミラーリングのされ方については、わかりやすく示すと以下のようになっています。
![robocopy](https://n-archives.net/software/robosync/articles/robocopy-mir-option/mirtxt.png)
↑
こちらの図は[n-Archives.netさんのサイト](https://n-archives.net/software/robosync/articles/robocopy-mir-option/#i-2)に表示されています。
その[n-Archives.netさん](https://n-archives.net/software/robosync/articles/robocopy-mir-option/#i-6)も
> とても便利なオプションで、私は、常々、
> robocopy は /MIR /DCOPY:DAT だけ使っていれば事足りるのではないかと思っているくらいです。
> 必要なファイルだけをコピーまたは削除し、短時間で、
> フォルダを同期し同一にさせることができるため、とても便利です。

というご意見です。
/DCOPYの各フラグは
`D:代替データストリームのコピーについて`
`A:拡張ファイル属性のコピーについて`
`T:タイムテーブルのコピーについて`
各々どうするかを設定するわけですが、

1. セキュリティーの観点から「代替データストリーム」のコピーについては使用状況に応じて考慮
1. フォルダの基本ファイル属性(Archive, Hidden, System, Read-only等)をコピーしない場合は `/NODCOPY`オプションを使える

という情報は新鮮でした。

【今回の参考情報源（実験結果なども掲載）】
[Robocopyコマンド: /DCOPY:DATのすすめ](https://n-archives.net/software/robosync/articles/dcopy-dat/)
[Robocopy /MIRオプションの動作と注意点](https://n-archives.net/software/robosync/articles/robocopy-mir-option/)
Red Hat OpenShift on IBM CloudのWebコンソールにアクセスできないときにocコマンドを実行したい場合の対処法

# 当記事の概要
Red Hat OpenShift on IBM Cloudのクラスターを新規に作成した際、設定を間違えたため、OpenShiftのWebコンソールにアクセスできない状態でクラスターが作られてしまいました。通常、ocコマンドでログインするのに必要なAPIトークンはWebコンソールで確認・入手するため、Webコンソールにアクセスできない原因をocコマンドで調査することもできない状態になりました。

当記事では、**Red Hat OpenShift on IBM Cloudにおいて、OpenShift Webコンソールを使用せずにocコマンドを実行できるようにする方法**を紹介します。


# 前提環境
試した環境のバージョンは以下の通りです。

- Red Hat OpenShift on IBM Cloud (OpenShiftバージョン：4.10.17_1524、VPCクラスターとして作成）
- IBM Cloud CLI : 2.7.0+04dfeac-2022-04-28T17:19:42+00:00


# 手順
まず、IBM Cloud CLIでIBM Cloudにログインします。

```bash
ibmcloud login
```

次に、`ibmcloud oc cluster config` コマンドで、OpenShiftの構成データ、証明書をダウンロードし、kubeconfigファイルに反映します。
`--cluster` オプションで指定するOpenShiftクラスターの名前（またはID）は、IBM Cloudのコンソールで当該クラスターの情報を表示することで確認できます（OpenShift Webコンソールへのアクセスは不要）。
また、`--admin`オプションを付けることで、今後再認証不要でocコマンドを実行できるようになります（当オプションを付けるかどうかは適宜判断ください）。

```bash
ibmcloud oc cluster config --cluster <OpenShiftクラスターの名前、または、ID> --admin
```

以下のコマンドを実行し、ocコマンドが正常に実行できることを確認します。

```bash
oc get nodes
```

以上です。


参考：[ibmcloud oc cluster configコマンド](https://cloud.ibm.com/docs/openshift?topic=openshift-kubernetes-service-cli#cs_cluster_config)
GHPythonRemoteの環境構築

不手際や不適切な箇所がありましたらご指導ご鞭撻のほどよろしくお願いいたします。

# GHPythonRemoteでの環境構築

前提
・Rhino7をインストールする

手順
1.pythonをインストールする
2.GHPythonRemoteをインストールする
3.exampleを必要に応じて編集する

## 1.pythonをインストールする
rhinoのpythonは３系に対応するとはいっているものの、
現状ほぼ2系（IronPython）対応なので、
Pythonは２系でインストールまたはバージョンを変更する。

下記を参照
[gh-python-remote 1.4.4](https://pypi.org/project/gh-python-remote/)

## 2.GHPythonRemoteをインストールする
[GHPythonRemote](https://www.food4rhino.com/en/app/gh-python-remote)
上記リンクがGHPythonのfood4rhino
リンクより本家のusageがダウンロードできる。
今回はrhino7で私は行った。

上記のusageをかいつまむと、
python2.7のsite-packagesのディレクトリ下で以下の操作を行う
`pip install gh-python-remote --upgrade`
`python -m ghpythonremote._configure_ironpython_installation`

## 3.exampleを必要に応じて編集する
GHPythonRemoteがインストールできたら、
・GH_python_remote.ghxを自身のworkSpaceにコピペする
・Rhinoのプロジェクトを立ち上げる
・Grasshopperを開く
・GH_python_remote.ghxを開き編集していく
　・GHPythonRemoteコンポーネントのlocationは自身のpython環境を`which python`などでディレクトリを調べて、それを選択させるように書き換える（condaでの環境構築が推奨されてはいる）　
　・おそらく画面右に位置しているGHPythonコンポーネントにcodeのインプットを追加する
　・Read fileコンポーネントを作成する
　　・コンポーネントをGHPythonコンポーネントにつなげる
　　・Fを右クリックしてsynchroniseを選択
　　・これからコードを書くpythonファイルを作成する
　　・select one existing fileで自身のコードを書いていくpythonファイルを選択する
　　・Read Fileコンポーネントを左クリックしてper lineを解除しておく

参考記事
[【GHPython × VSCode】GrasshopperでPython開発に外部エディターを使う方法](https://kasset.tech/post/1/external_editor_in_grasshopper/)
[gh-python-remote 1.4.4](https://pypi.org/project/gh-python-remote/)
[GHPythonRemote](https://www.food4rhino.com/en/app/gh-python-remote)
ABC257Python自己満解説

# ABC257Python自己満解説
あちゃぴです。初めて書いてみます。自己満ですｗ
とりあえず最初は灰色diffのみ解説していきます。
diffとは[AtCoder Problems](https://kenkoooo.com/atcoder#/table/)のサイトの基準で
diffが400だったらレートが400の人が50%の確率で解くことができるというものです。
なのでdiff<400のものだけを解説します。
問題はこちらです→[ABC257の問題](https://atcoder.jp/contests/abc257/tasks)
解説用にコードを綺麗に(できるだけ)してます。
ペナとはペナルティーの略でACにならなかったことです。
ペナ率とは全ての提出のうちペナになった提出の割合です。
## A問題
計算でO(1)で求めることもできますが、ペナ率が34.56%らしいのでこういったペナをなくすためには愚直にやるのが大事かもしれないです。
この場合だと愚直に得られる文字列を作成して、X番目なので添字はX-1となりそれを出力すればACです。
```python:A.py
N,X=map(int,input().split())
Al="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
S=""
for i in range(26):
    #Al[i]にはA~Zのi番目、Al[i]*NとはAl[i]をN個繋げたものである。
    S+=Al[i]*N
print(S[X-1])
```
:::note info
ちなみにコメントの部分を解説すると文字列に数字を掛けるとその文字列をN回繰り返した文字列になります。
```python:example.py
print("Hi!"*10)
```
```txt:example.pyの実行結果
Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!
```
:::
## B問題
これも愚直にシュミレーションします。
Q回操作してi回目はL[i]について操作します。
L[i]をL[i]-1にしてる理由は添字です。
左からL[i]番目のコマの場所を取得するためには```A[L[i]-1]```で取得できます。
「左からL[i]番目のコマが一番右のマスにあるならば何も行わない。」とあるので、```A[L[i]-1]```がNじゃないときに操作します。それを最初のif文```if A[L[i]-1]!=N```で判定してます。
「そうでない時、左からL[i]番目のコマがあるマスの1つ右のマスにコマが無いならば、左からL[i]番目のコマを1つ右のマスに移動させる。1つ右のマスにコマがあるならば、何も行わない。」
1つ右のマスにコマがあるかどうかを判定するには、```A[L[i]-1]+1```が配列Aの中にに含まれていたら1つ右のマスにコマがある、含まれていなければコマはないとすればよいです。
それは2つ目のif文```if not A[L[i]-1]+1 in A```で判定してます。
その後2つの条件にクリアした場合のみ```A[L[i]-1]+=1```で```A[L[i]-1]```のコマを一つ右にずらします。
結果を出力するときに```print(*配列)```とやれば配列の中身を空白区切りで出力することができます。演算子と混合しないように気をつけてください。これはよく使うので覚えておくといいでしょう。
```python:B.py
N,K,Q=map(int,input().split())
A=list(map(int,input().split()))
L=list(map(int,input().split()))
for i in range(Q):
  if A[L[i]-1]!=N:
    if not A[L[i]-1]+1 in A:
      A[L[i]-1]+=1
print(*A)
```
:::note info
ちなみに```print(*配列)```を空白区切りじゃなくて区切りなしや改行区切りにしたいときは```sep=何で区切るか```とprintのなかに書けば良い。
区切りなしにしたい場合は```print(*配列,sep"")```
改行区切りにしたい場合は```print(*配列,sep"\n")```
文字"."で区切りたい場合は```print(*配列,sep".")```
```python:example.py
S=[1,100,"Hello"]
print(*S)
```
```txt:example.pyの実行結果
1 100 Hello
```
```python:example2.py
S=[1,100,"Hello"]
print(*S,sep="&")
```
```txt:example2.pyの実行結果
1&100&Hello
```
```python:example3.py
S=["H","E","L","L","O"]
print(*S,sep="")
```
```txt:example3.pyの実行結果
HELLO
```
```python:example4.py
S=[1,22,333,4444,55555,666666]
print(*S,sep="\n")
```
```txt:example4.pyの実行結果
1
22
333
4444
55555
666666
```
:::
**以上、自己満解説でした。**
間違っているとこがあったら教えてくれたら嬉しいです！
Selenium + ModHeader で Request Header を変えてみた

<h1>はじめに</h1>
Selenium と Chrome拡張ツールの ModHeader を使ってRequestHeaderの「User-Agent Client Hints」を書き換えてページアクセスする方法。

今回はモバイル判定で利用する「sec-ch-ua-mobile」を「?1」に書き換えます。

## 環境
Java8
Selenium 4
WebDriverManager

<h2>準備</h2>
事前に「chrome-modheader」をダウンロードしておきます。

https://github.com/modheader/modheader_selenium/tree/main/chrome-modheader

<h2>コード</h2>

```java:Example.java
package example;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import io.github.bonigarcia.wdm.WebDriverManager;

public class Example {
    private WebDriver driver;
    private StringBuffer verificationErrors = new StringBuffer();
    @BeforeClass
    public static void setupClass() {
        WebDriverManager.chromedriver().setup();
    }
    @Before
    /**
     * https://stackoverflow.com/questions/71668952/how-to-set-user-agent-client-hint-sec-ch-ua-in-selenium-python
     * */
    public void setUp() throws Exception {
        //ダウンロードしたModHeaderのパスを指定
        Path currentRelativePath = Paths.get("chrome-modheader/modheader.crx");
        ChromeOptions options = new ChromeOptions();
        options.addExtensions(new File(currentRelativePath.toAbsolutePath().toString()));

        driver = new ChromeDriver(options);
        
        //headerを付与
        String secUaMobile = "?1";
        driver.get("https://webdriver.modheader.com/add?sec-ch-ua-mobile=" + secUaMobile);
    }
    @Test
    public void ModHeaderを使うテスト() throws Exception {
        driver.get("https://www.yahoo.co.jp/");

    }
    @After
    public void tearDown() throws Exception {
        driver.quit();
    }
}

```
## 最後に

Selenium では Request Header をいじることができないとのことなので、自分自身の備忘録のためこの記事を書きました。
Chrome 113 から「User Agent(UA)」の情報が削減されることが決まりました。
Seleniumでスマートフォン向けサイトのテストをする場合、スマートフォン用のUAを使ってアクセスしていましたが、
UAが削減されると、各WebページはUAの代わりに「User-Agent Client Hints」を使ってデバイスを判定することになりそうです。



<h1>参考</h1>

https://github.com/modheader/modheader_selenium


https://www.datacurrent.co.jp/column/useragent-20211015/
【Rails】「<投稿内容>...　続きを見る」という部分を作る。(truncateの実装とminitestの追加)

# はじめに
記事投稿サイトでよく見る「<投稿内容>...　続きを見る」という部分を作りたい。
なので作る！！！
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   Mac     |
| 2  |       Ruby      |   2.6.3   |
| 3  |       rails      |      6.0.4 |
|4  |    minitest|     5.11.3       |
|5|      minitest-reporters|   1.3.8|
# 一覧表示テンプレートに文字数制限と"続きを見る"リンクを追加
truncateメソッドにより文字数制限をして表示する。
続きをみるはlink_toメソッドにより投稿の詳細ページ(showテンプレート)に飛ぶようにする。
```app/views/microposts/index.html.erb
    <span class="content">
      <%= truncate(micropost.content, length: 100) %>
      <%#= => micropost.content.truncate(100)でも可 %>
      <% if micropost.content.size > 100 %>
        <%= link_to "続きを見る", micropost_url(micropost.id) %>
      <% end %>
    </span>
```
以下のような投稿の見た目になる。
![スクリーンショット 2022-06-26 0.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/fdd1f2c6-4f00-cced-94f2-efecc48f0fab.png)
# testスイートを書く
今回100文字制限にしているので、そこを閾値に2パターンのテストを記載する。
```test/integration/interface_test.rb
  test "micropost.size is 100 over" do
    # 100文字以上の文章を投稿する
    content = "This micropost really ties the room together. 
               This micropost really ties the room together.
               This micropost really ties the room together."
    title = "title"
    assert_difference 'Micropost.count', 1 do
      post microposts_path, params: { micropost: { content: content, title: title } }
    end
    assert_redirected_to root_url
    follow_redirect!
    assert_match content.truncate(100), response.body
    assert_select 'a', "続きを見る"
  end

  test "micropost.size is 100 below" do
    # 100文字以下の文章を投稿する
    content = "This micropost really ties the room together."
    title = "title"
    assert_difference 'Micropost.count', 1 do
      post microposts_path, params: { micropost: { content: content, title: title } }
    end
    assert_redirected_to root_url
    follow_redirect!
    assert_match content.truncate(100), response.body
    assert_select 'a', "続きを見る", count: 0
  end
```


# おわりに
案外簡単に実装できた。
# 参考文献
https://railsdoc.com/page/truncate
windows10でcronのようなことをする

# 経緯と概要
UNIX系OSで標準的に利用される常駐プログラム（デーモン）の一種で`'cron'`というものがあります。
これは利用者の設定したスケジュールに従って、指定されたプログラムを定期的に起動してくれる
`スグレ機能`
なのです。最近UNIX系もそうなのですがWindows系のお世話も頻発しているので、
Windows10の環境でも「そんなのあるかなぁ」と思ってググってみたら・・・ 
**あった** ので、備忘録として記載しておきます。
お役に立つなら幸いです。

## タスクスケジューラ
こんなものが標準装備としてございました。（Windowsって結構便利っ）

オッっとその前に、実行するタスクが必要ですので、とりあえずバッチファイルを簡単に作成しました。
特定のフォルダ内データを同期バックアップ（ミラーリング）してくれるものです。
```shell:backUp.bat
REM **********************
REM ミラーリングバッチファイル
REM **********************

REM ### コピー元パス ###
set backUpFrom=D:¥test¥data
REM ### コピー先パス ###
set backUpTo=E:¥backup

REM ### ミラーリング実行 ###
robocopy %backUpFrom% %backUpTo% /MIR /DCOPY:DAT
```
今回登場した`'robocopy'`につきましては
[Robocopy /MIRオプションの動作と注意点](https://n-archives.net/software/robosync/articles/robocopy-mir-option/)
で親切/丁寧に紹介してくださっていますので、[そちら](https://n-archives.net/software/robosync/articles/robocopy-mir-option/)をご覧ください。
（n-Archives.netさんに感謝（涙））

## タスクスケジューラの設定方法
では本論に入ります。
### まずは起動
+ [検索ボックス]の中で`「タスクスケジューラ」`と入力してください。候補が出ますのでマウスでクリックします。設定によっては`[虫眼鏡アイコン]で検索`するようになっている場合もあります。
![pic00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/a90738eb-e50e-0f14-ace5-9ee83414e355.png)

### 基本タスクの作成開始
+ タスクスケジューラが起動したら右側窓の`[基本タスクの作成]`をクリックしましょう。
![pic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/e60b4e4e-7eba-46dd-e4ae-ae6fcc7fc559.png)

### 名前 / 説明 の入力
+ ウィザードに従って、これから作成するタスクの`[名前]`/`[説明]`をお好みで記入してください。
![pic02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/3b41d1c1-dba9-86a4-ae75-dd5cddcc4c7b.png)

+ そうしたら`[次へ]`ボタンがアクティブになるのでクリックして進みましょう。
![pic03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/8781dd30-6f96-7996-4943-781e9fd09141.png)

### トリガーの設定
+ 次に`[トリガー]`の設定です。どのタイミングで設定するのか選択しましょう。今回は`● 毎日`で選択してみます。では`[次へ]`をクリック。
![pic04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/105f7183-3eef-46d7-a047-502b07b6627f.png)

+ すると、「毎日するのはわかったけど、何時何分何秒から開始するの？」って聞いてきますので、答えてあげてください。で、`[次へ]`。
![pic05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/033cdc7d-e267-d7b2-5b8d-d1956893e5ea.png)

### 操作メニューで設定
+ 次に`[操作]`メニューですが、ここでは`[プログラムの開始(T)]`を選択して`[次へ]`をクリックしましょう。
![pic06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/62f7a2a4-91e3-4ff3-7112-3762f865abdd.png)

+ `[参照]`ボタンで、今回実行したい`***.bat`とか`+++.exe`とかを選択して`[次へ]`に進みましょう。実行ファイルが単体実行タイプではなく引数を必要とするなら、それも入力してください。では`[次へ]`。
![pic07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/06974a29-6c8a-a423-7bb3-b311b8d7e8ce.png)

### 【要約】で最終確認しましょう
9. 最後にこれまで入力してきた内容の確認画面となります。もしミスがあれば`[<戻る(B)]`を、OKであれば`[完了(F)]`をクリックして設定を終えます。
![pic08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/dbaf72d5-0a7a-e7aa-3c29-bd5bf3d5b741.png)

## まとめ
もしかしたらこれを自分のパソコンに入れられたら、
１時間経過したら画面に
 **そろそろ休憩しようよ**
って画像流して強制的に休憩するようにできるかも・・・とか思いました。

何か有効活用できそうなことがあれば、皆様教えてください。
ここまでお読みいただきありがとうございました。
「UNIX原典」に収録されているUNIX論文の日英タイトルの対応表

「[UNIX原典―AT&Tベル研のUNIX開発者自身によるUNIX公式解説書](https://www.amazon.co.jp/dp/4893620142)」(1987/2/1) には UNIX に関する論文が日本語に翻訳されて多数収録されているのですが、日本語のタイトルじゃ元々の英語の論文のタイトルがわからず検索しづらいので対応表を作りました。いずれも古い論文ですが UNIX の歴史などを調べてる人にどうぞ。

---

- **UNIXタイムシェアリング・システムの発展**
  - The Evolution of the UNIX Time-sharing System
- **UNIX環境におけるプログラム設計**
  - Program Design in the UNIX System Environment
- **Blit - 多重化されたグラフィクス端末**
  - The Blit: A Multiplexed Graphics Terminal
- **BlitによるCプログラムのテバッグ**
  - Debugging C Programs With The Blit
- **UNIXオペレーティング・システムの安全性**
  - UNIX Operating System Security
- **UNIXシステムのcryptコマンドにおけるファイルの安全保障**
  - File Security and the UNIX System Crypt Command
- **Cの発展 - 過去と未来**
  - The Evolution of C-Past and Future
- **Cにおけるデータ抽象化**
  - Data Abstraction in C
- **マルチプロセッサUNIXオペレーティング・システム**
  - Multiprocessor UNIX Systems
- **IBMシステム/370のUNIXの実現**
  - A UNIX System Implementation for System/370
- **UNIXの移植の経験**
  - UNIX Operating System Porting Experiences
- **UNIXの性能の進展**
  - The Evolution of UNIX System Performance
- **命令計算によるプロファイリング**
  - Cheap Dynamic Instruction Counting
- **実用的な整列ルーチンを構成する際の理論と実際**
  - Theory and Practice in the Construction of a Working Sort routine
- **適正割当てスケジューラ**
  - The Fair Share Scheduler
- **仮想プロトコル・マシン**
  - The Virtual Protocol Machine
- **UNIXが稼動するコンピュータのネットワーク**
  - A Network of Computer Running the UNIX System
- **ストリーム入出力システム**
  - A Stream Input-Output System
レジストリの登録により IE を無効化する。

# 初めに (2023/7/19 追記)
本記事は Windows 10 LTSC 系統には有効なため、一応残しておきます。
一般的な Windows 10 の Internet Explorer は、2023年2月 配信の Edge V110 により無効化されました。

# これは何？
IE が 2022/06/16 に EOS を迎えましたが ~~IE が実際に起動されなくなる時期は Microsoft から公式見解は出ていません。~~
~~2022/11/21 修正) IE は 2023年2月 配信の更新プログラムにて起動できなくなることが告知されました。~~

~~2023/7/19 削除)そのため、そちらに左右されず今のうちに IE を無効化しておきたい人向けの設定です。~~
本設定を施すことで、iexplorer.exe を実行時、Microsoft Edge にリダイレクトされるようになります。
なお、本設定は Edge IE モードのご利用に影響を及ぼすことはありません。

# 実際の処理 (レジストリの書き込み)
管理者権限でコマンド プロンプトを起動して下記を実施するのみです。
AD でレジストリを配布してももちろんよいのですが、その場合は対応するグループ ポリシー「Internet Explorer 11 をスタンドアロンブラウザーとして無効にする」を配布することが推奨されます。

```cmd:ie_disable_sample.bat
reg add "HKLM\Software\Policies\Microsoft\Internet Explorer\Main" /v NotifyDisableIEOptions /t REG_DWORD /d 0
```

設定された値によって、 IE の起動を試みた際に表示される警告の挙動が変わります。
1 に設定した場合は常に、2 の場合は各ユーザが初回のみ警告が表示されます。
サンプルのように 0 の指定の場合は警告は表示されません。

なお、ユーザごとの設定 (HKCU での設定) も有効です。

# グループポリシーの場合
先述していますが「Internet Explorer 11 をスタンドアロンブラウザーとして無効にする」が該当します。
テンプレートの位置は [Windows コンポーネント] - [Internet Explorer] 直下となり、
設定値としては 0.しない / 1.常時 / 2.ユーザーごとに 1回  のいずれかから選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/3ea7d157-3a89-d166-4412-bd7b18cebb18.png)
gitのコンフリクトでファイルを消そうとしたときのミス

# 起きた問題
- Gitでコンフリクトしていた際にファイルを削除しようとしたが残ってしまった

# コンフリクトが起きるまでの状況
以下のように問題を再現してみました。
流れとしては、
- developブランチから切ったdelete_aaa_branchブランチでaaa.txtを消してdevelopへマージ
- add_bbb_branchブランチで別の作業(ここではbbb.txtを追加)をして、developブランチへマージしようとしている。ただ、この時、aaa.txtを間違えて修正してしまっている
```bash
$ mkdir temp20220625
$ cd temp20220625
$ git init
$ git checkout -b develop
$ echo aaa_content > aaa.txt
$ git add aaa.txt 
$ git commit -m "aaa.txtを追加"
$ git branch delete_aaa_branch
$ git branch add_bbb_branch
$ git checkout delete_aaa_branch
$ rm aaa.txt
$ git add aaa.txt
$ git commit -m "aaa.txtを削除"
$ git checkout develop
$ git merge delete_aaa_branch
$ git checkout add_bbb_branch
$ echo bbb_content > bbb.txt
$ echo "\n" >> aaa.txt # ここでミスってaaa.txtに改行をいれてしまうとする。Ideaの操作でやってしまう。
$ git add *
$ git commit -m "bbb.txtを追加"
$ git checkout develop
$ git merge add_bbb_branch #ここでコンフリクトする
```
その結果、以下のようになります。
```bash
$ git merge add_bbb_branch #ここでコンフリクトする
CONFLICT (modify/delete): aaa.txt deleted in HEAD and modified in add_bbb_branch. Version add_bbb_branch of aaa.txt left in tree.
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch develop
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Changes to be committed:
	new file:   bbb.txt

Unmerged paths:
  (use "git add/rm <file>..." as appropriate to mark resolution)
	deleted by us:   aaa.txt
```
そして、この際、コードを修正するメンバは皆aaa.txtを削除することに関しては同意しているとします。

# 間違って操作した箇所
上記の状況で、私は、「aaa.txtを削除したい。以下のように書いてある」
```bash
  (use "git add/rm <file>..." as appropriate to mark resolution)
	deleted by us:   aaa.txt
```
「【aaa.txtがdeletedされたこと】をaddするので git add aaa.txt だ」と考えました。
その結果、
```bash
$ git add aaa.txt
$ git commit
	[develop 48f60eb] Merge branch 'add_bbb_branch' into develop
$ ls
	aaa.txt bbb.txt
```
なんと、、aaa.txtが残ってますね。。

# わかったこと
上の状況で、「【aaa.txtがdeletedされたこと】をaddするので git add aaa.txt だ」という考えが間違っていました。
ここでは正解は、
```bash
git rm aaa.txt
```
でした。

# わからないこと
git rmはgitの管理から外すみたいな説明がありますが。ここでなぜそれをするのかわかっていないです。
```bash
  (use "git add/rm <file>..." as appropriate to mark resolution)
	deleted by us:   aaa.txt
```
というフレーズを読んでどういうふうに考えて、git rmするのか。。