OmniAICreator/Qiita-1.07M huggingface dataset:
古いサーバーでgitに接続しようとしたら時間がかかった時の解決策

## :apple: この記事で書くこと 
長いこと使用されてなかったサーバー上で開発を再開発しようと思った時に、
gitに接続が出来なくなった時にどうやって解決したかの備忘録。

## :apple: この記事で書かないこと

公開鍵と秘密鍵の発行方法、権限周りの詳細、仕組み

## :apple: 結論
サーバーのsshのバージョンが古過ぎて、 openssl形式の鍵に対応していなかった。
PEM形式の鍵を発行して使用したところ、期待する動きを確認できた。

## :apple: 困って困ってたどり着いた参考にさせていただいたサイトはこちら
[【OpenSSH 7.8】秘密鍵を生成する形式が変更になった件について](https://dev.classmethod.jp/articles/openssh78_potentially_incompatible_changes/)

ありがとうございます。本当に困っていました。この場でお礼をお伝えさせていただければと思っています。 :bow: 

## :apple: 状況
- 長い事動いてなかったサーバーで、使用されている公開鍵と秘密鍵は、もう弊社の退職者のアカウントのまま。
- そのサーバーで追加開発した内容を動かす必要があった。

## :apple: 試した事

:one:  他のサーバーで使用している公開鍵と、秘密鍵を件のサーバに移動して、そのまま使えるか試してみる。

```bash

ssh -T git@github.com
```

 をしても

```bash

Enter passphrase: え、わからないんですけど。。。。。設定してたの？？
Permission denied(publickey)
```

と返される。

同じ公開鍵と、秘密鍵を使っているサーバーで、


```bash

ssh -T git@github.com
```

 をしても

```bash

Hi アカウント名! You've successfully authenticated,
```

パスフレーズを聞かれる事なく、接続が完了する。。 :crying_cat_face:  なんで。。


:two: パスフレーズを設定した新しい鍵を作成して、サーバーにアップロードして、使用する。

```bash

ssh -T git@github.com
```

 をしても

```bash

Enter passphrase: 正しいパスワードをいれる。
Enter passphrase: 正しいパスワードをいれる。
Enter passphrase: 正しいパスワードをいれる。
Permission denied(publickey)
```

どうして :crying_cat_face: :crying_cat_face: 
正しいパスワードを入れてるのに、弾かれる。。。

:three: パスフレーズを設定しない新しい鍵を作成して、サーバーにアップロードして、使用する。

```bash

ssh -T git@github.com
```

 をしても

```bash

Enter passphrase: 正しいパスワードをいれる。
Permission denied(publickey)
```

設定してないのに、どうして！！！！ :crying_cat_face: :crying_cat_face: :crying_cat_face: 

参考にさせていただいたサイトに出会う。
自分の使用していた鍵を確認してみると、

```bash

-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----
```

となっている。

件のサーバー上で

```bash

ssh -V
```

でバージョンを確認すると、やはり対応してないバージョンでした。

対する、ローカル（自分のpcの環境）のsshのバージョンは、 `OpenSSH 7.8` より上でした。
なので、形式を特に指定せずに発行すると、


```bash

ssh-keygen -t rsa -C "発行した鍵が紐づいた使用するgitアカウントで使っているメールアドレス"

-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----
```

になっていたと。

という事なので、

```bash
ssh-keygen -t rsa -C "発行した鍵が紐づいた使用するgitアカウントで使っているメールアドレス"  -m PEM
```

でPEN形式での発行をしてみると、

```bash

-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PRIVATE KEY-----
```


PEM形式の鍵が発行された。 


:four: ということで作成した鍵をパスフレーズ付きで作成して、サーバーにアップロードして、使用する。


```bash

ssh -T git@github.com
```

 をすると

```bash

Enter passphrase: 正しいパスワードをいれる。
```

ドキドキしながら、やってみる。

```bash

Hi アカウント名! You've successfully authenticated
```

で、できたーーーー！！！ :sob: 

エラーメッセージでお使いのsshが依存してるopensslが形式が対応してないため、鍵の認証に失敗しました、などと教えていただけるとこんな自分でも気付きやすくていいのかなと思うのですが、今回自分が出会ったメッセージだと、なかなかすぐに原因にたどり着けませんでした。 :disappointed: 

## :apple: 最後に



同じようにつまづいてしまった方の何かの参考になればと思います。 
間違ってる箇所などございましたら、コメントいただけますと幸いです。
ここまで読んでくださりありがとうございました。 :bow:
【AWS SAP】AWS Trusted Advisor【頻出】

##AWS SAP取得に向けて勉強する中で覚えてよかったもの 第6弾

・AWS Trusted Advisor

##AWS Trusted Advisorとは
「コスト最適化」、「パフォーマンス」、「セキュリティ」、「フォールトトレーランス」の４つの項目で、AWSが自動で利用状況を精査し、アドバイスを送ってくれるものです。

##ポイント
ビジネスサポートもしくはエンタープライズサポートを契約する必要がある。
【ドットインストール】Node.js講座の仕様変更点【 #15 ドキュメントを挿入してみよう】

##はじめに
ドットインストールのNode.js講座は最終更新日が２０１４年のままアーカイブされていて、講座内容そのままやってもうまくいかない箇所がある。

「» #15 ドキュメントを挿入してみよう」
の章では、Node.jsのMongoClientの仕様が変わっているため、エラーが出てしまった。新しい仕様に対応した正しいやり方をメモしておく。

mongoDBの公式ドキュメントでは、バージョン３以降、MongoClient.connectにリターンする値がDBからClientに変わったと書かれている。
>「What’s new in 3.0
・MongoClient.connect now returns a Client instead of a DB.」

http://mongodb.github.io/node-mongodb-native/3.0/upgrade-migration/main/

##mongoDBに割り当てられているアドレスを知る
MongoClient.connectを記述する時、第一引数に、mongoDBに割り当てられているアドレスを記述する必要がある。
デフォルトでmongoDBに割り当てられているアドレスを知るには、ターミナルで「mongo」コマンドを入力し、mongoDBがどのアドレスにconnectしているか調べる

<img width="565" alt="スクリーンショット 2020-06-03 20.15.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/cf34e536-8cf3-5248-2266-9f7c8c1bcdc1.png">


##講座のままだとエラーになる箇所

ドットインストールの講座のコードのまま実行すると、ターミナルに「node mongo.js」を入力した際に以下のエラーが返ってくる。

>TypeError: db.collection is not a function

原因は、MongoDB ３.0以降、MongoClient.connectにリターンする値がDBからClientに変わったこと。
＜ドットインストールのコードの問題箇所＞

```javascript
MongoClient.connect("mongodb://"+settings.host+"/"+settings.db, function(err, db) {　//dbはリターンされないので引数に取れない
    if (err) { return console.dir(err); }
    console.log("connected to db");

    db.collection("users", function(err, collection) {
//dbはリターンされてないので存在しない
```

＜MongoDB ３.0に対応したコード＞

```javascript

var MongoClient = require('mongodb').MongoClient

//データベースに接続する関数に渡す第一引数である、mongoDBのアドレスは、定数に格納する方がスッキリする
const url = 'mongodb://localhost:127.0.0.1:27017/myDB'

  // callbackに渡されるオブジェクトが(err, db)から(err, client)に変わった
    MongoClient.connect(url, (err, client)=> {  
  // db名を指定してdbオブジェクトを取得する必要がある
      const db = client.db('localhost:127.0.0.1:27017')

    if (err) { return console.dir(err); }
    console.log("connected to db");
    db.collection("users", function(err, collection) {
        var docs = [
            {name: "taguchi", score: 40},
            {name: "fkoji", score: 80},
            {name: "dotinstall", score: 60}
        ];
        collection.insert(docs, function(err, result) {
            console.dir(result);
        });
    });
});
```


##データベースの確認方法
①ターミナルから確認
ターミナルに「node mongo.js」を入力すると、insertしたdocsの値が表示される

②mongoDBから確認
ターミナルに「mongo」を入力しmongoDBを起動

\>show dbs;

localhost:27017  0.000GB
このデータベースに挿入したドキュメントが入っている

\>show collections;

users
作成したusersコレクションが表示されている

\>db.users.find();
insertしたdocsの値ががmongoDBに挿入されていると確認できる。


##参考文献
Node.jsのMongoClientの仕様が変わってた
https://qiita.com/mimizq/items/76d3a948acb33881c8db

Node.jsからMongoDBに接続してみる
https://qiita.com/one-kelvin/items/c0c036f774f0b3b98ae5
C#値型(NULL許容値型)

##C#NULL許容値型
ジェネリックSystem.Nullable<T>構造体のインスタンス。

**NULL許容値型**は、元になる値型の未定義の値を表す必要があるときに使用します。
**ブール変数**で可能なのは、**true**また**false**のいずれ。
ただし、一部のアプリケーションでは、変数の値が未定義または存在しない場合がある。
例えば、データベースフィールドにtrueまたはfalseが含まれている場合や、値が全く含まれていない
場合がある。その場合にはbool?型を使用。


**宣言と代入**
値型は、対応するNULL許容値型に暗黙的に変換できるため、基になる値型の場合と同様に、
NULL許容値型の変数に値を割り当てることが出来る。またNULL値を代入とすることも可。
（**既定値はNULL**）

NULL許容値型のインスタンスの検査
C#7.0以降では、型パターンでIS演算子を使用して、NULLのNULL許容値型のインスタンスを調べ、
基になる方の値を取得することが出来る。

NULL許容値型の変数の値を確認して取得するには、常に次の読み取り専用プロパティを使用できます。
・Nullable<T>.HasValueはNULL許容値型のインスタンスに、基になる型の値が含まれるかどうかを示す。
・HasValueがTrueの場合Nullable.Valueは基になる型の値を取得。
HasValueがfalseの場合、ValueプロパティはInvalidOperationExceptionをスローする。

**NULL許容値型から基になる型への変換**
NULL許容値型の値をNULL非許容値型の変数に割り当てる場合は、NULLの代わりに割り当てる値を指定する必要がある。
それを行うには、NULL合体演算子？？を使用（Nullable<T>.GetValueOrDefault(T)メソッドも同じ木で使用することが出来る。）

例：

```
C#
int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}"); // output: b is 28

int? c = null;
int d = c ?? -1;
Console.WreteLine($"d is {d}"); // outlput: d is -1
```

NUllの代わりに基になる値の既定値を使用する場合は、Nullable<T>.GetValueOrDefault()メソッドを使用

次の例では、NULL居誘致型をNULL非許容型に明示的にキャストすることもできる。

例：

```
C#
int? n = null;

// int ml = n;  
int n2 = (int)n; 
```

実行時に**NULL許容値型の値がNULLの場合**は、明示的なキャストによってInvalidOperationExceptionがスロー。
NULL非許容値型Tは、**対応するNULL許容値型T?に暗黙的に変換**される。


**リフト演算子**
定義済みの単項演算子及び2項演算子、または値型Tによってサポートされるオーバーロードされた任意の演算子は、
対応するNULL許容値型T?でもサポートされます。
“リフト演算子”とも呼ばれるこれらの演算子では、一方または両方のオペランドがNULLの場合にNULLが生成。
それ以外は、そのオペランドに含まれる値を使用して結果が算出される。

```
C#
int? a = 10;
int? b = null;
int? c = 10;

a++;		// a is 11
a = a * c;  // a is 11-
a = a + b;  // a is null
```

**比較演算子<,>,<=,>=**では、一方または両方のオペランドがNULLの場合、結果はfalseになる。
それ以外はオペランドに含まれる値が比較。
例えば、＜＝から返される結果がfalseであっても逆の比較（＞）から返される結果がTrueとは限らない。

次の例では
10が
・NULL以上ではなく
・NULL未満でもないことを示します。

```
C#
int? a = 10;
Console.WriteLine($"{a} >= null is {a >= null}");
Console.WriteLine($"{a} < null is {a < null}");
Console.WriteLine($"{a} == null is {a == null}");
// Output:
// 10 >= null is False
// 10 < null is False
// 10 == null is False

int? b = null;
int? c = null;
Console.WriteLine($"null >= null is {b >= c}");
Console.WriteLine($"null == null is {b == c}");
// Output:
// null >= null is False
// null == null is True
```

**等値演算子 ==**では、両方のオペランドが null の場合、結果は true になります。一方のオペランドだけが null の場合、結果は false です。それ以外の場合は、オペランドに含まれる値が比較されます。
**非等値演算子 !=**では、両方のオペランドが null の場合、結果は false になります。一方のオペランドだけが null の場合、結果は true です。それ以外の場合は、オペランドに含まれる値が比較されます。
2 つの値型の間にユーザー定義の変換が存在する場合は、それに対応する null 許容値型間でも同じ変換を使用することができます。

参考資料：
・Microsoft　リファレンス
・C#の絵本
【AWS SAP】AWS Config と AWS cloudtrail【頻出】

##AWS SAP取得に向けて勉強する中で覚えてよかったもの 第5弾
以下サービスについて覚えておいて損はありません。

・AWS Config
・AWS cloudtrail

##AWS Configとは
AWSリソースの利用において、いつ、誰が何を使って何をしたのか、全て記録。

(以下、公式サイトより)
> AWS Config は、AWS リソースの設定を評価、監査、審査できるサービスです。Config では、AWS リソースの設定が継続的にモニタリングおよび記録され、望まれる設定に対する記録された設定の評価を自動的に実行できます。Config を使用すると、AWS リソース間の設定や関連性の変更を確認し、詳細なリソース設定履歴を調べ、社内ガイドラインで指定された設定に対する全体的なコンプライアンスを確認できます。これにより、コンプライアンス監査、セキュリティ分析、変更管理、運用上のトラブルシューティングを簡素化できます。

##AWS cloudtrailとは
AWSマネジメントコンソールやAWS の SDK やコマンドラインツールなどのユーザーアクティビティとAPI使用状況の追跡が可能。

(以下、公式サイトより)
> AWS CloudTrail は、AWS アカウントのガバナンス、コンプライアンス、運用監査、リスク監査を行うためのサービスです。CloudTrail を使用すると、AWS インフラストラクチャ全体でアカウントアクティビティをログに記録し、継続的に監視し、保持できます。CloudTrail では、AWS マネジメントコンソール、AWS の SDK やコマンドラインツール、その他の AWS のサービスを使用して実行されるアクションなど、AWS アカウントアクティビティのイベント履歴を把握できます。このイベント履歴により、セキュリティ分析、リソース変更の追跡、トラブルシューティングをより簡単に実行できるようになります。 さらに、CloudTrail を使用して、AWS アカウントの異常なアクティビティを検出することができます。こうした機能は、運用分析とトラブルシューティングを簡素化するのに役立ちます。
.NET FrameWorkコンパイラの場所(VB)

# コンパイラの場所
以下のパスの各バージョンのフォルダに「vbc.exe」がコンパイラである。
%windir%\Microsoft.NET\Framework
%windir%\Microsoft.NET\Framework64
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557103/76c02a8d-6b65-9597-4e74-af35c6260c7b.png)
Haskell入門 - Stackのインストールと設定

