OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsに安全に引き渡せるzipファイルをmacで作る

環境: macOS Monterey

# 設定方法
1. ⌘キー+Spaceキーを押してSpotlight検索を開き、「Automator.app」と入力してAutomatorを起動する
2. ファイル選択ダイアログが表示された場合は、左下の「新規書類」を選択
3. 以下の画像の画面が表示されたら、「クイックアクション」を選択して右下の「選択」を押す 

   ![スクリーンショット 2023-02-10 12.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614520/f485c257-2076-f1c5-56e0-ef472fed94d9.png)

4. 左上の検索窓に「シェルスクリプトを実行」と入力すると、以下の画像のように1つだけ項目が表示されるので、この「シェルスクリプトを実行」アクションを右側の灰色の領域にドラッグ＆ドロップする
 
   ![スクリーンショット 2023-02-10 12.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614520/b948461d-c286-8c0a-38d7-9267c5ea6d17.png)

   正しく操作できていれば以下の画像のように表示される。

   ![スクリーンショット 2023-02-10 12.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614520/f4041ec2-9aec-ca10-9cfa-7d413e63a1d7.png)

5. 以下のように項目を指定する

   - ワークフローが受け取る現在の項目: 「ファイルまたはフォルダ」
   - 検索対象：「Finder.app」
   - シェル:「/bin/bash」

6. 「cat」のみ表示されているテキスト入力欄に、以下のコマンドをコピペする

    ```shell:Shell
    for target in "$@"
    do
        # 対象のファイル名を取得
        name="${target##*/}"
        filename="$name"
        # 対象のファイルがあるディレクトリのパスを取得
        path="${target%/*}"
        cd "$path"
        if [ -f "$f" ];then
            # 選択対象がファイルの場合
            filename=$(echo "$f" | cut -f 1 -d '.')
        fi
        zip -r "${filename}.zip" "$name" \
            -x "*.DS_Store" \
            -x "*._*" \
            -x "*.icloud"
    done
    ```

7. ⌘キー+Sまたはメニューバーの「ファイル」→「保存」から保存する。ファイル名がコマンド名になるので、わかりやすいものにしておくと良い
   (保存場所はどこでも良いが、iCloudのフォルダに入れておくとバックアップになる)

<details><summary>zipコマンドの説明</summary>

- `-r "${filename}.zip"`: 選択したファイルorフォルダの名前でzipを作る
- `-x "*.DS_Store"`: mac特有の `.DS_Store` ファイルを除外する
- `-x "*._*"`: mac特有のゴミファイルを除外する
- `-x "*.icloud"`: iCloud上にのみ存在する(ダウンロードされていない)ファイルを除外する

</details>

# 使い方
1. Finderで圧縮したいファイルorフォルダを選択
2. 右クリックで出てくるメニューのうち、「クイックアクション」から設定したコマンド名を選択すると実行される

# 参考
(このページの焼き増しになってしまった気もする)

https://creepfablic.site/2021/12/26/mac-zip-automator/

https://qiita.com/mrk461/items/b1fb15b189627e72e59e
Queue , Deque class

Queue performs FIFO(First In First Out) Queue
Deque is Double ended Queue. we can use addFirst or addLast to DeQueue.

```java
public class Outer {
    public static void main(String args[]) {
        Queue<Integer> q = new ArrayDeque<>();
        q.add(1);
        q.add(2);
        q.add(3);
        q.forEach(System.out::println);
    }
}
```
```
1
2
3
```
```java
public class Outer {
    public static void main(String args[]) {
        Deque<Integer> q = new ArrayDeque<>();
        q.add(1);
        q.add(2);
        q.add(3);
        q.addFirst(98);
        q.addFirst(99);
        q.addLast(5);
        q.addLast(6);
        q.forEach(System.out::println);
    }
}
```
```
99
98
1
2
3
5
6
```
Microsoft Azure Data Fundamentals(DP-900)を取得したときの勉強法

## はじめに
Microsoft Azure Data Fundamentals(DP-900)の試験に合格したので、資格取得に向けた勉強方法をまとめています。
今回の情報は、2023年1月末時点での情報です。

## 試験概要

問題数：42問
試験時間：45分
合格点：700/1000点

出題されるスキルと割合は以下のとおりです。
・主要なデータの概念についての説明（25～30%）
・Azureでのリレーショナルデータの考慮事項の特定（20～25%）
・Azureでの非リレーショナルデータを扱ううえでの考慮事項についての説明（15～20%）
・Azureでの分析ワークロードの説明（25～30%）

## 勉強方法
・Data Fundamentals: データの基礎の受講
２日間（半日ずつ）受講することで受験費用が１回分無料になるバウチャーがもらえました。
https://www.microsoft.com/ja-jp/events/top/training-days/azure?activetab=a1:primaryr6

・DP-900 : Microsoft Azure Data Fundamentals 試験対策の視聴
動画を１回視聴後、スライド資料を２回読みました。
スライド資料内にある問題を解いて覚えたり、わからないことは調べたりしました。

## 最後に
800点以上取ることができ、無事に合格できました。
試験を受けるまでは少し緊張しましたが、Microsoft Azure Data Fundamentals 試験対策の資料に載っていた問題と同じような問題が出たので試験中は落ち着いて受けることができました。
次はDP-203合格に向けて勉強していく予定です。
Mac のターミナルでオリジナルコマンド（エイリアス）を生成しよう

# エイリアスとは
ディレクトリの中身を一覧にするとき、どういうコマンドを打ってますか？
以下のようなコマンドを使いますよね。
```zsh
ls -al
```

毎回オプションの `-al` つけるの面倒だなぁ・・・と思っているそこのあなた！
エイリアスを使いましょう！！

## ~/.zprofile の確認
まずはホームディレクトリに .zprofile があることを確認しましょう。
`~/.zprofile` はログイン時に読み込まれるファイルです。
zsh シェルの起動時に実行されるコマンドや環境変数の設定などを行うために使用されます。
インタラクティブシェルとか、シェルスクリプトでは不要だけど、ログインシェルのときだけ必要な設定はここに書きます。

```
cd ~
ls ~/.zprofile
```

## ~/.zshrc の設定
次は zsh 起動時に実行される `~/.zshrc` を見ていきましょう。
ログインシェルとインタラクティブシェルの場合だけ読み込まれるファイルで、一般的に紹介されている記事ではこの設定ファイルにいろいろ記述することが多いです。
今回はこのファイルを弄っていきます。

vi コマンドで `~/.zshrc` を開きます。
```
vi ~/.zshrc
```

## エイリアスを書き込む
作成したいエイリアスを書き込んでいきましょう。
今回は `ll` と打てば、 `ls -ltr` が実行されるようにします。
```
alias ll='ls -ltr'
```

## 再起動 & 実行
編集を終えたら、ターミナルを再起動しましょう（再起動しないと、`command not found` が出ます）
そして `ll` コマンドを実行すると、`ls -ltr`と同じ結果がでることがわかります。
POSTのペイロードをどのContent-Typeで送信するか

## TL;DR

- プロダクトごとに統一できると嬉しい
- 筆者的には`multipart/form-data`がおすすめ
  - しかし、バックエンド側のパース処理が複雑になるケースがあるのでその場合は、`x-www-form-urlencoded`がおすすめ


## POST、PUTメソッドのペイロードでよく使われるContent-Type

- `application/json`
    - レスポンスのContent-Typeでは、おそらくこれが一番多いんじゃないか
    - JavaScriptで処理する場合はとても楽
    - しかし、TypeScriptでは型定義しないと危ないので他と比べるとコストが大きい気がする
    - 画像などのバイナリファイルをこれで送信するのは「技術的には可能」だが現実的ではない
