OmniAICreator/Qiita-1.07M huggingface dataset:
KL情報量と最尤法

今回は生成モデルで登場する、KL情報量と最尤法について自分用にまとめます。

# Kullback–Leibler 情報量
KL情報量は、確率分布$p(\mathbf{x})$と$q(\mathbf{x})$に対して、次のように定義されます。

```math 
\begin{align*}
D_{KL}(p||q):= \int d{\bf{x}} \ p({\bf{x}}) \ {\rm{log}}\Big[\frac{p({\bf{x}})}{q({\bf{x}})}\Big]
\end{align*}
```

これは、確率分布間の距離のようなものです。実際この量は、$D_{KL} \geqq 0$を満たします。任意の正の実数$x$に対し、${\rm{log}}(x)  \leqq x-1$より、これを両辺-1倍すると、${\rm{log}}(\frac{1}{x})  \geqq 1-x$なので、

```math 
\begin{align*}
D_{KL}(p||q) &= \int d{\bf{x}} \ p({\bf{x}}) \ {\rm{log}}\Big[\frac{p({\bf{x}})}{q({\bf{x}})}\Big] \\
&\geqq \int d\mathbf{x} \ p(\mathbf{x}) \ \Big[1-\frac{q(\mathbf{x})}{p(\mathbf{x})}\Big] \\
&= \int d\mathbf{x} \ \Big[p(\mathbf{x})-q(\mathbf{x})\Big] \\
&= 1 - 1 = 0 \\
\therefore \ D_{KL} \geqq 0
\end{align*}
```

と示されます(等号成立は分布が等しい時)。しかし、pとqの入れ替えに対し、非対称な形をしているので完全な距離と見ることはできません。また上記では$\bf{x}$を、連続確率変数として積分記号でKL情報量を定義しましたが、離散確率変数の場合は和記号となることに注意してください。

# 最尤法
生成モデルでは、データを生成する真の確率分布と、自分が好き勝手に決める確率分布をより近づけようとします。例えば今、N個のデータを$\{\bf{x}_1, \bf{x}_2, ..., \bf{x}_N}$としましょう。このデータを生成する確率分布はおそらく、

```math 
\begin{align*}
p_0({\bf{x}})=\frac{1}{N}\sum_{i=1}^{N}\delta\big({\bf{x}}-{\bf{x}}_i\big)
\end{align*}
```

に近いと考えられます。この分布のことを、経験分布(Empirical distribution)と言います。つまり、基本的な生成モデルの考え方は、自分達が決めることのできる$q_\theta({\bf{x}})$をできるだけ経験分布に近づけるということです($\theta$は調整可能なパラメータ)。これはKL情報量を最小化する問題として定式化できます。

```math 
\begin{align*}
{\rm{min}}_{\theta} \ D_{KL}(p_0||q_{\theta}) &= {\rm{min}}_{\theta}\int d{\bf{x}} \ p_0({\bf{x}}) \ {\rm{log}}\Big[\frac{p_0({\bf{x}})}{q_{\theta}({\bf{x}})}\Big] \\
&= {\rm{max}}_{\theta} \frac{1}{N} \sum_{i=1}^{N}\int d{\bf{x}} \ \delta\big({\bf{x}}-{\bf{x}}_i\big){\rm{log}}\big[q_{\theta}({\bf{x}})\big] \\
&= {\rm{max}}_{\theta} \frac{1}{N} \sum_{i=1}^{N}{\rm{log}}\big[q_{\theta}({\bf{x}}_i)\big]
\end{align*}
```

最終的に得られた、${\rm{log}}\big[q_{\theta}({\bf{x}}_i)\big]$は**対数尤度関数**と呼ばれます。そしてこのような尤度関数を最大化する方法のことを**最尤法**と言います。

# Boltzmann Machine と Born Machine
ボルンマシンとボルツマンマシンは共に、物理学から着想を得ています。上で説明した自分達が決めることのできる確率分布を、次のような指数分布で書くことをボルツマンマシンと言います。

```math 
\begin{align*}
q_{\theta}({\bf{x}}) &= \frac{e^{-E_{\theta}({\bf{x}})}}{Z} \\
Z &= \sum_{{\bf{x}}}e^{-E_{\theta}({\bf{x}})}
\end{align*}
```

ここでZは規格化因子もしくは分配関数と呼ばれます。
そして、波動関数の絶対値2乗のように書く場合は、ボルンマシンと呼ばれます。

```math 
\begin{align*}
q_{\theta}({\bf{x}}) &= \frac{|\Psi_{\theta}({\bf{x}})|^2}{Z} \\
Z &= \sum_{{\bf{x}}}|\Psi_{\theta}({\bf{x}})|^2
\end{align*}
```

両者共にもう少し具体的な表式を与えないと、分かりにくいかもしれません。

[参考]
生成モデルの数理情報学！【2022年度・情報基礎科学としての数理情報学・東北大学大学院情報科学研究科】 (大関真之)
GASの実行制限を勘違いしていて少し苦しんだ話

## exceeded maximum execution time

GASを実行した時に発生したERRORです。
```
exceeded maximum execution time
```
実行時間長いよ、という話なわけですが
いや、そこまで重い処理はやってないぞ？となりまして。

ぱっと調べても、実行ユーザーが無料アカウントの場合、実行時間の制限が「6分」だとか、有料だともっと長い時間いける、という記事ばかりが出てくる（きちんと調べないのが悪い、というのはその通りです）

有料アカウントを使用しているし、無料で6分までいけるなら
尚更なぜERRORになるのか、30分ほど苦しみました。

## 実行時間の制限は一律だと勘違いしていた
実際のエラー画面です。
そうなんです。スクリプトで実行ではなくて、カスタム関数で実行していたんです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/e02d4deb-3914-685d-5ba0-7ed6b08aec7e.png)

ただの言い訳ですが、今までスクリプトばかりでカスタム関数はあまり触ってこなかったので、実行時間の制限は一律だと勘違いしていました。
| 機能 | 無料アカウント |Google Workspace アカウント|
|:-:|:-:|:-:|
| スクリプト ランタイム  |  6 分 | 6 分  |
| カスタム関数ランタイム  | 30 秒  |  30 秒 |

全然違うじゃん・・・30秒ならERRORになるのも納得、ということで
条件分岐を2ブロック分くらい減らして（元データをいじれなかったので、参照用データとしてある程度整えたものを追加した）良い感じに30秒におさめた関数ができました！

★★★助けていただいた記事★★★

https://qiita.com/kakakaori830/items/84a7dcba2d6119ed320a

https://jido-ka.com/about-gas-execution-limits/

## さいごに
制限とかの前提条件はきちんと確認しないと駄目ですね。勉強になりました。
android(kotlin)で時刻を毎秒取得する方法

# はじめ
こちらのアプリをつく際に毎秒時刻を取得するのに手間取ったのでメモがてら書き綴っていこうかなと思います。

https://qiita.com/goretzka_/items/52295986d2163f30b11c

# 結論

```kotlin:ViewModel

    private val _data = MutableStateFlow(System.currentTimeMillis())
    val data:StateFlow<Long> = _data.asStateFlow()
    val formatter = SimpleDateFormat("MM/dd:HH:mm")
    val formattedTimer:StateFlow<String> = data.map {data ->
        formatter.format(data)
    }
    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(),"")

    init {
        viewModelScope.launch {
            while (true){
                _data.value = System.currentTimeMillis()
                delay(1000)
            }
        }
    }
```

```kotlin:Activity
    viewModel.formattedTimer.collectAsState().value.let { formattedTimer ->
    ....
    }

```
かなり強引だし、init{}でviewModelが生成されてから終了されるまで１秒ごとに時刻を取得するわけですからメモリを食うし、画面が重い動きになるしでよくないのはわかっているのですが、このくらいしか思いつきませんでした。(´;ω;｀)

# 失敗
```kotlin:viewModel
val data = MutableState(System.currentTimeMillis())
val formatter = SimpleDateFormat("MM/dd:HH:mm")
var Time = fomatter.format(data)
```

これは関数で囲んでいないのでviewModelが生成された一度きりだけ時刻を取得するので、失敗しました。
varにはしてみましたが、そもそも更新されないので変数にする意味が.....
今考えれば関数内でフィールド値を設定して、戻り値をTimeにすればよかったのでは？

# 改善
コードは上記の結論のコードと同じです。
以前に、学んだFlowをつかってAcitivityでcollectAsState()で変更されたときにviewModelから取得すればいいのではと思い実装してみました。
これのメリットとしては毎秒取得しているので、画面に現在の時刻を一秒刻みで出力したい方などはいいと思います。それ以外は重くなるのでお勧めしないかも....

# 終わり
以上になります。
質問や改善案など、参考になるものなどあれば是非教えてください！
cloudflare/pages-action から cloudflare/wrangler-action への移行

![pages-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70638/28d50b5c-9a08-d573-bb86-7f4e8926530d.png)

## 概要