# Haskell入門 - Stackのインストールと設定

　どちらかといえばHaskellの門戸を叩くまでのアレ。新しい環境を作る度に古い環境を見ながら右往左往する癖をやめたい。
　インストールは最小限。エディタは好きなものを使う。

## Stackのインストール

　最悪これだけあれば良い。
　パッケージマネージャからインストールすると古いものがインストールされるので、curlまたはwgetでインストールする。

* `$HOME/.local/bin`には、`stack install`でインストールしたグローバルな何かが降ってくる。
* `.bashrc`あたりにオートコンプリート用のアレを仕込んでおくと、ノリでStackをシバけるようになって便利。
* `stack update`はかなり時間がかかる。後回しでもよいが、忘れていると初回ビルドに鬼のような時間がかかって泣く。

```shell
$ curl -sSL https://get.haskellstack.org/ | sh
$ echo 'export PATH=~/.local/bin:$PATH' >> ~/.bashrc
$ echo 'eval "$(stack --bash-completion-script stack)"' >> ~/.bashrc
$ stack update
```

## 最低限ほしいツール

* hlintはHaskell用のlinter。初心者であればあるほど入れるべき。
    * 不要なdoの削除やη-簡約の指摘だけでなく、場面により適した関数を提案してくれたりもする。
* stylish-haskell
    * フォーマッタ。ファイル保存時に自動的に走るようにすると吉。

```shell
$ stack install hlint
$ stack install stylish-haskell
```

### 次点でほしいやつ

* haskell-ide-engine (hie)
    * Haskell用の言語サーバ。
    * ビルドにボチボチ時間がかかる。また、ビルドに使用したGHCのバージョンとプロジェクトで使用するGHCのバージョンが同じでないと動かないらしい。

```shell
$ git clone https://github.com/haskell/haskell-ide-engine --recursive
$ haskell-ide-engine/install.hs hie
```

## StackのConfigとTemplatesの設定

　Stackを使ってプロジェクトをビルドしたり、`stack update`をしたりすると、`$HOME/.stack`下に諸々が生える。
　これを設定すると、`stack new`したときにセクシーなHaskellプロジェクトを生成できるようになる。

* `config.yaml`
    * `stack new`するときの引数のデフォルトを設定できる。
    * フォーマットはググれば出てくるが、概ね下のものを埋めてればいいはず。
    * `default-template`にはURLを指定できるので、テンプレートをGithubに置いておくとかしこい。

```yaml
templates:
  scm-init: git
  params:
    author-name: おなまえ
    author-email: おところ
    copyright: らいせんす
    github-username: githubの名前

default-template: てんぷれーと
```

* `templates/*.hsfiles`
    * ここには`stack new`したときに自動生成されるファイル群のテンプレートを作成する。
    * デフォルトで存在するものに手を加えるといい。
    * おススメはテストフレームワークの追加/変更(doctest, QuickCheck, tastyとか)と、GHCオプションで警告をONにすること。

```yaml
ghc-options:
- -Wall
- -Wcompat
- -Wincomplete-record-updates
- -Wincomplete-uni-patterns
- -Wredundant-constraints
```

　これを例えば`dependencies`の直上辺りに置いておくと、警告がいっぱい出てなんか楽しくなる。

## 参考

本気で Haskell したい人向けの Stack チュートリアル
http://web.archive.org/web/20200131232140/https://qiita.com/waddlaw/items/49874f4cf9b680e4b015
ブックマーク.htmlを初心者でもJavaScriptで整理整頓できるのか

