OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQL crosstabを使ったときに「ERROR:  return and sql tuple descriptions are incompatible」が出るときの対処方法

# 現象
PostgreSQLでcrosstab関数を使ったときに
> ERROR:  return and sql tuple descriptions are incompatible

というエラーが出る。

# 環境
```sql
postgres=# select version();
                                                     version
------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
(1 row)
```

# 実例

```sql
create extension tablefunc;

CREATE EXTENSION
postgres=# create table t(id text, detail text, count int);
CREATE TABLE
postgres=# insert into t(id, detail, count) values
postgres-#      ('test1','bad',1),
postgres-#      ('test1','good',2),
postgres-#      ('test1','ok',3),
postgres-#      ('test2','bad',4),
postgres-#      ('test2','good',5),
postgres-#      ('test2','ok',6);
INSERT 0 6
postgres=# select *
from crosstab(
    'select * from t'
)
as crossed(id text, bad bigint, good bigint, ok bigint);
ERROR:  return and sql tuple descriptions are incompatible
```

# 原因
crosstab関数にわたす引数のSQLが実際に返す行の型と、`crossed(id text, bad bigint, good bigint, ok bigint)`部分の型が一致していないことが原因でした。
上の例ではbigintと指定していたのが良くありませんでした。
自動で型変換してくれると思ったのですが、されないようですね。

# 解決方法
pg_typeof関数で実際の型を調べ、

```sql
postgres=# select pg_typeof(id), pg_typeof(count) from t;
 pg_typeof | pg_typeof
-----------+-----------
 text      | integer
 text      | integer
 text      | integer
 text      | integer
 text      | integer
 text      | integer
(6 rows)
```

他には`\d`で調べても良さそうです

```sql
postgres=# \d t
                 Table "public.t"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | text    |           |          |
 detail | text    |           |          |
 count  | integer |           |          |
```

integerだとわかったので、その型に合わせて指定することで解決しました。
(bigint -> intに変更しました)

```sql
postgres=# select *
postgres-# from crosstab(
postgres(#     'select * from t'
postgres(# )
postgres-# as crossed(id text, bad int, good int, ok int);
  id   | bad | good | ok
-------+-----+------+----
 test1 |   1 |    2 |  3
 test2 |   4 |    5 |  6
(2 rows)
```
@nuxtjs/vuetify で Vuetify を v2.0 にアップデートする