- `x-www-form-urlencoded`
    - `hoge=123&huga=aaa`のようなURLクエリパラメータをペイロードに入れたような形式
    - 基本的には、format stringで組み立てるのはインジェクションされる可能性があり危険なので[`encodeURIComponent()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent)で値をエンコードしてあげる必要がある
        - `encodeURI()`という関数も存在するが違いは[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#encodeuri_%E3%81%A8_encodeuricomponent)を参照するとわかりやすい
        - [`URLSearchParams()`](https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams)を使うと`.set()`メソッドが使えて簡単にクエリパラメータを組み立てられて便利[^1]
        - `URLSearchParams()`の引数にFromDataを入れると変換が可能
            - しかし、FromDataにファイルが入っている場合うまく変換できないためTypeScriptでは`URLSearchParams()`の仮引数にFormDataを渡せない[^2]
                - この場合、FromData内にファイルが存在しないことが確定しているのであれば`URLSearchParams(from as any)`にしてしまってもRuntimeエラーは発生しない
- `multipart/from-data`
    - `FromData`クラスがあるのでJavaScriptからは楽に送信できる
    - しかし、JS以外からは結構大変[^3]なので避けられがち？
        - 外部APIとかでこれは見たこと無い
    - ファイルを送信する場合、これ一択な気がする
- `application/graphql`
    - GraphQLを使う場合のContent-Type
    - 特筆することは無い

## 筆者のおすすめ

`multipart/form-data`が個人的には大好きです。以下のように`fetch`の`data`に渡すだけで使えます。

```typescript
const from = new FromData();
from.append('key', 'value');
form.append('image', image);

const res = await fetch('/api', {
    method: 'POST',
    data: form
});
```

バックエンド側では、Goを使えば`r.FormFile("file")`のように簡単に取得できるので便利です。デメリットとしては、`x-www-form-urlencoded`などと比べるとペイロードのデータ量が比較的大きいのが挙げられます。

文字列だけの場合は`x-www-form-urlencoded`にして、画像のアップロードなどは`multipart/form-data`にするというのも良いかもしれません。

また、OIDCのGETでもPOSTでもどちらでも使用可能なAPIエンドポイント[^4]などを実装する場合は`x-www-form-urlencoded`が必須になるのかなと思います。


[^1]: [Form で submit されたデータの収集と FormData & URLSearchParams | blog.jxck.io](https://blog.jxck.io/entries/2018-01-13/formdata-urlsearchparams.html)
[^2]: [allow constructing URLSearchParams directly from FormData · Issue #30584 · microsoft/TypeScript](https://github.com/microsoft/TypeScript/issues/30584#issuecomment-890515551)
[^3]: Goなどは[multipart package - mime/multipart - Go Packages](https://pkg.go.dev/mime/multipart)パッケージなどがあり、こういうので組み立てると良い。
[^4]: [Final: OpenID Connect Core 1.0 incorporating errata set 1](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest)などは`Authorization Servers MUST support the use of the HTTP GET and POST methods defined in RFC 2616 [RFC2616] at the Authorization Endpoint.`とあるようにGETとPOSTメソッドで実装しなければいけない。
[Rails] WEBアプリケーションを作るにあたっての基礎の基礎を整理してみる

## はじめに
某有名プログラミングスクールを卒業後、スピードメインで授業を進めてしまった私はもう少し基礎の基礎を見直したいと感じた為、投稿を残していこうと思います。



## ルーティング、コントローラ、モデルの役割とは
大前提としてページを表示させる流れがいまいちだと
アプリケーションを作る際に、何がなんだかわからなくと思います。

### ルーティングの役割:point_up_tone1:
ユーザーがURLにアクセスした時に、要望を最初に受け取るのがルーティング！
受け取った内容によって、どのコントローラのどの処理を実行するかを判断して実行してくれる

### コントローラの役割:point_up_tone1:
ルーティングで判断された内容を元に、処理を実行して対応する画面を表示させる

#### ページを表示させるまでの流れ
ユーザーがURLにアクセス
↓
ルーティングがユーザーの要望を受け取る→受け取った要望をの内容をコントローラへ
↓
コントローラがビューに受け渡すインスタンス変数を定義→表示するビューファイル指定




### モデルの役割:point_up_tone1:
・データベースとのやり取りをする
・コントローラとも繋がってる

#### データベースとは？
データを格納する所（データを保存、高速検索ができるようになる！　商品名、会員情報etc...）




## まとめ
Railsで学んだことを整理したく簡単にはなりますがまとめてみました！
まとめることは大切だと再認識です。。。
ArrayList, LinkedList, Vector

ArrayListは動的配列拡張
LinkedListは数珠繋ぎ
Vectorはthread safe

```java
public class Outer {
    public static void main(String args[]) {
        List<String> l = new ArrayList<>();
        l.add("A");
        l.add("B");
        l.add("C");
        l.forEach(System.out::println);
        Consumer con = x -> System.out.println("--------");
        con.accept(null);
        l.parallelStream().forEach(System.out::println);
        con.accept(null);
        List<String> l2 = new LinkedList<>();
        l2.add("A");
        l2.add("B");
        l2.add("C");
        l2.forEach(System.out::println);
        con.accept(null);
        l2.parallelStream().forEach(System.out::println);
        Vector<String> v = new Vector<>();
        con.accept(null);
        v.add("A");
        v.add("B");
        v.add("C");
        v.forEach(System.out::println);
        con.accept(null);
        v.parallelStream().forEach(System.out::println);   //thread safe
    }
}
```
```
A
B
C
--------
B
C
A
--------
A
B
C
--------
B
C
A
--------
A
B
C
--------
B
C
A
```
git プロンプト

```
# 補完で小文字でも大文字にマッチさせる
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# git
autoload -Uz vcs_info
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{magenta}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}+"
zstyle ':vcs_info:*' formats "%F{cyan}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd () { vcs_info }

# プロンプトカスタマイズ
# branchの前を表示したい場合はboost noteを参照
# PROMPT='%F{cyan}$vcs_info_msg_0_%f $ '
PROMPT='%. %F{cyan}$vcs_info_msg_0_%f $ '
```
firestoreの階層構造について誤解していたこと

初歩的な間違い。
サブコレクションはコレクションの下に生えるわけではなく、ドキュメントの下に生えること。

誤　root_collection/second_collection/third_collection
正　root_collection/r1/second_collection/s1/third_collection/t1

最初はフォルダ構成のように考えていたので上の間違いに気づけなかった。パスで指定するときはコレクション→ドキュメント→...と交互に現れることになる。

https://firebase.google.com/docs/firestore/data-model?hl=ja
今更ながらWhileについて考えてみよう

今更ながらWhileを久しぶりに触りました。
なんかヘルプをみててもパッとしないんですよね。
なので、備忘録として書いておきます。

今回は、APIのZipcloudを使って、郵便番号から住所を取得する想定をしてやっていきまーす。

[While](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/while.html)の説明。（T_Tわかんねー...）
嚙み砕いていうと計算式のLOOP処理ですね。


そもそも[Zipcloud](http://zipcloud.ibsnet.co.jp/doc/api)について

（例）郵便番号「7830060」で検索する場合
https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060 

このようにハイフンなしで郵便番号を送るとJSON形式で回答がもらえます。
レスポンスサンプルには下記が書いてあります。
````
{
	"message": null,
	"results": [
		{
			"address1": "北海道",
			"address2": "美唄市",
			"address3": "上美唄町協和",
			"kana1": "ﾎｯｶｲﾄﾞｳ",
			"kana2": "ﾋﾞﾊﾞｲｼ",
			"kana3": "ｶﾐﾋﾞﾊﾞｲﾁｮｳｷｮｳﾜ",
			"prefcode": "1",
			"zipcode": "0790177"
		},
		{
			"address1": "北海道",
			"address2": "美唄市",
			"address3": "上美唄町南",
			"kana1": "ﾎｯｶｲﾄﾞｳ",
			"kana2": "ﾋﾞﾊﾞｲｼ",
			"kana3": "ｶﾐﾋﾞﾊﾞｲﾁｮｳﾐﾅﾐ",
			"prefcode": "1",
			"zipcode": "0790177"
		}
	],
	"status": 200
}
````

とりあえずFileMakerからAPIをたたいてみます。

````
変数を設定[$URL;
値:"https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060"

URLから挿入[選択;ダイアログあり:オフ;ターゲット:$Result;URL]

変数を設定[$Result;
JSONFormatElements ( JSONGetElement ( $Result ; "results[0]" ) )]
````

ここまで回すと
````
{
	"address1" : "高知県",
	"address2" : "南国市",
	"address3" : "蛍が丘",
	"kana1" : "ｺｳﾁｹﾝ",
	"kana2" : "ﾅﾝｺｸｼ",
	"kana3" : "ﾎﾀﾙｶﾞｵｶ",
	"prefcode" : "39",
	"zipcode" : "7830060"
}
````
こんな感じになっているはず。

これをJSONGetで一個ずつ取り出してもいいわけです。
けどスマートなのでしょうか...
なので私は無意味にWhileを使うわけです。
address1address2address3と規則が決まっているので、
１２３の順番で取れたらいいわけで。

先ほどの
[While](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/while.html)の説明。
````
構文
While ([初期変数] ; 条件 ; [ロジック] ; 結果)
````
初期変数 - 以降の引数に使用できる変数の定義
条件 - 各ループの繰り返しの前に評価される論理式。真の間はループが繰り返されます。偽になるとループは停止します。
ロジック - ループが繰り返されるごとに評価される変数の定義
結果 - ループが停止したときに返される式


ほおほおほお？

````
While ( 
[ 
  lst = $Result ; //JSONの中身
  tar = "address" ; //ターゲットの名称
  i   = 1 ; //繰り返ししたいi
  add = ""  //格納されるやつ
] ;
  i < 4 ;
[
  add = add & JSONGetElement ( lst ; tar & i ) ;
  i   = i + 1 
 ] ;
  add
 )
````
こんな感じかな？

見事に"高知県南国市蛍が丘"が取れました。
ありがとうWhile！！

高知県南国市蛍が丘てどこ？？？

Whileって便利だけど人選びそう。
もう少しヘルプも見やすくなったらいいのに。
【Snippet】動画フレームを静止画として切り出す

```python
import argparse
import os
import subprocess
from glob import glob