iPhone3G-5sまでアップル漬け。
それ以降Android所有。
Googleを信用せずマイクロソフトを信じてる人。

古いiPhoneのバックアップデータ（10年前～4年くらい前）をiBackupbotで読み取り、SafariブックマークをHTMLに書き出す。
iPhoneを定期的に初期化し清潔を保っていたため毎度UUIDが変わるためバックアップもちらかっていた。
およそ20個ほどのUUIDから20個のHTMLを作成。この時点で奇人。

PC上のとっちらかってるエクスポートブックマーク.htmlをEverythingで30個ほど見つける。

Edge, Firefox, Chrome, Ironの最新ブックマークをHTMLに書き出す。

type *.html > merge.txt

で適当に連結。12万行になる。

テキストエディタで掃除、整理整頓、ソート、フォルダ削除。簡易的な重複削除。1万行。

JavascriptでURLが全く同じであれば重複削除。5000行まで圧縮。

10年間で5000ブックマーク。暇人すぎる。

閑話休題。

目標1は
・フォルダ構造をぶっ壊してしまったため機会的にフォルダ分けして動作を軽くしなければならない。
・サブドメインを含めないドメイン名主体で整理。
・互換性のあるフォーマットでHTML出力。

ブックマークバー/アーカイブ/ドメイン頭文字/ドメイン/固有のブックマークという構造
（例）
`ブックマークバー/アーカイブ/a/apple.com/<a href="https://music.apple.com">‎Apple Music</a>`

目標2は
フェッチAPIでDNS解決可否、サーバからお返事があるのか聴く。
なければ
`ブックマークバー/インターネット・アーカイブ/a/apple.com/<a href="https://web.archive.org/web/*/https://music.apple.com">[IA] Apple Music</a>`
のリンクに差し替える。
（フェッチAPIが有用なのかはわからないけれど）

目標は今月末まで。

ざっと調べた限りでは
Location, URLインターフェイス他ネイティブで用意されているパーツも使えそうであるがサブドメインやら扱うのが難しい。
正規表現でやってみようと思ったが汚くなるのでやめた。

```JavaScript
document.querySelectorAll("a")[50].hostname;
"foo.bar.com"
```