自分のブログサイトが GitHub Actions の [cloudflare/pages-action](https://github.com/cloudflare/pages-action) を使って Cloudflare Pages へデプロイを行なっていますが、ちょっと前から Cloudflare Pages へのデプロイのたびに以下の警告が出るようになっていました。

```
Node.js 16 actions are deprecated. 
Please update the following actions to use Node.js 20:
cloudflare/pages-action@1. For more information see: 
https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
```

どうやらしばらく cloudflare/pages-action が保守されていない様子なので、これを機に [cloudflare/wrangler-action](https://github.com/cloudflare/wrangler-action) に乗り換えたいと思います。

## GitHub Actions の設定ファイル変更

以下の内容で変更します。

### before

これは cloudflare/pages-action を使う設定です。
my-project は仮名ですので参考にする際は読み替えてください。

```yml:.github/deploy.yml
- name: Publish to Cloudflare Pages
  uses: cloudflare/pages-action@v1
  with:
    apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
    accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
    projectName: my-project
    directory: ./public
```

### after

以下のように cloudflare/wrangler-action を使うように変更します。バージョンはとりあえず現行の最新メジャーバージョンである `@v3` を指定しています。

```yml:.github/deploy.yml
- name: Publish to Cloudflare Pages
  uses: cloudflare/wrangler-action@v3
  with:
    apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
    accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
    command: pages deploy ./public --project-name=my-project --commit-dirty=true
```

### 補足
`--commit-dirty=true` をつけているのは以下警告への対応です。

```
[WARNING] Warning: Your working directory is a git repo and has uncommitted changes
  
    To silence this warning, pass in --commit-dirty=true
```

これは、ウチの環境の場合はCI内で実行している静的サイトジェネレータのビルドコマンドによって public ディレクトリ内に生成した html ファイルをコミットせずに `pages deploy` を実行していることによるものと思われます。public の成果物をコミットしていないのはウチでは意図的なものなのでこのオプションをつけて対応しています。

## 参考
基本的には公式のREADMEに沿っておけばOKです。

https://github.com/cloudflare/wrangler-action?tab=readme-ov-file#deploy-your-pages-site-production--preview
サーブレットを使っているwebアプリは2箇所の通信を確認する必要がある

サーブレットを使ったwebアプリでは、
- クライアント-webサーバ
- クライアントのダイアログなど-サーブレット

の2箇所で通信が発生する。
そのため、レスポンスに何かしら設定を加えたい場合は
- どちらに設定をするのか
- どちらに設定がされるのか

を確認する必要がある。


![20240531_003915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/bb337c63-40e2-4432-c718-c9ea0c903953.jpeg)


# 参考サイト

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Type
【Dart】うっかり！？でtry-catch で await を忘れると例外が捕捉されない！？

## はじめに
try-catch で await を使わないと例外が捕捉されない落とし穴に出会うことがあります。
うっかり await をつけ忘れるとどうなるのか、具体的なコード例を使って解説します。

## try-catch では await しないと捕捉できない

### ⭕️ 正常系のコード (await あり)
```dart
import 'dart:async';

// 1秒待ってから例外をスローする非同期関数
Future<String> fetch() async {
  await Future.delayed(Duration(seconds: 1));
  throw Exception('エラーが発生しました');
}

Future<String> fetchItems() async {
  try {
    return await fetch();
  } on Exception catch (e) {
    // 例外はここで捕捉されます
    print('fetchItemsでキャッチしたエラー: $e');
    return 'エラー発生';
  }
}

void main() async {
  try {
    final result = await fetchItems();
    print('Fetched result: $result');
  } catch (e) {
    // 例外はここまで伝播しません
    print('main関数でキャッチしたエラー: $e');
  }
}
```
#### 実行結果
このコードを実行すると、以下の出力が得られます。

```
fetchItemsでキャッチしたエラー: Exception: エラーが発生しました
Fetched result: エラー発生
```

fetchItems 内で例外が捕捉され、正しく処理されていることがわかります。

### ❌ 問題の発生例 (await なし)
次に、await を使わない場合の問題が発生するコードを見てみましょう。

```dart
import 'dart:async';

Future<String> fetch() async {
  await Future.delayed(Duration(seconds: 1));
  throw Exception('エラーが発生しました');
}

Future<String> fetchItems() async {
  try {
    return fetch(); // awaitなし
  } on Exception catch (e) {
    print('fetchItemsでキャッチしたエラー: $e');
    return 'エラー発生';
  }
}

void main() async {
  try {
    final result = await fetchItems();
    print('Fetched result: $result');
  } catch (e) {
    print('main関数でキャッチしたエラー: $e');
  }
}
```

#### 実行結果
このコードを実行すると、以下の出力が得られます。
```
main関数でキャッチしたエラー: Exception: エラーが発生しました
```
fetchItems 内で例外がキャッチされず、main 関数で例外が捕捉されていることがわかります。

## どういうことか
公式では以下
>In general, when writing asynchronous code, you should always await a future when it is produced, and not wait until after another asynchronous delay. That ensures that you are ready to receive any error that the future might produce, which is important because an asynchronous error that no-one is awaiting is an uncaught error and may terminate the running program.（[`Future<T> class`より抜粋](https://api.dart.dev/stable/3.4.2/dart-async/Future-class.html#:~:text=In%20general%2C%20when,the%20running%20program.)）

訳:
一般的に、非同期コードを書くときは、futureが生成されたら常にそれを待つべきです。なぜなら、誰も待っていない非同期エラーは捕捉されないエラーであり、実行中のプログラムを終了させてしまう可能性があるからです。

### 解説
await を使わずに Future を返すと、その Future はすぐに返され、非同期処理がバックグラウンドで続行されます。例外が発生しても、try-catch ブロックはすでに終了しているため、例外をキャッチできません。結果として、例外は呼び出し元に伝播します。

これを防ぐためには、await を使って非同期処理が完了するのを待ち、その間に発生した例外を適切にキャッチする必要があります。

## まとめ
await を使うことで、非同期処理が完了するのを待ち、その間に発生した例外を try-catch ブロック内で捕捉することができます。これにより、非同期処理中の例外を適切に処理し、プログラムが予期せず終了するのを防ぐことができます。

## 参考
https://blog.kaboc.cc/posts/20221219-01gmnatcf5

https://api.dart.dev/stable/3.4.2/dart-async/Future-class.html
PowerBIとTableauの比較

Power BIとTableauは、BIツールとして広く使用されていますが、それぞれの機能や利点には異なる側面があります。以下では、それぞれのツールの主な機能を比較しています。


## 目次
[データ前処理](#データ前処理)
[データ可視化](#データ可視化)
[データの共有と配信](#データの共有と配信)
[ライセンスの違い](#ライセンスの違い)
[おわりに](#おわりに)



## データ前処理
どちらのツールもデータ可視化の前段階であるデータ前処理を簡単に行える機能が備わっていますが、それぞれ特徴があります。

#### Power BI：
PowerBIでは、Power Queryと呼ばれるデータ変換ツールを使用し、データソースからのデータ取得、クリーニング、変換、結合などの操作を行います。
PowerQueryではタブによる直観的な操作とM言語と呼ばれる独自の言語を用いて前処理を行います。M言語は独特？癖のある言語なので慣れるまでは不便に感じるかもしれません。
M言語に加え、DAX言語と呼ばれるExcelの関数に似たものを使用して、計算列やメジャー（集計値）を作成することができます。ExcelユーザーにとってはDAX言語のほうが理解しやすいかもしれません。

#### Tableau：
Tableauでは、Tableau Prepと呼ばれるデータプレパレーションツールを使用して、直感的にデータの結合、変換、クリーニング、フィルタリングなどの操作を行うことができます。
Tableau Prepではデータの変換や操作を行うために、計算フィールドを使用します。計算フィールドを使用すると、データソースから取得したデータに対してカスタム計算を適用することができます。計算フィールドは、データソースへの変更を加えずにデータを操作するために使用されます。
個人的にフローでデータ加工を直感的に理解できるのはかなり便利だと感じました。

#### まとめ：
データの前処理(データ収集、集計、統合、加工)のやり易さ重視であればTableau、M言語やDAXに慣れているユーザーであればPowerQueryでも柔軟に前処理を行えると思います。



## データ可視化
PowerBIではPower BI Desktop、TableauはTableau Desktopというアプリケーションを用いてダッシュボードを作成します。
どちらのツールも直感的なドラッグ&ドロップでビジュアルを作成することができますが、表現方法やカスタマイズ性などに若干の違いがあります。

#### Power BI Desktop：
Power BI Desktopでは、ダッシュボード(一つのシート)上でビジュアルを作成します。あらかじめチャートタイプを選択してデータを当てはめてビジュアル作成する性質上、表現の柔軟性はTableauに劣ると感じます。
とはいえ、イメージに合致したチャートが見つかれば簡単にビジュアル作成できるので、ある程度標準化されたビジュアルをうまく使ってダッシュボードを作るイメージになります。
また、PowerBIの強みとして、同じMicrosoft製品であるExcelとGUIが似ているため、日頃からExcelを使用しているユーザーにとっては直感的な操作が可能です。

#### Tableau Desktop：
Tableau Desktopでは、ワークシートで各ビジュアルを作成し、作成したビジュアルをダッシュボードにまとめて可視化するという流れです。
ビジュアルの機能が豊富でカスタマイズしやすく、ユーザーの高いレベルの要求に合ったダッシュボードを作ることができるため、PowerBIよりもビジュアル作成において柔軟性が高いと感じます。

#### まとめ： 
PowerBIはMicrosoft製品とのシームレスな連携が強みで、Microsoft製品を使い慣れているユーザーには直感的な操作が可能です。
一方Tableauはビジュアル作成において高い柔軟性と豊富なビジュアルオプションを誇っており、カスタマイズ性に優れています。





## データの共有と配信

#### Power BI：
Power BIでは、Power BI Serviceを介してデータの共有や配信を行うことができます。クラウドベースのサービスであり、データのセキュリティやアクセス制御を管理し、チームや組織内でのダッシュボードの閲覧、編集を容易に行うことができます。

#### Tableau：
Tableauでは、Tableau ServerやTableau Onlineを使用してデータの共有や配信を行うことができます。Tableauのセキュアなデータ共有機能は、ビジネスニーズに合わせて柔軟に設定することが可能です。

#### まとめ： 
どちらのツールもダッシュボードの共有においては大きな違いは無いと感じます。




## ライセンスの違い
一般的にPower BIの価格はTableauより低く、低コストな導入が可能といわれています。一方で、Tableauの価格は高度な機能やエンタープライズレベルのニーズに合わせて設定されています。
使用する機能やユーザー数によってもコストは変わってくるためそれぞれのライセンスを理解する必要があります。

#### Power BI：
PowerBIのライセンスにはPower BI Pro、Power BI Premiumがあります。
Power BI Proは個々のユーザーごとに購入する有償ライセンスで、高度な機能やコラボレーション機能を提供します。（1ユーザーあたりの月額料金は約1千円程度　※代理店や市況によって変動する）
一方、Power BI Premiumは組織全体で利用するためのエンタープライズ向けライセンスで、サーバー容量に応じた料金体系が設定されています。

#### Tableau：
Tableau Desktopは個々のユーザーごとに購入する必要があるデスクトップアプリケーションであり、データの視覚化や分析を提供します。一方、Tableau Serverはデータ共有とコラボレーションのためのプラットフォームであり、サーバーのインスタンスごとにライセンスを購入する必要があります。どちらもオンプレミスまたはクラウド上に構築可能です。

#### まとめ：
導入コストを重視するのであればPower BI、ライセンスの安さ重視でなければTableauの利便性などのメリットも鑑み、判断しましょう。

参考までに、Power BI Proは1ユーザーあたり1千円/月（Power BI Desktopのみであれば無料）、Tableau Creatorは1ユーザーあたり8千円/月です。



## おわりに
PowerBIとTableau、どちらも優れたBIツールであることは間違いありませんが、柔軟性という点においてはTableauに軍配が上がると思います。
ただ、PowerBIも他Microsoft製品との親和性や低価格のライセンスなどのメリットがるため、現場環境や使用している他ツールの状況などを総合的に判断してどちらを導入するべきか決める必要があると感じます。


P.S.
足りない知識で書いた稚拙な文章に最後までお付き合いいただきありがとうございまました。
私自身もまだまだ勉強の身なので当記事に関しても随時ブラッシュアップしていければと思っています。
atcoder-toolsのコマンドを楽にしよう！！

# はじめに
atcoder-toolsを使うとき、コンテストのディレクトリを作成したり、問題ごとのディレクトリを移動するのは面倒ですよね？シェル関数を利用してもっと簡単にしちゃいましょう！！


# 環境
OS: macOS
シェル: VSCodeのzsh, (bash)
エディタ: VSCode

# ステップ1　zshの設定ファイルを開く
シェル関数を定義するために、ホームディレクトリにあるシェルの設定ファイルを開きます。`~/.zhrc`です。
`bash`の場合`~/.bashrc`を編集します。動くか試してないです。多分問題ないとは思いますが・・・

# ステップ2　atcoderコマンドの作成
まず`atcoder`コマンドを作成し、追記します。このコマンドは、指定されたコンテスト名のディレクトリを作成(`atcoder-tools gen abc`)し、その中のA問題に移動、`main.py`を開きます。
ちなみに`--lang`などのオプションはatcoder-toolsの設定ファイルに記述してるので省略してます。このコマンドに書けば設定ファイルを弄らなくてもいいですね。


```zsh
function atcoder() {
    if [ "$#" -ne 1 ]; then
        echo "Usage: atcoder <contest>"
        return 1
    fi

    CONTEST=$1

    atcoder-tools gen $CONTEST
    cd ~/YOUR_PATH_TO_CONTEST_DIR/$CONTEST/a
    open main.py
}
```

# ステップ3　next,pre コマンドの作成
次のアルファベットのディレクトリに移動するための `next` コマンドを作成し、追記します。これにより、`a`から`b`、`b`から`c`へと順番に移動できます。同時に、各問題の`main.py`を開きます。
またこれと逆の処理である`pre`コマンドも実装します。
```zsh
function move_to_directory() {
    local direction=$1
    # 現在のディレクトリを取得
    current_dir=$(pwd)

    # 現在のディレクトリの親ディレクトリを取得
    parent_dir=$(dirname "$current_dir")

    # 親ディレクトリ内の全ての子ディレクトリを取得し、ソートする
    child_directories=$(find "$parent_dir" -mindepth 1 -maxdepth 1 -type d | sort)

    # ソートされた子ディレクトリのリストから現在のディレクトリの位置を取得
    current_dir_position=$(echo "$child_directories" | grep -n "$current_dir" | cut -d ":" -f 1)

    # 次のディレクトリの位置を計算
    next_dir_position=$((current_dir_position + direction))

    # 次のディレクトリが存在する場合のみ移動する
    if [ "$next_dir_position" -gt 0 ] && [ "$next_dir_position" -le "$(echo "$child_directories" | wc -l)" ]; then
        next_directory=$(echo "$child_directories" | sed -n "${next_dir_position}p")
        cd "$next_directory"
        
        open main.py
    else
        echo "No such directory"
    fi
}

function next() {
    move_to_directory 1
}

function pre() {
    move_to_directory -1
}
```


# ステップ4　コマンドの実行
これで、`atcoder`コマンドを使用してコンテストディレクトリに移動し、`atcoder next`コマンドを使用して次のディレクトリに移動できます。

```zsh
atcoder abc200  # コンテストディレクトリに移動
next            # 次の問題に移動
pre             #　　前の問題に移動
```

# おわりに
これでAtCoder-toolsのコマンド入力がよりストレスフリーになりました！
`pre`と`next`は知らないだけで同じ機能が標準であったらどうしようと、これを書きながら震えてます・・・
準委任契約について

<h2>はじめに</h2>
こんにちは。水野です。

ヘルプデスク業務に携わっています。

業務で他部署へエスカレーション等をする機会があり、
その際に ”準委任契約” というキーワードが出てきたので
改めてどういう意味、契約なのか簡単に調べてみました。


準委任契約について調べていくと ”請負契約” と ”委任契約” というワードも出てきたので
ざっくりまとめてみました

<h3>請負契約と委託契約（+準委任契約）の違い</h3>
<p>・請負契約：具体的な成果物の完成が求められる。</p>
・委託契約（+準委任契約）：成果物の完成が必須ではなく、特定の業務やサービスの遂行が求められます。

つまり、「目的」や「どこに責任を負うか」という点で違いがあります。

さらに委任契約と準委任契約の違いを調べていくと、
こちらも簡単に言うと委託する業務の内容によって大きく分けられるように見受けられます。
<h3>委任契約と準委任契約の違い</h3>


・【委任契約】
民法第643条から第656条に詳細な規定があり、主に「法律行為を委託するための契約」
例）弁護士へ訴訟手続きの代理を依頼,税理士に対して税務申告や税務相談を依頼など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/f5a4ef81-077f-22df-aaa6-0b2fc219c62d.png)

・【準委任契約】
委任契約に関する一般的な規定が適応されるものの、「法律行為以外の事務処理を委託する契約」　
例）人材派遣,既存システムの保守・運用依頼など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/5669d625-1c11-7524-b475-c46c31507295.png)

【引用】e-Gov法令検索：https://elaws.e-gov.go.jp/document?lawid=129AC0000000089

<h2>最後に</h2>
<p>今回は「準委任契約」というキーワードが気になり、自身で調べてみました。</p>
<p>ここから ”業務遂行責任者” など、業務の責任や管理に関係するような話に</p>
関連しており、知見を深める第一歩にはなると思います。
<p>プロジェクトでより責任者に近い立場になると、ビジネスパートナーの方々の管理なども業務の1つになると思うので</p>
さらに勉強を進めていこうと思います。
昔作ったCSVで3Dデータ

今はどこにデータがあるのか分からないのでrequestsライブラリを使ってデータを得る事が出来ないのですが、昔保存した上高地の地形データのCSVを表示するプログラムです。
```Python3
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import csv

f = open("tikei.csv")
reader = csv.reader(f)
data = []
tmp = []
for row in reader:
    data.append(row)
    
data = np.array(data)
x = range(len(data[0]))
y = range(len(data))
x = np.array(x, dtype=float)
y = np.array(y, dtype=float)

X, Y = np.meshgrid(x, y)
Z = np.array(data, dtype=float)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z, color="#0000FF", rstride=1, cstride=1, linewidth=0.1)
ax.set_zlim(0, 3776)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/7750ab8d-7a7f-e518-918a-4d92a6097e25.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/bb6c1e66-2f6a-86e2-5b7a-8998911654cf.png)
とこんな感じでCSVの行を横、列を縦、値を高さとすることで地形データを表示するプログラムでした。
ちなみに3行追加すると等高線が作れます。
```Python3
plt.contourf(Z, cmap="rainbow")
plt.colorbar()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/e46a944e-aed7-b11c-a729-b68f3ccc0363.png)
という昔作ったプログラムでした。

ちなみに機械学習で決定境界を作るプログラムはこれを応用して作っています。
独学するために、有益なサイトはあるでしょうか

## はじめに
私は独学でプログラミングや関連知識について勉強しています。
しかし、学ぶにあたってお金はかけたくないというのが正直な気持ちではないでしょうか。

実際に独学で学ぶことができるサイトは、なかなか見つからないものです。
そのため、これから学習する方々のためにもいくつかのサイトを紹介したいと思います。
私も初学者ですので、一緒に学んでいけたらと考えています！

## 基礎編
ある程度の知識はProgateを活用してもいいと思います。
しかし、お金がかかってしまうのが、少し痛いですね。

１．https://www.freecodecamp.org
無料でプログラミング習得のためのプロジェクトを複数個取り組むことができます。
何よりも日本語に対応しいることが強い！
かなり実践的な内容があり、確かな実力がつけられます。

２．https://my-learning.w3schools.com/
複数のプログラミング言語を習得するためのチュートリアルに取り組むことができます。基本的なHTML、CSSやJavaScriptをはじめ、PythonやC言語などの言語やReact、Gitなどのフレームワークも対応しています。
アカウント作成のみで、完全無料です。

３．https://www.javadrive.jp/
これも多くのプログラミング言語を学ぶことができるサイトです。
日本語で、手っ取り早く知識を身に着けたい場合に適していると感じます。

４．https://web.dev/learn?hl=ja
web開発に関する知識を身に着けるのに最適なサイトです。
複数のコースをそのまま学習することができます。
これも日本語対応で、サイトデザインが分かりやすく、モチベーションが高まると感じます。

５．https://rinatz.github.io/cpp-book/
王道の言語であるC++をゼロから学ぶことができます。
日本語で、段階を踏んで学習できます。

６．https://java-code.jp/
このサイトはJavaを学ぶことができます。
項目が細かく分かれているので、各項目をしっかりと抑えながら学習を進めることができます。

７．https://www.php.net/manual/ja/index.php
PHPのドキュメントです。
日本語表記で、始めから終わりまでカバーしているので、これで完結できます。

８．https://docs.swift.org/swift-book/documentation/the-swift-programming-language/
Swiftのドキュメントです。
これもほとんどのことをカバーしています。
英語表記なので、少しとっつきにくいかもしれません。

## 実践編
ある程度のスキルを身に着けると、応用として自分の実力を知りたくなるかと思います。
次のステージとして、これらのサイトはいかかでしょうか？

１．https://webdesigner-go.com/coding-practice/
HTML、CSSなどのスキルチェック用に最適なサイトです。
与えられた素材で指定の構成、デザインのサイトを作成します。
レベル別になっているので、自分のレベルを知ることができます。

２．https://atcoder.jp/home
競技プログラミングのサイトです。
ほぼ毎日、コンテストを開催しており、世界中の人々が参加しています。
自分のコーディングレベルや他の人の能力を感じるために効果的です。

## その他
１．https://www.kaggle.com/
世界中の機械学習を学ぶ人のためのプラットフォームです。
誰でも機械学習コンペの参加や学習ができるので、発展的な知識を実体験で学ぶことができます。

２．https://tryhackme.com/login
ハッキングの学習サイトとしての有名どころです。
基本的に無料で、専門的な知識をわかりやすく学習できます。

## 最後に
いかがだったでしょうか？
皆さんにとって有益な情報が提供できたら幸いです。

独学で学ぶことは難しいものでもありますが、無償で学習の機会を与えてくれる方々は多くいることが分かります。

今回の記事で、皆さんがより大きな学びを得られることを祈ります。
最後まで読んでいただきありがとうございました！
Fiddler Everywhere for macOS Apple Silicon

## What is Fiddler Everywhere?

ネットワークトラフィックをデバッグして高品質を提供

あらゆるデバイスやプラットフォームのWebデバッグプロキシでデバッグ作業を強化できます。Fiddler Everywhereは、macOS、Linux、Windowsをサポートするすべての人のためのパスです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796327/26cf221e-399f-d47c-991e-92a61ead8983.png)

これは永久的です。

## Download Link

[Click me](https://xiaoyu-live.oss-accelerate.aliyuncs.com/ChatPictures/202391374/1DBA8DC05DFFC04E4CBA03F0479CE8A5)

起動コードが必要な場合は、これを記入します：42e897a03f114d12874126199fb95dc0
「ヤニ.タン.ムシリ.ノチヤ.ブンキ.ウタレ.テマナ.アンキセタ子ア.ヱラマン」はUniversal Dependenciesで書けるのか

佐々木悅藏『[樺太土人語日用會話](https://dl.ndl.go.jp/pid/869568)』(武裝堂, 明治38年8月)を読んでいたところ、「ヤニ.タン.ムシリ.ノチヤ.ブンキ.ウタレ.テマナ.アンキセタ子ア.ヱラマン」という文に出くわした(p.15)。Universal Dependenciesで書いてみようとしたのだが、「アンキセタ子ア」で悩みこんでしまった。

```
# text = ヤニ.タン.ムシリ.ノチヤ.ブンキ.ウタレ.テマナ.アンキセタ子ア.ヱラマン
1	ヤニ	eani	PRON	代名詞	_	13	vocative	_	SpacesAfter=\u002e
2	タン	tan	DET	連体詞	_	3	det	_	SpacesAfter=\u002e
3	ムシリ	mosir	NOUN	名詞	_	6	nmod	_	SpacesAfter=\u002e
4	ノチヤ	Nucá	PROPN	固有名詞	_	5	nmod	_	SpacesAfter=\u002e
5	ブンキ	punki	NOUN	名詞	_	6	nmod	_	SpacesAfter=\u002e
6	ウタレ	utar	NOUN	名詞	_	8	nsubj	_	SpacesAfter=\u002e
7	テマナ	temana	ADV	副詞	_	8	advmod	_	SpacesAfter=\u002e
8	アン	an	VERB	自動詞	_	13	ccomp	_	SpaceAfter=No
9	キ	ki	AUX	助動詞	_	8	aux	_	SpaceAfter=No
10	セ	he	ADP	副助詞	_	8	mark	_	SpaceAfter=No
11	タ子	tane	ADV	副詞	_	13	advmod	_	SpaceAfter=No
12	ア	a=	PART	人称接辞	_	13	nsubj	_	SpacesAfter=\u002e
13	ヱラマン	eraman	VERB	他動詞	_	0	root	_	SpaceAfter=No
```

![karapto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/e23bec89-a83c-9b16-10e3-d93b602da093.png)

「アンキセタ子ア」を「an ki he tane a=」とみなせば、ギリギリ解析可能になるのだが、ちょっと苦しい。「セ」と「ヘ」の交代は、[アイヌ語訳『五倫名義解』](http://hdl.handle.net/2433/286023)でも見られるのだが、樺太アイヌ語でも同様に考えていいんだろうか。一方、「ア.ヱラマン」は素直に読めば「a=eraman」なのだが、それは文頭の「ヤニ」(eani)と矛盾してしまう。仕方ないので「ヤニ」はvocativeで繋いでみたが、さて、困ったなあ。
ソースコードの改行コードについて

# 概要
本日はソースコードの改行コードについて話をしたいと思います。
最近気づいたことですが、Linux環境で圧縮したtarファイルをWindows上で解凍してみたら改行コードが変更されました。
この話をしたいと思います。

# 前提条件
・開発ソースのすべてのファイルをtarファイルに圧縮する。
・Windows上で解凍するツールは以下のもので試す。
①Winzip 2.5?
②7zip

# 圧縮ファイルを解凍
会社のPCにインストールされている圧縮ソフトウェアがWinzipのV2.5からtarファイルをWindows環境で
解凍するとソースコードの改行コードが「LF→CRLF」自動で変更される問題が発生しました。

# 解決方法
7zipツールからの解凍は問題なく改行コードがLFでした。
Winzipから解凍したソースファイルを手動で改行コードを変更したい場合は、
次のサクラエディタにて置換すれば簡単に変更は可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/2dc613d5-d72a-1888-6c55-db4948177a76.png)

●「CRLF→LF」に置換画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/0db5cc55-85e8-87ca-381a-ac7e911ebd02.png)


●置換後の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/fe011de6-88d7-cf3e-b941-d90d182b3e25.png)


# その他
Winscpツールを利用してLinux環境からWindows環境へ「シェルスクリプトファイル」をダウンロードするとなぜかこのときも改行コードがLF→CRLFに変更されました。この状態で別のLinux環境にこのスクリプトファイルをアップロードして実行するとなぜか正しく実行されない問題も起きました。
圧縮解凍以外にもファイル転送するツールからも同じ問題がありました。
一応A環境で正しく動いているのにB環境では正しく動いてないときも改行コードを確認してみてください。
またはデフォルトのシェルスクリプトがBashまたはCshなのかも確認が必要です。

# 終わりに
今日はソースコードの改行コードについて話をしてみました。
旧担当者から既存のソースを頂いて確認したときにすべてのソースの改行コードがWindowsのCRLFになっていることをみて旧システムではこのソースだったんだと思っていました。
新しい環境には改行コードを正しく変換してインストールし、確認している途中また旧担当者から最新ソースを改めて送ってきたんですが、このときは一部のソースコードは正しく改行コードがLFになっていました。テンプレートのコードはまだCRLFでしたが、そのまま新しい環境にも移行して確認しましたが、問題なかったので、そのまま利用中です。ただ、シェルスクリプトの場合は改行コードにより正しく動作しないことがありましたので、改行コード及び文字コードなどもシステムの環境文字コードに合わせて変更したら問題なく実行されました。
システムの文字コードと改行コードを意識しながら作業するのが大事と思いました。
今日はここまでです。ありがとうございます。
【VSCode】起動時にターミナルを起動してコマンドを実行する

## 拡張機能をインストール

Terminal Keeper という拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=nguyenngoclong.terminal-keeper

## 設定ファイルを作成

コマンドパレットを開き、「Terminal Keeper: Active Terminal Session」を実行し、「Yes」を選択します。
すると設定ファイルが生成されます。

![configuration.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/7d3a744c-5de1-466b-cc10-d6bf88f536cc.gif)


生成された設定ファイルにVSCode起動時に実行したいコマンドやアイコンなどを記述します。

```json:.vscode/sessions.json
{
  "$schema": "https://cdn.statically.io/gh/nguyenngoclongdev/cdn/main/schema/v10/terminal-keeper.json",
  "theme": "tribe",
  "active": "default",
  "activateOnStartup": true,
  "keepExistingTerminals": false,
  "sessions": {
    "default": [
      {
        "name": "rails",
        "autoExecuteCommands": true,
        "icon": "ruby",
        "color": "terminal.ansiRed",
        "commands": ["rails s"]
      },
    ]
  }
}

```

上記の場合には起動時にターミナルが起動し、　`rails s` コマンドが実行されます。

設定項目の詳細については以下をご確認ください。

https://arc.net/l/quote/knjstmua
引数が必要なプログラムのデバックをlldbでしてみた

## lldbとは
ソフトウェアデバッガの一つです。
Macの場合は最初からlldbがあるため、これを使ってデバッグを行ってみます。
今回、引数を必要とするプログラムのデバッグ方法がわからなかったので、まとめてみました。

## lldb使用方法
例えば、下記のようなプログラムを動かしたいとします。
```c:main.c
int	main(int argc, char **argv)
{
	t_philo			philo;

	init_args(argc, argv, &philo);
	init_philo_data(&philo);
	start_dinner(&philo);
	return (0);
}
```
上記のプログラムの実行方法の例は以下です。
```
./philo 4 800 200 200 5
```

このプログラムのデバッグを行います。

###  lldbを起動する 
まず初めに、プログラムを`make`し、実行ファイル`philo`を生成します。
※コンパイル時は`-g`オプションを必ず付けてください。

そして、下記のコマンドでlldbの起動をします。
```
lldb ./philo
```
下記のコマンドで引数を設定します。
```
settings set -- target.run-args 4 800 200 200 5
```

ブレークポイントを設定する場合は、下記のどちらかのコマンドで設定できます。
```
breakpoint set --name main
br set -n main
```
上記は関数名を指定していますが、下記のどちらかで関数名と行数を指定することもできます。
```
br set --file main.c --line 6
br set -f main.c -l 6
```

最後に、`r`または`run`でlldbが実行されます。
```
run
```

### lldb実行後
lldb実行後、下記のように今現在デバッグを行なっている行数が指されます。
![スクリーンショット 2024-05-30 22.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691430/1877e18b-80f3-f1ad-4ab6-65e0a2489bb9.png)

今、矢印が指している関数を詳しくみていきたい場合は`s`または`step`で関数の中に入れます。
```
step
```
次の行(関数)に移動したい場合は`n`または`next`で次に進みます。
```
next
```
リークしている部分があれば処理が中断し、下記のように知らせてくれます。
![スクリーンショット 2024-05-30 22.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691430/4ca0baab-873c-bf8e-9381-84f8b34968cf.png)

### 変数を出力
`po`(print object)または`print`コマンドを使用し、任意の出力したい変数名を入れると、その変数の値が表示されます。
```
print　[変数名]
```
構造体の中身を出力したい場合は、[0]のように値を指定してください。
```
print philo[0]
```
![スクリーンショット 2024-05-30 23.17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691430/663b326e-ff7d-99c9-5ca8-c351f997dae1.png)
配列要素のメンバーや構造体メンバーの表示も可能です。
```
(lldb) print philo[0].philo_id
(unsigned int) 1
```
```
(lldb) print philo->args.number_of_philo
(unsigned int) 4
```

### 終了方法
`control`+`d`でlldbを終了させることができます。

## まとめ
必要最低限のコマンドをまとめてみました。
役立つコマンドや効率の良い方法があればぜひ教えてください。
【厳選版】Nest.jsに入門したので使えるコマンドをまとめておく

# nest new xxx
新しいNestプロジェクトを作成する。

```bash
# Nestプロジェクト作成
$ nest n test_project
```

## オプション一覧

| オプション | 説明 |
|:-:|:-:|
| -s  | パッケージのインストールをスキップする  |
| -p xxx  | パッケージマネージャーを指定する（例：npm, yarn...）  |
| --strict  |  TypeScriptコンパイラフラグを有効にする  |

# nest generate xxx
ファァイルの生成および変更を行う。

```bash
# 新しいアプリケーションを生成する
$ nest g app xxx

# 新しいクラスを生成する
$ nest g class xxx

# 新しいコントローラーを生成する
$ nest g controller xxx

# 新しいインターフェースを生成する
$ nest g interface xxx

# 新しいモジュールを生成する
$ nest g module xxx

# 新しいプロバイダーを生成する
$ nest g provider xxx

# 新しいサービスを生成する
$ nest g service xxx
```

## オプション一覧

| 1 | 2 |
|:-:|:-:|
| --flat  | ディレクトリを生成しない  |
| --spec  | specファイルを同時に生成する  |
| --no-spec  | specファイルを生成しない  |

# nest build xxx
出力フォルダーにコンパイルする。

```bash
# プロジェクトをビルドする
$ nest build xxx
```

## オプション一覧

| 1 | 2 |
|:-:|:-:|
| -b  | コンパイルに使用するビルダーを指定する（例：tsc, swc, webpack）  |
| -w  | ウォッチモード（ライブリロード）で実行する  |

# nest start xxx
アプリケーションをコンパイルして実行する。

```bash
# コンパイル実行
$ nest start xxx
```

## オプション一覧

| 1 | 2 |
|:-:|:-:|
| -w  | ウォッチモード（ライブリロード）で実行する  
| -d  | デバッグモードで実行する  |

# nest add xxx
パッケージ化されたライブラリをインポートし、そのインストールスキーマを実行する。

```bash
# 任意のライブラリインポート
$ nest add xxx
```

# nest info
インストールされている Nestパッケージに関する情報やその他の役立つシステム情報を表示する。

```bash
$ nest info
```

# 参考
[CLI command reference](https://docs.nestjs.com/cli/usages)
[nest generateコマンドからざっくりとNestJSを把握する](https://qiita.com/kmkkiii/items/adebde644012aedec1bd)
AWS SAP対策#2 オンプレミスからのクラウド移行計画

AWS SAP試験対策#2

# 問題(ざっくり)
ある会社では、複数のデータセンターとオフィスで数百のアプリケーションを実行しています。アプリケーションには、LinuxOS・物理サーバー・MySQLデータベースなどが含まれています。既存のドキュメントは不完全で古くなっています。ソリューションアーキテクトは現在の環境を理解し、移行後のクラウドリソースコストを見積もることでクラウド移行を計画しなければいけません。どのツール・サービスを使いますか？(以下から3つ選択)

　①CloudWatch Logs
　②AWS Migration Hub
　③AWS Config
　④AWS Cloud Adoptation Readinss Tool (CART)
　⑤AWS Server Migration Service
　⑥AWS Database Migration Service
　⑦AWS Application Discovery Service

\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*

# 回答
②AWS Migration Hub
④AWS Cloud Adoptation Readinss Tool (CART)
⑦AWS Application Discovery Service

# 要点解説
### ②AWS Migration Hub
他のAWS移行サービスである、Application Discovery Service・Server/Database Migration Serviceに関する移行サマリダッシュボードを統合したサービスです。
→早い話が、クラウド移行を可視化してくれるようなサービスです。ここでは、後述するApplication Discovery Serviceで取得したデータを見るのに用います。

https://docs.aws.amazon.com/ja_jp/migrationhub/latest/ug/whatishub.html

>AWS Migration Hub を使用すると、1 か所で既存のサーバーを検出し、移行を計画して、各アプリケーションの移行ステータスを追跡できます。AWS Migration Hub は、アプリケーションポートフォリオを可視化し、計画と追跡を簡素化します。使用している移行ツールに関係なく、移行する各アプリケーションを構成するサーバーとデータベースのステータスを確認できます。

### ④AWS Cloud Adoptation Readinss Tool (CART)
クラウド導入・クラウド移行計画策定に役立つ、アンケート形式のサービスです。16個の質問に答えることで、ビジネス・人材・プロセス・プラットフォーム・運用・セキュリティの 6 つの観点からクラウド移行の準備状況を詳細に説明してくれるレポートが手に入る。

https://cloudreadiness.amazonaws.com/#/cart

### ⑦AWS Application Discovery Service
クラウドへの移行に向けた既存ITシステムのデータ収集サービスです。この問題では、「既存のドキュメントは不完全で古くなっています」とあり、現状のアプリケーション環境がどうなっているかもわからなくなっているので、その詳細を把握するためにも必要です。また、当サービスで得たデータを前述のMigration Hubで可視化できます。
→エージェントベース検出も、エージェントレス検出もどちらも可能です。エージェントはWindows/Linux両対応。エージェントレスの場合はVMware vSphereが必要になります。

https://docs.aws.amazon.com/ja_jp/application-discovery/latest/userguide/what-is-appdiscovery.html

>AWS Application Discovery Serviceオンプレミスサーバーとデータベースに関する使用状況と設定のデータを収集することで、AWSクラウドへの移行を計画できます。Application Discovery Service はAWS Migration HubAWS Database Migration Serviceと統合されています。Migration Hub は、移行ステータス情報を単一のコンソールに集約するため、移行の追跡が簡素化されます。

### 引っかけ?
⑤AWS Server Migration Service
⑥AWS Database Migration Service
この2つは(若干)引っかけの選択肢です。
//自分は最初まんまと引っかかりました…

問題文をよく読むと、 **「クラウド移行を計画しなければいけません」** とあります。 **「計画」** です。実際に移行する段階ではないのです。なのでバツです。自動車免許の問題かな？
graph_viz


```python
import graphviz as gv

# ノードのリスト
text1 = 'this is sample text \n hello'
nodes = [text1, 'B', 'C', 'D', 'E', 'F']

# Digraphオブジェクトを作成
graph = gv.Digraph(format='svg', filename="output/mygraph.gv",
                   graph_attr=dict(rankdir='LR', splines='ortho'),
                   node_attr=dict(shape='box'))

# ノードを5つずつ追加
graph.node(nodes[0])
graph.node(nodes[1])
graph.node(nodes[2])
graph.node(nodes[3])
graph.node(nodes[4])
graph.node(nodes[5])

# エッジを追加
graph.edge(text1, 'B')
graph.edge('B', 'C')
graph.edge('C', 'D')
graph.edge('D', 'E', constraint='false')
graph.edge('E', 'F')

graph.view()

```


```python
from graphviz import Digraph

# Digraphオブジェクトを作成します
dot = Digraph()

# ノードを追加します
dot.node('A', 'Start', shape='box')
dot.node('B', 'Process 1', shape='box')
dot.node('C', 'Process 2', shape='box')
dot.node('D', 'End', shape='box')

# エッジを追加します
dot.edges(['AB', 'BC', 'CD'])

# 一段目の最後から二段目の最初に矢印を追加します
dot.edge('B', 'C', constraint='false')

# レイアウトを横向きに設定します
dot.attr(rankdir='LR')

# ファイルに保存して表示します
dot.render('flowchart', format='png', cleanup=True)


```
現場で使えるくらいにはZodを理解しておきたい

# Zodとは
TypeScript向けのスキーマ宣言とデータ検証のためのライブラリのこと。
型安全な方法でデータ構造を定義し、それに基づいてバリデーションを行うことが可能。

# インストール方法

```bash
# npmの場合
npm install zod

# yarnの場合
yarn add zod

# pnpmの場合
pnpm add zod
```

# 基本的な使い方
引数に渡した値が問題無ければ、その値を返し、問題があればエラーを返す。

```typescript
import { z } from 'zod'

const stringScheme = z.string()

stringScheme.parse("hogefuga")
// => "hogefuga"
stringScheme.parse(true)
// => throws ZodError
```

## プリミティブ型のスキーマ作成

```typescript
import { z } from "zod";

z.string();    // string型
z.number();    // number型
z.bigint();    // bigint型
z.boolean();   // boolean型
z.date();    　　　　// date型
z.symbol();    // シンボル型
z.undefined();　　// undefined型
z.null(); 　　 　　  // null型
z.void(); 　　　  　 // void型
z.any();  　　　　　 　 // any型
z.unknown();   // unknown型
z.never();   　　 // never型
```

## オブジェクト型のスキーマ作成

```typescript
const Dog = z.object({
  name: z.string(),
  age: z.number(),
  ownerId: z.number()
});
```

## zodからTypeScriptの型を作成する

```typescript
 const FormData = z.object({
    name: z.string().min(2).max(50),
    email: z.string().email(),
    message: z.string().min(5),
  });

  type FormDataType = z.infer<typeof FormData>;
```

# 参考
[Zod | Documention](https://zod.dev/)
[Zodの基本的な使い方]()
[Zodスキーマでプロンプト生成を行い構造化データを自由自在に扱えて、LLMプロダクト開発が圧倒的に効率化した話](https://tech.algomatic.jp/entry/2024/05/23/140219)
[TypeScript開発に欠かせない？Zodライブラリの基本](https://dev.classmethod.jp/articles/basic_usage_zod/)
[Zodによるバリデーションに入門する](https://dev.classmethod.jp/articles/hello-zod/)
CSSのhoverで兄弟要素に変更を加える


hoverはしたときに親要素にある他の兄弟要素にも変更を加える方法。

```
<div class="parent">
    <div class="child">child1</div>
    <div class="child">child2</div>
    <div class="child">child3</div>
</div>
```

```
.parent:has(.child:hover) .child {
    opacity: 1;
}
.child:hover {
    opacity: .5;
}
```

.parentに.child:hoverがあったらそのほかの.childにも影響する。
font sizeの「ch」ってなんだ


CSSでfont-size: 10ch;が指定されているのをみた。
CHの存在を知らなかったので調べた。

# CH
chは横幅の単位。
1chはその要素に指定されているフォントの「0」の横幅。
つまりフォントファミリーが変わると横幅も変わる。

不便そうだからいつ使うのか謎。
(ドット絵)16ビット漢字ROMをかんがえる



目的
格納方法やいろいろかんがえる
いろいろあるから、地道に考える

まず、週の始まりは、月曜日で
(月)の漢字をかんがえる

「決戦は、金曜日」　なんのこと?

16x16で余白1ドットあり

単位は、16ビット　8ビット系だとインデックスレジスターを使う なんのこと?

●　編集ツール

https://qiita.com/caa45040/items/574231109a31cb6c55eb

●　新規で開く

![o_coq144.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/95cb5e87-2a7a-e325-2fce-b59bee252cfe.jpeg)

●　編集セーブする

![o_coq145.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c74dbd81-c4b0-9965-1a97-3133d280d822.jpeg)

●　変換ツール

https://javl.github.io/image2cpp/

●　変換する

![o_coq146.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7fe2d681-d4de-92f0-496d-8e819a81a084.jpeg)

![o_coq147.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/086f8339-f4a5-5167-2116-5f79a9c4bd82.jpeg)

●　データを張り付ける

![o_coq149.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/501f0f95-a730-f272-f98d-b1514596e95e.jpeg)


●　16bitに編集する

```

  0x0800, 0x0ff8, 0x0808, 0x0808, 0x0808, 0x0ff8, 0x0808, 0x0808, //(月)
  0x0808, 0x0ff8, 0x0808, 0x1008, 0x2008, 0x2038, 0x4018, 0x0000


```
selectタグのグルーピング


htmlのセレクトボックス（selectタグ）で意外と使えるメモ。

# hr
罫線（hr）を引くことができる。
```
<select>
    <option>A</option>
    <option>B</option>
    <hr>
    <option>C</option>
    <option>D</option>
</select>
```

# optgroup
選択肢をグルーピングできる。
```
<select>
    <optgroup label="group1">
        <option>A</option>
        <option>B</option>
    </optgroup>
    <optgroup label="group2">
        <option>C</option>
        <option>D</option>
    </optgroup>
</select>
```
zustandを使ってみたい

# zustandとは
小さく、シンプルに管理することができる状態管理ライブラリのこと。
シンプルにコードを書くことができて、グローバルに保持することが可能。どのコンポーネントからもアクセスできます。

# インストール方法

```bash
// yarnの場合
$ yarn add zustand

// npmの場合
$ npm install zustand
```

# 使い方
状態を管理するuseStoreフックを作成します。
create関数内で定義していき、set関数を使用して状態を変更します。

```react
import create from "zustand";

type Count = {
  count: number;
  increaseCount: () => void;
  decreaseCount: () => void;
  resetCount: () => void;
}

export const useStore = create<Count>((set) => ({
  count: 0,
  increaseCount: () => set(state => ({ count: state.count + 1 })),
  decreaseCount: () => set(state => ({ count: state.count - 1 }))
  resetCount: () => set({ count: 0 }),
}));
```

`useStore`をimportし、必要なstateのみ呼び出す。
`useStore()`とするとすべてのstateを呼び出すことが可能だが、変更があるたびに再レンダリングされてしまうため注意が必要。

```react
import type { NextPage } from "next";
import { useStore } from "../libs/store";
import styles from "../styles/Home.module.css";

const Count = () => {
  const count = useStore((state) => state.count);
  return (
    <>
      <h2>count: {count}</h2>
    </>
  );
};

const IncreaseCount = () => {
  const increaseCount = useStore((state) => state.increaseCount);
  return (
    <>
      <button onClick={() => increaseCount()}>Increase</button>
    </>
  );
};

const DecreaseCount = () => {
  const decreaseCount = useStore((state) => state.decreaseCount);
  return (
    <>
      <button onClick={() => decreaseCount()}>Decrease</button>
    </>
  );
};

const ResetButton = () => {
  const { resetCount } = useStore();

  return <button onClick={() => resetCount()}>Reset</button>;
};

const Home: NextPage = () => {
  return (
    <div className={styles.container}>
      <main className={styles.main}>
        <Count />
        <IncreaseCount />
        <DecreaseCount />
        <ResetButton />
      </main>
    </div>
  );
};

export default Home;
```

# 参考
[zustand](https://zustand-demo.pmnd.rs/)
[zustand（Github Repository）](https://github.com/pmndrs/zustand)
[zustandを初めて使ってみた](https://qiita.com/s_taro/items/0c16f077d843ac1a78fa)
[軽量なグローバル状態管理ライブラリ「zustand」](https://zenn.dev/stmn_inc/articles/f1101cfa20dedc)
[React状態管理ライブラリ Zustandを使ってみた](https://dev.classmethod.jp/articles/zustand/)
[Zustandの使い方](https://qiita.com/mikan-orangeFE/items/505ef42209aa7eb32c1b)
英単語の改行はHTMLハイフンネーションを使う


HTMLで英単語を表示させると改行が変なところでされる場合がある。
CSSのword-beakを利用してもよいが、HTMLハイフンネーションを利用すると便利。

```
&shy;
```

上記がハイフンネーションで

```
hello&shy;world!!!
```

とすると。

hellowの後にハイフンで改行される！

![スクリーンショット 2024-05-30 22.54.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/9cd2256f-0e41-aa63-0f44-c235d50e51a5.png)
AlmaLinux環境のNestJSでhttps

NestJSで自己署名証明書を使用したhttpsサーバを起動します。（同時にhttpサーバも立ち上げます。）

- 自己署名証明書の作成から行います
- 秘密鍵と証明書はWindowsにて、mkcertで作成したものをAlmaLinuxにコピーします

## 環境
AlmaLinux 8.8
NestJS 10.3.2
npm 10.8.0
Window 10
## 自己署名証明書の作成
AlmaLinux(RHEL/CentOS)で自己署名証明書を作成するにはOpenSSLを使用して作成するのが一般的なようですが、Windows 10にmkcertをインストールして、mkcertで作った証明書をAlmaLinuxへコピーすることにしました。
### 1．Windows 10 に Chocolatery をインストール
まず mkcert をインストールするためのパッケージマネージャ Chocolatery をインストールします。
1. Windows PowerShell (管理者)を起動
2. https://chocolatey.org/install にアクセス
3. 「Install Chocolatey for Individual Use:」の「Install with powershell.exe」の「Now run the following command:」の下にあるテキストボックスの右端をクリック（テキストボックスの内容がコピーされる）
ちなみにこれを書いている時点の内容は下記。
    ```
    Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
    ```
    ※管理者で実行しないと失敗する。もし通常で実行してしまった場合は作成されてしまった```C:\ProgramData\chocolatey```を削除してから、管理者で再実行する。
4. Windows PowerShell に貼り付けて実行
5. インストールできたかどうかを下記を実行して確認（もしかしたらPowerShellを起動し直す必要があるかも）
    ```
    > choco list
    Chocolatey v2.2.2
    chocolatey 2.2.2
    1 packages installed.
    ```
### Windows 10 に mkcert をインストール
1. Windows PowerShell (管理者)を起動
2. mkcert をインストール
    ```
    > choco install mkcert
    ```
3. トラストストアにローカル認証局(CA)をインストール
    ```
    > mkcert -install
    ```
### Windows 10 で自己署名証明書を作成
下記を実行して```localhost```の証明書を発行（```localhost```以外の場合は環境に応じてドメイン名や固定IPアドレスを指定）
- 秘密鍵ファイル: key.pem
- 証明書ファイル: cert.pem
```
> cd {適当なフォルダに移動}
> mkcert -key-file key.pem -cert-file cert.pem localhost
```
出来上がったkey.pem、cert.pemをAlmaLinux環境へコピー
## 2. NestJSでhttpsサーバを起動 (同時にhttpサーバも起動)
main.tsに以下のように記述
```main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ExpressAdapter } from '@nestjs/platform-express';
import * as express from 'express';
import * as fs from 'fs';
import * as http from 'http';
import * as https from 'https';

async function bootstrap() {
  const privateKey = fs.readFileSync('{ファイルを置いたパス}/key.pem', 'utf8');
  const certificate = fs.readFileSync('{ファイルを置いたパス}/cert.pem', 'utf8');
  const httpsOptions = { key: privateKey, cert: certificate };

  const server = express();
  const app = await NestFactory.create(AppModule, new ExpressAdapter(server));
  await app.init();

  http.createServer(server).listen(3000);
  https.createServer(httpsOptions, server).listen(443);
}
bootstrap();
```
sudoでNestJSを開始 (通常通り開始すると443ポートのバインドで失敗する)
```
$ sudo npm start
```
:::note warn
root権限で実行するのでNestJSプロジェクト内のdistフォルダ以下のパーミッションが全てrootになってしまいますのでご注意下さい。（次にユーザ権限で実行するときにエラーとなります。その場合は一旦distフォルダを消して下さい。）
:::
## 確認方法
ブラウザからhttpsでアクセス

## 参考サイト
https://qiita.com/dai-andy1976/items/6a47bb36932aa1d5af2d

https://qiita.com/dai-andy1976/items/b179ef6e56087ad1943d

https://rehansattar.dev/creating-a-local-https-nestjs-server-with-free-ssl-certificates-a-step-by-step-guide

https://codenote.net/posts/5248/
pugのループ処理


忘れやすいのでpugでのループ処理の備忘メモ。

# for
```
ul
  - for (var i = 1; i < 4; i++)
    li リスト#{i}
```

# each
```
- var list = ["apple", "banana", "orange"]
ul
 - each fruit in list
    li= fruit

```
git hookについて


# git hook
gitにはgitを扱うための各コード（git commitやgit pushなど）を実行する際に特定のスクリプトを実行する**git hook**という機能がある。

git hookを利用することで、例えばコミット前の構文チェックや規約違反などを未然に防ぐことができる。

git hookのスクリプトは「.git/hooks 」に格納されている。

- git/hooks
    - applypatch-msg.sample
    - pre-applypatch.sample
    - pre-rebase.sample
    - update.sample
    - commit-msg.sample
    - pre-commit.sample
    - pre-receive.sample
    - post-update.sample
    - pre-push.sample
    - prepare-commit-msg.sample

デフォルトでは.sampleの拡張子がついているので、使用するときは外す。

## よく使うhook
### pre-commit
pre-commitはgit commit を実行する直前で実行される。
コミット時に構文や規則のエラーをチェックできる。

### post-commit
コミットが成功した際に実行される。
通知やロギングに使う。

## どうしてもコミットしたい場合
sourcetreeのコミットオプションで「コミットフックをバイパス」を選択してコミットしても可能。
Dependsによる依存性注入

# 概要
FastAPIを用いて、開発をする際に`Depends`の意味がわからなかったので、備忘録として書き残します。

## 依存関係の注入は何をしているのか？
→オブジェクトやリソースを関数やクラスに渡す方法の一つ

### 依存注入の役割
- リソースの管理
依存性注入により、リソースのライフサイクル管理を集中化できる。リソースの作成、初期化、破棄などを　依存関係の注入システムが担当するため、個々の関数やクラスがリソースの管理に関与する必要がなくなる。
- コードの再利用性と保守性の向上
依存関係がクラスや関数を明確にし、保守性を高めることができる。

例えば、下記のコードでは`get_db`関数の中で依存性の注入を行っている。`SessionLocal()`でデータベースセッションを作成し、`db.close()`でセッションを閉じる一連の流れを依存関係として定義することで、DB操作をする際に毎回、記述しなくても良くなり、コードの可読性が向上する。

```python
from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session

from database import SessionLocal

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/users/")
def create_user(name: str, email: str, db: Session = Depends(get_db)):
    ...
```

## Annotated()を使った依存注入
→ Python3.9以降で導入された、型ヒント機能

Dependsと同様に依存関係の注入に使用される。異なる点は`メタデータを追加し、依存関係の動作を明確`にすることができる点である。

### 使用するメリット
型ヒントとメタデータを明示的に分離することができる。型ヒントの可動性が向上する。

- Annotatedを使用しない場合
型ヒントとメタデータを明示的に分離し、どの部分が型ヒントで、どの部分がメタデータなのかを明確に示すことができる。
```
db: Session = Depends(get_db)
```

- Annotatedを使用する場合
第1引数のSessionが型ヒントで、第2引数のDepends(get_db)がメタデータであることを明確に区別することができる。
```
db: Annotated[Session, Depends(get_db)]
```
AWS SAP対策#1 AWS Organizationsと請求書

AWS SAP試験対策 #1

# 問題(ざっくり)
ある会社では、複数事業部が各自のAWSアカウントを持っています。すべてのAWSアカウントに対して、事業部ごとに費用を分類した単一のAWS請求書が必要です。また、この会社ではすべてのAWSアカウントに対して、サービスや機能を一元的に制限・管理する必要があります。ソリューションアーキテクトはどうすればいいですか？(手順2つ)

\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
# 回答
①AWS Organizationsを使用してすべての機能を有効にした組織を管理アカウントで作成し、その組織にすべてのAWSアカウントを招待する。
②承認されたサービスと機能だけが許可されたSCPを作成し、そのポリシーをすべてのAWSアカウントに適用する。


# 要点解説
### ①AWS Organizationsの一括請求(コンソリデーティッドビリング)
→Organizationsを用いることで、複数アカウントの支払いを一括で行えるようになります。
※あくまでもOrganizationsとしての機能を用いるので、AWS Budgetsなど別のサービスを用いる必要はありません。

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/consolidated-billing.html

> 一括請求には次の利点があります。
> - 1 つの請求書 – 複数のアカウントに対して 1 つの請求書を受け取るだけで済みます。
> - 簡単な追跡 – 複数のアカウントでの料金を追跡し、コストと使用状況の統合データをダウンロードできます。
> - 使用状況の結合 – 組織内のすべてのアカウントの使用量を結合し、料金のボリューム割引、リザーブドインスタンスの割引、および Savings Plans を共有できます。その結果、会社、部門、またはプロジェクトでの料金が個々のスタンドアロンアカウントと比較して低くなります。詳細については、「従量制割引」を参照してください。
> - 追加料金なし – 一括請求は追加コストなしで提供されます。

:::note warn
メンバーアカウントが組織を離れた場合、そのメンバーアカウントは、組織にいたときに生成された Cost Explorer データにアクセスできなくなります。このデータは削除されず、組織の管理アカウントは引き続きデータにアクセスできます。再度組織に加わったメンバーアカウントは再びデータにアクセスできます。
:::

また、Organizationsへの招待に関しては、管理アカウントから別のアカウントに対して **「メールアドレスを用いて」** 行うことができる。(以下参照)

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_accounts_invites.html

### ②承認されたサービスと機能だけが許可されたSCPを作成し、そのポリシーをすべてのAWSアカウントに適用する。

→SCP(サービスコントロールポリシー)を用いて、Organizationsの組織内にあるAWSアカウントの行動を一元的に制限・管理できます。
(※管理アカウントのユーザーやロールには影響しない)

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps.html

>サービスコントロールポリシー (SCP) は、組織のアクセス許可の管理に使用できる組織ポリシーの一種です。SCP を使用すると、組織内の IAM ユーザーと IAM ロールが使用できる最大権限を一元管理できます。
:::note warn
SCP は、すべての機能が有効になっている 組織でのみ使用できます。組織が一括請求機能のみを有効にしている場合、SCP は使用できません。
:::

※SCPはIAMユーザーやグループに権限を付与するわけではないです。あくまでもフィルターとして機能します。
したがって、SCPで記述した内容がIAMポリシーを上書きしたりすることはありません。ただし、SCPで拒否(Deny)されているものは、IAMポリシーで許可されていても拒否されるので注意が必要です。
【Python】Lambda Layerの作成方法

# Lambda Layerを作成したいがめんどくさい
Lambda LayerはAWS Lambdaに標準で用意されていないライブラリや自分で作成した関数などを取り込む際に利用します。
一見zipファイルを作成してアップロードするだけなんですが、いくつか落とし穴があります
- Amazon Linuxで作成する必要がある（場合がある）
    - LambdaはAmazonLinuxで動いている
    - macOSなどでインストールしたものがAmazonLinuxで動かない場合があるため
- 求められるディレクトリ構造が実はある
- apiでのzipアップロードはファイルサイズの制限がある

などなどで躓いたのでやり方をまとめておきます

## AmazonLinuxでのpython実行環境の用意
構築方法は別記事にまとめました。ローカル環境（macOSやWindows）でインストールしたライブラリをアップロードすると、動くときもありますが動かないときもあります。仮に動いたとしても、基本的にはAmazonLinuxで作成するほうが良いでしょう。
pythonはLambdaで使用するバージョンと合わせる必要があります。

https://qiita.com/YujiHamada3/items/e1124b78f7d89b53c498

## ディレクトリ構成
適当にディレクトリを作成してもLambdaが読み取ってくれません。具体的な構成は以下のリンクを参考にすると良いでしょう。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/packaging-layers.html

バージョンを含める場合は
```
python/lib/python3.x/site-packages
```
といった構成にする必要がありますが。単一のバージョンで良ければpythonという名称のディレクトリを作成してそこにライブラリをインストールする必要があります。
よくわからない仕様にも思えますが、実際にLambdaで使うときはこのzipを解凍して、ある程度ディレクトリ構成を統一させる必要があるからかなと思っています。とはいえこのような仕様はもっと大きくはっきりと書いてほしいなと言う個人的な思いはあります。

## インストール方法
作業場所は任意でOKです。
まずはpythonディレクトリを作成します。
```shell
mkdir python
```

続いてインストールするライブラリ一覧を書き込むrequirements.txtを作成します。
```:requirements.txt
pandas
requests
```

今回は基本的なライブラリのpandasとrequetsを対象としました。
```
pip install -r requirements.txt -t ./python
```
次にインストールしたディレクトリをzipファイル化します。
```shell
zip -r python.zip python
```

## Lambda Layerにアップロード
今回はすでに作成されているレイヤーにアップロードする前提でいきます。
アップロードする際は
```shell
aws lambda publish-layer-version \
	--layer-name hoge-layer-name \
	--description "" \
	--zip-file fileb:///path/to/python.zip \
	--compatible-runtimes python3.12 --region ap-northeast-1
```
これで完了するのですが、api経由だとファイルサイズが50MBの制限があります。
この制限を超えたアップロードするには一旦ファイルをS3に置く必要があります。

```shell
aws s3 cp /path/to/python.zip s3://backet_name/path/to/python.zip
```

そしてpublic-layer-versionコマンドで、先程アップロードしたS3オブジェクトを参照させます。
```shell
aws lambda publish-layer-version \
	--layer-name hoge-layer-name \
	--description "" \
	--content S3Bucket=bucket_name,S3Key=path/to/python.zip \
	--compatible-runtimes python3.12 --region ap-northeast-1
 ```

 これにてlayerの作成が完了します。ライブラリが増えるとあっという間に50MBを超えるので面倒ですが、S3を経由させます。
 より簡単なやり方あったら知りたいです。よろしくお願いします。
2024年版[Git] コマンド一覧_個人用途

## 予備知識
| 1 | 2 |
|:-:|:-:|
|  origin main |  リモートリポジトリの `main` ブランチ |
|  origin/main |  ローカルリポジトリの `main` ブランチ |

## Gitコマンド一覧

| コマンド |  | 説明 |
|:-:|:-:|:-:|
|  `git add` |   |   |
|  `git commit -m "任意のコメント"` |   |   |
|  `git push origin [ブランチ名]` |   |   |
|  `git checkout [ブランチ名]` |   |   |
|  `git pull origin [ブランチ名]` |   |   |
|  `git remote -v` |   |   |
|  `git remote add origin [リポジトリURL]` |   |   |
|  `git remote set-url origin [リポジトリURL]` |   |   |
|  `git branch -m current-name new-name` |   |   |
|  `git reset --soft [巻き戻したい時点のコミットを指定]` |  コミットだけ |   |
|  `git reset (--mixed) [巻き戻したい時点のコミットを指定]` |  コミットとステージ |  `git reset` コマンドのデフォルトです。また、`git reset` でHEADを指定しなかった場合は、ステージのみがリセットされます。  |
|  `git reset --hard [巻き戻したい時点のコミットを指定]` |  コミットとステージ、ワーキングツリー |   |
|  `git rm -r --cached [ディレクトリ名]` |   |  指定したディレクトリを強制的にキャッシュから削除します。 |
|  `git config -l` |   |  設定の一覧 |

## GitHubのリモートリポジトリで `merge` するまで

| コマンド |  | 説明 |
|:-:|:-:|:-:|
|  `git add .` |  ステージに追加 |   |
|  `git commit -m "任意のコメント"` |  コミット |  トラッキング（追跡）中のローカルのリモートリポジトリにコミットします。 |
|  `git push origin [ブランチ名]` |  プッシュ |  リモートリポジトリに
プッシュします。|

**GitHubで `merge` する** ：`push` したブランチを、GitHubで `main` ブランチに `merge` する。

## ローカルリポジトリのワーキングツリーに `merge` するまで

| コマンド |  | 説明 |
|:-:|:-:|:-:|
|  `git checkout main` |   |  マージする `main` ブランチに移動します。 |
|  `git pull origin main` |  プル |  リモートリポジトリから直接、ブランチマージを行います。 |
|  `` |   |   |

**GitHubで `merge` する** ：`push` したブランチを、GitHubで `main` ブランチに `merge` する。

## 
| コマンド |  |  説明 |
|:-:|:-:|:-:|
|  `git remote -v` |   |  現在のリモートリポジトリを確認します。 |
|  `git remote set-url origin [リポジトリURL]`
 |   |  リモートリポジトリを変更します。 |