def create_arg_parser():
    parser = argparse.ArgumentParser()
    parser.add_argument('--dir', type=str, default='./')
    parser.add_argument('--dryrun', type=bool, default=False)
    args = parser.parse_args()  
    return args


def extract_frame(file_path, save_dir, dryrun=False):
    basename = os.path.basename(file_path)
    basename_without_ext = os.path.splitext(basename)[0]
    cmd = r'ffmpeg -i {} -r 2 -vcodec png -filter:v "crop=w=960:h=1280:x=0:y=0" {}/{}_%04d.png'.format(
        file_path, save_dir, basename_without_ext)
    print('Execute:', cmd)
    if not dryrun:
        subprocess.run(cmd)


def main():
    """
    dir/
    ├ sample01/
    ├   ├ file01.mp4
    ├   └ file02.mp4
    ├ sample02/
    └ sample03/
    """
    args = create_arg_parser()
    dir_list = glob(os.path.join(args.dir, '*'))
    if len(dir_list) == 0:
        raise ValueError('No directories')
    
    for i_dir in dir_list:
        mov_file_list = glob(os.path.join(i_dir, '*.mp4'))
        if len(mov_file_list) == 0:
            print('No files:', i_dir)
        
        for i_mov_file in mov_file_list:
            extract_frame(i_mov_file, i_dir, dryrun=False)         
 
    print('全て終了しました')



if __name__ == '__main__':
    main()
```
AWS Lambda Layer の作り方 - Python編

## Install python libraries
```shell
mkdir python
pip install -t python yahoo_fin stockstats
zip -r9 layer.zip python
```

## Create Lambda layer and upload zip file
```
aws lambda publish-layer-version \
    --layer-name python-layer \
    --license-info "MIT" \
    --zip-file fileb://layer.zip \
    --compatible-runtimes python3.7 python3.8
```
GithubでSPAを公開時の404エラーで詰まった話

# 何が起こった?
Github Pagesでreact_router_domのspaを公開した時に、url直打ちとかpushStateで404になる話。その解決策を備忘録として記します。(github Action使用)

# 解決策
404.html[(このサイトを参照)](https://maku.blog/p/9u8it5f/)をルートディレクトリに追加して、.github/workflows/main.ymlに下のように追記した。
```yaml
    - name: Build
      run: |
        npm ci
        cp ./404.html ./public/404.html　　//こいつを追加
        npm run build

```

この追記が必要なことに気付けず、ものっそい詰まりました()

参考・引用

https://maku.blog/p/9u8it5f/
【Metal】基本クラスの用語まとめ

Metalの記事や参考書を読む上で、クラスの概要を知っていないと中々理解が進まず
困っていたためMetalで使用されるクラスについてざっくりとまとめてみました


# MTLDevice
モデルデータを保持するバッファやテクスチャ領域をメモリ上に確保したい際にMTLDeviceに依頼する
# MTLCommandQueue
レンダリングコマンドをGPUに流すためのキュー
GPUのタスクが空くとプッシュした順にコマンドが実行される
# MTLCommandBuffer
CPUで作成したコマンド格納し、GPUで実行するためのコンテナ
# MTLCommandEncoder
レンダリングコマンドを作成するための役割を持つクラス
# MTLBuffer
モデルデータ（頂点のデータ）やその他レンダリングに必要なパラメータを記憶しておく領域
# MTLTexture
レンダリングに必要なテクスチャを管理するためのクラス
# MTKView
Metalを使用して描画する際のビュー
※UIKitのビューと同じように使用可能
# MTLLibrary
Metalライブラリにアプリからアクセスするためのクラス
# MTLFunction
Metalライブラリからバーテックスシェーダ・フラグメントシェーダ・カーネル関数を１つ１つ取り出したもの
# MTLRenderPipelineState
Metalライブラリのバーテックスシェーダ・フラグメントシェーダ・カーネル関数をレンダリングコマンドとして使うために
MTLRenderPipelineStateに持たせてMTLRenderCommandEncoderに渡す
# MTLTextureDescriptor
新しいMetalテクスチャを作成する際のオブジェクト
# MTLRenderPipelineDescriptor
レンダーパイプラインの状態オブジェクトを取得するためにデバイスに渡すオプションの引数
# MTLRenderPassDescriptor
レンダーパスの結果を保持するレンダーターゲットのグループ

# 参照
・[Metalのコードを読む前に知っておくと楽なこと](http://dsas.blog.klab.org/archives/52168969.html)
・[Metal入門の書籍](https://booth.pm/ja/items/826318)

# 補足
学習途中のためざっくりとした用語まとめになっております
よりわかりやすい用語集にするため、今後理解が深まった際に更新致します
HTMLでの御作法

## HTMLを書く上での御作法について

- HTMLファイルであると示す為に、1行目に必ず書かなければいけない！

```
<!DOCTYPE html>
```
- 2行目は下記のHTMLを書く。タグで囲うのはお作法。
```
<html>
    
</html>
```
- headタグを入れる。HTML文章の中での頭。head内に書いたコードはユーザから見えない。ブラウザーで重要な情報をこの中で書く。
```
<head>
    
</head>
```
- では、具体的に何を書くのか？


それは、metaタグのcharset。と　utf-8（文字コード） を書く事。文字コードを指定することで、ページの文字化けを防ぐことができる。UTF-8は、HTMLで推奨されている文字コード
```html
<meta charset="utf-8">
```

- viewport は→デバイスで見た時にどう写るかの設定を行う。
- width=device-width は→それぞれのデバイスに合わせて、webサイトを表示させる。
- nitial-scale=1 は→最初のズームの倍率は1。

```html
<meta neme="viewport" content="width=device-width,initial-scale=1">
```
titleタグは→タブに出る文言

```html
<title>Web page</title>
```
Google検索をする上でかなり重要な情報になる。

```html
<meta name="description" content="sample text txet text">
```

bodyタグの中に書くと、ユーザーから見える。

```html
<body>
あいうえお
かきくけこ
さしすせそ
 </body>
```

全体的にはこんな感じ。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta neme="viewport" content="width=device-width,initial-scale=1">
    <title>Web page</title>
    <meta name="description" content="sample text txet text">
  </head>

 <bodey>
 あいうえお
 かきくけこ
 さしすせそ
 </body>

</html>

```

## しかし、上記のタグを打たなくても大丈夫である。

html ：５　と打ってしまえば、あら不思議。


```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    aiueo
    kakikuko
    
</body>
</html>
```

こんな感じで、この中で作業をする。て事ですね
【Flutter】ShapeBorder継承でカスタマイズデザイン（応用編）

※本記事は下記のZenn本にまとめました。

https://zenn.dev/cxj/books/07def04506182d

