OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript: as const [アウトプット全くしてこなかったのでアウトプットする001]

自分は「プログラミング業務外でやりたくない期間」と「プログラミング業務外でもめっちゃやりたい期間」が1年の中で交互に来るのですが、今は割とやりたくなってきているのでいつまで続くかわかりませんがアウトプット記事を書いていきます。

### 何もつけない場合

```ts
const cawauchi = {
  height: 176,
  weight: 73.5,
  from: "栃木"
};
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/bc46e81f-3e51-8a7e-ca3d-b66c382ab69a.png)

上記の場合以下で値を代入可能です。

```ts
cawauchi.height = 122;
```

### constアサーション


```ts
const cawauchi = {
  height: 176,
  weight: 73.5,
  from: "栃木"
} as const;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/4153a7be-de30-18a0-8b4f-91ee25640521.png)

readonlyの場合以下で値を変えようとするとエラーを出してくれます。

```ts
cawauchi.height = 122;
```

> 可能な限りプロパティにreadonlyを付けましょう。特に、関数が引数としてオブジェクトを受け取る場合はreadonlyの使用を徹底しましょう。
これは、関数がプロパティを書き換えるかどうかを型の上にドキュメント化し、さらにTypeScriptによるチェックを受けられるという意味があります。

代入をしたりしない場合、可能な限りreadonlyをつけるのが良いとありました。

> 逆に言えば、渡されたオブジェクトを変更しない関数の場合は引数のオブジェクトの型に積極的にreadonlyを付けるべきだということです。これにより、その関数を使う人は、関数の中身を見なくても型情報を見るだけで「この関数は渡されたオブジェクトを破壊しない」という安心感を（TypeScriptコンパイラによる保証付きで）得ることができます。
さらに言えば、readonlyという道具が存在するにも関わらずreadonlyが付いていないということは、そのプロパティを勝手に変更するかもしれないよという意思表示だということです。これは「変数宣言にconstではなくletをわざわざ使うということはその変数をあとから変更するという意思表示である」という考え方と同じです。

なるほどなるほど.....

> この問題を低減させる方法のひとつとして、Readonly<T>組み込み型を用いる方法があります。これは、Tの全てのプロパティにreadonlyを付加して得られる型です。これなら型定義の際に全てのプロパティにreadonlyと書く必要がなくお手軽です。活用しましょう。

```ts
type FooBarBaz = {
  foo: number;
  bar: number;
  baz: number;
}

function sum(obj: Readonly<FooBarBaz>) {
  obj.foo = 999; // これはコンパイルエラー
  return obj.foo + obj.bar + obj.baz;
}
```

おおお....!

参考

https://qiita.com/uhyo/items/0fd033ff1aed9b4b32dd

強くなりたい!!!!!!!!
AWS:Honeycodeで勤怠管理アプリを作成

# 背景
・1日の仕事終わりに退勤時間を入力する癖がない。
・週末にまとめて入力するが、何時まで勤務したか履歴を探すのに時間をかけてしまっている。
・仕事終わりは、早く帰りたい気持ちが強くて退勤時間を記入・メモせずに帰宅してしまう。
&rArr;毎日、退勤時間をメモするアプリを作成する。
# 内容
・スマホで簡単に入力できるようにする。
&rArr;（仕事終了後の退勤時の電車内や、夕食後には必ずスマホを触るので）
&rArr;（業務PCは現場に置きっぱなしなのでPCでの操作はNG）