[@nuxtjs/vuetify](https://github.com/nuxt-community/vuetify-module) を使用して導入している [Vuetify](https://vuetifyjs.com/ja/) のバージョンアップを行ったのでメモ

## バージョン
`0.5.5` → `2.0.0-beta.0` に。
fibar が私の環境ではインストールできなかったため、
fibar が optionalDependencies になる `@nuxtjs/vuetify@2.0.0-beta.0` を使用。

## @nuxtjs/vuetify の変更点
[v2.0@alpha - Module revamp](https://github.com/nuxt-community/vuetify-module/pull/177)

### frameworkOptions
Vuetify 側の設定と @nuxtjs/vuetify 側の設定が分けられたようです。
@nuxtjs/vuetify の設定を `frameworkOptions` に移動する必要がありました。

```js:nuxt.config.js
module.exports = {
  vuetify: {
    frameworkOptions: {
      icons: {
        iconfont: 'md',
        values: {}
      }
    },
    customVariables: ['path/to/customize.scss']
  },
}
```

### defaultAssets
`0.5.5` では `materialIcons` という Material Icons を自動で導入してくれるプロパティがありましたが、
`defaultAssets` というプロパティに置き換わりました。
諸事情あってCDNではなくローカルサーバーに置いたアイコンを使いたかったのでOFFに。

```diff
module.exports = {
  modules: [
-    ['@nuxtjs/vuetify', { materialIcons: false }]
+    ['@nuxtjs/vuetify', { defaultAssets: false }]
  ]
}
```

## Vuetify v2.0 の変更点
ここからは Vuetify 側の変更点で引っかかった点を記述

### コンポーネントや props の名前・型変更
変更点は [マイグレーションガイド](https://vuetifyjs.com/ja/getting-started/releases-and-migrations/#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AC%E3%82%A4%E3%83%89) にまとまっていますが、大部分のコンポーネントに命名変更がかかっています。

特に [data-tables](https://vuetifyjs.com/ja/components/data-tables/) は変更点が多く、名前だけでなく構造も変わっているものがあります。
`options.sortBy` といったソートの設定が、複数カラムのソートに対応した影響か配列しか受け付けなくなっていたのは若干詰まりました。

```js
// data-tables の options
{
  page: number
  itemsPerPage: number
  sortBy: string[]
  sortDesc: boolean[]
  groupBy: string[]
  groupDesc: boolean[]
  multiSort: boolean
  mustSort: boolean
}
```

### data-tables の headerCell
[v1.5 の data-tables に存在した headerCell スロット](https://v15.vuetifyjs.com/ja/components/data-tables)にあたる機能が [v2.0](https://vuetifyjs.com/ja/components/data-tables/#slots) では無くなっているようです。
代わりに `header.<name>` で各ヘッダーを個別にカスタマイズできるようになっています。

私のプロジェクトではこの name が可変のテーブルを作っていたので `header.<name>` を
あらかじめ設定しておくことができず、`v-slot:header` でヘッダー丸ごと上書きする必要がありました。

```vue
<template v-slot:header="{ props: { headers, options }, on: { sort } }">
  <thead>
    <tr>
      <th
        v-for="(header, index) in headers"
        :key="index"
        :class="['column sortable',
                 options.sortDesc[0] ? 'desc' : 'asc',
                 header.value === options.sortBy[0] ? 'active' : '',
                 header.align == null ? 'text-left' : '',
                 header.align === 'center' ? 'text-center' : '',
                 header.align === 'end' ? 'text-right' : '']"
        @click="sort(header.text)"
      >
        <!-- 中身 -->
      </th>
    </tr>
  </thead>
</template>
```

こんな感じでクラスやクリックイベントを元と近い挙動になるように設定。
全くスマートではないが、他に良いやり方が見つからず。
Javaアプリケーションでは、Word（DOC/DOCX）ドキュメントをPDFに変換します

Spire.Docの助けのもとで、私達は簡単にword文書をPDFとして保存できます。この文はWord(.doc..docx)をPDFとして保存する方法を以下の3つの方面から紹介します。
<ul>
<li>Word文書をPDFに直接Javaアプリケーションで変換する</li>
<li>Word文書をPDFファイルに暗号化されたパスワードで変換結果ファイル</li>
<li>画像の品質を設定するときにWord文書</li>
</ul>

<b>Word文書をPDFに直接Javaアプリケーションで変換する</b>

```java

import com.spire.doc.*;
public class toPDF {
    public static void main(String[] args) {
        String inputFile="data/convertedTemplate.docx";
        String outputFile="output/toPDF.pdf";
        //サンプルドキュメントの読み込み
        Document document = new Document();
        document.loadFromFile(inputFile);

        //文書を保存
        document.saveToFile(outputFile, FileFormat.PDF);
    }
}
```

<b>Word文書をPDFファイルに暗号化されたパスワードで変換結果ファイル</b>

PDF文書のセキュリティを変換するために、パスワード保護PDFを設定できます。

```java

import com.spire.doc.Document;
import com.spire.doc.ToPdfParameterList;
import com.spire.pdf.security.*;

public class toPdfWithPassword {
    public static void main(String[] args) {

        String inputFile="data/convertedTemplate.docx";
        String outputFile="output/toPdfWithPassword.pdf";

        //サンプルドキュメントの読み込み
        Document document = new Document();
        document.loadFromFile(inputFile);

        ToPdfParameterList toPdf = new ToPdfParameterList();

        //パスワードの設定
        String password = "E-iceblue";
        toPdf.getPdfSecurity().encrypt(password, password, PdfPermissionsFlags.None, PdfEncryptionKeySize.Key_128_Bit);

        //文書を保存
        document.saveToFile(outputFile, toPdf);
    }
}
```

<b>画像の品質を設定するときにWord文書</b>

々は、特にドキュメントの画像の多くのWord文書を変換した後、出力PDFドキュメントのサイズは明らかに元のWord文書よりも大きいです。同時に、結果のPDFファイルのサイズを設定するには、イメージの質を設定することができます。Javaのspire . docは、ドキュメントのメソッドを提供します。setjpegquality ()は、JPEG画像の品質を0から100に設定します。出力画像品質のデフォルトセットは、元の80 %です。

```java

import com.spire.doc.*;
public class ShapeAsImage {
    public static void main(String[] args) throws Exception {

        //サンプルドキュメントの読み込み
        Document document = new Document();
        document.loadFromFile("Sample.docx");

        //画像の品質を設定
        document.setJPEGQuality(40);

        ToPdfParameterList pdf = new ToPdfParameterList();
        pdf.setDisableLink(true);

        //文書を保存
        document.saveToFile("output/ImageQuality.pdf", FileFormat.PDF);
    }
}
```
Javaのための無料のSpire . docを使用することは非常に簡単です。あなたの読書のおかげで、それが助けることを願います。
【最新版】tinderで自動スワイプ 2021/10/11更新

## ブラウザでtinderを開きましょう
`https://tinder.com/app/recs`

## 開発者ツールでconsoleタブを開きましょう
(command+option+iで開けるよ)

## 画像の箇所クリックしましょう
赤丸で囲んでいる箇所をクリックしましょう(画像の通り青くなっているのであればそのままでok)
![スクリーンショット 2021-08-24 23.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214581/a1999e54-edc3-356a-a786-23c6859c7517.png)



## consoleに以下をコピペ
```javascript
setInterval(() => {
document.querySelector(".recsCardboard__cards > div:nth-of-type(4)").querySelectorAll("button")[3].click()
},1000);
```

以上
Pythonを爆速にする「Cython」チュートリアル： C++側の関数が参照渡しされているときのハンドリング。

##概要
C++ で書いているコードを、どうしてもPythonで呼べる形のライブラリにしたい。
ただ、そこにはCythonという大きな壁が立ちはだかっていた。

これは、[Pythonを爆速にする「Cython」チュートリアル： C++側の関数がオーバーロードを持つとき。](https://qiita.com/kenmaro/items/3782e5b24aa5e314a2bf)　の続きになります。

コードは「[ここのgithub](https://github.com/kenmaro3/cython_practice)」にあげてあるので、ぜひご覧ください。

前回は、C++側の関数がオーバーロードをしているとき（同じ関数名で、引数に異なるものが入るような構成のとき）の、Cython化の解説しました。


今回は、C++側の関数が、引数として値渡しではなく参照渡しのときのCython側でのハンドリング仕方を解説したいと思います。
あまり新しいことは出てきませんが、実際Cythonを書こうとするとエラーに悩まされてしまうことが多いので、そのようなときに是非ご覧ください！！


##状況説明

- C++側の関数がオーバーロードされていたので、[前回の記事](https://qiita.com/kenmaro/items/3782e5b24aa5e314a2bf)のようにキャストを使って解決していた。
- C++側に実装された関数の引数の中に、参照渡しのものが含まれている。
- 引数が参照型だとエラーでるやん。

実際に試してみます。

```cpp_library/TestClass1.h
class TestClass1{
    private:
        TestClass2 property_test_class2;
        EnumForTestClass1 group;

    public:
        //~省略
        static void print_vector(vector<int> &x);
        static void print_vector(vector<double> &x);
```

前回と違うところは、```print_vector```の引数の```x```が、**値渡しから参照渡しになっている**ところです。

```cpp_library/TestClass1.cpp
void TestClass1::print_vector(vector<int> &x){
    for(int i=0; i<x.size(); i++){
        cout << x[i] << " ";
    }
    cout << endl;
}

void TestClass1::print_vector(vector<double> &x){
    for(int i=0; i<x.size(); i++){
        cout << x[i] << " ";
    }
    cout << endl;
}
```

これをいつものように```python setup.py install``` でbuildしようとすると、以下のエラーがでます。

```bash

./cython/my_library.cpp:2414:69: error: cannot bind non-const lvalue reference of type 'std::vector<int>&' to an rvalue of type 'std::vector<int>'
     __pyx_t_1 = __Pyx_void_to_None(__pyx_v_testclass1.print_vector(((std::vector<int> )__pyx_t_4))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
```

キャストをきちんとしているはずなのに、参照渡しになると怒られます。


そこで、解決策として、
### キャストではなく実体をその場で作ります。
どういうことかというと、

```cython/test_class1.pyx
    @staticmethod
    def print_vector(list x):
        cdef:
            TestClass1 testclass1
            vector[int] vec_int
            vector[double] vec_double
        
        if isinstance(x[0], int):
            vec_int.resize(len(x))
            for i in range(len(x)):
                vec_int[i] = <int>x[i]
            return testclass1.print_vector(vec_int)
        elif isinstance(x[0], float):
            vec_double.resize(len(x))
            for i in range(len(x)):
                vec_double[i] = <double>x[i]
            return testclass1.print_vector(vec_double)
        else:
            raise Exception('TypeError')
```

とします。ここで、```cdef```により、```vector[int]```や、```vector[double]```をその場で作り、それを関数に渡します。
たぶん、さっき出たエラーは、参照渡しなのに、本当に実体存在してるかわからんやん！困るで！！！
というエラーだったんだと自分は解釈しています。

したがって、実体を用意してあげて、安心させるといいわけです。


こうすると、例によって```python setup.py install```により、ビルドが通ります。

これにより、テストコードを以下のように書くことで、

```test.py
import my_library as myl

if __name__ == "__main__":

    cl1 = myl.test()
    x = [1,2,3]
    y = [1.1, 2.2, 3.3]
    cl1.print_vector(x)
    cl1.print_vector(y)
```

きちんと関数をコールできました。

```bash
(myenv) root@e96f489c2395:/from_local/cython_practice# python test.py 
1 2 3 
1.1 2.2 3.3 
```

## まとめ
今回は、C++側の関数が、引数として値渡しではなく参照渡しのときのCython側でのハンドリング仕方を解説しました。


今回はこのへんで。


おわり。
Vim: インサートモードで行の途中からでも次の行に新規挿入する方法 ~ 初心者 ~


# Vim: インサートモードで行の途中からでも次の行に新規挿入する方法 ~ 0から始めるvim ~

SublimeTextやAtomのCommand+Enterが便利だったので,
Vimのインサートモードでもやってみたというお話です。

デフォルトだと次のようなコマンドがあります。

```:インサートモード
<C-o>o
```

ただ毎回プリフィックスキーを打つのが面倒だったので,
次のようにキーバインドを変更したら快適でした。

```diff:.vimrc
inoremap <C-o> <C-o>o
```

左側の```<C-o>``` の部分は自由に変更することができます。
私はいつも Ctrl+o でやっていたので,このような設定にしてみました。

## 注意
インサートモードのプリフィックスキー``` <C-o>```には一度だけノーマルモードのコマンドを入力できる
という意味もあるので,もしいつも他の操作でプリフィックスキー<C-o >をいつも使用しているのであれば,
他のキーに変更するかそのまま使用することをお勧めします。
phpunitテスト

## phpunit テストについて
laravelでテストをする
そもそもlaravelのテストは2種類用意されている。
1. デフォルトでは Feature と Unit というディレクトリに分かれていて、Feature には機能テスト、Unit にはユニットテストを書く構成になっている
2. 今回はFeatureテストについて
Laravel7でのCors対応について

#Corsとは
ブラウザでは同一でのドメイン間でのアクセスしかできないようになっています
そのため、異なるドメインへのアクセス(APIなど)と通信することができないのですが
それを解決するために使用するのがCorsです

例えば、Laravel側で`localhost:8000`でNuxt側で`localhost:3000`で動かしていた場合
`localhost:3000`のNuxt側からaxiosなどを使って`localhost:8000`のLaravel側のAPIにアクセスができません
それをクロスドメインアクセスを可能にする事ができます

#Larvel7でのCors
ここからが本題何ですが、Cors対応しようと思い
今まで通り`composer`でインストールしようと思い`config`フォルダをみてみると
あれ?cors.phpがある!
という事に今頃気付きました。

今までやってた作業しなくてもLaravel7では必要ない？みたいですね

`app/Http/Kernel.php`を見てみても`$middleware`に`\Fruitcake\Cors\HandleCors::class`の記載もありました

cors.phpの中身をみてみる

```cors.php
<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    'paths' => ['api/*'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => false,

    'max_age' => false,

    'supports_credentials' => false,

];
```

apiからのアクセスは全て許可する設定になってるようで
これは今後LaravelではCors対応を手動でする必要がなくなったってことですかね?
とても助かりますね。。
と言うただ自分の中で発見があっただけの記事です

ついでに`cors.php`の設定項目について自分のわかっている範囲で説明入れておきます

#cors.phpの設定項目
`cors.php`の各設定項目について少し触れておきます

```cors.php
<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    'paths' => ['api/*'],    //許可するパスの設定

    'allowed_methods' => ['*'],    //許可するメソッドの設定

    'allowed_origins' => ['*'],    //許可するドメインの設定

    'allowed_origins_patterns' => [],    //許可するドメインのパターン

    'allowed_headers' => ['*'],    //許可するヘッダーの設定

    'exposed_headers' => false,    //レスポンスヘッダーの公開指定

    'max_age' => false,    //ブラウザのキャッシュの保管期間

    'supports_credentials' => false,    //クッキーなどの認証の許可

];
```

`[*]`とすると全て許可することになります
少し不安点あるので間違っている点あれば、ご指摘頂きたいです。
Power BI のタイムアウト設定の規定値について【備忘録】

#概要
ドキュメントにたどり着くのに手間がかかったのでメモ

下記のようにデータソース設定にあるが、普通省略で使うと思います。では規定値は？という話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a84d7b22-d903-067b-b514-bf87494c82a3.png)



#内容

[ドキュメント](https://docs.microsoft.com/ja-jp/powerquery-m/sql-database)によると、GUIでの設定はPower Query内でCommandTimeoutのオプションに格納されます。

規定値は「SQL」の場合10分でした。
> CommandTimeout:サーバー側クエリがキャンセルされるまでに実行を許可する長さを制御する期間。 既定値は 10 分です。
chromeなどのブラウザのブックマークをオサレに配置する

今回はシステム的なこととは少し離れますが、ブラウザのブックマークについてです。
ブラウザのブックマークにあれもこれも登録していると
あれ？ブックマークの中からブックマークを探すアプリ欲しくね？みたいな状況に陥ってしまうので
ためになるブックマークを活用するためにも整理は大事というお話になります。

なんてことはないのですが、私は下記のようにブックマークを登録しています。
<img width="498" alt="スクリーンショット 2020-03-26 16.19.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274405/62e0ea62-6fdb-1c31-4dfc-25ed940cf3a8.png">
なんとなくオサレな感じしません？しませんか、そうですか..

よく使うサイトはアイコンのみにして、特定の記事などのリンクはフォルダを作成し、その中に突っ込んでます。
デフォルト設定のままブックマークバーに登録すると、サイト名なども表示されてしまい
どうしても横長になって一度に少ししか表示できないので、もうアイコンだけで十分だろうと..

やり方は簡単で、ブックマークに追加するときに名前の部分を削除するだけです。
Chromeを例にしていますが、他のブラウザでも同じだと思います。
<img width="321" alt="スクリーンショット 2020-03-26 16.18.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274405/9ca4e8d7-05f1-010b-6964-aa8bf5a623b6.png">

tomatoを洗うより簡単なので、もし気に入ったらやってみてください:tomato:
ではまた🙋‍♂️

## さいごに
ZEROBILLBANKでは一緒に働く仲間を募集中です。
なんとかjsとか、ブロックチェーンとか、kubernetesとかでいろんなAPIを作るお仕事。
今のところエンジニアは5人くらい。スタートアップだけど、結構ホワイトで働きやすいです。

[ZEROBILLBANK JAPAN Inc.](https://zerobillbank.com)
Ruby 単体で ActiveRecord を使いたい

# はじめに

Rails ではなく Ruby 単体のプログラムで DB に接続したい時があるかと思います。

例えばスクレイピングしてきた情報を DB に格納したい時など。

ActiveRecord を使うと実装できます。

ActiveRecord は Rails に搭載されているので、皆さんご存知かとは思いますが、

ACtiveRecord を単体で使ったことがない方は結構いらっしゃるかと思いますので、ご紹介します。

今回は DB は MySQL を使っています。

# ActiveRecord を単体で使ってみる

##準備

まずは DB を用意しましょう。 MySQL にログインします。

~~~
mysql -u root
~~~

データベースを作ります。名前は今回sampleにします。

~~~
mysql> create database sample;
~~~

sampleデータベースに入ります。

~~~
mysql> use sample;
~~~ 

テーブルを作ります。名前は今回usersにします。Rubyの規約上、テーブル名は複数形にしてください(sをつける)

~~~
mysql> create table users (id int auto_increment not null primary key, name varchar(10));
~~~

一旦抜けましょう

~~~
mysql> exit
~~~

続いて ActiveRecord をインストールしましょう

~~~
$ gem install activerecord
~~~

mysql2もインストールします

~~~
$ gem install mysql2
~~~

##実装

これで準備ができたので Ruby のファイルを作ります

~~~
$ vi sample.rb
~~~

avtive_record の gem を呼び出し、DB の接続設定を以下のように記します

```sample.rb

# ↓ require する時はアンダースコアがいるので注意
require 'active_record' 

#DB接続設定
 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)
```

更にUserクラスを設定します。これでDBのusersテーブルがいじれるようになります

```sample.rb

require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

#以下追記
class User < ActiveRecord::Base
end
```

試しにUserテーブルにレコードを作りましょう

```sample.rb

require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

class User < ActiveRecord::Base
end

#以下追記
User.create(name: "taro")

```

実行してみます

~~~
$ ruby sample.rb
~~~

ファイルを変更してレコードができたか確認しましょう

```sample.rb

require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

class User < ActiveRecord::Base
end

#以下変更
puts User.find_by(name: 'taro').name
```

実行

~~~
$ ruby sample.rb
~~~

以下のように出ればOKです。

~~~
taro
~~~



#終わりに

今回は一つのファイルの中に設定など全て書きましたが、実際に使う時は、DB 接続設定を他の Ruby ファイルに書いて require するか、もしくは、YML ファイルに設定を書いて読み込んだりなどして使ってみてください。
ポエムります！（語呂悪

#こんにちは
私は専門卒の社会人２年生（４月で３年生）です。
ポエム記事がトレンドに上がっていたので私もポエムろうとおもいます。

#ポエムります
なんかいろいろやりたいなと思いIT派遣会社に就職したワイ。
２年間で３つの派遣先を経験したけど成長を感じれないまま行き先の不安感を抱え続けて死ぬ・・・END

最近、プログラム開発者格差なんたらって記事を発端に炎上してるやん？（他人事）
あれって結局お金の話で強い人はもらってるし、弱い人はもらってないって話じゃないん？（適当）
そもそも強くなれる環境ってどうやって錬金するん？わいも強くなってフリーランスとかしてみたいやん…
１つ言えることはSESは漆黒の闇

全く話変わるけどLGTMってなんやねん。意味知ってるけど普段使いすることある？（ワイはない、異論は認める。）
その言葉にすることによって同調圧力感じる人もいるみたいやし「いいね！」でええんちゃう？一緒やん。
それか段階増やして
「ええやん！:relaxed:」
「ええとおもうで:smirk:」
「わるない:frowning:」
「あかん:rage:」
とかにしたらええんとちゃうかな、知らんけど。（関西人特有のやつ）
プログラマ寄りにしたいのはわかるし、重めにしたい気持ちはわかるしどっちでもいいけどね！

ワイが言いたかったのはそれくらいや！





下書き削除かな…(投稿ポチッ）
ReaRでシステムを丸ごとNASにバックアップ/リストアする

ReaR (Relax-and-Recover)を使って、システムを丸ごとNASにバックアップします。設定ファイルはこんな感じ。

```/etc/rear/local.conf
OUTPUT=ISO
OUTPUT_URL="cifs://192.168.0.xxx/save/path/"
OUTPUT_OPTIONS="username=hoge,password=huga"
BACKUP=NETFS
BACKUP_URL="$OUTPUT_URL"
BACKUP_OPTIONS="$OUTPUT_OPTIONS"
```

バックアップコマンドを実行。

```shell
# rear -v -d mkbackup
```

これで起動ISOイメージ .iso とデータ .tar.gz が作成されます。

リストアする際は起動メディアにこのISOを指定すれば、NASから勝手にデータを引っ張ってきてリストアしてくれるので便利。
Vim: 拡張子ごとにインデントを変更する方法 ~ 初心者 ~

# Vim: 拡張子ごとにインデントを変更する方法

だいぶvimも使い慣れてきたのですが，
インデントが全て同じになってしまっていて
不便だったので拡張子ごとに設定してみたというお話です。


## ファイルタイプの確認
今回は拡張子 .jsを対象に紹介します。
1. hoge.jsというファイルをvimで開きます。
2. exモード(:wq の時に使う ':' で入るモード)で以下を入力

```
:echo &filetype
```

<img width="305" alt="1__Thanks_for_flying_Vim__tmux_.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/21a56a34-135a-950f-aeaa-989efbdbc471.png">

echoで出力されるのが, filetypeになります。
<img width="342" alt="hoge.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/3f249ca6-8ada-04db-1d09-dfdc35a633da.png">

今回はこのファイルタイプを使っていきます。


## 導入

それぞれの設定は以下のようになります。
if has('autocmd')　を使っているのは,
古いバージョンでautocmdが存在しなかった時のために入れてあります。

```vim:.vimrc

"""""""""""""""""""""""""
"      インデント
""""""""""""""""""""""""
set autoindent          "改行時に前の行のインデントを計測
set smartindent         "改行時に入力された行の末尾に合わせて次の行のインデントを増減する 
set cindent             "Cプログラムファイルの自動インデントを始める
set smarttab            "新しい行を作った時に高度な自動インデントを行う
set expandtab           "タブ入力を複数の空白に置き換える 

set tabstop=2           "タブを含むファイルを開いた際, タブを何文字の空白に変換するか
set shiftwidth=2        "自動インデントで入る空白数
set softtabstop=0       "キーボードから入るタブの数

if has("autocmd")
  "ファイルタイプの検索を有効にする
  filetype plugin on
  "ファイルタイプに合わせたインデントを利用
  filetype indent on
  "sw=shiftwidth, sts=softtabstop, ts=tabstop, et=expandtabの略
  autocmd FileType c           setlocal sw=4 sts=4 ts=4 et
  autocmd FileType html        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType ruby        setlocal sw=2 sts=2 ts=2 et
  autocmd FileType js          setlocal sw=4 sts=4 ts=4 et
  autocmd FileType zsh         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType python      setlocal sw=4 sts=4 ts=4 et
  autocmd FileType scala       setlocal sw=4 sts=4 ts=4 et
  autocmd FileType json        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType html        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType css         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType scss        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType sass        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType javascript  setlocal sw=4 sts=4 ts=4 et
endif

```

上記に載せてる拡張子以外にもファイルタイプさえわかれば,
設定できますので他にも設定していこうと思います。

### 参考サイト
http://hatakazu.hatenablog.com/entry/2012/06/12/231756
Azure Analysis Servicesのタイムアウト設定について【備忘録】

#概要
Azure Analysis Servicesのタイムアウト設定が、 SQL Server と箇所が微妙に違っていたのでメモ

#内容
SSMSで接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/058a95f9-3bd5-43fd-ec0a-5e0fabfd97af.png)


サーバ右クリックでプロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0cefc3b9-9c9f-2faa-2e4e-861b5d5a2f9e.png)


全般タブがちょっと違う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9e261c7f-1d80-0a41-34e2-ad83d6a4dff2.png)


接続のプロパティへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0ad2f1b5-92c3-aa5b-d686-939bfecaae4b.png)

設定項目があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/cf669490-12bb-916e-5139-e80db475850b.png)

※全般タブにもありますが、詳細なプロパティ値となっています。
LaravelのFormRequestの単体テストのやり方

## ただバリデーションテストを書きたいだけだった

こんな感じでValidator取得すればいけるやろ〜

```php

$formRequest = new FormRequest();

$v = $formRequest->getValidator();

$v->passes();
```

そこでValidatorを取得できそうなメソッドを探したが、すべて`protected`メソッドだったのであった...

## こんなふうに書きました

```php
public function test_FormRequest_validate()
{
    $data = [];

    $formRequest = new FormRequest();

    $v = \Validator::make(
        $data, $this->app->call([$formRequest, 'rules']),
        $formRequest->messages(), $formRequest->attributes()
    );

    $this->assertTrue($v->passes());
}
```

もとのFormRequestクラスの内部では↓こんなふうにValidatorを取得しています。

```php
$factory->make(
    $this->validationData(), $this->container->call([$this, 'rules']),
    $this->messages(), $this->attributes()
);
```

`app->call()`とすることで、`rules()`でメソッドインジェクションをしていた場合でもDIしてくれます。
boto3でaws cliを扱うための初期設定から稼働確認まで

#はじめに
boto3とは aws のリソースを python で扱うためのライブラリである。
本記事は、boto3でaws cliを扱い、AWSのec2と接続するまでの一連の流れ（初期設定）を記す。

##boto3のインストール
boto3をpipでインストールする。

```
$ pip install boto3
```
##aws cliのインストール
boto3を使用するためにaws cliをインストールする。
###Macの場合
aws cliをhomebrewでインストール

```
$ brew install awscli
```
###Windowsの場合
[AWSの公式サイト](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html)からインストーラーをダウンロードし、インストーラーを実行する。

###インストール確認
awsコマンドが使用できることを確認する。

```
$ aws --version
aws-cli/2.0.5 Python/3.7.5 Windows/10 botocore/2.0.0dev9
```


##IAMユーザーの作成
IAMユーザを作成し、EC2 full access の権限を与える。ただし、後に権限を絞る必要がある。
###作成方法
[AWSアカウントでのIAMユーザの作成](https://qiita.com/kzykmyzw/items/ca0c3276dfebb401f7d8)を参考に、IAMユーザーを作成する。

##アクセスキーの作成
アクセスキーを作成し、大切に保存する。

###作成方法
[こちら](https://console.aws.amazon.com/iam/home?#security_credential)にアクセスし、
１．”セキュリティ認証情報に進む”を選択
２．"アクセスキー(アクセスキーIDとシークレットアクセスキー)"を選択
３．"新しいアクセスキーの作成" を選択

ここでアクセスキーが作成される。この時[.csvのダウンロード]を押下し、アクセスキーの情報を保存しておく。
※ここを逃すとアクセスキーの情報を取得できなくなるため、注意！
誤ってアクセスキーの情報を保存し忘れた場合、一度アクセスキーを削除し、再度アクセスキーを作成する。

##PCにaws cliの初期設定を行う
```
$ aws configure
AWS Access Key ID [None]: AKI************
AWS Secret Access Key [None]: ***************
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
`aws configure`コマンドを入力し、上記のように先ほど取得したアクセスキー、リージョン、フォーマットを入力する。

ここまでできれば準備は完了！

##boto3が正しく動くか確認する
１．AWSコンソール上で任意のインスタンスを起動する。
２．ターミナルで以下のコマンドを実行し、起動中のインスタンスが取得できれば正常にboto3が動いている。

```
$ python
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import boto3
>>> ec2=boto3.resource('ec2')
>>>
>>> instances = ec2.instances.filter(
...  Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
>>>
>>> for instance in instances:
...  print(instance.id, instance.instance_type)
...
i-xxxxxxxxxxxxxxxxx t2.micro
```
無事インスタンスの情報が取得できたため、boto3は正常に稼働していることが確認できた。

##よくあるエラー
```
botocore.exceptions.ClientError: An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials
```
私は、このエラーに悩まされた。
原因はアクセスキーがうまく設定できていなかったから。
しかし、OS内の時間がずれている場合も接続できないらしい。。

念のためインスタンスにSSH接続し、サーバーのタイムゾーンを日本時間に変更した後、ローカルPCの時間も正しい日本時間となっていることを確認した。

タイムゾーンの変更は[こちら](https://qiita.com/azusanakano/items/b39bd22504313884a7c3)の記事を参考にした。

#おわりに
最後までご覧いただきありがとうございます。

最近pythonを使用したAWS管理ツールを作成することになり、初めてboto3を触ることになりました。
私自身、boto3の導入で少しつまずいてしまったため、同じようなエラーに悩まされている方の一助になればと思い、本記事を執筆しました。

ご指摘・ご質問等ございましたらお気軽に[@hiyoku0918](https://twitter.com/home)へご連絡ください！

[私のtwitterアカウントはこちら](https://twitter.com/home)

#参考

@kimihiro_nさん
・[Python boto3 でAWSを自在に操ろう ~入門編~](https://qiita.com/kimihiro_n/items/f3ce86472152b2676004)

@n0bisukeさん
・[AWS CLIのインストールから初期設定メモ](https://qiita.com/n0bisuke/items/1ea245318283fa118f4a)

@kzykmyzwさん
・[AWSアカウントでのIAMユーザの作成](https://qiita.com/kzykmyzw/items/ca0c3276dfebb401f7d8)

上記の記事を参考にさせていただきました。
ありがとうございました。
PetaLinuxToolsのインストール

#0. 概要
一般にXilinx社製のFPGAをSoCで動作させる場合、PetaLinuxというSoC上で起動するLinuxを使用することが多い。このPetaLinuxのIMG等を構築するためのツールのインストール方法について説明したいと思う。

#1. インストール方法
以下のURLからPetaLinuxインストーラーをダウンロードする。
https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/9d43a7c4-ea71-ea3c-60e4-49507cf8274e.png)

半日位かかるので覚悟が必要。


##関連ライブラリのインストール
必要なライブラリを以下のようにインストールする

``` bash
$ sudo apt-get install tofrodos gawk xvfb git libncurses5-dev tftpd zlib1g-dev zlib1g-dev:i386 libssl-dev flex bison chrpath socat autoconf libtool texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev screen pax
```

##インストール

次にインストール先のフォルダを作成

``` bash
$ sudo mkdir -p /opt/petalinux
$ sudo chown -R USER_NAME:USER_GROUP /opt/petalinux
```

インストールを開始

``` bash
$ chmod 777 /petalinux-v2019.2-final-installer.run
$ ./petalinux-v2019.2-final-installer.run /opt/petalinux/
```

インストール中にいくつかAgreementが出てくるのでそれらを全てYESにする。

##環境変数の設定
インストール後、環境変数を設定する

``` bash
$ cd /opt/petalinux/
$ source settings.sh
```

##不要な機能のOFF
Agreementにも出てくるが自動で使用情報等を送信する機能があるので、オフにしておく。

``` bash
petalinux-util --webtalk off
```
Gmail api を ServiceAccount ( G Suite 管理下の ) で行うのは大変

## 目的
- Gmail API でのメール送信
- G suite 管理下のドメイン配下からの送信
- ユーザーのトークンでは無くて ServiceAccount 経由

## 必要な事
- サービスアカウントの詳細で、「G suite ドメイン全体の委任を有功にする」
- G suite管理画面より、Api scopes を設定する( 不明瞭な点あり

## Api scopes
```
http://www.google.com/m8/feeds/contacts/,http://www.google.com/m8/feeds/groups/,https://mail.google.com/
```
( なんでか判らないけど、mail.google.com スコープだけだと権限エラーになってしまうので、この三つのスコープが必須

## sample code ( ruby
```rb
# frozen_string_literal: true

class GmailDeliveryMethod
  attr_reader :settings

  def initialize(settings)
    @settings = settings
  end

  def deliver(mail)
    credentials = Google::Auth::ServiceAccountCredentials.new(
      token_credential_uri: settings[:token_uri],
      audience: settings[:token_uri],
      scope: Google::Apis::GmailV1::AUTH_SCOPE,
      issuer: settings[:client_email],
      signing_key: OpenSSL::PKey::RSA.new(settings[:private_key]),
      project_id: settings[:project_id],
    )
    credentials.sub = mail.from.first
    gmail = Google::Apis::GmailV1::GmailService.new
    gmail.authorization = credentials
    gmail.send_user_message(
      mail.from.first,
      upload_source: StringIO.new(mail.to_s),
      content_type: 'message/rfc822',
    )
  end
  alias deliver! deliver
end


message = Mail.new(
  from: 'from@example.com',
  to: 'to@example.com',
  subject: 'TEST MAIL',
  body: "TEST MAIL #{Time.current}",
)

GmailDeliveryMethod.new({...}).deliver(message)
```

![test_–_IAM_と管理_–.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792/cc4acd05-d7ac-7310-858e-56bd1d157838.png)
![Admin_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792/45100b18-14e4-30b7-06a2-e7bb4c0fa13a.png)
ローカルPCの開発でSSLのjson-serverをたてたい

# はじめに
自分の探し方が悪いのか、ローカルPC内でhttpのjson-serverはみつかるのですが、httpsのjson-serverがみつからなかったのでやりました。

# 環境
- windows10

# 使ったもの
- hotel  (探しにくいのでこれだけはリンクはります https://github.com/typicode/hotel)
- json-server
- local-ssl-proxy
- openssl
 
## 設定ファイル等のフォルダ
C:\hotel\json-server
C:\hotel\local-ssl-proxy


## 構成
hotel 起動 → local-ssl-proxy と json-server を起動
SSL通信 → local-ssl-proxyの9000ポート → json-server 3000ポート

#### 管理画面

- hotel
http://localhost:2000/

#### それぞれの画面
- local-ssl-proxy
https://localhost:9000/

- json-server
http://localhost:3000/

# 設定
インストールが終ったら下記を実施します。
※インストールについては下のほうに記載しました。

### json-server
1 C:\hotel\json-server
に移動

2 1で移動した場所に、db.json を作成
※ db.jsonの参考
https://github.com/typicode/json-server/blob/master/db.json

3 1で移動した場所で、コマンドプロンプトで下記のコマンドを実行

```
hotel add "json-server --watch db.json --p %PORT%" --port 3000
```

### local-ssl-proxy

1 C:\hotel\local-ssl-proxy
に移動

2 1で移動した場所に、SSL証明書を作成する(chrome対応版)
(ページ下の「SSL証明書の作り方」を参照)

3 1で移動した場所で、コマンドプロンプトで下記のコマンドを実行

```
hotel add "local-ssl-proxy --source %PORT% --target 3000" --port 9000
```


#  使い方

コマンドプロンプトでhotelを起動してから管理画面を見ます。

```
hotel start
```

止め方は下記です

```
hotel stop
```

管理画面をみるとjson-server、local-ssl-proxyのオンオフのスイッチがあるのでスイッチを入れたら動きます。
http://localhost:2000/

その状態で下記をブラウザで開けば、SSLで動作しているのがわかります。
https://localhost:9000/posts

# それぞれののインストール

申し訳ないですが、node.jsのインストールは、[各自で探してみてください・・・](https://qiita.com/search?utf8=%E2%9C%93&sort=&q=node+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

私は`choco install nodist -y`でインストールしてます。

#### hotel

```
npm install -g hotel
```

#### json-server
```
npm install -g json-server
```

#### local-ssl-proxy
```
npm install -g local-ssl-proxy
```

#### openssl
chocolateyでインストールしました。

```
choco install openssl -y
```

下記参考です。

PC移行でchocolateyで入れた自分のソフト一覧
https://qiita.com/lunar_sword3/items/cf67d147f53ab22189be

## SSL証明書の作り方
SSL証明書の作り方は下記を参考にしました。

Chrome58以降でも使えるSSL/TLSオレオレ証明書の作り方
https://www.server-memo.net/memo/ssl-cert-san.html

4つの黄色の箇所のコマンドを実行するだけです。
CSRは適宜入力してください。
3つめだけは下記になります。

```
echo "subjectAltName = DNS:*.exaple.com" > san.txt
↓
echo subjectAltName = DNS:localhost > san.txt
```

証明書のブラウザ(chrome)へのインストール方法は下記とかを参照です
https://jp.globalsign.com/support/faq/558.html
※インストールした後はブラウザの再起動します


# おわりに
dockerで簡単にできるローカルjson-serverはいっぱいあるのですが、諸事情でdockerがインストールできなくなりました。
chocolateyでインストールとアンインストールしたら中途半端な状態で残ってどうしようもなくなってしまいました。
解決方法を教えてください:sob:
Firebase の Cloud Functions から RealtimeDatabaseにアクセスする

Cloud Functions から RealtimeDatabaseへのアクセスを実施。下記サイト参考のNode.jsからのアクセスを参考に実施
[Firebase Realtime DatabaseをNode.jsから動かしてみよう](https://protoout.studio/posts/firebase-realtime-database-node-js)

【結果】そのままでCloud Functionsからアクセスできることを確認
【Java】基本型変数の代入と参照型変数の代入の違い

どーも、ふぎとです。
今回も自身の復習を兼ねての投稿です。

##「変数への代入」
「変数への代入」とは、変数に何かしらの値をセット
すること。

##「基本型変数」への代入
基本型変数とは、「値そのものを保持する変数」のこと。
例えば、int型の変数numberに3を代入すると、numberが
保持する値は3になる。

~~~ruby:

int number = 3; //整数3をnumberに代入
~~~

##「参照型変数」への代入
参照型変数とは、「コンピュータのメモリ上に確保された
ある領域（オブジェクト）への参照（オブジェクトの場所
を示す位置情報）を保持する変数」のこと。

~~~ruby:

String word = "Qiita"; //変数wordに文字列"Qiita"を代入？
~~~
上の例では、String型の変数wordに文字列"Qiita"が代入され
ているように見える。言い換えると、変数wordが保持する値
は文字列"Qiita"であるように見える。
しかし実際には、変数wordが保持している値は「String型オブ
ジェクトへの参照」である。つまり、「コンピュータのメモリ
上に確保された、文字列"Qiita"を格納する為の領域の位置情報」
を変数wordは持つのである。

この、変数が持つ値の性質の違いは、「他の変数にその変数を
代入する」ときに目に見えて現れてくる。

##「他の変数にその変数を代入する」
~~~ruby:
int i = 21;
int k = i ; //int型変数kに変数iの値を代入
int i = 30; //変数iに30を再代入

//StringBuilder型変数sb1(参照型変数）を宣言
StringBuilder sb1 = new StringBuilder();
sb1.append("Qiita"); //sb1が参照するオブジェクトに文字列"Qiita"を追加
StringBuilder sb2 = sb1; //sb2にsb1の値を代入
sb1.append("★"); //sb1が参照するオブジェクトに文字列"★"を追加

System.out.println(i);   //「30」を出力
System.out.println(k);   //「21」を出力
System.out.println(sb1); //「Qiita★」を出力
System.out.println(sb2) ;//「Qiita★」を出力
~~~
基本型変数は、「値そのものを保持する変数」だ。そのため、
上の例において、int型変数kにiを代入したとき、その時点で
iが保持している値（21）が代入され、保持されることになる。
したがって、iに30を再代入してもkの値は変化せず21のまま
となる。
一方、参照型変数は「オブジェクトへの参照を保持する変数」
だ。よって、sb2にsb1を代入すると、「sb1が参照しているオ
ブジェクトへの参照」が値として代入されることになる。つま
り、「sb1が保持しているオブジェクトの位置情報」を、sb2も
また保持することになる。そのため、sb1が参照するオブジェク
トに文字列"★"を追加してから出力したとき、同じオブジェクト
を参照しているsb2にも変化があらわれるのだ。

##まとめ
・基本型変数は「値そのもの」を値として保持する
・参照型変数は「オブジェクトへの参照」を値として保持する
・２種類の変数の性質の違いは「他の変数にその変数（の値）
　を代入したとき」に顕在化する

...
では今回はこの辺で。ふぎとでした。

(P.S.)記事の内容への指摘などあれば
　　　遠慮なくお知らせくださいm(__)m
fetch APIによる画像の取得とData URIの発行

# 内容

POST通信しながら画像をイメージタグに入れる方法がないかと探してたけど、上手くまとまっているものが見当たらんかったので、備忘録。通信後にレスポンス結果をバイナリデータとし、それに対してData URI（webブラウザ上に領域を確保した際の仮のURI？）を発行し、これを<img>タグのsrcに設定する。

仮に以下のようなhtmlがあったとする。

```html
<img class="image"></img>
```

そしたら以下のような感じ。

```javascript

fetch(url, {
  method: "POST",# GET, POST
  mode: "cors", // no-cors, cors, *same-origin
  cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
  credentials: "same-origin", // include, same-origin, *omit
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "hoge":"hoge" // post時の引数
  })
  }).then(respons => {
     return respons.blob(); // バイナリデータとする？
  }).then(blob =>{
     return URL.createObjectURL(blob); // Data URI発行
  }).then(dataUri =>{
     $('.image').attr('src', dataUri);
  })
});
```
LaravelでTDDを始めよう


LaravelでのUnitTestを始めよう

TestUnitを始める上で勢いで始めないように設計しましょう。

・基本的に読むべきこと
https://phpunit.readthedocs.io/ja/latest/
https://readouble.com/laravel/5.5/ja/testing.html

アンチパターンとベストプラクティス
https://www.ryuzee.com/contents/blog/3982

1. テストの中で何もテストしていない
書きかけの場合は、テストに未完成の印をつけるなどしましょう
https://phpunit.readthedocs.io/ja/latest/incomplete-and-skipped-tests.html

2. １つのテストメソッドの中で色々テストし過ぎている

3. 引数に真にしたい条件を与えてなんでもassertTrueでチェックしている
@dependsアノテーションを使ってテストの実行順序を制御しつつ分割を行うべきです。

4. テストデータのパターンが複数あるのを理由に１つのテストの中で順番に検証する
引数は検証対象の値やオブジェクトであるべきで、テストの意図を伝わりやすくすべきです。

5. テストが分類されていない。適切なフォルダ構成になっていない
解決策は適切にフォルダに分けて配置したり、テストスイートをつくったり、@groupアノテーションを使ってテストを分類します。


LaravelでPhpUnitを使う
LaravelでPHPUnitを使用する際、デフォルトの状態であればtests/TestCase.phpが作成されており、全てのテストクラスはこれを継承してテストを行います。

参考：https://memorandumrail.com/laravel-phpunit/
LaravelではデフォルでhFeatureとUnitというディレクトリに分かれていて、Feature には機能テスト、Unit にはユニットテストを書く構成になっています。
関数単位、クラス単位の場合はUnit

Mockeryを使うと疑似モックを作ってくれるので便利らしい。
【AtCoder】ABC159 D - Banned K で嵌った話  【C++】

## 0. 前提
* ３月２２日（日）のAGC159が競プロ初参戦。
* １番慣れている言語はPythonだったが、いい機会なのでC++を勉強することにした。
* C++はAtCoderのHP上にある[
C++入門 AtCoder Programming Guide for beginners (APG4b)](https://atcoder.jp/contests/apg4b)をひと通りやってみた。
* 他に最適化処理などアルゴリズム関連の知識不足を痛感したので蟻本を購入し初級編を半分程度終わらせたところでAtCoderデビューした。

## 1. ABC159 D - Banned K

* 問題
<img width="1091" alt="Screen Shot 2020-03-26 at 14.34.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191326/9b41d222-08a0-69b0-3588-5b2b0eaab7cb.png">
* 結果
<img width="1103" alt="Screen Shot 2020-03-26 at 14.37.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191326/b5bc1b80-19d0-b712-0faf-2228fcddfab7.png">
最初の５問でハマりました。いろいろ試してみたものの原因がわからないままここで制限時間の100分が終了しました。苦い競プロデビューとなりました。。。。

## 2. ハマった点

* わかってしまえば非常に単純な点なのですが、オーバーフローが原因でした。提出したコードはだいたい以下のような感じ。

```cpp
#include <bits/stdc++.h>
using namespace std;
 
int main(){
    int N;
    cin >> N;
    vector<int> A(N);
    vector<int> count(N, 0);
    for (int i = 0; i < N; i++) {
        cin >> A.at(i);
        count.at(A.at(i)-1)++;
    }
 
    int sum = 0;
    for (int i = 0; i < N; i++) {
        int c = count.at(i);
        sum += c*(c-1)/2;
    }
 
    for (int i = 0; i < N; i++) {
        cout << sum - max(count.at(A.at(i)-1)-1, 0) << endl;
    }
} 
```
* 以下の行がオーバーフローしていました。

```cpp
        sum += c*(c-1)/2;
```
* $A_i$の最大値は200,000ですが、int型は-2,147,483,648〜+2,147,483,647の範囲しか取れないので、c*(c-1)の計算をするところでオーバーフローを起こし得ます。
* ということで以下のようにコードを修正しました。

```cpp
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int main(){
    int N;
    cin >> N;
    vector<int> A(N);
    vector<int> count(N+1, 0);
    for (int i = 0; i < N; i++) {
        cin >> A.at(i);
        count.at(A.at(i))++;
    }

    ll sum = 0;
    for (int i = 0; i < N + 1; i++) {
        ll c = count.at(i);
        sum += c*(c-1)/2;
    }

    for (int i = 0; i < N; i++) {
        cout << sum - (count.at(A.at(i))-1) << endl;
    }
}
```

* 通った！！
<img width="1097" alt="Screen Shot 2020-03-26 at 14.59.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191326/5859ebae-f4cc-f314-0e80-307258aaf684.png">

* long long型はint型の倍の8byteを使用しますが、-9,223,372,036,854,775,808〜+9,223,372,036,854,775,807の範囲を扱えます。
* 誰もが１回は通る落とし穴なのかもしれませんが、僕も無事落とし穴を経験しながら成長していく、と笑
読みやすいコードを書く

#読みやすいコードとは
読みやすいコードが書けずに困っているため、現段階で学んだことなどを書いていきたい。

##客観的にコードを読む
コードは自分だけがわかれば良いものではない。全く関係のない人が見ても理解に時間のかからないコードを書く必要がある。
そのためには自分の頭をリセットして客観的に自分のコードを読む

##わかりやすい変数名、メソッド名を書く
ここに一番苦戦している。ボキャブラリーが少ないせいか、わかりやすい名前をつけることができない。
そのため、ここに汎用的に使えそうな変数名などをメモしていきたいと思う。

###範囲の指定
firstとlast
限界値を明確にするには
minとmaxを使う

###何かを出力するメソッド
output ~
ファイルアップロードの動作確認でダミーファイルを用意したいときのサイトまとめ

ファイルアップロード機能を作ったときに適当なファイルを用意するのって~~めんどくさい~~大変ですよね。
そんなときは以下のサイトからダウンロードすると便利です。

# File Examples Download
![2020-03-26 14.56.54 file-examples.com fbb512128e1c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/b1d7e25a-969a-2bb6-1bc6-63dce62d1e5f.png)

https://file-examples.com

ワードやエクセルのファイルがあるのは助かりますね


# Download Sample Videos
![2020-03-26 14.57.22 sample-videos.com 418f6cad9620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/e5292538-fd4f-2d6b-16e4-0ae4e257f4b2.png)

https://sample-videos.com

動画ファイルだけじゃなくZIPファイルも容量別であったりして便利です

### おわり
みなさんのおすすめがあったら教えて下さい。
salesforceエラーメモ：INSUFFICIENT_ACCESS_ON_ CROSS_REFERENCE_ENTITY

INSUFFICIENT_ACCESS_ON_ CROSS_REFERENCE_ENTITY APEX / SALESFORCE
注：この問題の一般的な原因は、以下のシナリオです。
それがあなたに当てはまらない場合は、読んでください。
 *「レコードX」を「ユーザーY」と共有しようとしていて、「ユーザーY」がすでに「レコードX」にアクセスできる場合、このエラーが発生します。

これが何を意味するのかを理解して以前に対処しましたが、今回はこのエラーメッセージが1週間頭を悩ませました。
最後に、私はそれを整理しました、そしてこの投稿が誰かが同様に理解して解決するのを助けることを願っています。

このエラーはいつ発生しますか？
このエラーは通常、DML操作が実行されたときに発生します。
つまり、挿入または更新が実行されるたびに。 
APEXクラスまたはTRIGGERを保存すると、このエラーは実行時に発生するため、このエラーは表示されません。

このエラーはどういう意味ですか？
このエラーは、実行することが想定されていない操作を実行しようとしていること、
または実行しようとしている操作が、定義された共有とセキュリティの設定に従って許可されていないことを意味します。
このエラーメッセージは、場合によっては、操作を実行するためのアクセス権がないことを常に意味するわけではありません。
したがって、管理者であっても、このメッセージが表示される場合があります。

**考えられる原因：**
いくつかのシナリオを取り上げて分析しましょう。

**シナリオ1：**
新しいレコード（アカウント/連絡先/ ...）の作成と所有者の設定。レコードの更新にも適用されます。

したがって、コードでいくつかのレコードを作成します。デフォルトでは、レコードの作成者は所有者です。
これを変更し、新しく作成されたレコードのOwnerId列を変更します。 
「ユーザーX」をオーナーにします。コードを実行すると、以下のエラーが発生します。
System.DmlException：挿入に失敗しました。行2の最初の例外。最初のエラー：INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY、相互参照IDに対するアクセス権が不十分：[]

確認すること：
  *実行中のユーザー（この場合はあなた）が操作対象のオブジェクトにアクセスできることを確認してください。オブジェクトに対するCREATE特権を持っていることを確認してください。これはオプションですが、ここから始めるのが常に良いでしょう。
  *所有者、つまりユーザーXがオブジェクトに対するCREATE権限を持っていることを確認してください。彼のプロファイルに特定のオブジェクトに対するCREATE権限があることを確認してください。彼はそれを持っていないかもしれません、彼に許可を与えてください、そして問題は解決されます。

**シナリオ2：**
商談の作成または更新（例としては、任意のオブジェクト）。商談の関連アカウントを設定します。

たとえば、5つの商談を作成し、所有者を「ユーザーX」に設定したとします。アカウントを「アカウントX」に設定します。コードがこれらの5つの機会を挿入しようとすると、失敗し、同じエラーメッセージが表示されます。
System.DmlException：挿入に失敗しました。行2の最初の例外。最初のエラー：INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY、相互参照IDに対するアクセス権が不十分：[]
理由：
これは、「ユーザーX」が「アカウントX」にアクセスできないためです。 「アカウントX」の機会を作成しようとすると、彼はコードにアクセスできません。 「アカウントX」の「ユーザーX」へのアクセスを手動またはコードで許可してから、挿入を実行します。

**シナリオ3：**
共有オブジェクト。

これは少し複雑です。少なくとも私にとっては。
すべてのオブジェクトが独自の共有オブジェクトを持っていることに気づくかもしれません。
したがって、AccountにはAccountShareがあり、Customobj__cにはCustomobj__Shareがあります。
このオブジェクトのレコードを挿入または更新すると、同じエラーメッセージが表示される場合があります。
これが発生する理由はいくつかあります。
    １．「レコードX」を「ユーザーY」と共有しようとしていて、
　　　　自分自身が「レコードx」にアクセスできない場合、このエラーが発生します。
    ２．「レコードX」を「ユーザーY」と共有しようとしていて、
　　　「ユーザーY」がオブジェクトへのアクセス権を持っていない場合
　　　（プロファイルレベルの権限、読み取り、編集、削除の作成）、このエラーが発生します。
    ３．「レコードX」を「ユーザーY」と共有しようとしていて、
　　　「ユーザーY」がすでに「レコードX」にアクセスできる場合、このエラーが発生します。

参照：http://www.forcetree.com/2011/12/insufficientaccessoncrossreferenceentit.html
thanks very much.
API設計について調べたことのまとめ

API設計について、最近得た知見をまとめました。私がGoで開発しているのでGoベースの話になります。
間違いがあればコメントで教えていただければ幸いです。

# 参考資料
- GopherCon 2018 : [GopherCon 2018 - How Do You Structure Your Go Apps?](https://about.sourcegraph.com/go/gophercon-2018-how-do-you-structure-your-go-apps)
- デモのソースコード : [katzien/go-structure-examples](https://github.com/katzien/go-structure-examples/tree/master/flat)
- クリーンアーキテクチャのソースコード : [go-clean-arch](https://github.com/bxcodec/go-clean-arch)
- SlackのGophers, StudentGoなどの得た情報
- 株式会社オージス総研 クラウドインテグレーションサービス部 : [なぜAPIのアーキテクチャが重要なのか](https://www.ogis-ri.co.jp/pickup/renkei/docs/20170911_APIEconomy_Session2.pdf)


# 設計
## 設計とは
設計は、ユーザー目線で利便性を考える **「インターフェース設計」** と 開発者目線で利便性を考える **「アーキテクチャ設計」** があります。「インターフェース設計」で最近多くみられるのはREST APIと言われる設計方法が主流です。また、「アーキテクチャ設計」では、様々なアーキテクチャがあり、自分の開発しているAPIに適したアーキテクチャを使用します。
## インターフェース設計
インターフェース設計をする上で考えるべきことは、外部の大多数の開発者向けに開発する ```LSUDs(Large Set of Unknown Developers)``` と ある特定のアプリケーションのための開発者のための ```SSKDs(Small Set of Known Developers)``` の二つのどちらかなのかを明確にすることです。LSUDsでは、RESTなAPI設計が主流です。しかし、SSKDsは、必ずしもRESTなAPI設計に従って開発する必要はありません。開発しているアプリケーションによってAPI設計を考える必要があります。SSKDsで重要なことは、1画面1リクエストを意識することです。
### Rest (REpresentational State Transfer)
Rest設計については下記の記事が参考になりました。
[](https://qiita.com/masato44gm/items/dffb8281536ad321fb08)
[翻訳: WebAPI 設計のベストプラクティス](https://qiita.com/mserizawa/items/b833e407d89abd21ee72)
## アーキテクチャ設計
アーキテクチャには数多くの種類があります。そのため、どのアーキテクチャを採用するべきか見極めることが大変難しいです。
[GopherCon 2018の記事(参考資料)](https://about.sourcegraph.com/go/gophercon-2018-how-do-you-structure-your-go-apps)では、このような悩みを持つユーザーのために、アーキテクチャが紹介されていました。
この記事で紹介されている最も簡単なアーキテクチャは、 **Flat structure** 、 **Layered**、　**Modular** です。また、 **Domain Driven Development(ドメイン駆動設計)**　や **Hexagonal Architecture** も紹介されています。この記事の他にも、 **クリーンアーキテクチャ** や **オニオンアーキテクチャ** などもあります。これらのアーキテクチャの特徴を簡単にまとめたいと思います。
### Flat structure
このアーキテクチャは、簡素なAPIに適しているアーキテクチャだと思われます。パッケージ分をせずに全て ```package main``` で統一します。そのため規模が大きくなると読みにくいアーキテクチャになると思います。

### Layered
このアーキテクチャは、機能ごとにディレクトリを分けています。そうすることで、packegeごとの役割を明確にすることができます。
問題点は、違うディレクトリ同士で値を共有したい場合にどうやって共有するかか問題になります。

### Modular
このアーキテクチャは、ハンドラごとにディレクトリを分けています。部品ごとに分けて開発をするので、追加や修正が簡単にできることが良い点だと思います。

### その他
他のアーキテクチャは、また別の記事で深くまとめようと思います。

## 開発しているAPIに合った設計の見つけ方
自分が開発しているAPIは、どのアーキテクチャに向いているのかを見つける方法があります。その方法は、機能が増えたり規模が大きくなったらどこが問題になるかを考えることです。注意点としては、自分のAPIにカッチリ当てはまるアーキテクチャはほとんど無いので、試行錯誤する必要があります。試行錯誤には、かなりの理解が必要なので、「様々なアーキテクチャを実際に使用すること」や「実際に使用されているコードを読むこと」が重要なのではないのかと考えています。
# 終わりに
記事を書いていて新しく発見した知識も多かったです。自分が使用していたディレクトリ分けは、Layeredアーキテクチャに似ていると感じました。多くのアーキテクチャを学び、適しているアーキテクチャを見つけられるようになりたいです！
ありがとうございました。
Redisとはなんぞや

Redisとはなんぞや

「Redis は、リモートディクショナリサーバーの略で、データベース、キャッシュ、メッセージブローカー、およびキューとして使用するための、高速でオープンソースのメモリ内 Key-Value データストアです。このプロジェクトは、Redis の最初の開発者である Salvatore Sanfilippo 氏が、イタリアのスタートアップ企業のスケーラビリティを改善しようとしていたときに始まりました。Redis は今、ゲーム、アドテクノロジー、金融サービス、医療、IoT の分野のリアルタイムアプリケーションでミリ秒未満の応答時間を実現し、1 秒間に数百万件のリクエストを処理できます。Redis は、キャッシング、セッション管理、ゲーム、リーダーボード、リアルタイムアナリティクス、地理空間、ライドヘイリング、チャット/メッセージング、メディアストリーミング、およびパブ/サブアプリケーションに広く使用されています。」公式
要は
RedisはKey-Valueでデータを保存するサーバってことか。
応答時間が早いのが特徴なんですね
主にキャッシュ、セッション管理などに使われているということ

「データをディスクや SSD に保存するデータベースとは異なり、Redis のデータはメモリ内に保存されます。Redis のようなインメモリデータストアでは、ディスクにアクセスする必要がないため、シークタイムの遅延はなく、マイクロ秒単位でデータにアクセスできます。Redis は、柔軟性に優れたデータ構造、高可用性、地理空間、Lua スクリプト、トランザクション、オンディスクの永続性、クラスターサポートといった機能に対応しているため、リアルタイムのインターネット規模のアプリケーション構築がさらに簡単になります。」

DBは通常ディスクやSSDに保存される（あんまり知らなかった）
Redisメモリ内に保存される
ディスクアクセスが不要なのでマイクロ秒単位でデータアクセスが可能（わお）
リアルタイムの、インターネット規模のアプリケーション構築がさらに簡単に

「Redis と MemCached は、どちらもインメモリのオープンソースデータストアです。高性能分散メモリキャッシュサービスの Memcached は、シンプルに、また Redis は幅広いユースケースに対して効果的であるように、豊富な機能をお届けできるように作られています。決断するためのより詳細な機能比較については、Redis 対 Memcached をご覧ください。  MySQL、Postgres、Aurora、Oracle、SQL Server、DynamoDB などのリレーショナルデータベースまたは Key-Value データベースと連携してパフォーマンスを向上させます。 」
インメモリのデータストアはRedisのほかにMemCachedというものがあるのか。
ざっくり言えばMemCachedはシンプルで、Redisは汎用性が高いっていうイメージ。

「Amazon ElastiCache は、ミリ秒未満の応答時間が必要な最も要求の厳しいアプリケーション向けに、完全マネージド型の Redis と Memcached を提供します。Amazon ElastiCache はインメモリデータストアやインメモリキャッシュとして機能し、ミリ秒単位の応答時間が必要とされるような、要求の厳しいアプリケーションにも対応しています。お客様専用のノードで実行する最適化したエンドツーエンドのスタックを利用することで、Amazon ElastiCache で安全かつ非常に高速なパフォーマンスが実現します。」公式

なるほど。
AWSのElastiCacheはRedis（とMemCache）を管理してくれるサービスなのか。
ElastiCacheのおかげでミリ秒単位のアクセスが可能になるってのが売りなんですね。

ElastiCacheのスケーリングに関して調べてみる。
「Amazon ElastiCache は、変化するアプリケーションニーズに応じて、スケールイン、スケールアウト、スケールアップできます。書き込みおよびメモリのスケーリングは、シャーディングでサポートされています。レプリカは読み取りスケーリングを提供します。」公式

ElastiCacheもスケールできるんですね。
「Amazon ElastiCache for Redis では、小規模の Redis データから始め、アプリケーションの拡大に応じて最大 170.6 TB のインメモリデータを持つクラスターまで簡単にスケールすることができます。Redis Cluster 環境を最大 250 のノードと 250 のシャードにまでスケールできます。オンラインでクラスターのサイズを変更することでダウンタイムなしでスケールアウト/スケールインし、ニーズの変化に対応できます。ElastiCache では、読み込みキャパシティーをスケールするために、複数のアベイラビリティーゾーン全体で最大 5 つのリードレプリカを追加できます。ElastiCache では、書き込みキャパシティーをスケールするために、複数のプライマリ間で書き込みトラフィックを分割できるよう Redis クラスターをサポートしています。」公式

スケールアップ … 最大170.6TB
スケールアウト … 最大250ノードと２５０シャード
MultiAZで最大5つのリードレプリカ作成可能
Redisクラスタなるものがある。



 ![ああ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517424/352c6d6a-9ea6-88b5-07da-9fcd66bc8a60.png)

どうやらクラスタモードが有効か無効かによってスケーリング内容が変わってくるらしい・・・。

もうちょっとredisクラスタについて調べてみる...
「Redis (クラスターモードが無効) クラスターは、シャードを持たない単一ノードクラスターでも、1 つの シャードを持つマルチノードクラスターでもかまいません。単一ノードクラスターでは、読み取りと書き 込みの両方に 1 つのノードを使用します。マルチノードクラスターには、0 ～ 5 の読み取り専用レプリカ ノードのある読み取り/書き込みプライマリノードとして常に 1 個のノードがあります。」公式
単一かマルチの構成があるのか。

終わり
EKSとはなんぞや

EKSとはなんぞや

調べてみた
「Amazon Elastic Kubernetes Service (Amazon EKS) は、独自の Kubernetes コントロールプレーンを立ち上げたり維持したりすることなく、AWS で Kubernetes を簡単に実行できるようにするマネージド型サービスです。Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、および管理を 自動化するためのオープンソースシステムです。」公式
コントロールプレーンって何？
Kubernetesもっと知りたい。

「Kubernetes クラスターはマスターノードから成る「コントロールプレーン」と、実際にコンテナ稼働するワーカーノードから成る「データプレーン」から構成されます。
コントロールプレーンにはクラスターの情報を保持する etcd や、どのノードで Pod を動かすかをコントロールする kube-scheduler 、API を提供する kube-apiserver などが含まれます。 また、各ワーカーノード上には kubelet と呼ばれるエージェントが動いており、各 Pods はこの kubelet を介して実行されます。
開発者は kubectl という CLI ツールを介し、マスターノード上の API Server へリクエストを送ることで、Kubernetes 上のオブジェクトをコントロールすることになります。」Matsuda

業務でkubectlコマンド使ってたけど、これでマスターノードのAPI Serverへリクエストを送ってたのか。

CloudFormationってなんだ？
「AWS CloudFormation は Amazon Web Services リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにさらに注力できるようになります。使用するすべての AWS リソース (Amazon EC2 インスタンスや Amazon RDS DB インスタンスなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客様に代わってこれらのリソースのプロビジョニングや設定を受け持ちます。AWS リソースを個別に作成、設計して、それぞれの依存関係を考える必要はありません。AWS CloudFormation がすべてを処理します。次のシナリオは AWS CloudFormation がどのように役立つかを示します。」公式
なるほど。
テンプレート作成してそれをもとにリソース設定してくれるわけか。

「バックエンドデータベースを含むスケーラブルなウェブアプリケーションで、Auto Scaling グループ、Elastic Load Balancing ロードバランサー、Amazon Relational Database Service データベースインス タンスを使用している場合があります。通常、それぞれ個別のサービスを使用して、これらのリソースを プロビジョニングしているかもしれません。また、リソースを作成した後、一緒に動作するように設定する必要があるでしょう。このような作業は、まだアプリケーションを運用していないうちから、複雑な手間と時間がかかります。 代わりに、AWS CloudFormation の既存のテンプレートを作成または変更できます。テンプレートはすべてのリソースおよびプロパティについて記述します。テンプレートを使用して AWS CloudFormation スタックを作成すると、AWS CloudFormation が Auto Scaling グループ、ロードバランサー、および データベースをプロビジョニングします。スタックが正常に作成されると、AWS リソースの利用を開始できます。スタックの削除も同様に簡単です。スタックのすべてのリソースを削除できます。AWS CloudFormation を使用すると、リソースのコレクションを単一のユニットとして簡単に管理できます。」公式

CloudFormationスタックっていうのは、その設定のことか。

進もう。
次は図を見てEKSを理解していくことにする。
 <img width="927" alt="ああ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517424/9dd4aebf-a235-b859-0305-7a7c3725bec7.png">

EKSはFargate、EC2のクラスタとして使える。
![ええ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517424/4ce948cf-55cf-25e9-28ac-f079c3b650dc.png)

 
EKSがマスタ作って、ワーカーノードを作って、EKSにつながって、アプリが稼働する。

そういうことか。

終わり