# 目標
下記のような映画チケットを描くことです。
![](https://storage.googleapis.com/zenn-user-upload/355422ebf8f1-20230209.jpg)

カスタマイズ描画基本はCustomPaintの継承して描画しますが、今回はShapeBorderを継承してdecorationのshapeで装飾したいと思います。

# ShapeBorder継承
５つの抽象メソッドがあります。
```dart
import 'package:flutter/material.dart';

class TicketBorder extends ShapeBorder{
  @override
  // TODO: implement dimensions
  EdgeInsetsGeometry get dimensions => throw UnimplementedError();

  @override
  Path getInnerPath(Rect rect, {TextDirection? textDirection}) {
    // TODO: implement getInnerPath
    throw UnimplementedError();
  }

  @override
  Path getOuterPath(Rect rect, {TextDirection? textDirection}) {
    // TODO: implement getOuterPath
    throw UnimplementedError();
  }

  @override
  void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {
    // TODO: implement paint
  }

  @override
  ShapeBorder scale(double t) {
    // TODO: implement scale
    throw UnimplementedError();
  }
  
}
```

## 枠線を描く
pain関数のパラメーターにcanvasとrect持っているため、装飾対象のcanvas操作やrect情報を取得できます。それを利用してチケットの白い枠線を作りたいと思います。
```dart
  @override
  void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {
    var paint = Paint()
      ..color = Colors.white
      ..strokeWidth = 2.0
      ..style = PaintingStyle.stroke;
    var w = rect.width;
    var h = rect.height;
    canvas.drawRect(Rect.fromPoints(const Offset(40, 25), Offset(w - 40, h - 25)), paint);
  }
```

borderの枠を設けないと、エラーになるから、矩形を作っておきます。
```dart
 @override
  Path getOuterPath(Rect rect, {TextDirection? textDirection}) {
    Path path = Path();
    // 矩形枠
    path.addRect(rect);
    return path;
  }
```
![](https://storage.googleapis.com/zenn-user-upload/48a0746c076f-20230210.png)


## 穴を切り取る
```dart
    // 左上
    path.lineTo(40, 0);
    path.arcToPoint(
      const Offset(0, 40),
      radius: const Radius.circular(40),
    );
    path.fillType = PathFillType.evenOdd;
```
![](https://storage.googleapis.com/zenn-user-upload/89388befaca2-20230210.png)

## ギザギザを作る
```dart
    double radius = 4;
    int holeCount = (h - 80) ~/ (radius * 2);
    for (int i = 0; i < holeCount; i++) {
      if (i % 2 == 0) {
        path.addArc(
          Rect.fromCircle(center: Offset(0, 44 + i * radius * 2), radius: radius),
          pi / 2,
          pi,
        );
      } else {
        path.addArc(
          Rect.fromCircle(center: Offset(0, 44 + i * radius * 2), radius: radius),
          -pi / 2,
          pi,
        );
      }
    }
```
![](https://storage.googleapis.com/zenn-user-upload/361b5bf34f0e-20230210.png)

雑ですが、これでチケットの模様を作りました。
ソースは下記のGithubをご参考ください。

https://github.com/ling350181/flutter_ui/blob/main/lib/application/ticket_border.dart
【React Express】CORSエラー回避（特定のURLの許可）

## 前回
https://qiita.com/huntas0624/items/a2f610b45dbb46fecb1e

前回このような記事をアップロードしました。
この時は許可するドメインを`"*"`としてすべて許可していました。
今回は特定のURLのみを許可する設定をしていきます。

## やったこと
```javascript:api.js
app.use(
  cors({
    origin: "http://example.net",
    credentials: true, //レスポンスヘッダーにAccess-Control-Allow-Credentials追加
    optionsSuccessStatus: 200, //レスポンスstatusを200に設定
  })
);
```
これだけです！
originに指定のURLを記述しました

## つまづいた所
originに設定するURLはクライアント側なので、一度ブラウザで開いてそのURLをコピペしていました。その時のURLは`http://example.net/`と最後に`/`が入っていました。
そのため、何度試しても許可されず、時間を使ってしまいました。

ですので、気を付けましょう！
【AWS】初心者向け　目的別クラウド構成から学習するAWSサービス　①動的WEBサイト

# まず初めに
AWSを学習し始めて日が浅く、
構成図を見るとサービスの役割がいまいちピンと来ない方へ向けた記事となります。
以下に当てはまる方は参考になるかと思いますので、
是非読んでいただければと思います！

**・メジャーなサービスの機能は理解しているような、していないような**
**・AWSの構成図を見るのに何となく抵抗がある**
**・AWS SAAの試験を勉強中**

概要で挙げた中にもありますが、構成図が何となく難しいなと感じる方は、
サービス単体の機能は何となくわかるけど、
構成に盛り込まれていると、
役割がいまいち把握できてないところにあるのかなと思います。

優しいAWSはそんなこともあろうかと、
**簡単～応用レベルの構成を30パターン**公開しています。
ここでは抜粋した比較的簡単な構成について、
サービス解説を含め解説していきます。

以下、本記事で参考にするページです。
**参考ページ**
https://aws.amazon.com/jp/cdp/

# 動的WEBサイト
【構成図】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/778162/8aa98891-53da-ef15-b51d-5dca669959b8.png)

## サービスの解説

【使用されているサービス】
・Amazon CloudFront
・AWS Certificate Manager (ACM)
・Elastic Load Balancing
・Amazon Elastic Compute Cloud (Amazon EC2)
・Amazon Elastic Block Store (Amazon EBS)
・Amazon Machine Image (AMI)
・Amazon Simple Storage Service (Amazon S3)
・Amazon Relational Database Service (Amazon RDS)
・Amazon ElastiCache
・NAT Gateway

【解説】
まず動的WEBサイトというのは例で挙げると以下のようなサイトを言います。
・ショッピングサイト
・掲示板
・ブログ

ざっくりまとめるとすると会員制のサイトなどです。
(ユーザによって表示する内容が違うサイト)

この動的WEBサイトの構成で理解を深めるに**鍵となるサービス**3つ例に挙げ、
以下に解説していきます。


### ①CloudFront
CloudFrontはCDNサービスといわれる部類に属します。
簡単にまとめるとコンテンツ(画像やファイル)を配信するサービスになります。

主な役割は以下の通りです。
・エッジロケーションを利用したコンテンツ配信の高速化
・オリジンサーバの負荷軽減

例を挙げて解説すると、
コンテンツ配信元が日本で、ダウンロードを行う場所がアメリカである場合、
地理的距離から遅延が発生します。



CloudFrontを使用することで、エッジロケーションを介して、
地理的な遅延を極力抑えた通信にすることが実現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/778162/8a35bb38-82ff-1f4e-8211-7e3d053147a4.png)

上記画像で解説すると、
CloudFrontがない場合は、UserからS3へ直で通信することになり、
地理的距離から遅延が発生します。

CloudFrontがある場合、DNSを利用したルーティングで最寄りのエッジロケーションに、
通信が向けられ、遅延を少なくすることができます。

ここで1つ注意するのが、CloudFrontはキャッシュを利用しているため、
エッジロケーションにコンテンツを取りに行った際、該当のコンテンツがない場合は、
一度オリジンへ取りに行く仕組みになっており、**初回のみ遅延**が発生します。

負荷の観点から見ると、初回のみはオリジンサーバに通信が向かいますが、
以降はエッジロケーションに保持されているキャッシュを利用するため、
**オリジンサーバの負荷が軽減されます**。
(キャッシュの保持期間は、デフォルトでは24時間ですが、
リクエストのパスパターンや、個々のファイルに対して保持期間を設定することが可能です。)


### ②S3
S3はご存じの通りストレージサービスですが、
動的WEBサイトでは、静的WEBホスティング機能を使用して、
ソーリーページ(ユーザ用のエラー画面)を実装するために利用されることが多いです。
CloudFront+S3は鉄板の構成なのでSAAの試験では多く見られます。

>CloudFrontを利用してオリジンサーバー障害時にS3上のコンテンツを表示する
https://dev.classmethod.jp/articles/cloudfront-sorry-s3/


### ③ElastiCache
筆者はいまだに"エラスティキャッシュ"なのか"エラスティックキャッシュ"なのか、
一生もやもやしています。
(今のところエラスティキャッシュが自分の中では優勢です。)

話はそれましたが、解説していきます。


Elasticacheはキャッシュ機能として採用されます。
特徴として**インメモリキャッシュ**という機能があります。

通常のDBとは違って、
ディスクにデータを保持するのではなく、**メモリ内に保持**するため、
**ディスクにアクセスする時間が無くなり**、データの取り出し処理が非常に高速です。
クエリの結果もキャッシュに保持できるため、
クエリにかかるコストも**初回のみ**となり、費用対効果も高いものになります。

サポートしているエンジンは**Memcached**と**Redis**の2つです。
簡単に紹介すると以下の通りです。

**Memcached**
単一ノードの性能は高いが、データの格納はString型しか対応していない

**Redis**
単一ノードの性能はMemcachedに比べると劣るが、可用性とデータの格納は豊富な型に対応している


まとめると動的WEBサイト上では、
EC2上のアプリケーションとやり取り(データ取り出し等)を行う際、
キャッシュを利用した低レイテンシーな通信を実現できるために使用されています。

# まとめ
今回はAWSが公開しているサンプル構成図の中から、動的WEBサイトの解説をしました。
鉄板の構成なので、覚えておいても損は無いと思います！

サービスごとの勉強では点と点の学習になってしまうので、
一連のつながりを理解したい場合は、構成図を眺めてみるのはおススメです。



最後までご高覧いただきありがとうございました。
Autonomous DB を別のサブネットに変更する方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
Autonomous DBを作成する時、ネットワーク・アクセスのタイプは、以下の３つがあります。デフォルトは、左の「すべての場所からのセキュア・アクセス」となります。右の「プライベート・エンドポイ・アクセスのみ」を選択した場合、VCNとサブネット内に作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/56e3ed85-fcc5-1b75-878f-e89979d12853.png)
インスタンス作成後、他サブネットに変更できますか？はいできます。簡略に言いますと、<strong>アクセス・タイプを２回切り替え</strong>ればOKです。これから変更方法を紹介したいと思います。

__ステップ__
- [1. アクセス・タイプを「任意の場所からのセキュア・アクセスを許可」に切り替える](#1-任意の場所からのセキュアアクセスを許可に切り替える)
- [2. アクセス・タイプを「仮想クラウド・ネットワーク」に切り替える](#2-仮想クラウドネットワークに切り替える)

## 1. 「任意の場所からのセキュア・アクセスを許可」に切り替える
ADBが<strong>起動</strong>している時、コンソールから実施します。

ADB 詳細情報 -> 他のアクション -> "ネットワーク・アクセスの更新"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7c324d38-da62-8518-9210-691c19f72a1c.png)

「すべての場所からのセキュア・アクセス」を選択し、更新をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/94f5ac44-d91b-1b5c-5d03-e8425e593637.png)

ADB名を入力し、確認をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/6e3bf49a-9f24-caa8-c78b-72524f9a502f.png", width="500">
確認後、更新処理が開始されます。 完了するまでしばらく（2~3分間）お待ちください。

__注意点__
アクセス・タイプを更新する前、「<strong>mTLS認証</strong>」の設定は、<strong>有効</strong>になっているかどうかを確認してください。「任意の場所からのセキュア・アクセスを許可」の場合、必ず「mTLS認証」を有効にしないといけません。（有効にする時、ADBへ接続するのに、Walletファイルは必須です。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d60037a4-2014-1882-6af3-442f25248a89.png", width="350">

## 2. 「仮想クラウド・ネットワーク」に切り替える
アクセス・タイプの更新が完了した後、もう一回メニューから「ネットワーク・アクセスの更新」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1393906c-fcbe-d5c3-78f5-fe8512fbda61.png)