見立てでは初心者でもかんたんで少量の記述量で済むjQuery, [URI.js](https://medialize.github.io/URI.js/docs.html)に頼って書くが楽そうだ。

プログラミングに関することも書いておかないと規約上いけませんので

```JavaScript
let uri = new URI("http://abcd.efgh.example.org/foo/hello.html");

uri.subdomain(); 
"abcd.efgh"

uri.domain(); 
"example.org"

uri.tld();
"org"

uri.domain()[0]; 
"e"
```

JR東海のポスターのごとく「ラクだ！」

プロなら30分の仕事かもしれない。

URI.js - https://medialize.github.io/URI.js/docs.html

# 目標1達成

ブックマークのHTMLフォーマットが厄介で悪戦苦闘

![ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60993/0dc5b847-b94a-99e9-7b39-7c6dbeaf0fc5.png)
プログラミング言語Go完全入門 質問会 質疑応答メモ（ラフ）

### Q.
interface の使い方、継承との違いがまだしっくりときていません。できること、できないことをできれば他の言語（Java, Rubyなど）と比較して解説していただけると嬉しいです。

A.
Goに継承はない。
interfaceは抽象化したい時に使う。
httphandlerが有名なinterfaceのひとつ。あるいは、io.Reader/Writer。
Javaはimplemetsする必要があるが、Goでは必要ない。
⇒ダックタイピング
Goではinterfaceを後から作ることができる。

### Q.
保守運用が楽になるエラーハンドリングの方法や参考になる資料があれば教えていただきたいです。根本原因にたどり着くまでに時間がかかることがよくあります。

A.
ログを出しましょう。
ラップして上に投げればいいわけではない。
エラーを返すと受取り側の処理が複雑になるので、都度panicで出したい。

### Q.
初心者向けに、コードリーディングに最適なライブラリなどありましたら教えてほしいです。

A.
標準ライブラリ、という回答が一般的。
stringsパッケージが簡単かも。
デバッカーでライブラリの中まで入れると良い。
身近なライブラリを読むといいかも。
ライブラリに書いてあることが正しいわけではない。

デバッカーdelve
[Golangのデバッガdelveの使い方](https://qiita.com/minamijoyo/items/4da68467c1c5d94c8cd7)

### Q.
業務でGoを使わない場合、基礎を学んだ後はどのように学習していくのがいいですか？

A.
自分が使うものを作るのが一番。
日々の生活に困っているなど。。

### Q.
jsonを生成するのがとても辛いのですが、ベストプラクティスってあるのでしょうか？

A.
隠したいフィールドは出して。出したいフィールドは出す。
jsonの辛みを分析して、そのライブラリを作るといいかも。
jsonパッケージのライブラリを読んでみるとか。

ちなみに、structは入れ子にできる。

### Q.
RubyからGoに来たエンジニアとJavaからGoに来たエンジニアでテストや設計で意見が割れることがあるので、Goならではの思想、指針みたいなものがあれば聞きたい。

A.
Goの思想はシンプル。
シンプルなものはどれかで選ぶと良い。
シンプルというのは「複雑ではない」ということ。
複雑に作ると、後々保守性が悪くなったり、依存度が高くなる。


### Q.
ORMの良さ、どのORMがいいのか、何をするためのものかを教えて下さい。

A.
自分でSQL書くことが多い。

### Q.
goに関する書籍でおすすめの本、最近読んでよかったものなどありましたら聞きたいです

A.

- プログラミング言語Go
- Goによる並行処理
- Goならわかるシステムプログラミング
- Goの公式ブログなどもオススメ

### Q.
Goの将来性について、ご自身の考えで構いませんのでお伺いしたいです。Goのシェアはみるみる伸びていますが、Goを導入したけどPythonやRubyに戻したという話もちらほら聞くので、気になりました。

A.
Docker, k8sなどクラウド界隈ではしばらく使われるだろう。
Ruby, Pythonなど言語だけに注目して議論するのは危険。チームの状況諸々を考慮する必要がある。

早期にコンパイルNGなど、実行する前にバグがわかるのは助かる。実行時に安全。


# 参考リンク
- https://user-first.ikyu.co.jp/entry/google-wire
- https://future-architect.github.io/articles/20200528/
- https://knsh14.github.io/translations/go-codereview-comments/
- https://github.com/cuelang/cue
- https://future-architect.github.io/articles/20200522/
git : リモートブランチに初めてpushしたとき表示されたエラーを解決する

#はじめに
bitbucketで新しいリポジトリを作って、そのリポジトリに最初にpushするときにつまづきました。その時の解決法と原因を記録しておこうと思います。

##bitbucketで新しいリポジトリを作る
bitbucketで新しいリポジトリを作ります。
![Screenshot from 2020-06-03 19-57-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/26cb5ffd-6fbf-df3d-04a1-183cb02594f7.png)

ここで自分は「READMEを含めますか？」の欄で「Yes」としてREADMEを一緒に作成しました。

##作ったリポジトリに向けて最初のpushをする
ローカルリポジトリでファイルを編集、add、commitまで行って、pushをするというところでerrorとなりました。
（作業ブランチはmasterです）

```
sada@lynx:~/デスクトップ/training$ git push --set-upstream origin master
To bitbucket.org:***/***.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@bitbucket.org:***/***.git'
ヒント: Updates were rejected because the remote contains work that you do
ヒント: not have locally. This is usually caused by another repository pushing
ヒント: to the same ref. You may want to first integrate the remote changes
ヒント: (e.g., 'git pull ...') before pushing again.
ヒント: See the 'Note about fast-forwards' in 'git push --help' for details.
```
ヒントの中に「git pullをしてみろ」とあるので実行してみると、pullでもエラーとなりました。

```
fatal: refusing to merge unrelated histories
```

##解決法
過去に全く同じように問題に合われていた方がいたので、参考にさせていただきました。
>https://qiita.com/takanatsu/items/fc89de9bd11148da1438

pullのときのエラー文にあるように、無関係なヒストリーを持ったブランチ同士であるため、mergeができなかったようです。
>ちゃんと調べてみたところ
Git 2.9から mergeコマンドとpullコマンドでは，--allow-unrelated-historiesを指定しない限り，無関係なヒストリを持つ２つのブランチをマージすることはできなくなった。
とありました。

結果的には「--allow-unrelated-histories」オプションを指定することでpullが成功でき、pushできました。

##なぜ無関係なブランチだと言われたのか
参考元の記事でも同様の考察がされていますが、どうやら最初にREADMEを一緒に作ってリポジトリを作成したことが原因のようです。
bitbucketのブランチを見てみると、READMEが「initial commit」になっています。
![Screenshot from 2020-06-03 20-24-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/f3411752-c13a-d79b-5ae9-06fbdd0b91ac.png)


- リモートのmaster -> READMEをcommit
- ローカルのmaster -> 別ファイルをcommit

リモートとローカルでそれぞれ別の過程でcommitが行われた結果、無関係なブランチと判断されたようです。
MAMPのMySQLを利用することで面倒な環境構築せず、すぐにMySQL使えるように設定しよう！

まず、MAMPをダウンロードします。（無料）
https://www.mamp.info/en/downloads/
MAMP&MAMP PROをクリックしてダウンロード。

ダウンロードしたら、インストールします。
インストール終了したら、アプリケーションに作成されます。
<img width="613" alt="スクリーンショット 2020-06-03 19.51.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636249/26adfba7-ae9d-00ef-c320-aa92e1aee39b.png">

MAMPアイコンをMacのDockにドラッグ＆ドロップしてショートカットの作成をオススメします。
アイコンをクリックすると起動します。
<img width="543" alt="スクリーンショット 2020-06-03 19.54.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636249/335bc343-733a-b1fd-d67e-28bbef42b755.png">

Start Serversをクリックすると緑色に点灯してMySQLが使えるようになります。
※Cloudは、赤く点灯しますが、無視してください。
<img width="525" alt="スクリーンショット 2020-06-03 19.56.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636249/10a35729-4378-3f80-f0d8-cdcfb899f806.png">

MySQLが起動すると以下のphpMyAdminリンクにアクセスできます。
http://localhost:8888/phpMyAdmin/
phpMyAdminは、データベース、テーブル、カラムの作成、変更、削除が容易にできます。

laravelの<code>.env</code>を設定しましょう。
デフォルトは、以下になっています。
<img width="601" alt="スクリーンショット 2020-06-03 20.06.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636249/517c0603-4498-a30d-0a56-a85ab3a771fe.png">

<img width="544" alt="スクリーンショット 2020-06-03 20.08.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636249/a7ab0ebe-6916-3a2b-238b-9ce86a8d67ed.png">

<code>DB_DATABASE=</code>　データベース名を記述。
<code>DB_PASSWORD=</code>　Macの場合は、<code>root</code>になります。
追加で<code>DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock</code>を記述。

phpMyAdminでデータベースを作成してみましょう。
新規作成をクリック。
データベース名を入力。
作成ボタンをクリックでデータベースが作成されました。
<img width="695" alt="スクリーンショット 2020-06-03 20.15.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636249/a7c5680f-5b09-be84-18fb-31c93e84c19e.png">

作成したデータベース名を<code>.env</code>の<code>DB_DATABASE=</code>　に記述。
<img width="544" alt="スクリーンショット 2020-06-03 20.08.45のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636249/c3a0e16f-d5fd-b161-fcfb-409c1cbb4006.png">

ターミナルでmigrationします。

```
php artisan migrate
```
設定したデータベースにmigrationされました。

phpMyAdminにアクセスして確認。
http://localhost:8888/phpMyAdmin/
作成したデータベース以下にmigrationされています。

以上です。

参考になったら幸いです。
【Golang】ゴルーチン⑤複数goroutinからチャネルに値を入れ取り出す


#【Golang】ゴルーチン⑤複数goroutinからチャネルに値を入れ取り出す
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//producerとconsumer
//複数goroutinからチャネルに値を入れ取り出す

//mainから、いくつかのProducerを走らせて、
//その処理結果をchannelに入れて、Consumerでchanelの値を集めれて
//処理を行う

import (
	"fmt"
	"sync"
	"time"
)

func producer(ch chan int, i int) {
	ch <- i * 5
}

func consumer(ch chan int, wg *sync.WaitGroup) {
	for i := range ch {
		//インナー無名関数
		//処理をまとめたいとき。
		func() {
			defer wg.Done()
			fmt.Println("process", i*100)
		}() //() 実行
	}
	fmt.Println("全producer受け取り終了")
}


func main() {
	//並列処理 全てのGoroutinが終わるまで待つ
	var wg sync.WaitGroup
	//channelを作成
	ch := make(chan int)

	// Producer
	//10回分作成
	for i := 0; i < 10; i++ {
		//Consumerが全て受け取ったかを確認するため
		//10回追加
		wg.Add(1)
		go producer(ch, i)
	}

	// Consumer
	//同じwg　なのでアドレスで渡す
	go consumer(ch, &wg)

	wg.Wait()

	//ここでクローズするのは、まだconsumerのgoroutinが走っている為
	//consumerだけ走ったまま終了してしまう
	//Consumer内のchannelが全て出力されるのを待つ
	close(ch)

	//Consumerが全て終わったら
	time.Sleep(2 * time.Second)
	
	fmt.Println("Done")
}
```
【VBA】CSVファイル読み込み

```vb
Sub Test()
  Dim wsImport As Worksheet
  Set wsImport = Worksheets("Sheet1") 'CSVデータを取り込み用シート
 
  '読み込むファイル
  Dim strFilePath As String
  strFilePath = "C:\Users\take2\Desktop\VBA\test.csv"
 
  Dim queryTb As QueryTable
  Set queryTb = wsImport.QueryTables.Add(Connection:="TEXT;" & strFilePath, Destination:=wsImport.Range("A1")) ' CSV を開く
  With queryTb
      .TextFilePlatform = 932          ' 文字コードを指定
      .TextFileParseType = xlDelimited ' 区切り文字の形式
      .TextFileCommaDelimiter = True   ' カンマ区切り
      .RefreshStyle = xlOverwriteCells ' セルに書き込む方式
      .Refresh                         ' データを表示
      .Delete                          ' CSVファイルとの接続を解除
  End With
  

  MaxCol = wsImport.UsedRange.Columns(wsImport.UsedRange.Columns.Count).Column
  MaxRow = wsImport.UsedRange.Rows(wsImport.UsedRange.Rows.Count).Row
  arr = Range(Cells(1, 1).Address, Cells(MaxRow, MaxCol).Address)
  
End Sub

Sub aaaa()
  Dim wsImport As Worksheet
  Workbooks.Open "C:\Users\take2\Desktop\VBA\test.csv"
  Set wsImport = Worksheets("test") 'CSVデータを取り込み用シート
  
  MaxCol = wsImport.UsedRange.Columns(wsImport.UsedRange.Columns.Count).Column
  MaxRow = wsImport.UsedRange.Rows(wsImport.UsedRange.Rows.Count).Row
  arr = Range(Cells(1, 1).Address, Cells(MaxRow, MaxCol).Address)
End Sub

```


>参考
https://www.sejuku.net/blog/69321
Ruby ハッシュについて

[前回のハッシュに関する記事](https://qiita.com/mofuko0213/items/58de90ac4c5595518511)

# ハッシュ
ハッシュとは: キーと値の組み合わせでデータを管理するオブジェクトのこと

ハッシュを作成する場合は、以下のような構文を使います

`{ キー1 => 値1, キー2 => 値2, キー3 => 値3 }`

実際にハッシュを作成した例

```ruby
{'food' => 'rice', 'fruit' => 'lemon'} 
```

## 要素の追加

ハッシュを作成した後から、新しいキーと値を追加したい場合、以下のような構文を使います。

`ハッシュ[キー]　=　値`

(例)以下は新たにドリンクの種類を追加するコードです。

```ruby
menu = { 'food' => 'rice', 'fruit' => 'lemon',  }

# ドリンクメニューを追加する
menu['drink'] = 'water'

puts menu #=> {"food" => "rice", "fruit" => "lemon", "drink" => "water"}
```

### 要素の上書き
既にキーが存在する場合、値が上書きされます。

```ruby
menu = { 'food' => 'rice', 'fruit' => 'lemon',  }

# 値を上書きする
menu['food'] = 'pizza'

puts menu #=> {"food" => "pizza", "fruit" => "lemon"}
```

## ハッシュを使った繰り返し処理
eachメソッドを使用すると、キーと値のセットを順番に取り出すことができます。

```ruby
menu = { 'food' => 'rice', 'fruit' => 'lemon',  }

menu.each do |key, value|
  puts "#{key} : #{value}"
end

# => food : rice
#    fruit : lemon
```

ハッシュに each メソッドを使うときは変数に「キー」と「値」を指定します。 
|変数|の変数はブロック引数といい、eachメソッドから渡されたハッシュの要素が入る。
ハッシュの「キー」が変数 key に、「値」が変数value に順番に代入されていきます。そして、ハッシュの要素の数だけブロック内で記述された処理が繰り返し実行された後、ブロックから抜け出し処理が終了します。

## 参考にした文献

[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/dp/4774193976/ref=cm_sw_em_r_mt_dp_U_shaUEbXSFD416)
RNなのにリリースのときネイティブコード触ってるの？

# やりたいこと
さあ、react-nativeアプリの機能実装終わった！リリースだ！
新バージョンにインクリメントするか・・

3. `npm version minor`叩いて・・・
1. ios: `info.plist` さわって・・・
2. android: `build.gradle` さわって・・・


クロスプラットフォームなのにこのタイミングはネイティブコード触るんか・・・
これ、自動化できへんの・・・？

# ソリューション

`react-native-version`を使うんや！
https://github.com/stovmascript/react-native-version
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/cb31929c-ab34-1043-8c67-a066060a08e6.png)

## How To

僕の場合はこのようにしています。

```bash
$ npm version <major | minor | patch> # => ex) npm version patch => 1.0.1
$ RNV=android,ios npx react-native-version # 1.0.1としてインクリメントされる
```

こうすることで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/6a6be66e-df86-7b1c-030e-fed467d41cd2.png)

npmのバージョン情報をもとにandroidとiosの各ファイルを更新しにいくのです。
androidのbuild.gradleのversionCodeもきっちりインクリメントしてくれる・・・すてき・・・
AWS Lambdaの利点、欠点

#Lambdaとは
ユーザーはコードだけ書いてくれれば、サーバー管理はAWS側でしますよってサービス。データの変更に応じてコードを実行したり、HTTPリクエストに応答してコードを実行したりしてくれる。

#Lambdaの利点
####サーバー管理が不要
Lambdaとはでも書いた通り、サーバー管理をAWS側でしてくれる。

####継続的スケーリング
自動的にアプリケーションをスケーリングしてくれる。
重たい処理には多くのリソースを割り当てて、軽い処理には少しだけリソースを与える。

####ミリ秒単位の課金
コードが実行される100 ms(= 0.1秒)ごとに課金される。
コードが実行されてない時は課金されないから料金は安く済む。

####安定したパフォーマンス
それぞれの処理に適切なメモリサイズを割り当てるからコード実行時間を最適化できる。
2桁のミリ秒以内に応答するようにハイパー対応することも可能。

#Lambdaの欠点
####サーバー管理ができない
メリットでもあったけど、自分で管理したい時はそのままデメリットになる。

#最後に
AWSについて学習中のメモ代わりに残しています。
新しくわかったことがあれば追記します。

参考
https://aws.amazon.com/jp/lambda/
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
ECSサービス機能について

#前提
ECSについて学んだことを書いていきます。

#本題

#サービスとは
タスク定義を手動実行してクラスターにタスクを配置。
手動でタスク定義の画面からタスクを実行。
→実際のサービスでは現実的ではない。

負荷が高まったら人力でオートスケーリング。
タスクを人力監視する。
自動化できるナイスな機能がある。
その機能がサービス。
サービスはタスクを配置し管理する機能のことでタスク定義１に対し、サービスを作成する。
サービスとタスク定義は１対１。
サービスにはタスクをいくつ起動するか数を指定する。

例えば、、、
3つタスクを起動するよう指定した場合。
すると、ECSはクラスターに対してタスクを3つ配置してくれる。
コンテナは6つ起動。

タスクを配置する際にどのような配置するか、優先順位をつけることができる。（配置戦略）

例えば、、、
最低限のタスクが5つの場合。
コンテナが2つ消滅した場合、ECSサービスが自動的に2つタスクを起動。
また、大規模なAZ障害で片方のEC2が停止した場合、リソースが空いている前提で、ECSはもう片方のEC2でタスクを起動する。

サービスはタスクをいくつ起動するか、管理する機能。

ECSはロードバランサーやオートスケーリングと組み合わさったサービス。
どのように組み合わさるのか。

クラスターの土台の上に、タスクを実行する。
タスクにはコンテナが含まれている。
タスクをどのように配置するか管理し、また何個実行するか数を管理する。

サービスはタスクをまとめるレイヤーのものだが、タスクの事項数を指定する、自動でタスクをデプロイするといった特徴がある。

タスク定義を作成して、サービスでタスクの必要数を４に設定して実行する。
EC2のタイプの場合、EC２の上で実行される。
クライアントはどのようにサービスにアクセスするのか。
それにはロードバランサーをサービスに関連づけて使用する。

クライアントはロードバランサーのDNSネームにアクセスする。
このロードバランサーにはALBやNLBの種類があり、通常EC2インスタンスに対してバランシングをするが、ECSで作成するロードバランサーは、サービスと関連付けたタスク全てに対して、トラフィックをバランシングする。
ちなみにコンテナネットワークモードをブリッジすることでホスト側のポートとコンテナ側のポートを紐づけていたが、ホストポートを０にすることで、エフェメラルポート（一時的なポート番号）が割り当てられる。
ロードバランサーにはセキュリティグループをアタッチするが、EC2のセキュリティグループ許可設定で、ロードバランサーがアタッチしているセキュリティグループからの通信を許可しておく。
クライアントは８０番ポートで、ロードバランサーのDNSnameに対しアクセスをすると、ロードバランサーは各コンテナへアクセスを振り分けてくれる。

#コンテナアップデート方法
バージョン１のコンテナをアップデートしてバージョン２を作成。
このバージョン２をECRにプッシュし、タスク定義のコンテナイメージURIを指定する箇所でバージョンを２に変更する。
そうするとタスク定義のリビジョン番号は増加する。

サービスの設定を更新。
更新時にタスク定義のリビジョンナンバーを２にすることで新しいコンテナがEC2に配置される。
かつロードバランサーは新しいもの古いものの区別なく、各コンテナへ振り分けてくれる。
一定時間経過すると古いコンテナはターゲットグループから削除され、タスクの実行もECSサービスによって停止される。

#グループリーンのデプロイ方法
古いコンテナが稼働している環境に、新しいコンテナをデプロイしロードバランサーのトラフィックを送信先を徐々に新しいコンテナへ変えていき、最終的に新しいコンテナのみトラフィックを送信する。

#オートスケーリンググループ
クラウドウォッチアラームとスケーリングポリシーを使用し、EC2を増減させる機能のこと。
ECSサービスでは、タスクに対するオートスケーリング機能がある。
タスク個別にオートスケーリングするもの。
EC2とタスク個別とオートスケーリングを組み合わせられる。

オートスケーリングについて、基本的にサービス全体の合算。
サービス全体のCPU使用率、またはメモリ使用率が閾値を超過したらタスクを1つ追加するといった設定ができる。
追加してもまだ高負荷の状態が続き、閾値超過し続けていたら、さらにタスクを1つ投入。
最小値、最大値、希望する数といった設定が可能。
メモリを閾値にする場合、EC2インスタンスに搭載されているメモリの容量はインスタンスタイプによって決まっている。
T3microは２GB、２０４８MB。
そのため、タスク1つあたり5１２MBを予約メモリとして割り当てている場合、EC2、１台あたり4つまでしかタスクを配置できない。
あと2個しかタスクを起動できない状態。
この辺りでEC2インスタンスをスケールしたいところ。
そこでReservation系のメトリクスを使用する。
これはクラスター全体に対してメモリ使用率が何パーセント予約されているかといったメトリクス。
この状態だとクラスター全体の4096MBに対し、3072MB、75%使用されているため、MemoryReservationが75%以上になった場合、EC2を1つスケールするよう、スケーリングポリシーを設定することでタスクを最大値の１0までクラスターやタスクのスケールアウトを伴って高負荷の状態を乗り切ることができる。
高負荷の状態が治ったらスケールインする設定も忘れずに行う。
Reservation系のメトリックスはCPUもある。
Rails】undefined local variable or method エラーについて【定義しているのに出る！！

ちゃんと定義しているのに<b>「undefined local variable or method」</B>エラーが出るエラーに苦しんだので。。。

#起きたエラー
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647361/5f43aaeb-b607-56d1-fcc1-15d40c82761c.png)

<b>「invite」というメソッドがありません！</b>というエラーに…。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647361/714a68c5-3706-c43a-935f-ac28b7c3160f.png)
でも「inviteメソッド」は間違いなく書いてあります。

#原因
「def invite」の直前部分が<b>「全角スペース」</b>になっているだけでした

全角スペースを<b>半角スペース2個</B>でインデント揃えたら解決しました。

とっても初歩的なミスでした。

同じミスで苦しんでいる人の助けになりますように
一緒に頑張りましょう…！
アップデートでVisualStudioの文字の色が変わった

#VisualStudioをアップデートしたら！#
普段C#でプログラムを書いているのですが、
先日VisualStudio2019に16.6.1のアップデートが来ていました
3GBのファイルのダウンロードと、インストールが終わることを待っていると
エクスプローラが**落ちました**
何はともあれ、アップデートは完了しました

#問題が！#
アップデートは無事(問題は発生しましたが)完了しましたが、
プロジェクトを開くと問題が！

(濃色の場合)
なんと、慣れ親しんでいた

- メソッドは黄色
- クラスは緑
- グローバル変数は白
- ローカル変数は水色
- 制御文はピンク
- 組み込み型、アクセス修飾子が青
- 列挙型が緑

といった配色が以下のように変わってしまいました

- 予約語が青
- 変数メソッドが白
- 列挙型が緑
になっていました

画像ではこのような感じです


### アップデート前
![アップデート前](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606743/2901387c-70e4-7c4c-d29c-3b07b17a8cc4.png)


### アップデート後
![アップデート後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606743/b07bcc98-9243-bef2-17b9-ba975425b3d9.png)


見てわかるように見にくくなりましたね
これを直す方法を紹介します

#直し方#
ツール(T)→オプション(o)を押すとオプションという画面が開きます
![オプション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606743/98123095-ab68-c9d8-0606-b959d1c508d5.png)

そこから、テキストエディター→C#(任意言語)→詳細
を押します
![スクリーンショット (234).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606743/5859f273-d1d5-6bfa-eb97-be5cdc93a3b5.png)

スクロールしていくと、エディター配色があるので
それをVisualStudio 2017から2019に変更します
以上です。

![スクリーンショット (229).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606743/b7537594-7ccf-4840-db61-018f4dd7e183.png)


この通り戻りました

#終わりに#
今回はなぜか、アップデートしたことにより配色が2017になっていたので2019に戻したということでした
ElixirのCachexモジュールをSupervisor.start_link/1のchild_listにどのように指定すればよいのか？

## ドキュメントの通りに行う
Cachex version 3.2のドキュメントには、以下のように書かれている。

```Elixir
Supervisor.start_link(
  [ worker(Cachex, [ :my_cache, [] ]) ]
)
```

このままのコードを書いて、コンパイルすると、undefined function worker/2 というエラーになるので、モジュール名を指定しなければならないらしい。

```Elixir
Supervisor.start_link(
  [ Supervisor.Spec.worker(Cachex, [ :my_cache, [] ]) ]
)
```

これで、実行できた。

## ハマる
Elixir version 1.10.3 のドキュメントによると、Supervisor.Specは、deprecated になっている。ということで、child_specを使ってみる。

```Elixir
Supervisor.start_link(
  [ Cachex.child_spec(:my_cache, []) ]
)
```

これはだめ。Cachex.child_specのarityは、1なので、コンパイルエラーになる。じゃあリストにするの？と、以下のように書き換えてみる。

```Elixir
Supervisor.start_link(
  [ Cachex.child_spec([:my_cache, []]) ]
)
```

これは、実行時にエラーになる。Cachex.child_spec/1を実行すると以下のように展開される。

```
iex(1)> Cachex.child_spec([:my_cache, []])
%{
  id: Cachex,
  start: {Cachex, :start_link, [[:my_cache, []]]}, 
  type: :supervisor
}
```

Cachex.start_linkのarityが、2なので、上記のchild_specデータでは、実行時エラーになって当たり前。

じゃあどうする？と、行き着いた結果が以下。

```Elixir
Supervisor.start_link(
  [ Supervisor.child_spec(Cachex,
                          start: {Cachex, :start_link, [:my_cache, []]}) ]
)
```

## 残された疑問

Cachex.child_spec/1 って何なの？

## その後

Cachex v3.3.0 で、Cachex.start_linkのarityが、1になり、キャッシュの名前は、:nameオプションで指定するようになった。めでたし、めでたし。
【AWS】ECSリポジトリにローカルのDockerをプッシュできないときの対処方法

# 環境
Docker 19.03.8
macOS 10.15.4

# IAMユーザーの作成
IAMユーザーを作成し、その後にアクセスキーを設定します。

```ruby:terminal
$ aws configure
AWS Access Key ID [****************]: (credencialsのAccess key ID)
AWS Secret Access Key [****************]: (credencialsのSecret access key)
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [json]: json
```
そして```$ aws configure list```を実行します。

```ruby:terminal
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     (credencialsのAccess key ID)      env    
secret_key     (credencialsのSecret access key)  env    
    region           ap-northeast-1      config-file    ~/.aws/config
```

**※しかしこのときにセキュリティ的に伏せていますが```$ aws configure```と```$ aws configure list```のアクセスキー及び、シークレットアクセスキーが一致していない前提です**

# 認証トークンを取得し、レジストリに対して Docker クライアントを認証しようとするものの...

```ruby:terminal
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin (アカウントID).dkr.ecr.ap-northeast-1.amazonaws.com

An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.
```

このエラーの内容は**認証情報周りの設定に問題があることが原因**だと言うことがわかりました。アクセスキーとシークレットアクセスキーがenvになっているので**おそらくどこかで環境変数にアクセスキーとシークレットアクセスキーを設定している**と考えました。

# .bash_profileを確認する
.bash_profileの中を確認してみます。

```ruby:terminal
$ open -a TextEdit ~/.bash_profile
```
```$ aws configure list```で確認されたアクセスキーとシークレットアクセスキーの末尾と一致するアクセスキーとシークレットアクセスキーが表示されましたので削除します。

ターミナルを閉じて再度開いてから```$ aws configure list```を実行すると**.bash_profileのアクセスキーとシークレットアクセスキーが優先され、IAMユーザー認証情報が実行できなかった場合に**これでエラーが解消されます。

# それ以外のアクセスキーとシークレットアクセスキーが優先されていた場合は...
下記のコマンドを実行し一度リセットします。

```ruby:terminal
$ mv ~/.aws/credentials /tmp/credentials.bak
$ mv ~/.aws/config /tmp/config.bak
# credentialとconfigを削除するコマンド
```
そして一度ターミナルを閉じてから再度開いて```$ aws configure```を実行して再設定する方法もあります。

以上が【ECSリポジトリにローカルのDockerをプッシュできないときの対処方法】になります^_^
Javascriptで値が数値かどうかチェック→スペースかどうかも

[Wano株式会社](https://wano.co.jp/)で社内のもろもろを担当しているakibinです。

ヒゲ男ばかり聴いて、少しでも若返ったつもりでいる今日このごろです。でも好きだなーこのちょっと縦ノリっぽい楽曲と声。

#今回やってみたこと

Javascriptで値が数値かどうかチェックするのに[こちらの記事](https://uxmilk.jp/46961)を参照させてもらいました！（分かりやすかったです！!）

がしかし！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/d118694d-4b5c-47fa-31ee-ffadaa21e824.png" width=50%>
スペースを数字と認識してしまうので、スペースかどうかもチェックするようにしてみました。

#こんな感じ
正規表現の\S（空白文字以外の文字）と、！で論理値を反転させてif文で判定。当てはまった(true)場合はtry…catch文を使用して終了する。（JSにはexitが無いので）
※htmlは参照させていただいた記事と変わりないのですが、念の為載せておきます。

```html:check.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>check</title>
  <script src="check.js"></script>
</head>
<body>
  数値を入力して下さい：
  <input type="text" id="input01">
  <input type="button" value="check" onclick="check();">
</body>
</html>
```

```javascript:check.js
'use strict';

var check = function() {
    var num = document.getElementById('input01').value;

    try {
        if (!num.match(/\S/g)){
            alert("スペースが入ってますよ！");
            throw new Error("スペースありのため終了します");
        }

        if(!isNaN(num)){
            alert("入力された数は" + num + "です。");
        } else {
              alert("数値以外が入力されています");
        }
    } catch(e) {
        console.log(e.message);
    }
}
```

これで…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/764a5948-4f24-0137-e588-96f1073e8c04.png" width=50%>
これでOKぃ！！

こちらもよろしくです。
＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
◆ Twitterアカウント
@AkibinMusic

◆ Youtubeチャンネル
https://www.youtube.com/channel/UC-JOpwEnJn3gCrUA4NdCYgg
レボボーヌージョー

先駆者: [ヌレボージョーボー](https://qiita.com/ddg171/items/c2d75b2b2b3289ca4e0c)

```python
import random
l = ['ボ', 'ジョ', 'レ', 'ヌ', 'ボ']
random.shuffle(l)
[l.insert(i, 'ー') for i in [3, 5, 7]]
print(''.join(l))
```

行数は増えたがコードのサイズは減らせた

# 元ネタ

[ヌジョレーボーボー](https://qiita.com/mattn/items/ae764601862b0073071e)
PyTorchでMNISTする際のGPUメモリ（＋α）を測定してみた

ディープラーニング用にグラフィックカードの購入を検討しており、どのくらいのGPUメモリがあればいいのか知りたく、本記事を作成しました。

# 前提

- 環境
  + GCP
  + GPU（NVIDIA Tesla T4）を1枚付けたインスタンス（4vCPU、メモリ8GB）
  + Ubuntu 18.04.4、PyTorch 1.5.0
- 使ったプログラム
  + PyTorchのサンプルコード（[GitHub](https://github.com/pytorch/examples/tree/master/mnist)）

# 測定方法

- バッチサイズを4、16、64、256、1,024、4,096と変えながらMNISTの処理を実行。エポック数は20。
- 乱数のシードを3パターン用意し、平均値を集計。
- 実行中はnvidia-smiコマンドを使ってGPUメモリの使用量を測定。

# 結果

## GPUメモリの使用量と処理時間

| バッチサイズ | GPUメモリ使用量（MB） | 処理時間（秒） |
|----------:|-----------------:|-----------:|
|         4 |            1,752 |      1,185 |
|        16 |            1,750 |        387 |
|        64 |            1,880 |        246 |
|       256 |            2,270 |        211 |
|     1,024 |            3,278 |        204 |
|     4,096 |           10,490 |        204 |

## テストデータでのlossとaccuracy

<img width="1090" alt="スクリーンショット 2020-06-03 17.27.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34307/15a4c3fa-f784-5e0a-a026-2165a560d09c.png">

上記グラフだとバッチサイズ＝4,096の影響が強すぎて、それ以外の差がわかりづらいので、、、

## テストデータでのlossとaccuracy（バッチサイズ＝4,096を除く）

<img width="1090" alt="スクリーンショット 2020-06-03 17.29.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34307/f6854fda-405c-4b63-dc2a-b0e4c328403c.png">

# まとめ

MNISTをやるだけであれば、GPUメモリ4GBのグラフィックカードで事足りそうですが、MNISTだけやって満足するわけがないので、違うデータでも測定をしてみる予定です。
最新のopenframeworksでFaceTracker試してみたがエラーが出て困った

#はじめに
新しくノートPCを買ったのでopenframeworksの環境をセットアップしてFaceTrackerのサンプルコンパイルしてみようと思ったのですが、ハマった点を自分用にまとめます。
(2020/06/03)

##環境
Windows10
Visual Studio 2019
openframeworks 0.11.0→0.10.0

openframeworksはvs2017のv141をつかっているみたいで
Visual Studio Installerをつかってインストールします。
![vs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/f34a2a87-792b-137e-3f95-a139bd14fcbf.png)



###参考
FaceTrackerを試してみた
https://qiita.com/moshimoshiasimo/items/91ebb571fbc3df647343

上記のqiitaの記事を参考に環境をセットアップしてコンパイルしました。

###エラーー内容
E1696	ソース ファイルを開けません "opencv/cv.h"

現在、openframeworksのHPに行って最新版をDLすると0.11.0が落ちてきます。
そうすると、opnecvのファイルのオープンができないと言うエラーが出てしまいます。このエラーはaddonsのofxFaceTrackerがopnecvの関数使ているみたいなのですが、これがエラーを出します。
このエラーはofxFaceTrackerのIssuesに上がっていました。
どうやら、openFrameworks 10.2以降のOpenCVをバージョン4.0.1にアップグレードし、FaceTrackerがこのバージョンと互換性がないのが問題らしい。。
https://github.com/kylemcdonald/ofxFaceTracker/issues/164

####解決方法
0.11.0→0.10.0ダウングレードすることで対応しました。
下記がopenframeworksの過去のリリースバージョンをDLできるURLです。
https://openframeworks.cc/download/older/


#####もう一個エラー
リンクエラーが出るのですが、その解決方法は下記のqiitaの記事書いてあります
https://qiita.com/shunjisato/items/014cb79bbf034a28770c

#####まとめ
openframeworksは普段使っていないので、わからないのですが、バージョンによって対応未対応みたいなのがあるのでしょうかね？今回はバージョンダウンで対応しました。（FaceTrackerが使いたいだけなので）
![face.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/88847e24-c817-af01-1154-cfd0b32de32c.png)
さようなら、いままで魚をありがとう。

間違えてターミナルでexitしてしまったときのメモ。

## 経緯
<img width="680" alt="スクリーンショット 2020-06-03 2.10.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585984/fe6ce94c-1056-beee-5f63-474e667b4302.png">

なんだこれは。
と思ってググって出てきたのがこれ。
https://www.google.com/search?sxsrf=ALeKk00MtIOmVaCW4MacQSM_VpeVbPBpvA%3A1591116226247&ei=woHWXtrWDtaDoATFj7k4&q=so+long+and+thanks+for+all+the+fish.+--+douglas+adams&oq=&gs_lcp=CgZwc3ktYWIQARgCMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnMgcIIxDqAhAnUJ4NWJ4NYJjgzwFoAXAAeAGAAQCIAQCSAQCYAQGgAQGqAQdnd3Mtd2l6sAEK&sclient=psy-ab
ダグラス・アダムズ著『So Long, and Thanks for All the Fish(さようなら、いままで魚をありがとう。)』というSFコメディらしい。

このタイトル + "exit", "terminal" あたりのキーワードでも検索をかけたが書籍関係ばかり出てくる。

ちなみに詩 (?) も出てきた。
https://youtu.be/ojydNb3Lrrs

この詩を訳している記事もあった。なかなか興味深い。
http://bakerist.hatenablog.com/entry/2012/02/18/140429



## 結論 
対処としては特になく、ターミナルを再起動すれば問題ない。[^1]
ところで、この物語の次作は『Mostly Harmless』で "ほとんど無害"。





[^1]: ただしプロセスは残ってしまっていたので、きちんとkillした
JavaScriptでhtmlのTableをいじる

# 初めに
今回はjQueryをメインでDOM操作しながらTableをあれこれする方法を展開します。
## コード
### セルを押下できるようにする
セルを押下するとイベントが発火して処理される仕組み(今回はアラート表示)
まずはhtml側にTableをセットする(今回はタイトルなしです)

```html:test.html
<table border="1">
        <tr>
            <td id="a"><a onclick="onClick(this);">Test1</a></td>
            <td id="b"><a onclick="onClick(this);">Test2</a></td>
            <td id="c"><a onclick="onClick(this);">Test3</a></td>
        </tr>
        <tr>
            <td id="d"><a onclick="onClick(this);">Test4</a></td>
            <td id="e"><a onclick="onClick(this);">Test5</a></td>
            <td id="f"><a onclick="onClick(this);">Test6</a></td>
        </tr>
    </table>
```

```javascript:main.js
function onClick(link){
    alert("Test");
}
```

### 押下したセルの文字を入れ替え

```javascript:main.js
function onClick(link){
    $(link).html("入れ替え")
}
```

### 押下したセルの文字を抽出

```javascript:main.js
function onClick(link){
    $(link).parent().text()
}
```

### 押下したセルの列番号を抽出

```javascript:main.js
function onClick(link){
    $(link).parent().index()
}
```

### 押下したセルのIDを抽出
idを振っている前提です

```javascript:main.js
function onClick(link){
    $(link).parent().attr('id')
}
```

#終わりに
今回はTableについての展開でした。
すごく簡単ですね！楽しい！
Stripe wehook testing locally

To test if your Stripe webhook integration is working fine on your local.

# Expose your local server

For example of docker-compose.yml

```
  my-project:
    build: my-project
    volumes:
      - ./my-project:/var/www/html
      - ./my-project/000-default.conf:/etc/apache2/sites-available/000-default.conf
    # Expose 8080 for debugging of Stripe webhook with ngrok.
    ports:
      - '8080:80'
```

# Sign up for ngrok
https://dashboard.ngrok.com/signup
After you sign up, it will explain how to install/use the ngrok command in the dashboard.

# Run ngrok command

```
$ ./ngrok http 8080
Session Status                online
Account                       taroshin (Plan: Free)
Version                       2.3.35
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://3fc5e4f7****.ngrok.io -> http://localhost:8080
Forwarding                    https://3fc5e4f****.ngrok.io -> http://localhost:8080

Connections                   ttl     opn     rt1     rt5     p50     p90
                              2       0       0.00    0.00    3.04    3.22

HTTP Requests
-------------
```
It will provide you a hostname which tonnes payload from Stripe to your local server.


# Register your webhook URL to Stripe
Log in to your Stripe account and register your webhook URL in `Developer > Webhook`
And also you can test it out on the same page.
Joobyはいいぞ

#とりあえず公式
https://jooby.io/

#Jooby?
Java/Kotlinを使用できるマイクロフレームワークです。
古めかしいフレームワークチックな気配は感じられなくとても楽にパパっとコードが組めちゃいます。

Windows上でも開発できますが、できればLinux上で開発したほうがよさげです
(体験談)公式に配布されてるCLIがWindows上でうまく動作しなかった。

プラグインも豊富でそれなりの規模のアプリケーションにも対応できそうな感じです。

```build.gradleから抜粋(慣れてる人は.ktsで良いと思います！)
dependencies {
    // DataSource via HikariCP
    implementation 'io.jooby:jooby-hikari:2.7.1'

    // Jdbi Module
    implementation 'io.jooby:jooby-jdbi:2.7.2'

    // Flyway Module
    implementation 'io.jooby:jooby-flyway:2.7.1'

    // mysql-connector
    implementation 'mysql:mysql-connector-java:8.0.19'

    // okhttp3
    implementation  "com.squareup.okhttp3:okhttp:4.3.1"

    compile "io.jooby:jooby-netty"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile "ch.qos.logback:logback-classic"
    compile 'io.jooby:jooby-jackson:2.6.2'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.10.3'
    compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.10.3'
    compile "org.jetbrains.exposed:exposed-core:0.22.1"
    compile "org.jetbrains.exposed:exposed-dao:0.22.1"
    compile "org.jetbrains.exposed:exposed-jdbc:0.22.1"
    compile "javax.xml.bind:jaxb-api:2.3.1"

    testImplementation "com.nhaarman:mockito-kotlin:1.5.0"
    testCompile "org.junit.jupiter:junit-jupiter-api"
    testCompile "org.junit.jupiter:junit-jupiter-engine"
    testCompile "io.jooby:jooby-test"
    testCompile "com.squareup.okhttp3:okhttp"
}
```

１つ謎な点を挙げるとプラグインによっては読み込む位置が違うとうまく動作しなかった点かな
コード的な観点というと特徴的なのはApp.ktとかルーティングの部分くらい(詳しくは公式へ)

```App.kt
class App : Kooby({

    /** Jacksonモジュール、ここで読み込まないと効果がない */
    install(JacksonModule())

    /** CORS用のハンドラー、ここで読み込まないと効果がない */
    val cors = Cors.from(config)
    decorator(CorsHandler(cors))

    get("/") {
        Const.env.getString("tmp.imageFilePath")
    }
　　
    // use(path,**())で別のルートテーブルを読み込める、パスごとにまとめれるので便利
    use("/WebXX", WebXX())
})

fun main(args: Array<String>) {
    runApp(args, App::class)
}
```

<まだ試してないこと>
元々Java8で始まったフレームワークっぽいですが、11でビルドしても問題なく動作してます。
それならJLinkと組ませてミニマムなJRE生成までセットでできたら良いかなぁ。。。

[badass-runtime-plugin](https://badass-runtime-plugin.beryx.org/releases/latest/)
ExampleにKotlinでの例もあります。(一回Windowsのローカルで試しましたが使えそうでした。)

以上
Embedded Frameworkでビルドエラーが出る場合

#クリーンしてからの再ビルドでエラーが出る人

Embedded Frameworkを複数作成して開発していると、差分ビルドは成功するのにクリーン後のビルドで何故かFrameworkが無いとか、謎のビルドエラーなどが出る人向けです。

##依存関係を定義しましょう。

ターゲット -> Build PhasesからDependenciesを展開。
依存関係にあるEmbedded Frameworkを追加しておきます。

これだけで解消します。
CSSだけでランキング上位者感漂うアバターを作る

みなさん、ランキング上位ユーザーのアバターを神々しくしたくなるケースってよくありますよね？👀

`linear-gradient` を使えば画像を使わずいい感じのグラデーションがかけられるっぽいのでこれを使いましょう💪✨

##各ブラウザの対応状況

「IE9に対応してなくね？」
一な、なに言ってんスか？そんなブラウザもう絶滅しましたよwww冗談きついっスwww
![caniuse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122701/16be883f-317d-f3e4-db71-8ebd86e7f5ff.png)


Can I use
http://caniuse.com/#feat=css-gradients

MDN
https://developer.mozilla.org/ja/docs/Web/CSS/linear-gradient#Browser_compatibility

##サンプルコード

```html:html
<div class="avatar">
    <img src="avatar.jpg" />
</div>
```

```scss:scss

.avatar {
    background: linear-gradient(to bottom right, #fefd68, #a08001);
    border-radius: 50%;
    height: 82px;
    padding: 5px;
    width: 82px;

    img {
        background: #fff; /* 透過してる画像の対応 */
        border-radius: 50%;
        height: 100%;
        width: 100%;
    }
}
```

##説明

`border-radius: 50%;` で丸を作って
`padding: 5px;` で画像の外側に 5pxの余白を作ります

背景に `linear-gradient` を指定して完成です🤗

`background: linear-gradient(to bottom right, #fefd68, #a08001);`
左上から右下へ <font color="GoldenRod">#fefd68</font> から <font color="DarkGoldenRod">#a08001</font> にグラデーションをかけます📝

##表示

うまくできました👏👏👏

![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122701/bc4c9c09-5136-c536-12a7-64bc5200b43d.png)
GraphAPIについて

# 目次
- APIとRESTとは
- REST APIの例
- Graph APIとは
- Facebook API
- RailsでGraph APIを作ってみました

---
# API

API（Application Programming Interface）とは、プログラムから特定の機能を利用できるように公開しているインターフェイスのことで、ソフトウェアの機能や情報を共有するための仕組みです。

例えば
- GitlabAPIはGitlabが公開した情報を修得するインターフェイスです
- UV Beluga3 APIはBeluga3のフロントエンドでサーバーのデータを使うため、修得するインターフェイスです

---

# REST

RESTful API(REST API)とは、Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つで、RESTと呼ばれる設計原則に従って(したがって)策定(さくてい)されたもの。RESTそのものは適用範囲の広い抽象的（抽象的）なモデルだが、一般的にはRESTの考え方をWeb APIに適用したものをRESTful APIと呼んでいる。


https://qiita.com/masato44gm/items/dffb8281536ad321fb08


---
# REST API設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/a8aad84a-a926-6a51-d56d-84e408270dc8.png)

---
# RESTのメリット

- サーバー側のシステムは複雑にならない
- リソース指向のURIなので開発者は直感的に扱える
- 統一インターフェースなので互換性がある
- 外部向けとしたAPIの場合に扱ってもらいやすい

---
# 例えば Gitlab API
https://docs.gitlab.com/ee/api/

The main GitLab API is a REST API. Therefore, documentation in this section assumes knowledge of REST concepts.

Gitlab APIはREST APIです。

→　REST APIの知識があれば、Gitlabのドキュメントを読みやいと思います。
→　API覚えなくても、Endpointや目的などが判断出来ます。

---

# 例えば Twitter API

Twitter APIの一部はREST APIが使われています。
https://developer.twitter.com/ja/docs/basics/things-every-developer-should-know

https://developer.twitter.com/en/docs/api-reference-index

→　REST使わない部分がありますので、ドキュメントはちょっと分かりづらい

- 検索しづらい
- API覚えないといけません
- Endpointと目的など判断しずづらい

---

# 最近にAPI気になってる

- SPAが増えています　→　APIが必要になる
- フロントエンドが強くなります　→　バックエンドのコストを下げたい
- フロントエンドアップデートしても、バックエンドアップデートしたくない
- REST APIを使うといいなと思いました。

---

# RESTを使う時に、気になること
→ 別々のリソースを取りたい場合、別々のAPIを叩かないといけません
- 例えば
    - GET campaigns/1
    - GET campaigns/1/responses
    - GET campaigns/1/tweets
    - GET campaigns/1 に返すデーターはresponsesとtweetsがあれば、一つAPIだけ必要です
    - でも、パフォーマンスがちょっと良くない　→　ある場合はcampaignのデーターだけを取りたい
    - responsesとtweetsを取るかとらないか指定出来るようにしたいです
→　Graph APIになります。

---

# Graph API（Facebook API）

グラフAPIは、Facebookプラットフォームにデータを取り込んだり、Facebookプラットフォームからデータを取り出したりするための主要な手段です。プログラムを使用したデータのクエリ、新しい記事の投稿、広告の管理、写真のアップロードなど、アプリのさまざまなタスクに利用できるHTTPベースのAPIです

https://developers.facebook.com/docs/graph-api/overview/?locale=en_US

---

# Graph API 
グラフAPIは、Facebookでの情報を表す「ソーシャルグラフ」の概念にちなんで名付けられました。グラフAPIの構成は次のとおりです。

- ノード - 基本的には、ユーザー、写真、Facebookページ、コメントなどといった個々のオブジェクトを指します。
- エッジ - 1つのページ上の複数の写真または1つの写真上の複数のコメントといった、単一のオブジェクトとオブジェクトのコレクションとの間の接続を指します。
- フィールド - ユーザーの誕生日やページの名前といった、オブジェクトに関するデータを指します。
通常、ノードは特定のオブジェクトに関するデータを取得するため、エッジは単一のオブジェクト上にあるオブジェクトのコレクションを取得するため、フィールドは単一のオブジェクトまたはコレクション内の各オブジェクトに関するデータを取得するために使用されます。

---

# Graph API Explore

https://developers.facebook.com/tools/explorer/v2/

<img width="894" alt="スクリーンショット 2020-06-03 12.31.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/403001b7-caad-a426-f849-4403409a2b1f.png">


---

# Graph APIのメリット
- RESTのメリット同じですので、メリットと同じ
- 柔軟性が高い　→　一つAPIだけ叩くとたくさん情報が取れます

---

# RailsでGraph APIと同じ作ってみました
- Rails デフォルトのrouterを使う
- Rails Active Recordを使う
- Cancancanライブラリーを使う

https://github.com/phamthanhthuongbk/graph_api_rails

--- 

# 最後に

- WEB APIを開発する時にGraph API 設計と同じにして、開発簡単だし、フロントエンドの方もう楽と思います。
- あと、BatchAPIを使えば、もっと楽になると思います。
ログイン状態且つ住所テーブルにデータが登録してある場合としてない場合の条件分岐

```ruby
def new
    if current_user && Address.find_by(user_id: current_user.id).present?
      @address = Address.find_by(user_id: current_user.id)
      render action: :edit
    else
      @address = Address.new
    end
```
```ruby
if current_user && Address.find_by(user_id: current_user.id).present?
```
２行目 ...presentメソッドはオブジェクトのレシーバーの値が存在すればtrue、存在しなければfalseを返すメソッド。if文などの条件分岐でよく使用するので覚えておきたい。
current_user.idと一致するuser_idが存在すればeditアクションが動く。
ちなみに(renderで同じコントローラーのアクションが動かせるのは本日知りました)

6行目...current_user.idと一致するuser_idが存在しなければnewアクションがそのまま動くので新規登録となる。
SourceTree のマージに WinMerge を使う

SourceTreeのメニューから
ツール - オプション
Diffタブで

マージツール
`カスタム`

マージコマンド
`C:\Program Files\WinMerge\WinMergeU.exe`

引数
`-e -ub -fr -ar -wl -wm -dl base -dm remote -dr local $BASE $REMOTE $LOCAL -o $MER`

参考
https://ameblo.jp/hero-design/entry-12500881611.html
GitについてのTips

### Gitリポジトリよりファイルを削除した時に変更を反映する

- `git rm filename.txt` 
   - `filename.txt`を削除する。
- `git rm --cached filename.txt`
   - `filename.txt`をステージングから消す（フォルダ上には残ったまま）
- `git add -u`
   - 全削除ファイルをステージングに反映する。

https://stackoverflow.com/questions/12373733/staging-deleted-files 

### Merge のコンフリクト（衝突）を一瞬で解決する

- VScodeでコンフリクト のあるファイルを開く。コンフリクト のある箇所で「マージする側の変更を適用する」「マージされる側の変更を適用する」「両方の側の変更を適用する」という選択肢が選べる。

- スクリプトで対処
   - https://easyengine.io/tutorials/git/git-resolve-merge-conflicts/
   - 基本アイディアとしては、`>>>>>>>>`などコンフリクトのある箇所の文字列で検索しコンフリクト のあるファイルを洗い出す　→ `git checkout --ours PATH/FILE`または`git checkout --theirs PATH/FILE`でどちらかの変更を受け入れる。