・AWSのHoneycodeを利用
&rArr;簡単にモバイルアプリが作れる。
# 参考
・[1 AWS記事](https://aws.amazon.com/jp/builders-flash/202008/honeycode-attendance-management/?awsf.filter-name=*all)
・[2 AmazonHoneycodeノーコードで出退勤アプリを作成してみた](https://xp-cloud.jp/blog/2021/01/22/10857/)

# 実際の作業
1. Honeycodeで表を作る
   手書き、CSVデータを読み込ませるなどで表を作る
![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/19f5c148-9074-3866-cd10-f8cbee276aaf.png)
2. この表を元にアプリを作成する
   下画像の赤枠をクリック
![screen 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/b1eaca29-2b02-5e3c-494d-815404fb0fa2.png)
3. 「Use app wizard」を起動する
クリック後に下画像が表示されるので、「Use app wizard」をクリック
![screen 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/cb781a38-58a7-e01f-e989-7ef49915a8a9.png)
4. App Wizardに沿ってアプリを作成する
   ソースとなる表を選択して「Next」をクリック
   表示する項目などを選択し、「Done」まで進んで、「Done」をクリック
![screen 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/12ce020f-9947-5a82-0490-2aedd186d9d7.png)
5. アプリ作成完了
![screen 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/6dc85abe-ec70-a6ac-625c-51b4714759c2.png)

6. スマホでアプリストアでHoneycodeをインストールして開く
ログインすると、作成したアプリが表示されるのでクリックする
![screen 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/8756243f-4aa0-7140-257c-0c0aa495e76a.png)
7. アプリ表示画面
入力した勤怠時間を確認できる
画面の「＋Add」をクリックすると勤怠時間を追加できる
勤怠時間をクリックすれば、入力した項目を編集・削除も可能
![screen 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/9baa1438-9419-48c0-79bd-dec2f6db008b.png)
# 所感
・こんなに簡単にアプリが作成できるとは驚きです。
・Honeycodeを触り始めてから数時間でできたので結構簡単に作成できると思います。
・日本語版がなかったので取っ付きにくい感はありましたが、慣れれば問題ないかな？
・後は実際に使ってみて勤怠管理の手助けになるか検証します。

以上。
.NET MVC プロファイル情報の取得

.NET MVC5で自身で追加したプロファイル情報を取得したかったのですが、明確に記載されていた記事がなかったのでメモとして残します。

```c#:プロファイル情報の取得方法
//HttpContextからApplicationUserManagerを取得
var manager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
//ApplicationUserManagerを使ってユーザーIDで検索
var user = manager.FindById(User.Identity.GetUserId());
//プロファイルに追加した項目（↓の場合はhogehoge）を取得
Debug.WriteLine("プロファイル情報:"+user.hogehoge);
```
ファイル関連をかく

- ファイルを扱うときのみ**enctype**をつける
- accept="video/*"で取り込みデータを限定できる。この場合は動画。
- fileapiというJSのライブラリが存在し、フロント側で画像やファイルの生データを取得することができるみたい

```javascript
   <form action="" method="post" enctype="multipart/form-data">
        <input type="file" accept="video/*">
    </form>
```

※ファイル選択とセレクトボックスはonClickではなくonChangeで選択したバリューが変更された時にイベントが発火するようにしたほうがいい
Power Automate + Forms + Onedrive + Excel online で作る勤怠システム（Forms 編）

# 目次
- [はじめに](#はじめに)
- [タイムシート](#タイムシート)
    - [設問作成](#設問作成)
    - [共有設定](#共有設定)
- [まとめ](#まとめ)
- [リンク](#リンク)


# はじめに
　本記事を見つけて頂き、ありがとうございますm(_ _)m
　本記事は、 [Power Automate(web) + Forms + Onedrive + Excel online で作る勤怠入力システム](https://qiita.com/crispy_1741/items/58d9ffd9172cc48f8d59) の続編になります。今回は入り口であるFormsについてです。各入力内容と質問の種類について説明します。
![qiita2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/0aa3f8af-8e62-03b0-f317-277f5da295e3.png)

# 設問作成
　Excel のsheet1の列が入力する内容になります。改めてテーブルと項目を確認しましょう。
　また、今回は細かく伝える内容がないので簡単な説明で留めます。
![Qiita2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/07a6a76a-c56e-c699-19b7-66a62fc60f5d.png)
##### 更新日時
- 作成しません。
- [Automateで現在の時刻を生成します。](https://www.teijitaisya.com/powerautomate-datetime/)
##### 日付
- 日付入力
##### 出勤時刻、退勤時刻、休憩時間
- テキスト（短い）
- 数字入力の制限をかけてください
##### 勤怠区分
- ラジオボタン（ドロップダウンリスト）
##### 備考
- テキスト（短い、長いどちらでも可）

# 共有設定
**自分の所属組織内のユーザーのみが回答可能**
にしてください。そうすることで、
- ユーザーを識別できるので、ユーザーが社員番号を入力する手間が省け、入力ミスを回避できます。
- その代わり、入力前にMicrosoftアカウントでログインが必要になります。

# まとめ
　今回はFormsについての内容でした。
　後述する内容な...特にないです...。

# リンク
- [準備・仕組み 編](https://qiita.com/crispy_1741/items/58d9ffd9172cc48f8d59)
- [Excel 編（タイムシート）](https://qiita.com/crispy_1741/items/6db3cdfe09d43c9559d3)
- [Power Automate 編](https://qiita.com/crispy_1741/items/8b91c6fa2df111f1f4d9)
[C++] new演算子による配列のメモリの動的確保

# はじめに
備忘録として、メモしました。

# 配列の定義

## 1. 配列サイズは定数のみ

### エラーなし

- 配列宣言時に要素数を指定

```swift
int array[5];  // 要素数 5 の配列を宣言
```

- const（定数）で要素数を定義

```swift
const int n=5; // まずは配列の要素数を定数として定める
int array[n];   // 要素数 n の配列を宣言 (これなら n は定数なのでコンパイルは通る)
```

### エラーあり

- nは定数でなく、変数なのでコンパイルエラー

```swift
int n=5;       // まずは配列の要素数を決める
int array[n];  // 要素数 n の配列を宣言 (しかしコンパイルエラー！！)
```

# 2. 配列サイズをコンパイル時に確定しなければならない

これを確かめるために、

プログラム実行中に、配列サイズを決められるかどうかを考える。

### エラーあり

- nは定数でなく、変数なのでコンパイルエラー

```swift
int n;       // 配列の要素数として用いる

std::cout << "配列の要素数を入力してください : ";
std::cin >> n;  // この行は初めて登場するが、「コンソールから入力された値を n に代入する」という意味である
std::cout << "読み込まれた n の値は" << n << "です\n";

int array[n];  // 要素数 n の配列を宣言 (n は定数ではないのでコンパイルエラー！！)
```

- 定数constは宣言時に初期化しなければならず、値を変更しようとするとコンパイルエラー

```swift
const int n;       // 配列の要素数として用いる

std::cout << "配列の要素数を入力してください : ";
std::cin >> n;  // 今度は定数 n を変更しようとしてコンパイルエラー！
std::cout << "読み込まれた n の値は" << n << "です\n";

int array[n];  // ここまで到達しない)
```

以上のことから、配列サイズはコンパイル時に確定している必要があることがわかる。

→

では、プログラム実行中に配列サイズを決めたい場合、どうするか？

→

new演算子によるメモリの動的確保（ポインタの利用）

# new演算子によるメモリの動的確保（ポインタの利用）

配列の動的確保 = プログラム実行中に配列サイズを決定

```cpp
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;       // 配列の要素数
    int *a_heap; // int型のポインタ（後に配列として利用）

    cout << "配列の要素数を入力してください: ";
    cin >> n; // 配列の要素数をキーボードから打ち込む

    // new演算子で整数n個分のメモリを確保
    // 要素数n個の配列として使用可能
    a_heap = new int[n];

    // 以降、利用法は普通の配列と同じ（最後にdeleteでメモリ解放忘れずに）
    for (int i = 0; i < n; i++)
    {
        a_heap[i] = 2 * i;
    }

    for (int i = 0; i < n; i++)
    {
        cout << a_heap[i] << endl;
    }

    // new演算子で確保したメモリ領域は、deleteで必ず解放する！（しないと、メモリリーク発生）
    delete[] a_heap;
}
```

## ポイント

- ポインタ（*a_heap）をあらかじめに宣言
- 配列の要素数nをキーボードから入力 ( = プログラム実行中に配列サイズを決定)
- 要素数n個の配列のメモリを`a_heap = new int[n];`
- new演算子で確保したメモリ領域は、**deleteで必ず解放**する！← メモリリークを防ぐ

## ヒープ領域とスタック領域
配列のメモリ領域の図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/934e2726-fe3f-cce9-d5d7-6db2d3c396dc.png)

- スタック領域：自動変数である、**ポインタ変数 a_heap** が格納される
- ヒープ領域：new演算子により確保されるメモリが配置される。
    - new演算子で確保された配列 a_heap を使い終えたら、delete[] a_heap によってヒープ領域のメモリを解放 ← メモリリークを防ぐ

メモリリーク発生時の図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/9b145939-c5a4-f783-315d-6eec0f36e4c4.png)

# 参考
* https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/prog1/11-02.html
Python スレッドのフラグ管理をEnumとStateパターンでおこなう

# はじめに
今までスレッドの状態管理をBool値を使っていたし状態遷移を直接代入方式でやっていた。今回、開発中のアプリのコード数が増えてきたこともあり、また、ワンランク上のコーディングをしたいという欲もでてきたので挑戦してみた。

# 以前のコード

```python
class MainThread():
    def __init__(self) -> None:
        self.is_running_thread1 = True
        self.is_running_thread2 = True
        self.is_running_thread3 = True

    def task1(self):
        # スレッド1の状態がRUNか否か
        if self.is_running_thread1:
            print('thread1 is running.')
        time.sleep(1)
        # スレッド1シャットダウン
        self.is_running_thread1 = False
        # スレッド1の状態がシャットダウンか否か
        if not self.is_running_thread1:
            print('thread1 has shutdown.')
    
    # 以下省略
    ...
    ... 
    ...
```

コード数は短いけどテストがやりにくいし、なんか幼稚なコード。

# 挑戦したコード

```python

# ---------
# スレッド名
# ---------

class ThreadName(Enum):
    THREAD1 = auto()
    THREAD2 = auto()
    THREAD3 = auto()

# -------------
# スレッドの状態
# -------------

class Thread1(Enum):
    RUN = auto()
    SHUTDOWN = auto()


class Thread2(Enum):
    RUN = auto()
    SHUTDOWN = auto()


class Thread3(Enum):
    RUN = auto()
    SHUTDOWN = auto()

# -------------
# Stateパターン
# -------------

class State():
    def __init__(self) -> None:
        self.thread1 = Thread1.RUN
        self.thread2 = Thread2.RUN
        self.thread3 = Thread3.RUN

    def shutdown(self, thread):
        if thread == ThreadName.THREAD1:
            self.thread1 = Thread1.SHUTDOWN
        elif thread == ThreadName.THREAD2:
            self.thread2 = Thread2.SHUTDOWN
        elif thread == ThreadName.THREAD3:
            self.thread3 = Thread3.SHUTDOWN

   # もしくはスレッドごとに分ける
   # そうすれば引数なしで呼べる
   # def shutdown_thread1,thread2,thread3

# --------------------------------
# スレッドで実行させるタスク
# 
# -- 行うこと --
# スレッドの状態がRUNか否か
# スレッドをシャットダウン
# スレッドの状態がシャットダウンか否か
# ---------------------------------

def task1(state: State):
    # スレッド1の状態がRUNか否か
    if state.thread1 == Thread1.RUN:
        print('thread1 is running.')
    time.sleep(1)
    # スレッド1をシャットダウン
    state.shutdown(ThreadName.THREAD1)
    # スレッド1の状態がシャットダウンか否か
    if state.thread1 == Thread1.SHUTDOWN:
        print('thread1 has shutdown.')

# 以下、task1と同様

def task2(state: State):
    if state.thread2 == Thread2.RUN:
        print('thread2 is running.')
    time.sleep(2)
    state.shutdown(ThreadName.THREAD2)
    if state.thread2 == Thread2.SHUTDOWN:
        print('thread2 has shutdown.')


def task3(state: State):
    if state.thread3 == Thread3.RUN:
        print('thread3 is running.')
    time.sleep(3)
    state.shutdown(ThreadName.THREAD3)
    if state.thread3 == Thread3.SHUTDOWN:
        print('thread3 has shutdown.')


def run(self):
    thread = MainThread()
    thread.run()


if __name__ == '__main__':
    # run()
    state = State()
    th1 = threading.Thread(target=task1, args=(state,))
    th2 = threading.Thread(target=task2, args=(state,))
    th3 = threading.Thread(target=task3, args=(state,))
    th1.start()
    th2.start()
    th3.start()
    th1.join()
    th2.join()
    th3.join()
```

# 感想

どうでしょうか

# 参考
https://nishi2.info/pydp/GoF_dp/behavior/20_State/index.html
https://ufcpp.net/study/csharp/st_enum.html
[Flutter] firebase_storage_platform_interface-4.1.0/lib/src/method_channel/utils/exception.dart:19:11: Error: Member not found: 'Error.throwWithStackTrace'.     Error.throwWithStackTrace(exception, stackTrace);

## エラー文

```dart
../../development/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_storage_platform_interface-4.1.0/lib/src/method_channel/utils/exception.dart:19:11: Error: Member not found: 'Error.throwWithStackTrace'.
    Error.throwWithStackTrace(exception, stackTrace);
          ^^^^^^^^^^^^^^^^^^^
../../development/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_storage_platform_interface-4.1.0/lib/src/method_channel/utils/exception.dart:22:9: Error: Member not found: 'Error.throwWithStackTrace'.
  Error.throwWithStackTrace(
        ^^^^^^^^^^^^^^^^^^^
../../development/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_storage_platform_interface-4.1.0/lib/src/method_channel/utils/exception.dart:14:7: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
Never convertPlatformException(
```



# 解決策　

```
firebase_storage: 9.0.0 #バージョンを合わせる
```
完全オフラインで日本語対応のSpeech Recognitionモデル「Vosk」を試す

# 概要
完全オフラインで日本語対応のSpeech Recognitionモデル「Vosk」を試す

## 手順
1. 実行環境を用意
2. 音声ファイルを用意
3. 実行

### 実行環境を用意
```sh
cd $work_dir
pip3 install vosk
wget https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip
unzip vosk-model-small-ja-0.22.zip
mv vosk-model-small-ja-0.22 model
```
### 音声ファイルを用意
適当なmp3ファイルを用意して
```sh
ffmpeg -i "target.mp3" -vn -ac 1 -ar 44100 -acodec pcm_s16le -f wav "output.wav"
```

### 実行
```python:run.py
#!/usr/bin/env python3

from vosk import Model, KaldiRecognizer, SetLogLevel
import sys
import os
import wave

SetLogLevel(0)

if not os.path.exists("model"):
    print ("Please download the model from https://alphacephei.com/vosk/models and unpack as 'model' in the current folder.")
    exit (1)

wf = wave.open(sys.argv[1], "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
    print ("Audio file must be WAV format mono PCM.")
    exit (1)

model = Model("model")
rec = KaldiRecognizer(model, wf.getframerate())
rec.SetWords(True)

while True:
    data = wf.readframes(4000)
    if len(data) == 0:
        break
    if rec.AcceptWaveform(data):
        print(rec.Result())
    else:
        print(rec.PartialResult())

print(rec.FinalResult())
```
```sh
python3 ./run.py output.wav
```
AWSでWebサイトを作ってみた(1) AWS設定編

[出来上がったWebアプリケーションはこちら](http://aws-portfolio-infra.com/)

次の記事はこちら(執筆中)


今回は[AWS](https://aws.amazon.com/jp/)を利用し、自身でサーバーを立て、記事のキーワードを自動抽出するWebアプリケーションを作成してみました。



# 目次
* [概要](#概要)
    * [利用しているサービス、構成](#利用しているサービス、構成)
        * [モニタリング等](#モニタリング等)
* [AWSの設定](#awsの設定)
    * [AWSの作業用アカウント作成](#awsの作業用アカウント作成)
    * [CloudWatchで料金アラートを設定](#cloudwatchで料金アラートを設定)
    * [CloudTrailで操作ログを記録](#cloudtrailで操作ログを記録)
* [終わりに](#終わりに)
* [参考文献](#参考文献)

# 概要
AWSを使ってWebサイトを作る前にAWSの各種設定を行っていきます。

## 利用しているサービス、構成


### モニタリング関連

| リソースなどのモニタリング | アクティビティなどのトラッキング |内容保存 |
|---|---|---|
|CloudWatch |CloudTrail |S3 |





# AWSの設定
## AWSの作業用アカウント作成
[IAM](https://aws.amazon.com/jp/iam/)というユーザーのアクセス制御を行えるサービスです。
IAMを用いて作業用ユーザーを作成しました。ルートユーザーは絶対的な権限を持つため、むやみに使用するのは危険なのです。

本来なら、AWSのサービスごと(EC2,RDSなど)に作業用ユーザーを作成するのがセキュリティ上好ましいですが、今回一人で開発を行うためAdministratorAccessの権限を持ったIAMを作成しました。




## CloudWatchで料金アラートを設定
[CloudWatch](https://aws.amazon.com/jp/cloudwatch/)は様々なアラーム作成できるサービスです。AWSからの思いがけない料金を請求されないように、事前に請求アラームを作成します。

まず、請求アラームを作成するために請求設定を変更します

マイ請求ダッシュボードを開きます

![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/cf65aeeb-879e-51d2-1d38-797699eb8b0d.png)



設定の請求設定を開き、チェックボックスにチェックをつけます
![請求ダッシュボード.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/4bacf14e-5d25-cf53-b0f3-04b4a50d9757.png)



Cloudwatchで以下のように設定します

|タイプ |閾値 |アクション |
|---|---|---|
|メイトリクスアラーム |6時間以内の1データポイントのEstimatedCharges>5 US$ |設定したGmailに送信 |


注意点
* 請求アラームを作成する際にはリージョンを確認しましょう
    * 特定のリージョン(米国東部(バージニア北部)など)でしか設定することが出来ません。




不明点
* ~~請求アラームを作成したが、アクションの欄に警告が発生~~→解決
   * ~~このアクションの SNS トピックが見つかりませんでした。存在しない可能性があります。~~
   *アラームの編集画面で、トピックを作成しアラームに登録することで解決

以下のように新しいトピックを作成にチェックマークをいれ、任意にトピック名をつけ、送り先のEmailを設定してください。
        ![SNStopic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/18ebeac1-7b47-c2b1-b082-c709e4ba5174.png)




## CloudTrailで操作ログを記録
[CloudTrail](https://aws.amazon.com/jp/cloudtrail/)はAWSユーザーの操作を記録するサービスです。これによって誰がどの操作をしたのかがわかるようになります。

CloudTrailで以下のように設定

|証跡名(任意) |全リージョンに適応 |管理イベント |データイベント| S3パケット |
|---|---|---|---|---|
|cloudtrail-log |はい |読み込み/書き込み すべて | アカウントすべてのS3パケット選択 |aws-and-infra(新規作成) | 

設定をすることで以下のように操作や通知のログが記録されます。また、リージョンごとに記録される内容が異なるので注意です。

バージニア北部(請求関連のログが多い)
![trail_region_va.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/48cd4049-2a12-f858-da19-8cc4b275eb66.png)

東京(インスタンス関連のログが多い(インスタンスの設置場所だから))
![trail_region_tk.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/86d0c473-d7d7-1abe-34d3-74836533e7e9.png)


注意点
* CloudTrailを保存するS3というサービスは料金がかかる
    * 無料枠が設定されているが、すぐに超えてしまう

# 終わりに
本記事では主にAWSの設定について行ってきました。AWSは無料枠はありますが、基本有料サービスなので思いがけない料金が請求される可能性があるので注意しましょう。

次の記事ではローカルネット、サーバー構築を行っていきます。


# 参考文献
* [AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)
ReactiveCommand.WithSubscribe() 使用時の RC本体の破棄について

## はじめに

@okazuki さん がメンテナーを務めておられる [ReactiveProperty](https://github.com/runceel/ReactiveProperty) に関する記事になります。
趣味のWPFアプリ開発で長い間 愛用させていただいているのですが、勘違い（勝手な思い込み）をしているところが見つかり、かずき さんに質問した内容をまとめた記事になります。

知ってる人にはとっては「今更何言っての？」って内容かもしれません 😭

## 本題

`ReactiveCommand` を作成する場合、 `WithSubscrbe()` を使って `Action` の購読までメソッドチェーンで一気に書くことがあります。
以下のコードでは  `ICommand.CanExecute()` を 1秒ごとに切り替えます。

```C#
TimerCommand = Observable.Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1))
    .Select(x => (x & 1) == 0)
    .ToReactiveCommand()
    .WithSubscribe(() => Message = $"Clicked!", _disposables.Add);
```

`WithSubscribe()` に `Disposer` を指定しており、`_disposables.Dispose()` を実行すれば **後腐れなく全てが破棄** される。　**と思い込んでおりましたが、その認識は間違いでした。**

実際に `Disposer` に登録されるのは 購読した `Action` のみで、 `ReactiveCommand` 自体は登録されません。
そのため上のコードでは、`_disposables.Dispose()`  後も Timer が動作し続けて、`ReactiveCommand.CanExecute()` は変化し続けます。（`Action` は破棄済みなので `Command` を実行しても何も起きません）


## 対策

`ReactiveCommand.WithSubscribe()` の使用時は `ReactiveCommand` 自体も破棄の対象に登録しましょう。

```C#
TimerCommand = Observable.Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1))
    .Select(x => (x & 1) == 0)
    .ToReactiveCommand()
    .WithSubscribe(() => Message = $"Clicked!", _disposables.Add)
    .AddTo(_disposables);    // ◆これが必要!!
```

思い込みって怖いですね。

## サンプルコード

[hsytkm/RpTimerDemo: Dispose ReactiveCommand when using WithSubscribe method.](https://github.com/hsytkm/RpTimerDemo)

## 環境

VisualStudio 2022 17.2.0 Preview 1.0

.NET 6.0 + C# 10.0 + WPF

ReactiveProperty 8.0.3
AtCoderのインタラクティブ問題をjavascriptで提出する

# AtCoderのインタラクティブ問題をjavascriptで提出する

結論だけ言うと、
入力はnodejsのreadlineモジュールを使う
出力はconsole.log()でOK(flush処理は特にしない)
最後にreadlineをcloseしておいた方がよい(下記の問題では不要だったがAHC008では必要だった)

例として
https://atcoder.jp/contests/language-test-202001/tasks/practice_2
にあるC++のサンプルコードを移植してみると：

```typescript:l_interactive_sorting.ts
import {createInterface} from 'readline';

const readline = createInterface({
  input: process.stdin,
  // output: process.stdout,
});

const input: string[] = [];

readline.on('line', (line: string) => {
  input.push(line);
});

const getLine = async () => {
  while (input.length === 0) {
    await new Promise(resolve => setTimeout(resolve, 0));
  }
  return input.shift();
};

const close = () => {
  readline.close();
};

const main = async () => {
  const [N, Q] = (await getLine()).split(' ').map(elem => parseInt(elem));

  const s = [];
  for (let i = 0; i < N; ++i) {
    s.push(String.fromCharCode('A'.charCodeAt(0) + i));
  }

  for (let i = 0; i < N; ++i) {
    for (let j = 0; j < N - 1; ++j) {
      console.log(`? ${s[j]} ${s[j + 1]}`);
      const ans = await getLine();
      if (ans === '>') {
        const work = s[j];
        s[j] = s[j + 1];
        s[j + 1] = work;
      }
    }
  }
  console.log(`! ${s.join('')}`);

  close();
};

main();
```
Golang学習ノートDay１


# 学習動機
去年FBがMeta社名変更ということで、BlockChainGameやNFTといった仮想通貨関連のものがブームになった。
自分もいくつのBGCに参加しているところです。
※余談ですが、STEPNというゲームで毎日ジョギングするようになった。

今後もメタバース、ブロックチェーンゲーム、NFTなどの仮想通貨関連のプロジェクトに
企業やユーザがどんどん入ってくるだろうと考えて、仮想通貨関連の技術を学ぼうと思います。

# 目標
Go言語を使って、日本国内の取引所のAPIを利用した独自の仮想通貨取引サービスを開発する。
EC2を立ち上げ、サービスをデプロイする。
※AWS関連の知識も絶賛勉強中

# Golang学習方向
Golangに関して、詳細はこちらのページで詳しく紹介されています。
↓↓↓↓↓↓↓↓↓↓↓↓↓
[Go言語(golang)とは？ 特徴・できること・人気の理由について徹底解説](https://type.jp/et/feature/9445/#:~:text=Go%E8%A8%80%E8%AA%9E%E3%81%AF%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2,%E3%82%82%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%AE%E4%B8%80%E3%81%A4%E3%80%82 "Qiita Home")

Golangを学習することで、以下の開発に携われるんじゃないかと思います。
１、ブロックチェーン関連の開発
２、Webサーバー構築
３、Golangマイクロサービス/クラウドエンジニア

# 開発環境構築
１、Golangをダウンロードして、インストール
　・https://go.dev/dl/　
  　・ 最新版をダウンドールする
    ![スクリーンショット 2022-02-27 135451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549664/a28823e8-74d8-d502-a92d-80c8e37369c3.png)

　・ダウンロードしたファイルを実行し、インストールする。
　　PATH自動追加のオプションにチェックつけること、そうでない場合に、
　　自分でシステム環境変数**Pah**（追加されたSDKのbinパス）と**GOROOT**（SDKインストール先）を指定する
　　※すでにインストール完了のため、過程は割愛する。　

　・インストール完了後、プロンプトラインを起動し（WIN＋R　cmd）
　　go versionコマンドで確認する。画像のように表示されたらOK
![スクリーンショット 2022-02-27 135901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549664/8b7e38da-7aa5-6f5f-463f-393dd83558c3.png)

２、開発ツール（VScodeを使用する）をインストール
　　WINDOWSの場合はこちら
　　↓↓↓↓↓↓↓↓↓
　・https://code.visualstudio.com/docs/?dv=win
　　・ 最新版をダウンドールする
　※インストールはポジポジするだけなので、ここでは割愛する。

３、自分のプロジェクトフォルダとgoファイルを作成する
　・GoLearning
　　・main
　　　・test.go
　　・package
```
package main
import "fmt"

func main(){
	fmt.Println("hello,world")
}
```
　
![スクリーンショット 2022-02-27 141847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549664/f1412a14-701c-3cad-914a-b194d8d6e306.png)

４、プロンプトラインでgoファイルをbuildする
![スクリーンショット 2022-02-27 143024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549664/c3ebbe41-c3cb-c86f-ca36-de29d9200caf.png)

build後、test.goはコンパイルされて、test.exeファイルが生成される。
![スクリーンショット 2022-02-27 143100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549664/06bf7b2d-7c8c-638e-aca9-3c3ae43b0313.png)


５、test.exeファイルを実行する
　hello,worldが出力される
![スクリーンショット 2022-02-27 143251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549664/176b29f9-eb1c-839c-5a47-72f18a824b3a.png)

※　go run test.goコマンドも同じ結果が出力されますが、それはあくまでテストなどで、手抜きするため
　go run のコンパイルは裏で実行されています。
![スクリーンショット 2022-02-27 143541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549664/625c1f4f-59ec-08ec-fc08-2ed807237273.png)


今回VScodeで実行していませんが、次回からVScodeで学習していきたいと思います！
[Flutter] Error: Member not found: 'Error.throwWithStackTrace'.の解決策


```
/Flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth_platform_interface-6.2.0/lib/src/method_channel/utils/exception.dart:14:11: Error: Member not found: 'Error.throwWithStackTrace'.
 Error.throwWithStackTrace(exception, stackTrace);
       ^^^^^^^^^^^^^^^^^^^
/Flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth_platform_interface-6.2.0/lib/src/method_channel/utils/exception.dart:17:9: Error: Member not found: 'Error.throwWithStackTrace'.
Error.throwWithStackTrace(
     ^^^^^^^^^^^^^^^^^^^
/D:/Flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth_platform_interface-6.2.0/lib/src/method_channel/utils/exception.dart:12:7: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.

Never convertPlatformException(Object exception, StackTrace stackTrace) {
   ^
FAILURE: Build failed with an exception.
```




# 解決策

```
firebase_auth: 2.0.0
```

バージョンを変えてみるといいっぽいですね。


# 参考文献

https://stackoverflow.com/questions/71274499/error-member-not-found-with-flutter-firebase-auth-package
GitHubにデモ動画を簡単に埋め込む

GitHubのREADME.mdにデモ動画を埋め込む方法を自身の記録用として記すことにしました。(Windows10)

手順は次の通りです
**1.デモ動画を撮る
2.デモ動画の画面サイズを小さくする
3.デモ動画をGIFファイルに変換する
4.README.mdに埋め込む**

# 1.デモ動画を撮る
Windows10の場合、標準で画面録画をできるので利用していきます
※ただし、録画するウィンドウは1つのみになります。また、録画するウィンドウはあらかじめ出しておく必要があります

`Windows + G`で以下のようなものが出るので丸いところをクリックして録画します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549439/e6037fd3-c32e-95f7-8975-c2ef028da4b7.png)

これでデモ動画はできました

# 2.デモ動画の画面サイズを小さくする
画面録画をしているのでサイズが大きくなりがちです
画面のサイズ自体を小さくするためにこちらのサービスを使いました（アカウント登録をすれば無料でできます）

[Adobe Creative Cloud Express 無料でビデオをサイズ変更](https://express.adobe.com/ja-JP/tools/resize-video)

動画を選択してサイズをカスタムで指定すれば小さいサイズにしてくれます

# 3.デモ動画をGIFファイルに変換する
mp4ファイルなどの動画をGIFファイルに変換するサイトやソフトはたくさんあるので、何かしらを使ってGIFファイルに変換します
[EZGIF.com Video to GIF converter](https://ezgif.com/video-to-gif)

Processingで作った全然正確じゃない太陽系モデルのデモ動画はこんなのになりました↓
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549439/b5ce0069-7e82-001b-a9d7-5599a94fb9ca.gif)

# 4.README.mdに埋め込む
調べているとWikiリポジトリをcloneするというのが大体ですが、もっと簡単な方法を見つけました。こちらのサイトを参考にするとわかりやすいです
[GitHub の Wiki に画像を貼り付ける一番簡単な方法（Wiki リポジトリを clone しないバージョン）](https://akiyoko.hatenablog.jp/entry/2016/08/30/051708)

手順としては、
- GitHub Issueに貼り付けたい画像をドラッグ&ドロップ
- 生成されたタグをコピー
- GitHub Wikiに貼り付ける
- README.mdにも貼り付ける

```markdown
***DEMO:***

![demo](コピーしたタグhttps://user.images......gif)
```

# おわりに
私が作ったデモ動画はこのような感じになりました(実際は動いています)↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2549439/3d3b17ed-7981-1bb6-c1f6-3901344220f5.png)
[Solar System Model -GitHub](https://github.com/NinaNakajima/SolarSystem)

Wikiに貼るときに画像が大きすぎると貼れないので、どうにかして簡単にサイズを小さくできないか、簡単に埋め込められないかと考えた結果です。
GitHub自体もまだ慣れていなくて試行錯誤の連続ですが少しずつ使いこなしていければと思っています💦
Linux:chromeのプロフィールパスの場所 

メモ用

以下コマンドで検索
`find ./ -name "google-chrome" -type d`
↓
結果
`./.config/google-chrome/Default`

通常上記のコマンドで出てくるが、インストール直後など、一度もchromeを起動しない状態だとDefaultフォルダが存在しない模様。
AWS Solution Architect Associateに合格しました

## この記事で書くこと
2022/02/23にAWS Solution Architect Associate試験を受け、なんとか合格しました。
この記事では合格までに行った対策や何を使って勉強したのかをメインに記していきます。
これから受験される方にとってなにか参考になれば幸いです。

この記事を書いている筆者のAWS歴はおよそ2年半ほどで、主に業務上で利用しています。
触っているサービスは以下のとおりです。
- VPC系リソース（VPC, Security Group, ACL...）
- EC2系リソース（EC2, ELB, Target Group...）
- ECS系リソース（主にFargate）
- Route53
他にも色々ありますがメインで触っているのは上記のとおりです。

## 受けてみた所感
受けてみた感想としては、オンプレミスを触ったことなくずっとクラウドでインフラ管理をしている身としては思ったよりも難しかったです。
（オンプレミス -> クラウドへの移行に関する問題が多かった印象でした）
また細かい仕様に関する知識が必要になる問題もあったので業務で利用しているだけでは足りなかったなぁと言うのが本音でした。

この部分を補うために以下のような勉強を行いました。

## 勉強方法
人それぞれ勉強方法はあると思いますが、自分は以下のように勉強しました。

1. 本を読んで試験に必要な知識を全体的に広く浅く取り込み、付属の問題集を解く
1. 間違えたところをAWS Blackbelt等読んで勉強する
1. AWS公式の模擬試験やUdemyで模擬試験セットを解く
1. 間違えたらまたBlackbeltや公式ドキュメントを読む
1. もう一度問題集を解く
1. また間違えたらBlackbeltや公式ドキュメントを読む
1. もう一度問題集を解く
1. 以下わかるまで繰り返し

以上の流れで勉強をしていきました。

## 期間
およそ1ヶ月くらいで、平日週1で2時間・休日も土日それぞれ2時間くらい勉強していました。

## 利用した本やテキスト
### 読んだ本
評価がまあまあ高いので買ってみましたが、
出題範囲が網羅されていてどんなサービスが問題に出るかを把握するといった意味では最適かと思います。
唯一気になったのは、巻末の模擬試験が簡単なものだった点です。
この模擬試験だけ受けて実際の試験を受けると難易度のギャップにびっくりしていたかもなぁと思いました。

https://www.amazon.co.jp/gp/product/4815607389/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

### 模擬試験
上記の通り、巻末の模擬試験が簡単だったのもあってもうすこし試験の感覚を掴みたいなと思いました。
そのときに利用したのはAWS公式の模擬試験とUdemyで購入した模擬試験です。

#### AWS公式の模擬試験
これに関してはクラスメソッドさんの以下の記事が詳しいと思うので紹介します。
https://dev.classmethod.jp/articles/new-aws-official-practice-questions/

以前まで有料であった模擬試験が無料で受けられるようになったのでこれを解きました。
問題数は本番とは違い20問でしたが、実際の出題文の感覚や難易度を掴むには問題ないかと思います。

#### Udemyの模擬試験
いくつか模擬試験テキストは有ると思いますが、自分は以下のものを使いました。
https://www.udemy.com/share/101rfM3@8pNclpYjBE_SkrpY2ezzXtJP_KnNGQ2v0F9Pfrv6R0d7IK3WSOVan1_Cc4jS3jJLHg==/

65問 × 6回分あるため、これを一周してわからない部分を潰していく、という流れで勉強していくのが一番効果があったかなと思います。
最初の一周目は6割くらいしか解けないかもしれませんが、何週かしておよそ8割9割くらい取ることができれば本番でも問題ないかと思います。

## 試験当日
当日は今まで解いた模擬試験をさらっと見直す程度で臨みました。
自分はテストセンターで受験しました。
何人か別に受験している人はいますが静かで集中できる環境でした。とてもありがたかったです。
時々問題の日本語が分かりづらい部分があったりしますが、英文も読むことができるので英文を見つつ日本語も見ていけば特に問題ないかと思います。
時間も2時間近くあるので、焦らずじっくりと考えて解いていけば問題ないと思います。
あとから問題を見直すためのチェックもできるので見直しも楽でした。
出た問題の所感としては自分が触っていたサービス以外にDB系（AuroraやRedshift、DynamoDB）、オンプレミスとクラウドを繋ぐサービス（Storage GatewayやDirect Connect、Site-to-Site VPN...）、S3のストレージクラス系の問題がよく出題されました。

## 結果
結果として合格することができました。
模擬試験で見た問題そのままの問題が出たり勉強したところに刺さるような問題も出たので、
事前に模擬試験をやっておくのはおすすめです。
合格のボーダーラインは72%ということなので、
少しくらいなら間違えても大丈夫というマインドで臨みました。

## まとめ
今回AWS SAAを受験しました。
正直このような資格試験は初めてだったので緊張していたのですが、
対策をしっかりして臨めばちゃんと合格できることを実感しました。
自分がやった中で特に効果があったと思うのはUdemyで購入した模擬試験だと思います。
本番の試験の傾向に沿って作成されており、問題の内容もアップデートされているので試験を受ける方にはおすすめです。

以上が自分の体験記です。
これから受験される方への参考になれば幸いです。
wiktionaryのxmlをwikiextractorで整形するとtextの情報が減る

# 概要
[wiktionary](https://ja.wiktionary.org/wiki/Wiktionary:%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)の情報を使って辞書を作りたく、[wikiextractor](https://github.com/attardi/wikiextractor)で文章の整形（マークアップ等の除去）を試みたところ、なぜかtextの情報が減ってしまった。
wikipediaではなくwiktionaryを整形しようとしているので、wikiextractorに非はない。
とりあえず、作業録として残しておく。

注：2022年に書いた記事です。当時は自分用として限定公開にしていましたが、積極的に隠すほどでもないと考え直して公開します。


# 環境

```
% sw_vers
ProductName:	macOS
ProductVersion:	11.6.1
BuildVersion:	20G224
% python -V
Python 3.9.10
```

## 手順

wikiextractorを利用して、wiktionaryのjsonデータを作成

```
curl -O https://dumps.wikimedia.org/jawiktionary/latest/jawiktionary-latest-pages-articles.xml.bz2
pip install wikiextractor
# 以下でtextというフォルダの中にwiktionaryのpage情報を１行に一つずつ書かれたテキストファイルが生成される
python -m wikiextractor.WikiExtractor data/jawiktionary-latest-pages-articles.xml.bz2 --json
# 一つのファイルに纏めたい場合。今回は必須ではない。
cat text/*/* > jawiktionary.txt
```

pythonで中身を確認

```Python
import json
import os
path = os.path.join("text","AA","wiki_00")

data = {}
with open(path) as f:
  for line in f:
    jsondata = json.loads(line)
    title = jsondata["title"]
    assert title not in data
    data[title] = jsondata

# 「杞憂」の中身を出力
print(data["杞憂"])
```

```
{'id': '725', 'revid': '329', 'url': 'https://ja.wiktionary.org/wiki?curid=725', 'title': '杞憂', 'text': '日本語.\n名詞.\n杞憂（きゆう）\n\n（\u3000簡体字:杞忧）'}
```

textの内容がwebpageに書かれているものと比べて明らかに少ない。

```
# https://ja.wiktionary.org/wiki?curid=725 より抜粋
日本語
名詞
杞憂（きゆう）

将来のことについて、する必要のない心配をすること。根拠のない心配。取り越し苦労。杞人憂天。
杞憂に終わる
杞憂に過ぎない
次に女子解放運動が、女子をして、その母性を失わしめると論じるのも理由のないことで、事実を離れた、一種の杞憂です。（与謝野晶子 『「女らしさ」とは何か』）
由来
古代中国の杞 (wp)と言う国の人が「いつか天地が崩壊してしまうのではないか」と心配していたという故事より。杞人の憂い。（出典『列子』天瑞篇）
「杞」は夏 (wp)の遺民が封ぜられた国であり、周代後期以降、時代遅れの風習を有する国とのイメージがあり、このような例の引き合いに出された。同様の例として、殷 (wp)の遺民が封ぜられた宋 (wp)がある（例.「守株」、「宋襄の仁」）。
関連項目
終末論
訳語
フランス語:souci
中国語
名詞
杞 憂（qǐyōu　簡体字:杞忧）

（日本語に同じ）。
同義句
杞人憂天/杞人忧天
```

「杞憂」はたまたま見つけただけだが、これに限らず、情報が落ちているタイトルがありそう。
いったん、wikiextractorを使うのは諦める。

# 参考
jawiktionaryのDLリンク
https://dumps.wikimedia.org/jawiktionary/latest/

wikiextractor
https://github.com/attardi/wikiextractor

wikiextractorの使い方Tips
https://qiita.com/hoppiece_/items/72753b7ac08f0bd4993f
git->完全初心者のための完全初心者によるコマンドメモ

初心者のgit memo
今回の使用環境
IDE　Cloud9
git version 2.18.5

※ターミナルでの操作方法です

gitの設定
ターミナルで 
$ git config --global user.name "ユーザの名前を入力"
$ git config --global user.email "email の入力"
$ git config --global core.editor 'vim -c "set fenc=utf-8"' // テキストエディタにvim
　　　　　　　　　　　　　　　　　　　　　　　　　// を使用し日本語対応にする
設定の確認
$ less ~/.gitconfig // lessはテキストファイルの設定を確認するためのコマンド

ディレクトリの作成
$ mkdir // mkdirはディレクトリを作成する　mkdir〇ディレクトリnameを記入
例　$mkdir git_repositories

使用するディレクトリへの移動
$ cd // コマンドプロンプトの略
$ cd git_repositories // git_repositoriesディレクトリに移動

ディレクトリ内のgitの初期化
$ git init //initialize現在いるディレクトリの配下を対象に初期化を行う

新しいファイルの作成
$ touch //directoryの中に新しいファイルを作成
使用例　$ touch practice.js // directoryの中にpractice.jsファイルが作成される

ステータスの確認
$ git status // gitのステータスを確認できる

作業ステージに登録
$ git add ファイル名　// gitにファイル内の情報を登録

リポジトリにコミット
$ git commit -m "message" // 任意のmessageを入れた情報がコミットされる（リポジトリに登録される）

ログの確認
$ git log // git の更新情報を確認できる

$ git log ファイル名 // ファイル名のgitのlogを確認できる

$ git log -p // commitで行われた差分を確認できる

$ git log -p ファイル名　// 指定したファイル名のcommitで行われた差分を確認できる

ワーキングツリーとステージの差分を確認する
$ git diff //ワーキングツリーとステージ領域の差分を表示する。差分がない場合は何も起きない

$ git diff HEAD // コミットする内容がきちんとしたものか確認するために使用する。
　　　　　　　　前回のコミット（HEAD）との差分を確認するためのコマンド

コミットの取り消しについて
・revert(指定したコミットを取り消す）
　履歴が残り、取り消したいコミットに新しく上書きするイメージ
・reset(コミットをなかったことにする)
　履歴が消える、間違えた時のリスクが大きいのであまり使わない

コミットの打ち消し
$ git revert HEAD // 最新のコミットを打ち消す
$ git revert 取り消したいコミットのハッシュ値　// 取り消したいコミットを打ち消す
enter を押すとエディタが立ち上がるので　:w　でセーブできる　:wq　と入力する

コミット自体をなかったことにする
$ git reset --hard 戻りたいコミットのハッシュ値　// ハッシュ値のコミットまで戻れるが履歴などが削除されるため、間違えてしまうと復旧が不可能になる可能性がある。

対象ファイルの削除
$ git rm ファイル名 // ファイル名のファイルを削除します
$ git diff HEAD //で確認し
$ git commit -m "remove ファイル名" // コミットしリポジトリに登録
これで対象ファイルの削除が完了します

ブランチ
・共同で作業を行うときに使う個々に与えることのできる作業スペースみたいなもの

ブランチの確認（現在使用しているブランチの確認）
$ git branch // ブランチの一覧を表示する＋自分の現在いるブランチ名がわかる＊ブランチ名の箇所に自分がいます

ブランチを新しく作成
$ git branch ブランチ名 // ブランチ名のブランチを新しく作成する

ブランチの選択を切り替える
$ git checkout ブランチ名 // ブランチ名のブランチに自分が移動します

ブランチのマージ
マージとはコミットのようなもの
$ git merge --no-ff ブランチ名 // ブランチ名のブランチをマージする

マージしたログを確認
$ git log --graph // マージを確認する

コミットメッセージの修正
$ git commit --amend -m "修正後のメッセージ" // 直前のコミットのコミットメッセージを変更できる
dockerで構築したローカルサーバーをスマホなど外部機器でアクセスする方法

# 概要
dockerでローカルサーバーを立ち上げたときに、スマートフォンでの検証をする場合などがある。その際に、スマートフォンに対して`http://localhost:8000`などとアクセスしてもつながらないことがあった。ファイアウォールの設定が関係しており、外部機器でのつなぎ方の設定を記載する。

# 使用端末
- win10


# 方法
* 設定
1. 「セキュリティが強化されたWindows Defender ファイアフォール」を開く。
1. 左の項目から「受信の規則」を選択
1. Docker Desktop Backend(プロファイル　パブリック)を探す
1. 許可されていないとなっている場合があるため、右クリックでプロパティを開き、許可するを選択して、適用
1. また, パブリック以外になっていたら、パブリックにする
1. 2つあると思うので二つとも許可とパプリックに設定する(UDP, TCP)
1. 再起動(念のため)

* 実際に接続してみる
1. 外部機器（スマホなど）とパソコンを同じWi-Fiにつなぐ。
1. dockerにてローカルサーバーを立ち上げる。
1. `$ ipconfig`でデフォルトゲートウェイが開いているipv4の値を見る。
1. スマホで`http://(ipv4の値):(ポート番号)`でアクセス可能

# 最後に
今回はDockerで構築したローカルサーバーのアクセス方法を示したが、`npm`など他のツールでローカルサーバを立ち上げた時は、そのツールに対して同じ設定をする必要がある。(npmだと受信の規則一覧にnodeっぽい名前の設定項目があるはず)
three.jsでスプライトのrenderOrderが正しく反映されないとき

# 解決法

## 順序を指定したい"全てのmaterial"に同じtransparentを設定する
* `Material.transparent = true`

**Object3D.renderOrder**
> This value allows the default rendering order of scene graph objects to be overridden  although opaque and transparent objects remain sorted independently

https://threejs.org/docs/index.html?q=object3#api/en/core/Object3D.renderOrder

https://github.com/mrdoob/three.js/issues/9447

## 同じZに複数のスプライトを描画する場合、materialにdepthTest=falseを設定する
* `Material.depthTest = false`

**Material.depthTest**

https://threejs.org/docs/index.html#api/en/materials/Material.depthTest

https://stackoverflow.com/questions/30407288/using-renderorder-in-three-js/30408704#30408704

**注意**
Rendererでdepth=falseを指定していてもこの設定は必要。ブラウザによって挙動が異なる。
* Firefox: MaterialでdepthTest:falseを設定していなくても正しく表示される
* Chrome/Edge: MaterialでdepthTest:falseを設定していないと正しく表示されない
Jqueryでsubmitを行う際に、inputタグを追加する方法

##書こうと思った理由
Jqueryでsubmitを行い、submit先に応じて異なる情報を渡したい時があり、inputタグを追加する方法で実装を行ったので、自分のメモとしてまとめておこうと思いました。

##参考コード


```html:index.html
 <form action="~~~~" method="POST">
    <input type="hidden" name="果物" value="りんご">
    <input type="hidden" name="趣味" value="テニス">
  
    <button class="fruit" type="button" title="果物"></button>
　　<button class="hobby" type="button" title="趣味"></button>
 </form>


```

```javascript:jquery

<script>
$('.fruit').on('click',function(){
  var $form = $(this).parents('form');
  $("<input>",{type:"hidden", name:"果物", value:みかん,}).appendTo($form);
  $form.submit();
  });

$('.hobby').on('click',function(){
  var $form = $(this).parents('form');
  $("<input>",{type:"hidden", name:"趣味", value:映画,}).appendTo($form);
  $form.submit();
  });

</script>

```

##説明

まず、form内に2つのボタンを用意します。

```
<button class="fruit" type="button" title="果物"></button>
<button class="hobby" type="button" title="趣味"></button>
```


「果物」のボタンをクリックしたときには、下記の情報も追加で渡したいときがあったとします。
```
<input type="hidden" name="果物" value="みかん">
```

なので、jqueryでsubmitを実装するときに下記のように書きます。
```
$('.fruit').on('click',function(){
  var $form = $(this).parents('form');
  $("<input>",{type:"hidden", name:"果物", value:みかん,}).appendTo($form);
  $form.submit();
  });
```

これで、「果物」のボタンをクリックしたときだけ、追加でみかんの情報を持ったinputタグを追加することができます。
EC2へSSMで接続

手順メモです。

## IAMロール作成
IAM　→ ロール → ロールを作成　→ AWSのサービス　→ EC2　→ AmazonEC2RoleforSSM　→ （適当なロール名）→ ロールを作成
![Screen Shot 2022-02-27 at 12.14.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/65ef4e9e-9b66-977e-4d1e-6d1f18f533b2.png)
![Screen Shot 2022-02-27 at 12.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/f23a6436-0c1d-b5ab-0511-d726b8d5a436.png)

## VPC作成
- VPCを作成
- サブネットを作成
- インターネットゲートウェイの作成　→ VPCへアタッチ
- ルートテーブルを作成　→ 0.0.0.0/0 インターネットゲートウェイを追加 → サブネットへ関連付け

## EC2作成
EC2　→ インスタンス　→ インスタンスを起動　→ Amazon Linux 2 → 選択　→ t2.micro　→ 次のステップ　→ 自動割り当てパブリックIP：有効　/ IAMロール：（作成したIAMロール）　→ 確認と作成 → 起動　→ （起動まで数分待ち）
![Screen Shot 2022-02-27 at 12.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/515462c1-af59-9592-33eb-62693770cc84.png)
![Screen Shot 2022-02-27 at 12.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/3536ec2f-dfad-c36a-6d71-c425ff36979b.png)


## SSM接続
SSM → ノード管理 → セッションマネージャー → セッションの開始 → （作成したEC2を選択、選択肢へ反映されるまで数分かかる）　→　セッションを開始する

![Screen Shot 2022-02-27 at 13.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/90f50eb6-c222-1376-c426-231ffbc7dbad.png)

![Screen Shot 2022-02-27 at 13.02.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/f69c8594-6331-251f-a371-300af57334ad.png)
Vercel で Reactアプリをデプロイする際にエラーが出る


# 現象
`create react app`で作成したReactアプリを、Vercelでデプロイしようとした際に、ローカルでは問題なくビルドできているにもかかわらず、ビルドエラーになる。
Vercelのビルドログで下記のエラーメッセージが表示される。

```
Treating warnings as errors because process.env.CI = true.
```

# 対処法

環境変数 `CI` の値が `true`のため、worning が error として扱われています、ということなので。。

この環境変数をいじってよいものか、よくわからなかったのですが、下記の、Vercel のコミュニティでも同じ会話がされていたので、`CI`の値を`false`に上書きすることにしました。
https://github.com/vercel/community/discussions/30

Vercelの環境変数の設定はGUI上から可能です、下記を設定しデプロイを再実行したところ、エラーなく実行できるようになりました。

NAME: CI
VALUE: false


![add-env-variable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253713/5993977e-0ffc-a9d4-68eb-3608596cbf61.png)


# 参考

Vercelの環境変数について↓

https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables
Windows10でGitHubを始める～②GitHubアカウント作成

個人学習メモ。

GitHubは基本的に1ユーザー1アカウントの決まりであるため、自身のGitHubアカウントをすでに持っている方は本記事は飛ばして次の記事[「Windows10でGitHubを始める～③GitHubでのメールアドレス設定とGitクライアントでのユーザ名・メールアドレス設定」](https://qiita.com/emiki/items/4103150a5d7a7cfbff24)へ。

# 1.GitHubアカウントの作成
GitHubへアクセスし「サインアップ」。

https://github.co.jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/08b80491-9805-c63b-36d4-5f8111081eee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/dd09f050-1448-948a-32c6-dc1e6b26e6d1.png)

 - Username（ユーザ名）
 - Email address（自身のメールアドレス）
 - Password（設定するパスワード）

を入力する。Email preferencesはチェックしなくてよい。

Verify your account から指示に従ってアカウント認証を行う。
認証が完了したらCreate accountをclick。

プランの選択画面ではFree（無料プラン）を選択。
画面下部の Finish sign up をクリックすると仮登録が完了し、登録したメールアドレス宛にGitHubから確認メールが送られてくる。メールに記載されている「Verify email address」をクリックし、登録完了メールが届いたら本登録完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/0ea8aecc-7816-23f0-101f-f122f9227718.png)

# 2.推奨設定（2要素認証）
二要素認証も追加推奨。（私はAuthyを使用）

https://docs.github.com/ja/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication

# 参考
[Windows10でGitHubを始める～⓪Gitの概念とインストールソフトの種類](https://qiita.com/emiki/items/5c8e52cf6b8506015462)
[Windows10でGitHubを始める～①Gitインストール](https://qiita.com/emiki/items/c0aa0b4da4b63921b153)
[Windows10でGitHubを始める～①'おまけGitホームディレクトリ変更](https://qiita.com/emiki/items/d3f7c054b70171218f64)
[Windows10でGitHubを始める～②GitHubアカウント作成](https://qiita.com/emiki/items/dadf77e9ae1e2b192323)
[Windows10でGitHubを始める～③GitHubでのメールアドレス設定とGitクライアントでのユーザ名・メールアドレス設定](https://qiita.com/emiki/items/4103150a5d7a7cfbff24)
[Windows10でGitHubを始める～③'おまけユーザ名・メールアドレス設定について詳細](https://qiita.com/emiki/items/24212696b54fd16e8af8)
[Windows10でGitHubを始める～④リモートリポジトリの作成（GitHub）](https://qiita.com/emiki/items/5080d948af4a2d0febf5)
[Windows10でGitHubを始める～⑤Githubにプッシュする](https://qiita.com/emiki/items/a2871ab626396e95d9ec)
[Windows10でGitHubを始める～⑥-0.Git～GitHub間の認証について](https://qiita.com/emiki/items/eeaf77d51aadef98aea9)
[Windows10でGitHubを始める～⑥-1.Git操作時のGitHub認証HTTPS（Git Credential Manager）](https://qiita.com/emiki/items/3f2ebda7280374fb3bb7)
[Windows10でGitHubを始める～⑥-2.Git操作時のGitHub認証HTTPS（Personal access token）](https://qiita.com/emiki/items/498b05ede19eee3ad916)
[Windows10でGitHubを始める～⑥-3.Git操作時のGitHub認証SSH編](https://qiita.com/emiki/items/1f1fc0bf0c2c4347148d)
[Windows10でGitHubを始める～⑦GitHubへのPullRequest](https://qiita.com/emiki/items/8619441dca761869177f)

https://it-kyujin.jp/article/detail/263/

https://qiita.com/ayatokura/items/9eabb7ae20752e6dc79d
[Mac] ターミナルからChromeを起動する

# はじめに
Mac book proのターミナルからChromeを起動したかったので起動方法とコマンドのエイリアスの設定方法を備忘録として残します。

# ターミナルからChromeを起動する
ターミナルを開きopenコマンドで'Google Chrome'アプリを起動します。
引数にwebページのURLを渡してあげればChromeが開きwebページが表示されます。

```bash:ターミナル
$ open -a 'Google Chrome' 'https://google.com'
```

ローカルPC内の.htmlファイルを引数として渡すとwebページ同様Chromeで表示されます。

```bash:ターミナル
$ open -a 'Google Chrome' '~/sample.html'
```

# コマンドのエイリアスを設定する
コマンドのエイリアスを設定するには.zshrcにエイリアスの設定を記述します。(使用しているシェルの種類に応じて読み替えてください)
今回はchromeというコマンド名で設定します。

``` bash:ターミナル
# テキストエディターでzshrcを開きます
$ vi .zshrc
```

``` bash:ターミナル
# zshrcが開いたら下記を追記する
alias chrome="open -a 'Google Chrome'"
```

``` bash:ターミナル
# ターミナルに戻ったらzshrcを再度読み込む
$ source .zshrc

# chromeコマンドを起動してみる
$ chrome 'https://google.com'
```

# おわりに
時々ターミナルからChromeを開きたくなるので設定したくなり調べたら意外と簡単でした。
今回zshと記載しましたがbashでも変わらないと思います。

# 参考サイト
今回参考にさせてもらったサイトです。
ありがとうございました。

[MacのターミナルからChromeを開いてサイトにアクセスする](https://sumito.jp/2019/12/22/mac%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%8B%E3%82%89chrome%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9/)

[【初心者向け】エイリアスの設定方法](https://qiita.com/yutat93/items/b5bb9c0366f21bcbea62)
スキルアップAIの長期インターンに参加した話

# はじめに
スキルアップAIの長期インターンに参加し、修了したので内容と感想について書いていこうと思います。

# スキルアップAI長期インターンとは
　私が参加したインターンの正式名称は「AIエンジニアになるための長期インターンプログラム」です。スキルアップAIのHPによると、「AI領域で活躍するための長期インターンプログラム、半年でAIエンジニアの基礎スキルを身に着ける！」とあります。実際に内容としては人工知能に関する知識、それに関連する数学（確率統計、線形代数など）の知識、プログラミングの知識を全く持たない人でもAI人材を目指せるようになるようなものとなっていました。応募条件としても理系の学生のみ、などという制限はなく、人工知能に興味を持っている学生ならだれでも応募できました。私が参加したのは2023年卒、2期生のインターンです。

# 参加した理由
　私がこの長期インターンに参加した理由を説明するためにまず、日本ディープラーニング協会（JDLA）が主催しているE資格という人工知能の資格について説明します。

### E資格とは
　ディープラーニングに関して、かなり深い内容まで出題される資格です。日本で最も難しい人工知能に関する資格試験だと言われています。JDLAが主催している試験にG検定というものがありますが、この上位資格にあたります。G検定は誰でも受けることができますが、E資格は**JDLAの認定プログラムを修了した人のみ**受験することができます。しかし、この認定プログラムの受講料が非常に高額です。最近は安い講座が出てきましたが、私が最初にE資格を受験しようとした数年前は相場が20万～30万円でした。大学生が払うのにはかなり厳しい額です。

### E資格とインターンの関係
　上述のとおり、E資格を受けるために受講しなければならない講座はどれも高額なのですが、このスキルアップAIのインターンの中には、E資格の認定プログラムの内容が含まれています。つまり、**この長期インターンを修了すればE資格の受験資格が得られます。**このE資格の受験資格の取得が私が長期インターンに参加した理由になります。

# 進め方
　インターンに参加するとSlackに招待され、そのSlackに講義資料とその対応するプログラム、講義動画が見られるサイトへのリンクが貼られます。それらを利用して学習を進め、定期的にテストが実施され、合格すると次の講座を受けられるようになる、という流れになります。

# 内容
　長期インターンプログラムには、スキルアップAIが開講している複数の講座が含まれています。以下がその講座になります。
1. AIジェネラリスト基礎講座
1. 機械学習のためのPython入門講座
1. 機械学習・ディープラーニングのための基礎数学講座
1. 現場で使える機械学習・データ分析講座
1. 現場で使える機械学習・データ分析基礎講座

### 1. AIジェネラリスト基礎講座
　人工知能の歴史や、仕組み、主なモデル、法律などが内容に含まれており、Ｇ検定に対応した範囲となっています。

### 2. 機械学習のためのPython入門講座
　Pythonの基本的な文法から始まり、Numpy、Pandas、matplotlib、Seabornを学んだあとに、データの前処理の仕方、機械学習モデルの構築の仕方を実際にコードを書きながら学びます。

### 3. 機械学習・ディープラーニングのための基礎数学講座
　確率統計、微分、線形代数の中から機械学習とディープラーニングに関係する内容を学習します。基礎的な内容のあと、勾配降下法やロジスティック回帰など、具体的な使用例について学びます。

### 4. 現場で使える機械学習・データ分析講座
 Pythonを用いて、データ解析の際に用いる各種技法について学びます。回帰問題やモデルの評価指標、正則化、正規化など様々な分野について実際にコードを書きながら学んでいきます。

### 5. 現場で使える機械学習・データ分析基礎講座
　ディープラーニングの仕組み（誤差逆伝播法、オプティマイザー、損失関数など）からはじまり、CNN、RNN、トランスフォーマー、強化学習などについて学んでいきます。KerasやPytorchなどのディープラーニングのライブラリは使わずに、numpyなどの基本的なライブラリのみ使用して基本的なモデルのプログラムをかけるようになることが必要です。そのほか発展的なモデルについては知識として学んでいきます。修了条件として、選択式の知識テストとスキルアップAIが作成したカタカナ文字データセットの分類問題において精度98％以上を出せるモデルを構築するプログラミングテストの2種類を合格する必要があります。1～4までの講座はそれぞれ約1ヶ月で学習をしてテストを受けますが、この講座は3か月ほどかかります。

# 感想
　私は大学で人工知能を用いた画像解析の研究を2つ行っており、G検定についても数年前に合格済みなので、1～4までの講座はあまり難しく感じず、5の講座の勉強にほとんどの時間を費やしました。特に、最後の講座のCNNのところまでは、普段研究で使っているモデルなどについて、「こういう仕組みで動いているんだ、面白い」くらいの感じで学習できましたが、触れたことのないRNNやトランスフォーマー、強化学習の分野の勉強は大変でした。
　私はE資格の受験資格、およびその勉強としてインターンに参加しましたが、とても勉強になりました。大学で行っている研究に関しても生かせる知識がたくさん得られたので参加して本当に良かったと思います。
　Slackの自己紹介を見る限り、人工知能に関して研究やインターン経験があるのは数人で、ほかの人は全く知識がないようでした。そういう人はこの半年間本当に大変だったと思うし、最後の修了テストまで合格した人はすごいと思います。人工知能について知識がない人は大変だと思いますが、そのような人でも理解ができるようにかなり基本的な部分から丁寧に説明をしてくれるので、人工知能に興味がある人は参加してみることをオススメします。
構文解析と木構文

新しいプログラミング言語を設計するさいの留意点いろいろ:

https://cs.lmu.edu/~ray/notes/languagedesignnotes/

が書かれた記事が面白かったのですが、操作的意味論の構文の話が載ってないなと思ったので書いてみました。

通常の構文解析を考える場合は文字列を構文解析してASTを作るようなことを考えます。そのために BNF や EBNF、 PEG や パーサコンビネータ を使ってパーサを作るということがあります。文字列から構文解析するパーサを作るのは慣れると楽しいですし、高速に動作するので実運用上は必要な処理となります。

しかしながら、研究用の論文を読むとか、言語を100個作るとかいうことをやり始めますと、構文解析器を作る手間が気になり始めます。

そこで用いたいのが木構文です。代数的データ型やXML Schema、JSON Schema などが木構文定義の典型的な例です。

例えば四則演算のパーサを考えてみましょう。

次の例は [Ohmエディタ](https://ohmjs.org/editor/) での構文定義です:

```
Exp
    = AddExp

  AddExp
    = AddExp "+" MulExp  -- plus
    | AddExp "-" MulExp  -- minus
    | MulExp

  MulExp
    = MulExp "*" ExpExp  -- times
    | MulExp "/" ExpExp  -- divide
    | ExpExp

  ExpExp
    = PriExp "^" ExpExp  -- power
    | PriExp

  PriExp
    = "(" Exp ")"  -- paren
    | "+" PriExp   -- pos
    | "-" PriExp   -- neg
    | ident
    | number

  ident  (an identifier)
    = letter alnum*

  number  (a number)
    = digit* "." digit+  -- fract
    | digit+             -- whole 
```

これはテキストからの構文解析の意味をうまく表現されています。
具象構文と言います。

OCaml の代数的データ型で木構文を考えると以下のように書けます:

```
type exp =
  | Num of float
  | Add of exp * exp
  | Sub of exp * exp
  | Mul of exp * exp
  | Div of exp * exp
```

こちらは抽象構文(AST)と言いますね。
抽象構文を使うとカッコやテキスト表現は消えてスッキリしますが、具象構文がなくなってしまいます。

数学的なBNFを使うと以下のように書けます:

```
Exp ::=
  | Number
  | Exp + Exp
  | Exp - Exp
  | Exp * Exp
  | Exp / Exp
```

数学的な BNF は Union Types のある言語で AST を表現した形で構文と型の両方をうまく表現できます。
論文などではこの表現を1文字の記号で表すことが多く以下のように記述します:

```

t ::= n | t + t | t - t | t * t | t / t

図1. 構文

t は四則演算の式を表し n は浮動小数点数 t + t は加算、
t - t は減算、 t * t は加算 t / t は割り算を表します。
```

普通のプログラマにとって短い変数名はループ変数など以外は基本的にタブーですが、論文を書く際には当たり前のように１文字の変数を使います。

これは慣れないと気持ち悪いでしょうが、慣れると簡潔に書けるので便利ですから覚えると良いです。
git add -Aと.（ドット）の違い

# はじめに
git add \<options\> のよく使うオプションについてまとめてみました。
git add コマンドは、作業ディレクトリ内の保留中の変更をstagingエリアに進めます。commitをする前段階です。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [基本の使い方](#Chapter1)
1. [-Aオプション](#Chapter2)
1. [.（ドット）](#Chapter3)
1. [その他オプション](#Chapter4)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 基本の使い方
```
git add <ファイル名またはフォルダ名>
```
stagingエリアに追加したいファイル名またはフォルダ名を指定します。
指定には*（[ワイルドカード](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89_(%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86))）が使えます。

```zsh
git add sample.txt
git add sample_directory/
git add *.jpg #カレントディレクトリのすべてのjpgファイルをaddします。
```

<a id="#Chapter2"></a>
# -Aオプション
```
git add -A
または
git add --all
```
修正したファイル、削除したファイル、新規に追加したファイルなど変更のあった全てのファイルをaddします。（Gitの管理に含まれていないファイルも含まれます）


<a id="#Chapter3"></a>
# .（ドット）
```
git add .
```
基本的には-Aオプションと同じですが、コマンドを打つ場所によって結果が変わります。

-Aオプションではどこでコマンドを打っても結果が変わりませんが、.（ドット）では今いるディレクトリ配下のものしか対象にしません。

例えば、以下のようなフォルダ(dir0)があったとします。
dir1フォルダの中にはA.txtとdir2フォルダがあり、dir2フォルダの中にはB.txtがあります。
```
dir0
└── dir1
    ├── A.txt
    └── dir2
        └── B.txt
```
A.txtとB.txtに変更を加えた場合、結果は以下にようになります。
```zsh
# (dir0)の階層でコマンドを打った場合
(dir0) git add -A
add 'dir1/A.txt'
add 'dir1/dir2/B.txt'
(dir0) git add .
add 'dir1/A.txt'
add 'dir1/dir2/B.txt'

# (dir2)の階層でコマンドを打った場合
(dir2) git add -A
add 'dir1/A.txt'
add 'dir1/dir2/B.txt'
(dir2) git add .
add 'dir1/dir2/B.txt' # A.txtは含まれない！
```

<a id="#Chapter4"></a>
# その他オプション
### -u オプション
```
git add -u
または
git add --update
```
現在gitで管理しているファイルをのみを対象とします。
新規作成したファイル等は対象にしません。

### -n オプション

```
git add -n <確認したいオプション等>
または
git add --dray-run <確認したいオプション等>
```

\<確認したいオプション等\>には'A.txt'や'-A'、'-u'などが入ります。
このオプションでは実際にaddはされず、add対象になるファイルの一覧が表示されます。何がadd対象なのか事前に確かめたいときに使います。



<a id="#reference"></a>
# 参考文献
- [Git - git-add Documentation](https://git-scm.com/docs/git-add)