右側のタイプ（プライベート・エンドポイ・アクセスのみ）を選択し、移動先のVCNとサブネットを指定して更新をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ecb94326-3670-14dc-02e7-556515dde34f.png", width="700">

先ほどと同様、確認画面でADB名の入力は必要です（画面コピーを省略）。更新処理が完了するまで少しお待ちください。更新後、他サブネットへの変更は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c008b19e-b0e4-b4d7-5df9-7d3c1877df1b.png)
以上

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
R3transを使用したクライアント削除

クライアント削除でサイズの大きいテーブルの削除は非常に時間がかかります。
R3transにはクライアントコピー制御の機能もあり、以下のコマンドでより高速に削除対象クライアントのテーブルエントリの削除が可能です。
（並列処理も可能）

〇コマンド
R3trans -w <ログファイル> -u <オプション> <制御ファイル>

〇制御ファイル（削除）
clientremove
client = <XXX>
select * from <テーブル>

注意点としてはselect count等で削除の進捗が見えずらく、UNDO領域を使用するため拡張やテーブル削除後の作り直しが必要な場合があります。

ちなみに、制御ファイルの内容を書き換えてテーブルのエクスポート、インポート、クライアント間のコピーも可能です。

〇制御ファイル（エクスポート)
export
Client = <XXX>
FILE = <エクスポートファイル>
select * from <テーブル>

〇制御ファイル（インポート)
import
Client = <YYY>
FILE = <エクスポートファイル>

〇制御ファイル（コピー）
clientcopy
source client = <XXX>
target client = <YYY>
select * from <テーブル>
【サンプル動画あり】選択した画像src の情報をpostして、次ページで表示させる。Jquery

### サンプル動画
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478380/af2105b5-e7ec-9647-b3be-e4ff15406b45.gif)

#### 流れ

１：index.php（テーブル選択画面）で、Jqueryでクリックした要素のsrcのパスを取得する

２：１で取得したパスを、<form>タグの、valueに入れて、postする。

３：form.php で、postされた画像パスを受け取り、表示させる。

#### ソースコード（抜粋）

```index.php

# <!-- 画像パス　POST 用フォーム -->
<form id="contactForm" name="contactForm" method="post" action="form.php">

<input type="hidden" name="path" id="path">
<input id="send" class="Form-Btn02" type="submit" value="問い合わせ">

</form>

# Jquery クリックした要素の値を取得部分

$(function() {
    
    //============== ホワイトテーブル　色変え
    $("#sub_image li").eq(0).show();

   // === テーブルカラー選択
   $("#btn_01 li").click(function() {
        num = $("#btn_01 li").index(this);
        $("#sub_image li").hide();
        $("#sub_image li").eq(num).show();

       // 画像URLを取得　& valへ値セット
       targetSrc = $("#sub_image li img").eq(num).attr('src');
       $("input[name=path]").val(targetSrc);
            console.log(targetSrc);
       });
    

});

```

```form.php
# ------（抜粋）------

# 画像パスの値を取得
$img_path = "";
if (isset($_POST['path'])) {
    $img_path = $_POST['path'];
}


# <!-- HTML 画像 表示部分　 -->
<p id="select_img">
                <span id="select_item">選択された商品</span>
                <img src="<?php print h($img_path); ?>">
</p>

```

■github （HTML などの記述は下記を参考ください。）

https://github.com/tossy0130/Vue.js-PHP-WEB_system_2023_001
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure AD SSPRオプション」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure AD SSPRオプション」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory のセルフサービス パスワード リセット とは](https://learn.microsoft.com/ja-jp/training/modules/allow-users-reset-their-password/2-self-service-password-reset)
[Azure AD のセルフサービス パスワード リセット を実装する](https://learn.microsoft.com/ja-jp/training/modules/allow-users-reset-their-password/3-implement-azure-ad-self-service-password-reset)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADセルフサービスパスワードリセットの詳細」](https://qiita.com/fsd-jume/items/4fdcdc519bc7cd2bdcaa)

## Azure AD SSPRオプション
### SSPRデプロイオプション
・Azure ADでのパスワード変更をオンプレミスのAD DS環境に同期可能
⇒パスワードライトバック
・SSPRパスワードライトバックの方法
　-Azure AD Connect同期
　-Azure ADクラウド同期
　-Azure AD Connect同期/クラウド同期の併用

**◆Azure AD Connect同期**
・Azure AD Connectアプリケーションを使用
・Azure AD同期はAzure ADクラウド同期に置き換えられている
⇒クラウド同期がConnect同期と完全に同じ機能を持つと廃止

**◆Azure ADクラウド同期**
・Azure ADクラウドプロビジョニングエージェントを使用
・ユーザ/グループ/連絡先をAzure ADに同期する
⇒ハイブリッドIDの目標を満たして実現するように設計された

**◆Azure AD Connect同期/クラウド同期の併用**
・切断された複数のADフォレスト環境からAzure ADテナントへの同期のサポート
　-一般的なシナリオ：合併と買収
・軽量プロビジョニングエージェントによるインストールの簡素化
　-エージェントはADからAzure ADへのブリッジとして機能
　-すべての同期構成はクラウドで管理
・複数のエージェントを使用して高可用性の展開を簡素化
　-ADからAzure ADへのパスワードハッシュ同期に依存している組織に特に重要
・最大50,000人のメンバーを持つ大規模なグループのサポート
⇒OUスコープフィルターのみ使用を推奨

### SSPRの適用範囲
**◆なし**
・Azure AD組織内のすべてのユーザがSSPRを使用不可
・デフォルト値

**◆すべて**
・Azure AD組織内のすべてのユーザがSSPRを使用可能

**◆選択済み**
・指定したセキュリティメンバーのみSSPRを使用可能
・テストとして使用することも可能
⇒想定通りの動作を確認したらすべてに変更

## 次の学習内容
**◆Azure Storage**

https://qiita.com/fsd-jume/items/adf29ff40105e06c5098

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Rails + curl – POST送信したファイルの中身を取得する例 ( ActionDispatch )

# curl コマンドの例

任意のキー ( ここではfoo ) に対してファイルパスを指定してPOSTする

```
curl -X POST http://localhost/file -F foo=@/path/to/file
```


# Rails Controller

paramsのキーにActionDispatchのインスタンスが関連付けられるので read すればファイル内容が得られる

```rb
class FileController < ApplicationController
  def create
    params[:foo] # ActionDispatchのインスタンス
    params[:foo].read # ファイルの中身
  end
end
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
serverless framework rollback 備忘録

## やばいよやばいよ

サーバーレスデプロイを実行完了後
やばコードの不備に気づいた

そうだロールバックをしよう
とおもったが　いままでロールバックするようなことがなかったので慌てた

今後のための備忘録

## how

#### 1.ロールバックするためのTimestampを取得
とりあえずロールバックするために「どの時点の」の情報が必要

```
sls deploy list -s prod -r ap-northeast-1
```
- -s ステージのこと
- -r リージョンのこと


結果
```
      ・
      ・
      ・
2022-11-21 06:38:26 UTC
Timestamp: 1669012706219
Files:
  - compiled-cloudformation-template.json
  - custom-resources.zip
  - gemLayer.zip
  - pokepoke.zip
  - serverless-state.json
 
2023-01-11 14:35:07 UTC
Timestamp: 1673447707195　　⇦この時点に戻したい
Files:
  - compiled-cloudformation-template.json
  - custom-resources.zip
  - gemLayer.zip
  - pokepoke.zip
  - serverless-state.json
 
2023-02-10 01:23:41 UTC　　
Timestamp: 1675992221304　　　⇦これやばいよやばいよコード
Files:
  - compiled-cloudformation-template.json
  - custom-resources.zip
  - gemLayer.zip
  - pokepoke.zip
  - serverless-state.json
```

#### 2.ロールバック実行

```
sls rollback -t 1673447707195 -s prod
```

- -t タイムスタンプのこと

タイムスタンプには戻したい状態のタイムスタンプを書く

## まとめ

慌てた時こそ冷静に
[2023/02/10]ColabでJaxのエラーが出る問題の解決法

2023年2月10日現在、JaxとJaxlibのバージョンの整合性が取れていない状況になっています。
おそらく2023/2/3のアップデートでNvidiaのドライバーを更新したことが原因です。

libcudnnのアップデート & jaxのアップデートで解決します。

```python
!apt install --allow-change-held-packages libcudnn8="8.4.0.27-1+cuda11.6"
!pip install --upgrade pip
!pip install -U "jax[cuda11_cudnn82]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
```
【Matlab】基本的な3次元可視化関数のメモ


matlab可視化関数の備忘録

## 行列データ (2次元配列)
#### surf() / mesh()
matlabで行列データ（2次元配列）を3次元的に可視化する際によく用いられるのは，surf()やmesh()だと思います．例としてpeaksで生成した行列を入力として実行すると次のような図が得られます．

```.mat
%% peaksデータ
data = peaks(50);   　% 50×50の行列データ(Z値)

% surf描画
figure("Color","w");
surf(data);         　% ハイトマップとして立体的に可視化する

% mesh描画
figure("Color","w");　
mesh(data);　　　　　　% エッジのみを描画する
% ※内部的にはどちらもsurface()のパラメータを変えているだけ
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/a32b28aa-db94-d1dc-35b8-ab25b3e23d65.png)

上のように単一の行列を引数に与えた場合はZDataとして扱われますが，X/YDataも指定することが出来ます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/9741a5ac-3ec7-ad90-36f4-7f175d19aa61.png)

↓ xyz全てを指定した描画の例
```.mat
[x,y,z] = sphere(50);          % create a sphere 
surf(x,y,z);            % plot spherical surface
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/ebc9f2de-80b4-f7cb-3422-565103c763b7.png)

https://jp.mathworks.com/help/matlab/ref/surf.html

#### quiver3()
また，面の法線などの空間ベクトルを描画したいときにはquiver3を用います．
```.mat
% ダミーデータ
[X,Y] = meshgrid(-pi/2:pi/8:pi/2,-pi/2:pi/8:pi/2);  % 単調増加の格子点xy座標
Z = sin(X) + cos(Y);                                
[U,V,W] = surfnorm(Z);                              % 面の法線ベクトル

% 可視化
quiver3(X,Y,Z,U,V,W,'r')
axis equal
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/6768650c-3bd7-230c-0a7c-caeef8deffee.png)

https://jp.mathworks.com/help/matlab/ref/quiver3.html?searchHighlight=quiver&s_tid=srchtitle_quiver_2

## ベクトルデータ (1次元配列)
#### plot3()
3次元のラインプロットができます．LineSpecを指定することで実線，破線，点などの描画を切り替えられます．
```.mat
% ダミーデータ（行ベクトル）
t = 0:pi/50:10*pi;
st = sin(t);
ct = cos(t);
% 可視化
plot3(st,ct,t);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596227/bafb2df9-9678-7ec1-e7e3-826e6eb8d954.png)

https://jp.mathworks.com/help/matlab/ref/plot3.html

## その他

matlabでは行列やベクトルデータの要素にアクセスする際，単一の要素だけではなく，"変数(〇:〇)"のような形で部分要素を取得することが出来ます．自前で実装数必要がないため，可視化関数にデータを渡すときにも便利です．
```.mat
    % ダミー配列の生成
    matrix = zeros(5,10);          % 5行10列の配列 (0で初期化)

    % 配列要素へのアクセス (※"[]"ではなく"()"を使う)
    newValue  = data(3,8);         % スカラー
    newVector = data(1:3:, 1);     % 3行1列の行ベクトル
    newMatrix = data(1:3,8:end);   % 3行3列の行列

    % 可視化関数の呼び出しに利用
    surf(data(1:3,8:end));
```
YouTube始めました、その理由は？Teruhisa - DEV？

YouTubeチャンネルを開設しました。そのお知らせのざっくり記事です。

# 経緯
自分は約7年ほどフリーランスで生計をたてた後、数年前に法人成りしたソフトウェアエンジニアで、主にwebアプリ開発をメインにお仕事させて頂いています。
開発業務の他にも、これまでに初学者メインの学習会等を運営した経緯があり、現在もDiscord上で毎週火曜夜に交流会を主催しています。

自分のメインフィールドは、JavaScript/TypeScript、Node.js、Reactなので扱うトピックはこれらが主になります。現在開催している交流会では、フロントエンド開発の話題を中心に参加者の発表や質疑応答等を実施しています。

Discordはこちらです:wave:
[discord.gg/zPhh4KeBm5](https://discord.gg/zPhh4KeBm5)

前置きが長くなりましたが、この交流会において自分の好みでピックアップした世界中の話題を延々と喋るということをやっています。
話題のジャンルはもちろん上記の技術ネタです。

これまでは数人に対して喋っていたのですが、どうせなら録画して他の人にも見てもらえたらいいな、と思うようになった事がYouTube開設の発端になります。

# チャンネルの内容
このチャンネルでは交流会で話した録画を簡単に切り取って編集し、アップロードする予定です。
まったり喋っているので、よくある「TypeScript爆速入門！」とか「エンジニアって儲かるの！？」のようなバズリ狙い？だったり小綺麗にまとまった感じではなく、雑談ラジオちっくな感じになります。

動画編集に労力は掛けません。別にYouTuberで稼ぎたいとかがモチベーションにはないですし、それよりコード書いてお賃金頂いたほうが・・・
録画しているのは、交流会中に画面共有したものと自分の声だけなので、交流会メンバーの声が入っていません、会話している場面もそのまま動画に含まれるので独り言言ってるヤバイやつに見えるかもしれませんね？音は聞くに耐えれるように配慮したつもりです。

![動画の一場面](https://storage.googleapis.com/zenn-user-upload/88cd9ceb3458-20230210.png)

このチャンネル動画の使い方としては、作業しながら聞いてもらい、気になる話題が出たらビデオにもどって画面の内容と一緒に見てもらう、という使い方をしてもらうといいのかなと想像しています。
対象者は、上記の技術界隈に居る初学者〜中級者ぐらいでしょうか。情報収集頑張ってる方は、もうそれ知ってる〜、なことがあると思います。（週1収録なので情報の鮮度が1週間経過してることが多々あります）
世界中の話題と言いましたが、ネタ元はTwitterなので自分をフォローしてもらってる方は聞いたことある内容になるかもしれません。

一応、喋っている内容は動画説明欄にタイムスタンプと一緒に記載しているので、興味あるものだけを見てもらいやすいかなとも思います。

Twitterはこちらです
https://twitter.com/t6adev

# 最後に
チャンネル登録よろしくおねがいします！←
[https://www.youtube.com/@t6adev](https://www.youtube.com/@t6adev)

Discordもお気軽に参加ください👌
[discord.gg/zPhh4KeBm5](https://discord.gg/zPhh4KeBm5)

## 記念すべき初回アップロード動画はこちら
共感性羞恥が発動した方が居たらその部分をこっそり教えていただければです。（えーっと、って連発してるとことか恥ずかしいけど、もういいやと思える年頃にはなりました）

https://www.youtube.com/watch?v=4tqYG8VS0uY


### 番外：マイクについて
普段はAirPodsでビデオチャットしていたんですが、それで収録してみたら音質が悪くボヤいてみるとこんな反応を頂きました。マイクって大事なんだなと知りました・・・
https://twitter.com/ccccjjjjeeee/status/1620461395367313409

### イベント/コミュニティ主催履歴
https://ebisu-js.connpass.com/
https://ebisu-voice-production.connpass.com/
https://ebisu-tech-school.connpass.com/
https://twitter.com/DevCranes
プログラミング何もわからなかった中一がAtCoderで入緑するまで

中一のwatasou1543です。ABC287で無事入緑しました。
![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074544/429331af-4980-0350-bb54-a9d2c419c4bd.png)

# はじめに
まず、私が競技プログラミングを本格的に始めたのは昨年の7月です。五月に一回コンテストに参加してみたのですが、
「言語って何？」
この状態でした。
ここから8か月で緑コーダーになることができました。
この記事では、入緑を目指している方のために、
　・自分が入緑するまでにどんなアルゴリズムを学んだか
　・どれくらい何をしたか
について書こうと思います。
# 学んだ言語
競技プログラミングでは、先輩から勧められたC++を使っています。また、今考えても競技プログラミングに最適な言語はC++だと思います。その理由は、
・ほかの言語よりも実行速度が速い
・解説が多い
・[APG4b](https://atcoder.jp/contests/APG4b)というサイトがあるので学びやすい(私もこのサイトでC++を学びました)
だと考えています。
Pythonをお勧めする方も多いですが、
・簡潔に書ける
・理解しやすい
反面、
・遅い(C++だと通りやすいのに...のような問題が時々ある)
・JOIの本選にはC++でしか出られない
といった問題があるので、**私は**お勧めしません。が、PythonをC++と併用して学ぶことで、
「Pythonだと2行で書ける！(例:[ABC275-B](https://atcoder.jp/contests/abc275/tasks/abc275_b))」
「C++だとすぐ解ける！(例:[ABC276-C](https://atcoder.jp/contests/abc276/tasks/abc276_c))」
といった問題にすぐ対応できます。なので、サブの言語としてPythonを持っておくと良いと思います。~~が、私はPythonが何もわかりません。~~
# 入茶するまでにやったこと
とりあえず、学んだアルゴリズムやデータ構造は以下のものです。
また、学んだアルゴリズムにランクづけをしています。
S:必須といってもいいレベル
A:重要
B:持っておくと便利
| アルゴリズム名| ランク |説明|
|:-:|:-:|:-:|
| 全探索  |  **S** |これがないとB問題も解けない。すべての基本。|
| 累積和  |  **A** |区間の総和を$O(1)$で求められる。Cで頻出。|
| imos法  |  **B** |区間に$O(1)$で数を足せる。Cで出る。|
| bit全探索  |  **B** |$O(2^N)$を全探索するアルゴリズム。大事。|
| 二分探索 |  **A** |$O(logN)$で**ソートされた配列から**最頻値を求められる。最強。|
|  繰り返し2乗法 | **B**  |$N^M$を$O(logM)$で求められる。持っておいて損はない。|
|  DFS(深さ優先探索) | **A**  |CはグラフのCという迷言?が生まれるほど最近C問題によく出る。再帰関数を使う。|
|エラトステネスの篩|**A**|$1$~$N$が素数かどうかを$O(NlogN)$で高速判定。素数問はDでよく出る。Cで詰まってこれを使ってD通してパフォーマンス爆盛り！とかできて強い。|

また、この時は学ばなかったけど持っておきたかったアルゴリズムは以下の通り。
| アルゴリズム名 | ランク | 説明 |
|:-:|:-:|:-:|
| BFS(幅優先探索) | **B**  |  DFSとは違い、キューを使う。DFSよりもBFSのほうが実装は大変だが通る問題が多い。 |
| 順列全探索  |  **A** | $O(N!)$を全探索できる。最近は減ったが、C問題でよく出ていた。C++が実装しやすい。  |

ちなみに私は茶色になるまでに461ACをして、20回Ratedでコンテストに参加しました。「AC数はレートに比例する」という考え方があるのですが、ACをして経験を重ねていくことが大事です。
# 入緑するまで
入緑するまでに以下のアルゴリズムを学びました。また、入茶するまでに必要なアルゴリズムはすべて完璧にしていることを前提にします。
| アルゴリズム名 | ランク | 説明 |
|:-:|:-:|:-:|
| DP(動的計画法)  |  **A** | 最も重要なアルゴリズムでかつ、応用が利きます。また、DはDPのDと呼ばれるほどDによく出ます。緑になるまでに[EDPC](https://atcoder.jp/contests/dp)などを使ってちゃんと学習しておくことをお勧めします。~~ね、簡単なナップザックで爆死している茶コーダーさん...~~[^1]  |
| ダイクストラ法  |**A**| 重みがある有向グラフの最短経路を$O(NM)$で求められる。  |  
| ダブリング  | **B**  | 木の頂点iのk個上の頂点を$O(logk)$で求められる。  |
| ワーシャルフロイド  | **B**  | 重みが負の辺を含むグラフについての最短経路を$O(N^3)$で求められる。  |
|  UnionFind | **S**  | めちゃ大事。連結判定や閉路検出など、様々なグラフの問題で使え、実装もライブラリを持てば重くない。しかも$O(logN)$でできることが多い。私がグラフ好きな理由は多分これ。  |
|  約数列挙 | **A**  | Dで素数関係が頻出。  |

ちなみに入緑するためにRatedで出た回数は31回、AC数は650です。

# おわりに
ここまで目を通してくださり、ありがとうございます。ぜひ感想などを書いていただけると嬉しいです。
今は5月までの入水を目指して頑張っています。
もしかしたら記事を書くかもしれません。その時は目を通してくれると嬉しいです。
### 参考文献:
[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編：目指せ水色コーダー！】](https://qiita.com/e869120/items/eb50fdaece12be418faa)

[^1]:[ABC286](https://atcoder.jp/contests/abc286)の私のことです。
クラスの関連付け

# 2.1 belongs_to関連付け
あるモデルでbelongs_to関連付けを行なうと、```他方のモデルとの間に「1対1」のつながり```が設定されます。このとき、宣言を行ったモデルのすべてのインスタンスは、```他方のモデルのインスタンスに文字どおり「従属（belongs to）」```します。
たとえば、Railsアプリケーションに著者（Author）と書籍（Book）情報が含まれており、書籍1冊につき正確に1人の著者を割り当てたいのであれば、Bookモデルで以下のように宣言します。
```rb
class Book < ApplicationRecord
  belongs_to :author
end
```
.
.
.
```belongs_toを単独で利用すると、一方向のみの「1対1」つながり```が生成されます。
つまり上の例で言うと、「個別の書籍はその著者を知っている」状態になりますが、「著者は自分の書籍について知らない」状態になります。

```双方向関連付けをセットアップするには、belongs_to関連付けを使うときに相手側のモデルにhas_oneまたはhas_many関連付けを指定```します。

```belongs_toでは「参照の一貫性」が担保されません。```そのため、ユースケースによっては以下のように参照カラムで```データベースレベルの外部キー制約（foreign_key: true）を追加する必要```があります。
```rb
create_table :books do |t|
  t.belongs_to :author, foreign_key: true
  # ...
end
```
# 出典
https://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91:~:text=2.1%20belongs_to%E9%96%A2%E9%80%A3,true%0A%20%20%23%20...%0Aend

### 気づき
従属する宣言なのか。
* ```belongs_to :author```は、```author```クラスに従属することを宣言しているのか。
* 一方向のみの関係なのか。(これから理解できるようになる)
* 宣言しただけではいけないらしい。```データベースレベルの外部キー制約（foreign_key: true）を追加```する必要があるようだ。

# 2.2 has_one関連付け
has_one関連付けは、```相手側の1つのモデルがこのモデルへの参照を持っていること```を示します。
相手側のモデルは、この関連付けを経由してフェッチできます。
```rb
class Supplier < ApplicationRecord
  has_one :account
end
```
belongs_toとの主な違いは、```リンクカラムsupplier_idが相手側のテーブルにある```ことです。
.
.
.
ユースケースによってはaccountsテーブルとの関連付けのために、```supplierカラムに一意のインデックスか外部キー制約を追加する必要が生じる```こともあります。その場合、カラムの定義は次のようになるでしょう。
```rb
create_table :accounts do |t|
  t.belongs_to :supplier, index: { unique: true }, foreign_key: true
  # ...
end
```
このリレーションは、相手側のモデルでbelongs_to関連付けも設定することで双方向関連付けになります。

# 出典
https://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91:~:text=2.2%20has_one%E9%96%A2%E9%80%A3,%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82

### 気づき
何かここから難しくなってきた。

# 2.3 has_many関連付け
has_many関連付けは、has_oneと似ていますが、```相手のモデルとの「1対多」のつながりを表す点が異なります```。has_many関連付けは、多くの場合belongs_toの反対側で使われます。

has_many関連付けは、そのモデルの```各インスタンスが、相手のモデルのインスタンスを0個以上持っている```ことを示します。たとえば、さまざまな著者や書籍を含むアプリケーションでは、Author（著者）モデルを以下のように宣言できます。
```rb
class Author < ApplicationRecord
  has_many :books
end
```
.
.
.
ユースケースにもよりますが、通常はこのbooksテーブルのauthorカラムに「一意でない」インデックスを追加し、オプションで外部キー制約を作成するのがよいでしょう。

# 出典
https://railsguides.jp/association_basics.html#has-many%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91:~:text=2.3%20has_many%E9%96%A2%E9%80%A3,true%0A%20%20%23%20...%0Aend

### 気づき
まず一対一、一対多の意味を知る必要があるようだ。
次の記事にこれは書くことにする。
これはUMLの中のなんかの図に説明があったような気がする。

### 関連記事
https://qiita.com/masatom86650860/items/39be8f8083389bd9e022
Macのターミナルで使っているシェルは bash? zsh? どちらなのか確認する

## 自分の Mac はなんのシェルを使っているか確認する
以下のコマンドで、シェルの確認ができます
```
echo $SHELL
```

ちなみにコマンドを叩かなくてもTerminal 開いたら書いてあるので zsh だってわかるんですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/f14591b7-3095-919e-394e-d4c365894f81.png)

## そもそもシェルってなんだろう？
シェルとは、コンピューターを操作するためのソフトウェアです。このソフトウェアは、ユーザーからの命令を実行して、コンピューターを操作するために使用されます。つまり、コマンドを書くことで、OS側に命令をだしてくれるプログラムのことです。シェルの語源は、古代ギリシャ語の「σκέλος」（skélos）から来ています。「外殻」や「外壁」を意味しており、コンピューターのシェルは、ユーザーとコンピューターの間にある外殻のようなものとして機能します。OS を直接いじくりまわすのはリスクが高いので、外壁としてのシェルを通して命令を実行する、といったイメージでしょうか。

## bash と zsh の違いは？
bash と zsh は、両方とも Unix 系のコマンドラインインターフェース（CLI）です。bash は、GNU プロジェクトの一部として開発されたもので、Unix シェルとして最も広く使用されています。一方、zsh は、bash よりも高度な機能を持つシェルです。zsh は、複雑な操作を簡単に行うためのツールとしても機能します。zsh のほうが高機能だぞ！とおぼえておくと良さそうです。

ちなみに、bash は `.bashrc` という設定ファイルを使用しますが、zsh は、`.zshrc` という設定ファイルを使用します。
ググって見つけた記事が `.bashrc` を操作するものだったら、Mac ユーザーの方は `.zshrn` に変換して対応しましょうね。
HTML Part2

### リンクの貼り付け。

- 例文

実際に、リンクを貼ってみた場合。
```html
<a href="https://www.google.co.jp/?client=safari&channel=iphone_bm">This is a tag</a>
```
Googleの文字の部分だけにリンクの表示をさせる（入れ子）

```html
<p>let's go to <a href="https://www.google.co.jp/?client=safari&channel=iphone_bm">Google</a> </p>
```
- 応用（ネスト→入れ子）

sectionで挟んで、一つのグループを作る事ができる。こうして情報のまとまりを作ってあげる事で、機械的に優しくなる。

```html
<section>
    <h1>ONE PIECE</h1>
    <p>This is the super excited Manga in japan.....</p>
    <p>Official web page is <a href="https://one-piece.com/">here</a></p>
</section>
```
クラスは空でもサイズは1バイト

# 空のクラスサイズ
数年に1度、空のクラスを作りたくなることってありますよね？
クラスのサイズがどうなっているか興味はないでしょうか？

タイトルでネタバレしていますが、クラスは空でもサイズは1バイトです。
コンパイラ依存かもしれませんが、Visual C++, gccでも1バイトです。
```C++:空のクラスサイズ
#include <iostream>

class A{};

int main()
{
	std::cout << sizeof(A);
	return 0;
}
```
```C++:結果
1
```

なぜ1バイトなのかという考察ですが、メモリアドレス確保のために0では無理なので、1バイト以上になります。
あとはどんな数字でも良いのですが、最小の1バイトが選択されたのだと思います。

メンバ変数もないのだからnullptrの返却でいいのじゃないかと個人的には思います。アドレスも不要でしょう。
でもnewでnullptrが返却されたら不安になるか…

# 空のクラスの初期値
C++プログラマ発展のために科学~~黒魔術~~的実験が必要だと思うので試してみました。
誰も使ってない領域なのだから、作業領域として活用しても問題ないですよね？ (ネタで言っていますのでご注意ください)

初期値がどうなっているのか確認しました。
```C++:空のクラスの初期値
#include <iostream>

class A {};

void hoge(A* a)
{
	std::cout << (int)(*((uint8_t*)a)) << std::endl;
}

int main()
{
	A a;
    /* 関数経由の回りくどい書き方をしている理由はVisual C++で
       変数aが初期化されていないエラーを回避するためです。*/
	hoge(&a);
	return 0;
}
```
```C++:結果(Visual C++ Releaseビルド/gcc)
0
```
```C++:結果(Visual C++ Debugビルド)
201
```

0で初期化されている優しさ(?)はありましたが、Visual C++のDebugとReleaseで挙動が変わるのはいただけません。
初期値0の変数として使うのは控えた方が良さそうです。

# 空のクラスのアクセス
次に書き換えが可能か確認しました。
```C++:空のクラスの書き換え
#include <iostream>

class A {};

int main()
{
	A a;
    /* ここで初期化(?)を行ったので
       Visual C++のエラーを回避できます。*/
	*((uint8_t*)&a) = 10;
	std::cout << (int)(*((uint8_t*)&a)) << std::endl;
	return 0;
}
```
```C++:結果
10
```
こちらは問題なさそうですね。
他に配列にしてみたり、newしてヒープ領域ならどうなるかなど試してみましたが結果は同じでした。

特にオチはないですが、ここまでです。
空のクラスのご利用は計画的に！
wslでledger その4

# 概要
wsl(wsl2じゃない)でledgerやってみた。
練習問題やってみた。

# 練習問題
elixirでcsvをledgerに読み込める様に変換せよ。

# サンプルコード

```
defmodule Main do
    def main() do
        csv = """
2021-11-30T00:00:00,交通・通信,11614,ネット・電話等
2021-12-01T00:00:00,雑費,4277,新聞
2021-12-03T00:00:00,交通・通信,520,電車
2021-12-31T00:00:00,交通・通信,10140,ネット・電話等
2022-01-27T00:00:00,食料,332,amazon
2022-01-06T00:00:00,食料,570,マクドナルド
2022-01-02T00:00:00,交際費,4320,テパ地下
"""
        Enum.map(String.split(csv, "\n"), fn l ->
			print(l)
		end)
	end
    def print(nil) do
        IO.puts "ok"
    end
    def print(l) do
		s = String.split(l, ",")
		j = String.replace(Enum.at(s, 0), "T00:00:00", "")
		j = String.replace(j, "-", "/")
        IO.puts "#{j}  #{Enum.at(s, 4)}\n    Expenses:#{Enum.at(s, 1)}  #{Enum.at(s, 2)} JPY\n    Assets:全財産"
    end
end

Main.main




```

# 実行結果

```
2021/11/30  
    Expenses:交通・通信  11614 JPY
    Assets:全財産
2021/12/01  
    Expenses:雑費  4277 JPY
    Assets:全財産
2021/12/03  
    Expenses:交通・通信  520 JPY
    Assets:全財産
2021/12/31  
    Expenses:交通・通信  10140 JPY
    Assets:全財産
2022/01/27  
    Expenses:食料  332 JPY
    Assets:全財産
2022/01/06  
    Expenses:食料  570 JPY
    Assets:全財産
2022/01/02  
    Expenses:交際費  4320 JPY
    Assets:全財産
  
    Expenses:   JPY
    Assets:全財産
```


# 成果物

https://paiza.io/projects/oxyb-Ws0v9Ixo2lpWuRwGg?language=elixir

# ledger balance

```
$ ledger -f genkin.txt bal
        -1120002 JPY  Assets:全財産
         1120002 JPY  Expenses
          105879 JPY    交通・通信
           31149 JPY    交際費
          476000 JPY    住居
           33311 JPY    保健医療
           90348 JPY    家具・家事用品
           24500 JPY    教養娯楽
            2990 JPY    被服及び履物
           83615 JPY    雑費
          272210 JPY    食料
--------------------
                   0
```


以上。
最近知ったgit checkout のある動作

次のように、Androidプロジェクトのディレクトリを削除した。

```shell
rm -rf .idea
```

そして、次のように`git checkout 削除したディレクトリ名`を実行してみた。

```shell
git checkout .idea
```

そしたら、次のように表示された。

```shell
Updated 4 paths from the index
```

今までAndroid StudioやVSCodeを使っていたので、意識したことがなかったが、どうやらこの動作はステージから作業ツリーに特定のファイルを戻す処理らしい。なので、削除されたファイルが削除される前の内容に復元されたみたいだ。

# 参考にした記事

https://dev.classmethod.jp/articles/git-reset-and-git-checkout/

https://github.com/android/nowinandroid/issues/527