OmniAICreator/Qiita-1.07M huggingface dataset:
docker registryにクライアントPCからhttpでアクセス

# 環境
```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.1 LTS
Release:	20.04
Codename:	focal
```

```
$ docker -v
Docker version 20.10.1, build 831ebea
```
# 手順
/etc/docker/daemon.jsonを作成、registryを指定

```daemon.json
{ "insecure-registries": [ "192.168.1.1:5000" ] }
```

docker再起動 

```
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```
# ちょっと躓いた

## 内容
/etc/docker/daemon.jsonにinsercure-registriesを記載しても反映されない


## 解決
daemon.json「"」と「:」の間にスペースがあったため

```
# OK
{ "insecure-registries": [ "192.168.1.1:5000" ] }

# NG
{ "insecure-registries" : [ "192.168.1.1:5000" ] }
```

## その他
一度設定できてしまえば、空白があっても反映できるようになった

# 参考
https://python5.com/q/desfwrhm
arxivデータを利用したトピック解析：可視化

# この記事の目的

- 前回投稿した、[arxivデータを利用したトピック解析](https://qiita.com/hnakatsuka/items/efd7d37646f3007b9cf7)について、せっかくなので可視化をやった結果の紹介です。
- ついでに、hep(high energy physics)分野のトピック(論文カテゴリー)の投稿数がどのように変化したのかを時間軸で見ていきたいと思います。
- LDAモデルの可視化をやってみたい人向け

# トピック解析とは

[前の記事](https://qiita.com/hnakatsuka/items/efd7d37646f3007b9cf7)で詳しく書いたが、要は大量の文章を、話題(トピック)ごとに自動で分類するように解析すること。学習モデルが作れてしまえば、未知の文章に対しても適切にトピックを振れるようになる。
今回私が解析に使ったデータ元のarxivとは、世界最大の論文投稿プラットフォームである。だれでもAPI経由で投稿された論文のタイトルや要約、著者などの情報を取得できる。

前回の記事では、LDAモデルを使って、hepカテゴリーの論文の過去30年分のデータを学習させるところまでやった。
以下では、得られたモデルを使った可視化を行う。

参考にした記事様

- LDA学習：[LDAとそれでニュース記事レコメンドを作った。](http://tdual.hatenablog.com/entry/2018/04/09/133000#%E5%AE%9F%E8%B7%B5)
- LDAの可視化:[LDAによるトピック解析 with Gensim](https://qiita.com/Spooky_Maskman/items/0d03ea499b88abf56819)




# トピックの可視化

トピック分析の利点の一つとして、事前情報無しに文章のトピックを自動生成できる点が挙げられる。これにより、投稿された論文からどのような分野が形成されているのか調べられる。
問題は、その各トピックが何を意味するのか人間が理解しやすい形で可視化することである。

有名な方法として`Word Cloud`という、各トピックを特徴づける単語を図示するという手法がある。よくビックデータの解析のイメージ図で出てくる絵である。`from wordcloud import WordCloud`をして、次のように簡単に生成できる。

```
# WordCloud
x = dict(lda_model.show_topic(topic_num, 30))
image = WordCloud(
        background_color='black',
        color_func=color_func,
        max_words=400,
        width=300, height=300,
        random_state=0
    ).generate_from_frequencies(x)

```

`lda_model`が前回学習させたモデルで`topic_num`が注目しているtopicのidである。
例えば、今回だと次のような図が現れる。

![word_clouds_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999047/151366d9-4fc2-0d29-fdc0-bab4e7918b24.png)

![word_clouds_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999047/42066f1a-b8a6-539a-1370-29135ba25b0f.png)

一つの四角が一つのトピックに相当している。右上を見ると、ノーベル賞受賞にもつながった[ニュートリノ振動](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%83%8E%E6%8C%AF%E5%8B%95)のトピックが見えていたり、左下にはAxion関連の用語が出ていたりと、割と体感に合うような結果が出ている。
上に挙げた図の他にも`string theory`などhepの分野ごとのトピックが生成されていた。

個人的に不思議だったのが、超対称性SUSYを表すトピックが出ていなかったことである。おそらく、一時期流行りすぎたせいで、より細かなトピックに細分されてしまって表に出ていないだけかもしれない。

# トピックごとの、論文投稿数の年次データ

トピックの特性が大体わかったので、次はそれを使って論文投稿数の時間変化を眺めていきたい。
というのも、この解析を始めた動機の一つが、自分の分野が今どれくらい流行っているのか知りたい、というものだったからである。
例として、次の4つのトピックの投稿数の年度ごとの棒グラフを並べてみた。縦軸が１年あたりの投稿数で、横軸が年度。
![time_span.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999047/d83542f0-c394-e0be-97c1-69edd0f13478.png)

キャプションは、先のword cloudから目立った用語を拾ってきたものであり、トピックを大まかに表している。
このグラフは見方によっては結構面白くて、例えば2010年を過ぎた辺りから`Higgs`が激増しているのは、２０１２年に[Higgs粒子](https://ja.wikipedia.org/wiki/%E3%83%92%E3%83%83%E3%82%B0%E3%82%B9%E7%B2%92%E5%AD%90)が発見された影響なのではと思われたりする。
とはいえ、Arxiv自体が使われ始めた時期もあるので、流行り廃りを見るなら投稿数ではなく投稿割合を見たほうが適切かもしれない。

この手の図を自動で生成するwebアプリを作ると、一部界隈に需要があるかもしれない。

#　今後の展望

今回、ざっとうまく分類できた例を見せたが、Word cloudにはよくわからない分類をされているTopicなども存在していた。(review論文や総説に対応するTopic?)
結果を見つつ、前処理を工夫したほうがいいかもしれない。

またトピック分類に関して、時代とともに使われている用語が変わったりするので、本当は30年分全部をやるのではなく、最近の5年分で学習してから、過去のデータを分類する、といった使い方をしたほうが、適切に時間変化を把握できる可能性がある。

このあたりの改善は今後の課題としたい。
指数関数的なパルスの時系列データをpythonで生成する方法

# 指数関数的なパルスの時系列データの使い所

光子検出器のパルスの検出する為に、擬似的に時系列データを生成して、シミュレーションするような場合に、パルスをpythonで簡単に生成したい場合に用いる。

コードを読めばわかる方は、[google Colab のページ](https://colab.research.google.com/drive/11h8irfUb0BB5GKwxUHLsHjLzsNu25_QG?usp=sharing) を参照ください。

## パルスの発生方法

おそらくもっとも簡単なパルスの波形は、指数関数の差を使うものであろう。
a をパルスの減衰時定数、b をパルスの立ち上がり時定数、Aを振幅とすると、

``` math:
A \times ( e^{-t/a} - e^{-t/b} ) 
```

のようにかける。


## １発のパルスの生成方法

``` python:
# ２つの指数関数の差で波形を形作る
def pulse(a = 1.0, t1 = 1e-3, t2 = 5e-3, dlen=1024, dt = 1e-4):
  t = np.linspace(0, dt * (dlen-1), dlen)
  y = a * (np.exp(-t/t2) - np.exp(-t/t1) )
  return t, y
```

デフォルトで、dlen=1024 で、1024サンプルのデータを生成するようにして、時間間隔 dt = 1e-4 で、0.1ms 程度の時間を想定。t1 = 1e-3, t2 = 5e-3 で、1ms の立ち上がり時間と、5ms の立ち下がり時間を想定。

これでパルスを生成すると、

![スクリーンショット 2021-01-08 1.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/ff4e8f1d-b5d1-6687-b8f4-1c5e1a4418f1.png)

の様になる。

## もう少し凝った生成方法

もう少し長いパルスを生成してみよう。

``` python
# ゼロのデータを追加する例
t0, y0 = pulse(a = 0, dlen = 100)
t = np.hstack((t,t[-1]+t0))
y = np.hstack((y,y0))

# 振幅 0.5 のパルスを追加
t1, y1 = pulse(a = 0.5, dlen = 1024)
t = np.hstack((t,t[-1]+t1))
y = np.hstack((y,y1))

# 振幅 0.8 のパルスを追加
t1, y1 = pulse(a = 0.8, dlen = 1024)
t = np.hstack((t,t[-1]+t1))
y = np.hstack((y,y1))

# 振幅 0.3 のパルスを追加
t1, y1 = pulse(a = 0.3, dlen = 1024)
t = np.hstack((t,t[-1]+t1))
y = np.hstack((y,y1))
plt.plot(t,y,".")
```

これをプロットするとこんな感じ。

![スクリーンショット 2021-01-08 11.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/4b1b1eb6-b6d5-48dc-661b-e27ca45c547c.png)
Unreal EngineのソースからUE4Editorを作る

#0. 記事を掲載した理由
1. 参考情報[1]のUnreal Engineを使った地図連携が面白そうだったのですが、バージョン4.19以下（現在の最新バージョン4.26）との指示がある。しかし、Epic Gamesは古いバージョンを提供していないため、ソースから実行ファイルを作る必要があった。
2. ソースから実行ファイルを作ろうとしていたが、解決できていない。(参考情報[2][3])

私も、解決までに1日かかりました。

【参考情報】
[1] Unreal EngineでIoT、はじめる時の基礎（通信REST、グラフ描画、地図連携） (https://qiita.com/AkmIOtUE4/items/a39c9318f1c5c1789c5b)
[2] ARCore Using Unreal Engine SDK Preview2にチャレンジしたけど失敗した！
(https://qiita.com/___monta___/items/3ad22282c560779fd3c6)
[3] Unreal Engineのフォーラム
https://answers.unrealengine.com/questions/675040/nldefh-error-at-compile-time.html

#1. 準備
・Visual Studio 2017 のインストール
・Githubデスクトップのインストール（※GithubからZipファイルをダウンロードしても良い。）
・ソースファイルのダウンロード（https://github.com/Oculus-VR/UnrealEngine）
![GitHub.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/b701737f-bd1c-8a75-0683-d6b5d8eb2d98.png)

#2. Exeファイルを作るまでが難しい
　実行ファイルを作る手順は、以下の1,2を順に実施しますが、コンパイルエラーが発生することがあります。私も、コンパイルエラー（例えば、C1083 nldef.hというファイルがない）が発生しました。

1. ダウンロードしたzipファイルを適当な場所に展開する。
2. やり方は展開したフォルダ内のREADME.mdに記述されているので、参照の事。
![フォルダ内.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/56c8ab11-3838-95e5-e5a0-d7a921db8585.png)
後は、こちらを参照ください。（https://docs.unrealengine.com/ja/ProductionPipelines/DevelopmentSetup/BuildingUnrealEngine/index.html）

#3. 解決策
1．Visual Studio 2017で追加インストールが重要です。
　・C++によるデスクトップ開発をチェック
　・C++によるゲーム開発をチェック
　・オプション（Windows8.1 SDKとUCRT.SDKをチェック
![Installer_VisualStudio.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/159bee66-1f7e-f963-dbba-b3023976a3da.png)
![Installer2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/5d073fd1-2b2f-c525-aca0-dd77e8fbca5d.png)

2. Cleanビルドを実行した後、ビルドを実施。
![Clean.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/aaad3020-2da3-b2f5-47cf-14d3bcddc3a8.png)

# 結果
上記を実施した結果、コンパイルに成功。
![コンパイル成功.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/312a60a3-b8cc-ed53-70b8-8cd1386f7161.png)

\UnrealEngine-4.19\Engine\Binaries\Win64のフォルダの中に、UE4Editor.exeが生成されている事を確認
![UE4Editor.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/722d621f-0e5c-34c9-b6e0-5fad3d14c6ed.png)

上記、UE4Editor.exeを実行し、バージョンを確認すると、当然ながら、4.19.2であることを確認。
![バージョン4.19.2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305726/67bd441b-43ee-d43d-e476-d3c129f26979.png)

# 最後に
私と同じような経験をし、困っている人の役に立てれば幸いです。
amazonSESのはじめの一歩

<h1>はじめに</h1>
前回に引き続き、メール機能について学習したのでアウトプットしていきます
今回はAmazon SESを使っていきます
Amazon SESを使う前提として

>- [AWS にサインアップ](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/sign-up-for-aws.html) 
   <dt>(AWSアカウントをすでに作成済みの方はOKです！）</dt>




</dd>
>- アカウントの詳細を入力

が必要になってきます。

<h1>メール送信</h1>
Amazon SES では、
>- *Amazon SES コンソール*
- _Simple Mail Transfer Protocol (SMTP)インターフェイス_
>- <font color="#1aa"><strong>Amazon SES API </strong>


など、E メールを送信するためのいくつかの方法を利用できます。

この中でAmazon SES APIを使ってみます

<h2>Amazon SES API</h2>
Amazon SES APIを用いることで以下のことができます。

>- Amazon SES クエリ API を HTTPS 経由で直接呼び出し(ムズイらしい)
> - AWS Command Line Interfaceの使用
> - AWS Tools for Windows PowerShellの使用
> - <font color="#fb1"><strong> AWS SDK の使用</strong>

aws初心者の私は一番簡単にできそうなAWS SDKを使っていきます！
AWS SDKは Amazon SESオペレーションだけでなく、基本的な AWS 機能 (リクエスト認証、リクエストの再試行、エラー処理など) も提供します。

<h2>AWS SDK 経由でAmazon SES API</h2>
<p>Node.js 内の AWS SDK for JavaScriptを使用します！(SDKにはPythonやjava,PHPなど様々な言語に対応したものが用意されています)</p>

> セキュリティのベストプラクティスについては、AWS アカウントのアクセスキーではなくIAM ユーザーのアクセスキーを使用します。
AWS アカウントの認証情報によってすべての AWS リソースへのフルアクセス権を付与するため、この認証情報は安全な場所に保存しておき、AWS の日々の操作には IAM ユーザーの認証情報を使用するらしいです。

では早速、AWS アクセスキーを作成していきましょう！
awsのベストプラクティスでは、AWS アクセスキーの作成手順として以下のように紹介されています。
>1: IAM ユーザーを作成し、そのユーザーのアクセス許可を可能な限り狭く定義します。
>2: その IAM ユーザーにアクセスキーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977422/4cd98998-ff0a-aa39-aad4-ff1745ce2128.png)


AWS アクセスキーは、アクセスキー ID とシークレットアクセスキーで構成されます。

<h1>SESの環境を構築</h1>
<h4>sdkをインストールします</h4>

```
npm install aws-sdk --save
```
<h4>aws-sdkで接続情報の設定</h4>
基本的には[IAMロール](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html)を使って行うらしいのですが、よくわからないので別の方法で！
クレデンシャル(~/.aws/credentials)もよく使われるらしいですが、今回はenvに設定しました～

dotenv モジュールのインストール


```
$ npm install dotenv
```
ルートフォルダーに.envファイルを作り記述します。

``` <span>.env</span>
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットアクセスキー
```

最後にmail.jsをルートフォルダーに作り、最も簡単なE メールテンプレートの作成をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977422/3fbbfae2-cc4c-5610-10a6-e37990597ec8.png)

```
node mail.js
```
を実行すれば…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977422/cd14ac49-3ee5-4246-631a-7d5dd977fb61.png)

届きました。

<h1>メール機能を運用していくにあたって</h1>
現状では不正使用や悪用を防止し、送信者としての評判を保つため、新しい Amazon SES アカウントには制限が適用されます。そのため、下記の制限があります。

>- 最大で 24 時間あたり 200 メッセージ

>- E メールは、検証済み E メールアドレスまたはドメインからのみ送信

制限解除にはサンドボックスに配置されている Amazon SESをサンドボックスの外に置く必要があります。

<h1>おまけ</h1>
awsを使うにあたり調べた用語を紹介します
><strong><dt>ロール</dt></strong>
特定のアクセス権限を持ち、アカウントで作成できる IAM アイデンティティです。IAM ロールは、IAM ユーザーといくつかの類似点を持っています。ロールとユーザーは、両方とも、ID が AWS でできることとできないことを決定するアクセス許可ポリシーを持つ AWS ID です。ただし、ユーザーは 1 人の特定の人に一意に関連付けられますが、ロールはそれを必要とする任意の人が引き受けるようになっています。また、ロールには標準の長期認証情報 (パスワードやアクセスキーなど) も関連付けられません。代わりに、ロールを引き受けると、ロールセッション用の一時的なセキュリティ認証情報が提供されます。
Dockerfile, docker-composeの書き方と解説

## はじめに
docker初心者の自分が同じようにdocker初心者の方向けに作成したものです。
Dockerfileやdocker-composeでよく使われている用語を抜粋してこの記事を書かせていただきました。皆さんの参考になれば幸いです。✊
## 対象者

- __Docker, docker-compose__ 初心者の方
- ファイルの書き方を忘れてしまった方

## Dockerfile とは

__Dockerfile__ は、命令を取り込み自動的にイメージをビルドしてくれるテキストファイルである。pull しなくても自分で Dockerfile を書けば好きなようにイメージを作成することができる。

## Dockerfile よく使われる命令解説（例付き）

##### FROM
Docker イメージを指定(ローカルにイメージがなくても勝手に作成する)

```Dockerfile
FROM python:3.7
```

##### ENV
環境変数（key, value)を設定する

```Dockerfile
ENV PYTHONUNBUFFERED 1
```

##### RUN
イメージ作成前にシェルを実行する

```Dockerfile
RUN mkdir /code
```

##### CMD
イメージ作成後にシェルを実行、複数用いても最後の 1 つだけ実行する

```Dockerfile
CMD python3 app.py
```

##### WORKDIR
docker コンテナ がコマンドを開始するディレクトリを指定

```Dockerfile
WORKDIR /usr/share/nginx/html
```

##### COPY
ホストからファイルを Docker イメージにコピー、圧縮ファイルの場合解凍されない

```Dockerfile
# /~/で囲うと絶対パス、無いとWORKDIRの相対パス
COPY index.html index.html
```

##### ADD
ホストからファイルを Docker イメージにコピー、圧縮ファイルの場合解凍される

```Dockerfile
# /~/で囲うと絶対パス、無いとWORKDIRの相対パス
ADD requirements.txt /code/
```

##### VOLUME
ホスト側のデータをマウントするディレクトリを指定

```Dockerfile
VOLUME /code
```

<br>

## docker-compose とは

__docker-compose__ は、YAML ファイルを使って複数のコンテナを定義し実行する Docker アプリケーションのためのツール。

## docker-compose 解説（例付き）

### サンプル

```
version: '3'

services:
    db:
        image: postgres
        container_name: docker_compose_postgres
        ports:
            - "5555"
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        networks:
          - docker_link

    web:
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        depends_on:
            - db
        networks:
            - docker_link

    networks:
        docker_link:

```

- __version__：docker-compose のバージョン
- __service__：動かすアプリケーション
  - image：Docker イメージ指定
  - container_name：コンテナ名
  - ports：ホスト側とコンテナ側の両方のポートを指定だけでなく公開用のみも指定できる
  - environment：環境変数を追加
  - build：Dockerfile の存在するディレクトリを指定
  - command：デフォルトのコマンドを上書き
  - volumes：ホストのディレクトリをマウントするディレクトリを指定
  - depends_on：サービス間の依存関係を指定
  - networks：どのネットワークに接続するかを指定
- __networks__：ネットワークの指定

## 参考にしたサイト

- [Dockerfile リファレンス](https://docs.docker.jp/engine/reference/builder.html)

- [docker-compose 概要](https://docs.docker.jp/compose/overview.html)
- [Compose ファイル・リファレンス](https://docs.docker.jp/compose/compose-file.html)
Go言語-標準パッケージ

# 標準パッケージ
プログラミング基本からGoの理解を文字におこして行こうと思います！
[Go言語の基本❶はこちら](https://qiita.com/coxcoa/items/01cd4e30e965bcebb3ee)
[Go言語の基本❷はこちら](https://qiita.com/coxcoa/items/55e126bcbf67cf7505bc)

### 標準パッケージ
Goには標準パッケージと呼ばれるものがあり、100種類以上の便利な機能が
はじめから用意されている
これらを自分たちのプログラム内で自由に用いることができる

```
fmt        コンソールに出力できる
math/rand  ランダムな数値を生成できる
time       時間に関する処理ができる
```

### パッケージのインポート
```go
package main
import "fmt" //標準パッケージをインポート
```
インポートは、「package main」の下に「import "パッケージ名"」と記述

### パッケージの使い方
```go
package main
import "fmt"
func main() {
  fmt.Println("Hello,Go")
}

//コンソール
Hello,Go
```
「println」より「fmt.Println」の方が表示できるデータ型が多い

### 使用していないパッケージ
```go
package main
import "fmt"
func main() {
  Println("Hello,Go") //fmtパッケージを用いていない
}

//コンソール
fmtパッケージを用いていないとエラー
```
fmtパッケージをインポートしているのに使っていない場合、エラーが発生

### fmt.Printf
```go
fmt.Printf(書式,出力に用いる値)
```
fmtパッケージのPrintf機能を用いると、書式を指定してコンソールに出力できる

書式とは、出力する文字列の形
1つめに書式、2つめに出力に用いる値を指定

### 文字列の書式
```go
func main() {
  name := "タナベ"
  fmt.Printf("Hello,%sさん", name) //%sには変数nameに入っている文字列が使用
}

//コンソール
Hello,タナベさん
```
"Hello, %sさん"のように%sを文字列の中に含めると
「fmt.Printf」の2つめに指定した文字列が%sの部分に挿入されて出力される

### 複数の値を埋め込む
```go
func main() {
  name := "タナベ"
  fmt.Printf("%s, %sさん","Hello", name)
}

//コンソール
Hello,タナベさん
```
%sを2回用いる場合、それぞれの%sに挿入する文字列を指定する必要がある

### 整数を埋め込む
```go
func main() {
  age := 26
  fmt.Printf("%d歳です", age)
}

//コンソール
26歳です
```
書式には、文字列だけでなく数値も挿入することができる
数値の場合には%d

### データ型の不一致
```go
func main() {
  age := "26"
  fmt.Printf("%d歳です", age)
}

//コンソール
%!d(string=26)歳です　//書式に%dを使用しているためエラー
```
書式には、文字列だけでなく数値も挿入することができる
数値の場合には%d

### PrintfとPrintlnの違い
```go
func main() {
  fmt.Printf("Hello, ％sさん", "タナベ")
  fmt.Printf("Hello, %sさん", "ナイトウ")
}

//コンソール
Hello,タナベさん Hello,ナイトウさん
```
「fmt.Printf」は、「fmt.Println」と違い
出力した文字列のあとで改行を行ってくれない

### \n
```go
func main() {
  fmt.Printf("Hello, %sさん \n", "タナベ")
  fmt.Printf("Hello, %sさん \n", "ナイトウ")
}

//コンソール
Hello,タナベさん
Hello,ナイトウさん
```
文字列中で\nを用いると、出力される文字列が改行

### \n(2)
```go
func main() {
  name := "タナベ"
  fmt.Printf("Hello, \n%sさん" name) //文中に\nを含める
}

//コンソール
Hello,
タナベさん
```
文字列の途中に含めれば、\nの次の文字は、改行されて次の行に出力
Javascriptの練習帳

自分用の備忘録。

■クラスによってボタンが押せたり押せなかったりするやつ
http://jsfiddle.net/kgtrxve2/

■スクロールで特定の高さになるまで要素が追従してくるやつ
https://jsfiddle.net/piyo8810/he75r6qm/2/
VueJSのData,Store,Propsについて

Vueを使った際の状態管理についてちょいと考えてみた。

Vueで状態管理というとData・Store(Vuex)・Propsがあるけど、
それらの使い所って結局何？みたいな感じになるかと思いますが、
私見満載な感じにサンプル踏まえてまとめてみました。
※なんか違うかなと思ったらご指摘・ご意見下さい。

vueの公式マニュアルを順番に読み進めていくと、
サンプルとしてカウンターの話が出てくるかと思います。

```vue:とっても簡単なcountを出すアレ
<template>
  <div>{{count}}</div>
</template>

export default {
  data:() => ({
    count: 0,
  })
}
```

例えば
上のコンポーネントをAとした時に、
countの情報は「A(の中)だけでしか使わない」のであれば、
これはもうDataで良いと思います。
※だってどこにも公開しなくていい子だから。

では、
このcountをコンポーネントBでも使いたいとき、
※AやBでカウントアップしたらどっちも同じ値が出るようにする場合を指します
この時は手法が2つあるのかなと思います。

1. Storeでcountを管理する

AとBがそれぞれ独立したコンポーネント（例えば画面Aと画面Bみたいな）で、例えば画面Xでcountをインクリした時に画面Aに遷移したときと画面Bに遷移した時に同じ値が表示されていることを想定

```Vue:storeの方
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})
```

```Vue:利用側(AもBも同じとする(コンポーネントとしては有りえんけど))
<template>
  <div>{{$store.state.count}}</div>
</template>
```
これで、A/B以外のコンポーネントからincrementがcommitされると、どっちのコンポーネントもインクリされた同じ値が表示できるねという話。


2. Propsでcountを管理（受け取る）する

A/Bを同時に利用している「親となるコンポーネント」のdataでcountを管理して、単に参照渡しする場合

```vue:propを使った場合のコンポーネントAまたはB
<template>
  <div>{{count}}</div>
</template>

export default {
  props: {
    count: {
      type: Number,
      required: true
    },
  }
}
```

```vue:親側
<template>
  <div>
    <a-compo :count="count"></a-compo>
    <b-compo :count="count"></b-compo>
  </div>
</template>

// import文　省略
export default {
  components: {
    a-compo,
    b-compo,
  },
  data:() => ({
    count: 0,
  })
}
```

※Propは状態管理？な感じもするけどとりあえず載せてみた

そんなわけで簡単にまとめると使い所としては
Data：対象コンポーネント内だけで使うデータ
Store：グローバルなデータ(例：ログインユーザ情報など)や親子関係じゃないコンポーネント間のデータ共有時
Props：親から子へのデータ渡しのとき

まぁあくまで私見なので1意見として流し読んでもらえると良いかなと。
※世の中には「Dataじゃなくて何でもStoreで管理しろ」とか言う方もいるみたいなので
ROSでAstra Stereo S を動作させる手順

#環境
ubuntu20.04
ROS noetic

#手順

```console:手順
sudo apt install libuvc-dev
cd ~/catkin_ws/src
git clone https://github.com/ros-drivers/libuvc_ros.git
git clone https://github.com/orbbec/ros_astra_camera
catkin build

roscd astra_camera
./scripts/create_udev_rules
```

https://answers.ros.org/question/361536/astra-camera-on-noetic-and-ubuntu-focal/

#実行

```
roslaunch astra_camera stereo_s.launch
rostopic echo /camera/depth/points 
> データが出力されればOK
```

#キャリブレーション
https://github.com/orbbec/ros_astra_camera/issues/131
calibration tool
https://3dclub.orbbec3d.com/t/astra-s-intrinsic-and-extrinsic-parameters/302/2
Progate Ruby 学習コースⅡ 修了

##学んだこと

自分用の備忘録メモなので手短に要点だけ…

- 配列の際は [ ] を忘れない
- 配列のインデックス番号は０から始まる。(0,1,2...)
- ハッシュの使い方
- ハッシュの書き方のひとつ「シンボル」
- ハッシュを省略した書き方
    - ハッシュには3通りの書き方があるが「省略形」が一般的。
- 「nil」 = なにもないの意
- Rubyでの繰り返し処理は「each文」を使う
- Each文内の変数名は、配列の変数名の単数形にすることが（慣習上）多い。
DataPortal: 新機能さかのぼり（コンポーネント選択の改善）

DataPortalのまだ知らない使えそうな機能を求めて、新機能の一覧を遡ってみました。

コンポーネント選択の改善
> 複数のコンポーネントでの同時作業がより容易になりました。レポートの編集者は、種類（ページ上の表、ページ上のスコアカード、ページ上のコントロールなど）、または共有データソース（同じデータソースを持つすべてのコンポーネントなど）に基づいて、ページ上のコンポーネントを選択できます。コンテキスト メニュー（右クリック）で [選択] を選ぶと、使用可能なオプションが表示されます。

早速試してみます。

## 何もないところ
レポートの何もないところでコンテキストメニューから選択を表示します。
![何もないところ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/e88532fa-cce3-a0e4-ce16-ec65582897a4.png)

#### ページ上のすべてのコンポーネント
すべてのコンポーネントが選択されました。
![ページ上のすべてのコンポーネント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/56ed15af-d958-55fa-17db-702dfb072db4.png)

#### ページ上のすべてのコントロール
すべてのコントロールが選択されました。
![ページ上のすべてのコントロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/ddb08ace-b827-aeff-b0dd-e10ff10b4706.png)

#### ページ上のすべてのグラフとコントロール
すべてのグラフとコントロールが選択されました。
![ページ上のすべてのグラフとコントロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/782afd9a-2120-28b2-ca44-7135755f69a1.png)

## コンポーネント
### グラフ上
グラフ上のコンテキストメニューから選択を表示します。
![グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/b7af3f52-c278-79d1-3003-4989cb22939e.png)
#### ページ上の期間
すべての期間が選択されました。
![期間.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/1f283f5c-2d70-de1c-e476-9645d1f7be3e.png)
#### ページ上でこのデータソースを使用するグラフ
ページ上でこのデータソースを使用するグラフが選択されました。
グラフだけでなくコントロールも選択されています。
![データソース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/6e704231-9ee1-edb8-54b6-e70951e8df45.png)

### コントロール上
コントロール上のコンテキストメニューから選択を表示します。
![コントロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/04600f9f-1ce4-2a38-57d8-f1f41d3c3ee2.png)
#### ページ上のリストコントロール
すべてのリストコントロールが選択されました。
選んだコントロールは入力ボックスだったのですが、リストコントロールに含まれるようです。
![リストコントロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/79708fae-6546-8a1d-7eed-348a7a0fd391.png)
#### ページ上でこのデータソースを使用するグラフ
ページ上でこのデータソースを使用するグラフが選択されました。
選んだのはコントロールでしたが、この場合はグラフに含まれるようです。
![コントロール-データソース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/19fd7faa-6f45-69ed-4ebb-c87629370017.png)

### テキスト上
テキスト上のコンテキストメニューから選択を表示します。
![テキストコンポーネント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/f6a9c244-984c-9a2a-34ec-04b3c159c380.png)
#### ページ上のテキストコンポーネント
すべてのテキストが選択されました。
![ページ上のテキストコンポーネント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/641660d4-05f5-28cf-6fe5-01c4bce8f162.png)

### 折れ線上
折れ線上のコンテキストメニューから選択を表示します。
![折れ線.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/a3c89909-ac5f-b8a2-a05d-ca09d09b1ea6.png)
#### ページ上の行
すべての行が選択されました。
「行？」と思いましたが、英語だと `line` なんですかね。
![行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/9902f421-4d23-4619-594f-99b67868f903.png)

## まとめ
すべてのコンポーネントを選択する場合は `Cmd+A` の方が早いですが、全てのテキストのプロパティを変更したい場合などに便利かもしれません。
DockerでPython(Django)学習環境を作ってVSCodeでデバッグできるようにする(ほぼ自分用手順メモ)

# この記事について

タイトルの通りです。
Djangoの勉強をするにあたって学習環境を構築したので、その手順メモをここに残します。
解説は一切ないので、どういうツールが入ってるとかどういう仕組みで動いてるとか一切興味ない、あるいはもう知ってるから環境構築だけさせてくれ！という人向けの記事です。
というか自分の備忘録的メモです。
Windows10環境にて実行しています。

# やりたいこと

- Djangoの勉強をしたい
- VSCodeでデバッガを使ってステップ実行とかもしたい
- Python仮想環境がどうとかで煩わしい思いをしたくない、PCの環境汚したくない

⇒Dockerで環境作ればいいよね！

# WSL2をセットアップする

WSL2(Windows Subsystem for Linux 2)が未セットアップの場合、まずはWSL2をセットアップします。手順は下記です。
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

使用するLinuxディストリビューションはどれでもいいです。
私はUbuntuにしました。

# Docker Desktopをインストールする

Docker Desktopをインストールします。
https://www.docker.com/products/docker-desktop
インストーラーに従ってデフォルトのままインストールすれば問題ありません。

# VSCodeをインストールする

VSCodeをダウンロードしてインストールします。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

続けて、Remote Containersという拡張をインストールします。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

# 開発環境ファイルを取得する

本来であればここからDockerfileを書いたりVSCodeの設定ファイルを作ったりゴニョゴニョするのですが、学習用の環境ファイル一式を作成したので、下記から取得してください。
https://github.com/nendo-code/djangostudyenv

# Djangoの起動、デバッグ

VSCodeで、先ほど取得した「djangostudyenv」のフォルダを開きます
![open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211743/635e4379-0640-9795-cb89-2cb79de64924.png)

VSCodeの画面左下にある、緑色のアイコンを押します。
![midori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211743/97cb4133-8cb4-f67d-5930-a4c9a2601118.png)
コマンドパレットが表示されるので、「Remote-Containers:Open Folder in Container」を選択します。
フォルダ選択するダイアログが出るので、先ほど取得した「djangostudyenv」のフォルダを指定します。
![remote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211743/d0b1d073-624b-7022-d78c-3dbbf28011dd.png)

Dockerによる環境構築(と、VSCodeの拡張のインストール)が始まります。
「Starting Dev Container(show log)」をクリックすると、環境構築の進捗状況が表示されます。
![showlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211743/2ef5e7a0-2d54-41e0-b237-0b5cbeedb9bd.png)

これでDockerコンテナ上にDjangoの開発環境が構築できたので、Djangoのプロジェクトを作成します。
ターミナルを開いて下記のコマンドを実行します。

``` bash
$ cd /code/web
$ django-admin startproject app
```

これで「app」というdjangoのプロジェクトが作成されます。
VSCodeの左側の「実行」メニューで「Python: Django」を選択して、デバッグの開始ボタンを押下します。
![django.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211743/528c3fd9-565e-6515-e70e-dadc317cdbfd.png)

これでdjangoで作成したアプリケーションが起動するので、試しに
http://localhost:8000/
にアクセスします。
下記の通りdjangoのスタートページが表示されれば成功です。
![django_success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211743/4b4aff77-9efb-8059-5836-c95485a45ba5.png)

これで環境構築は完了です。
あとはブレークポイントをコード上に置いて止めたり、ステップ実行したり、デバッガを使って開発できます｡
![devug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211743/800c58ea-c604-a3cc-2a31-b9c7696a4af7.png)


# カスタマイズ

環境をカスタマイズしたい場合は下記の箇所を修正するとカスタマイズできます。

・コンテナ側にVSCodeの拡張機能を入れたい
⇒
.devcontainer/devcontainer.jsonの"extensions"に、入れたい拡張を追加する。

・djangoのプロジェクトフォルダの名称を変えたい、実行時のオプションを変えたい
⇒
.vscode/launch.jsonのconfigrationsを編集する。


# 参考記事

https://docs.docker.jp/compose/django.html
https://docs.djangoproject.com/ja/3.1/intro/tutorial01/
https://qiita.com/nokonoko_1203/items/33a05c86f359027afb33
https://qiita.com/firedfly/items/00c34018581c6cec9b84
Vue-Nativeで画像ファイルをmultipart/form-data形式でPostする

# 概要
Vue-Nativeアプリ上で選択した画像を、multipart/form-data形式でAPIにリクエストするまでをまとめたいと思います。

# 実践
## 画像ファイルを選択
~~~vue.js
async pickImage() {
      let result = await ImagePicker.launchImageLibraryAsync({
        mediaTypes: ImagePicker.MediaTypeOptions.All,
        allowsEditing: true,
        quality: 1,
      })
      store.dispatch("image/selectedImage", result)
    }
~~~
開発支援サービスのExpo.ioを使用しているため、`expo-image-picker`で画像を取り扱います。オプションは公式リファレンス参照。
https://docs.expo.io/versions/latest/sdk/imagepicker/

### 返り値（result）
~~~json
Object {
  "cancelled": false,
  "height": 750,
  "type": "image",
  "uri": "file://~~~~.jpg",
  "width": 748,
}
~~~

## プレビュー表示

~~~html
<image
 class="image-cover"
 :source="{uri: image}"
/>
~~~
プレビュー表示する場合は、上記の表記方法で`image`は取得した返り値をvuexで状態管理されたstateにcomputedで監視させて呼び出します。画像ファイルはアプリの起動中に一時的にキャッシュされているので、そのuriで読み込みます。

## APIに送信
~~~javascript
async saveImage ({state, rootState, dispatch}) {
      const data = new FormData();
      let extention = state.selectedImage.uri.split(".")[1]
      var mineType = await dispatch('mineType', extention)
      data.append('image',
        {
          uri: state.selectedImage.uri,
          name: String(rootState.auth.id) + '-image.' + extention,
          type: mineType
        }
      )
      var config = {
        method: 'post',
        url: baseApiUrl + '/users/'+ String(rootState.auth.user.id) + '/image',
        headers: {
            Accept: "application/json",
            "Content-Type": "multipart/form-data",
        },
        data: data,
      };
      return axios(config)
    },
    mineType ({}, extention) {
      let allow = {"png":"image/png","pdf":"image/gif","jpeg":"image/jpeg", "jpg":"image/jpg"};
      if (allow[extention] !== undefined){
        return allow[extention]
      }
      else {
        return undefined
      }
    }
~~~
FormDataには上記の形式でアペンドします。postする際は、ヘッダーオプションに`Accept`が必要なので注意が必要です。

# 参考資料
https://stackoverflow.com/questions/32441963/how-to-use-formdata-in-react-native
VPCエンドポイント ってなんのこと？

## 勉強前イメージ

VPCの設定でエンドポイント設定できるって感じがする
ただ、エンドポイントってなんだろう・・・

## 調査

### VPCエンドポイント とは

VPCと他のサービス間の通信を可能にするVPCコンポーネント(仮想デバイス)です。
VPCエンドポイントを作成することで、VPC内のインスタンスとVPC外のサービスをプライベート接続で通信できるようになります。
セキュリティの問題でインターネットに接続せずにサービスと繋がりたいときに使用するものです。

### VPCエンドポイントの種類

VPCエンドポイントは以下の2つの種類があります。

- インターフェイスエンドポイント
- ゲートウェイエンドポイント

以下詳細に見ていきます

### インターフェイスエンドポイント

こちらは `PrivateLink` と呼ばれるサービスを使って、各サービスを接続させることが出来ます
`PrivateLink` の実体はVPC内のENI(Elastic Network Interface) になります
PrivateLink自体がIPアドレスを持ってVPCの中にエンドポイントが出来ます

![インタフェース型Untitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/853091b0-c96a-95a2-8b86-3ffc325dd1c0.png)


### ゲートウェイエンドポイント

VPCのルートテーブル(ルーティング設定)を書き換えてのゲートウェイ経由でサービスへアクセスします
最初に出たエンドポイントで、S3とDynamoDBのみが対応しています。

![ゲートウェイUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/57b4d456-8bf1-f65c-84a6-632ae8de8568.png)

### 2つの違い

- 対応サービス

インターフェイスエンドポイントはS3・DynamoDB以外のAWSプリンシパルサービスや独自サービスなど多くありますが、
ゲートウェイエンドポイントはS3とDynamoDBのみです。

- ポリシー

インターフェイスエンドポイントはフルアクセスで設定できませんが、
ゲートウェイエンドポイントは設定が可能です

他にもいろいろ違う点はあります

## AWSでの設定画面

- インタフェースエンドポイント

タイプに `Interface` と記載されているものになります。
ゲートウェイエンドポイントより多いです。

![interfaceエンドポイントの作成 _ VPC Management Console - Google Chrom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e1657abd-0b66-823a-c098-abd3112f9263.png)


- ゲートウェイエンドポイント

タイプに `Gateway` と記載されているものが対応しているものになります。
こちらはdynamodbとs3のみの記載です

![gatewayエンドポイントの作成 _ VPC Management Console - Google Chrom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/912d9b48-a997-b220-0326-4e7ead6cdf4f.png)

## 勉強後イメージ

インターネットに出ずとも他のサービスを繋げるための設定。
あんまりちゃんとした設定はしたことないけど、PJの要件とかでインターネットはだめ！って言われたらこういうのを使わないといけないんだろうね。

## 参考

- [VPC エンドポイント](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html)
- [AWS PrivateLink で使用できる AWS のサービス](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/integrated-services-vpce-list.html)
- [AWS VPCエンドポイントを利用したHAクラスターの構築を試してみました (Windows/Linux)](https://jpn.nec.com/clusterpro/blog/20180115.html#:~:text=VPC%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF,%E3%81%A7%E3%81%8D%E3%82%8BAWS%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82)
- [2つのVPCエンドポイントの違いを知る](https://dev.classmethod.jp/articles/vpc-endpoint-gateway-type/)
- [Amazon VPC エンドポイント の GatewayとInterface](https://qiita.com/leomaro7/items/cbe8f6e3ff41805c1b49)
- [AWS PrivateLinkの使い方と注意点 ～VPCピアリングとの使い分け～](https://devlog.arksystems.co.jp/2018/05/11/4896/#toc_id_1)
アドベントカレンダー33日目：SREを読んでみた「効果的なトラブルシューティング」編①

今日から新しい章に入ります。
内容は効果的なトラブルシューティングです。
トラブルシューティングは、初心者は2つの要素で躓くことがあります。それは一般的なトラブルシューティングの手法の理解とトラブルシューティングを行うシステムに関する理解、これらの不足によります。

まずは、一般的なトラブルシューティングの手法、その理論から見ていきます。

## 一般的なトラブルシューティングの理論
形式的にはトラブルシューティングの過程は、仮説演繹法の応用と考えられます。
システムに関する一連の観察結果と、システムの挙動を把握する理論的な基盤をもとに、障害の原因の仮説を立て、その仮説を検証するというプロセスを繰り返します。

トラブルシューティングは、問題のレポートから始まり、トリアージ、観察、診断、テスト/対処、回復or観察に戻る。もしくは、トリアージを再び行うというように進みます。

仮説を検証する方法は2種類あり、観察したシステムの状態と仮説を指示するあるいは支持しない証拠を見つける方法。
もしくは、システムに何かしらの変更（手当て）を行い、その結果を観察するという方法。

## 一般的な落とし穴
トラブルシューティングの効率が悪くなるのは、システムへの理解が不足していることが多いです。

例えば、

* 関係のない症状を見てしまう。メトリクスの意味を取り違える。結果を一足飛びに求めすぎてしまう。
* 安全かつ効率的に仮説を検証するために必要なシステムやシステムの入力、環境の変更方法を誤解している。
* 生じている問題に対し、ありえないような仮説を思いついたり、一度起きたことはまた起きるはずだと考え、過去の問題の原因に固執する。
* 実際には偶然だったり、共通の原因を持つような出来事に対し、間違った関係性を追求してしまう。

初めの二つは、システムへの理解が増せば、解消されます。
3つ目は、すべての障害が起きる確率は等しくないということを念頭に考えるべきです。
最後の例の場合は、相関関係は因果関係でないということを忘れないようにすべきです。

## まとめ
* 理論的にはトラブルシューティングは、仮説とその検証の繰り返しである。

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　139-141
M1チップ搭載MacBookでHomebrewを導入する


Homebrewの導入方法は、偉大な先人が沢山の情報を提供してくれている。
先人の知恵をそのまま脳死で活用しようとした私は、インテル搭載とM1チップ搭載の違いに見事にハマったのだった。
>M1チップこと、Apple Sliconは様々なところに違いがあるのかもしれない。

#①Homebrewをインストールしよう
[Homebrew公式サイト](https://brew.sh/index_ja.html "Homebrew公式サイト")

上記サイトにアクセスするとTOPにインストールと大きく書かれたコードがある。

![install](https://i.gyazo.com/1683ed4b12c434764026d028b6fd45f4.png)
>2021年1月現在。閲覧時期によってはコードが若干変わっているかと思うので参考程度に。

コードをコピーしてターミナルで実行、するとパスワードの入力が求められる。
ちなみに入力文字は反映されず見えないが、ちゃんと入力できている。

後はインストールが終わるのを待つだけ。
インストールが終了したら以下コマンドでHomebrewがインストールできているか確認する。

```bash:ターミナル
$ brew -v
```
**まあ、brewコマンド認識してくれないんですけどね。**
ここまではインテル搭載のMacと何も変わらない。
次にbrewコマンドを使えるようにPATHの追加を行う。

>**余談**
私はXcodeをインストールしたのにセットアップしてなかったことが原因でインストールに失敗した。
ここでうまくいかなかった場合はコードを読んでGoogle先生を頼って欲しい。

#②Homebrewはどこ？
先程の原因は、いわゆる環境変数にbrewを使えるようにするためのPATHを追加していないからだ。

さて、Homebrewはどこにインストールされたのだろうか。
私はコマンドを使って捜索した。2hくらい。
インテル版は憶測になるが念の為、調査記録として記載しておく。

####以下のコマンドを実行してHomebrewが存在するかチェック。
######intel版
```bash
$ ls /usr/local
```
######M1版

```bash
$ ls /opt
```
上記コードを実行してHomebrewという文字が見つかればOK。
しかし通すバスはここではない。brewが存在するディレクトリを通す必要がある。
そこでもう一つコマンドを実行する。
######intel版
```bash
$ ls /usr/local/bin
```
######M1版

```bash
$ ls /opt/homebrew
```
あれ、M1のコマンド実行してもbrewないじゃん？実はもう１つ下の階層にbrewがある。
```bash
$ ls /opt/homebrew/bin
```
最初からこのコマンドで一発だが両者指定しているものが若干違うので紹介。
インテル版が/binだからって```/usr/local/bin```とか```/opt/bin```とか適当にやってもHomebrewは存在しません、残念。
しかし```/usr/local```も```/usr/local/bin```もM1搭載Macにも存在するので惑わされないように注意。

ちなみに、この違いに気づいたのは[Homebrew公式サイト](https://brew.sh/index_ja.html "Homebrew公式サイト")のインストールオプション（Documentation）のおかげだ。
![Documentationのスクリーンショット](https://i.gyazo.com/678451eab7b1fdc097e3d602e89277ad.png)
>公式最強。なぜ最初から公式を見なかったのか悔いている。

#③コマンド実行でパスを通す

brewの場所もわかったので、コマンドが使えるようにするためにPATHを通していこう。
>ちなみにPATHを通すために編集するファイルは
```.bash_profile```でホームディレクトリに存在する。
普段は見えなくなっているが
```command + shift + .
```で隠しファイルの表示/非表示を切り替えられるので参考までに。

###コマンドだけで完結させるパターン
######intel版

```bash:
$ export PATH=$PATH:/usr/local/bin >> ~/.bash_profile
```
######M1版
```bash:
$ export PATH=$PATH:/opt/homebrew/bin >> ~/.bash_profile
```
上記コードは.bash_profileに```export PATH=$PATH:/hoge/hoge```を追加するコード。
これだけではPATHは通っていないので要注意。

###bashで編集するパターン
こちらはvimコマンドを使用する。

```bash
$ vim .bash_profile
```
すると、沢山の**~**で埋め尽くされた表示に切り替わる。
>これは、.bash_profileに何もないときになるので、上記で紹介したexportコマンドを実行しているとその文字が表示される。

まず、ここで簡単なvim実行中のコマンドを紹介する。

|入力キー|実行される内容|
|:-:|---|
|**[ i ]**|編集モードにする|
|**[esc]**|編集モードの終了|
|**:wq**|入力後、Enterでvimを終了する|
正直あまりよくわかっていないので適宜調べて欲しいが、今回はこの３つが使えれば問題はない。
編集モードにして、以下の内容を入力しよう。
######intel版

```bash:
export PATH=$PATH:/usr/local/bin
```
######M1版
```bash:
export PATH=$PATH:/opt/homebrew/bin
```
おしまい。**:wq**を実行して元のbash画面に戻ってきたら次。

###設定ファイルを読み込む
先程２通りのやり方を紹介したが、どちらも終わったらこの手順を実行する必要がある。
ファイルに記述しただけで、読み込んでいないのでPATHが通っていないからだ。
######共通コマンド
```bash
$ source ~/.bash_profile
```
おしまい。
念の為にPATHに追加されているかチェックしてみよう。
######共通コマンド
```bash
$ echo $PATH
```
末尾に:/opt/homebrew/binが追加されているのを確認できただろうか。
###おめでとう！！！！これでbrewコマンドが使えるぞい！！！！！！！

では最初に実行できなかったコマンドを、、、

```bash:
$ brew -v
```

Homebrewのバージョンが表示されたら無事終了。

ちなみに私はインストールで躓き、PATHを通すところで溝にはまりかなりの時間を消費した。
頑張って調べて辿り着いたので勢いで記事にしているが、これが誰かの助けになったらとっても嬉しい。
[Rails] RSpec エラー　expected `User.count` to have changed by 1, but was not given a block

<h1> はじめに </h1>
Rails のテストツール Rspec を使ってみました。
使用中に、expected `User.count` to have changed by 1, but was not given a block と言うエラーにハマったので備忘録として残します。

<h1> 問題のソースコード </h1>
これがエラーの出るソースコードです。

<h5>エラーのでるソース</h5>

```ruby
      expect(
        find('input[name="commit"]').click 
      ).to change{User.count}.by(1)
```

<h5> エラーの内容 </h5>
エラー　　expected `User.count` to have changed by 1, but was not given a block
翻訳　　`User.count`が1変更されると予想されましたが、ブロックが与えられませんでした

change マッチャを使うときは、expectをブロックにしなきゃいけないよって事でした。
つまり、（）だと引数を渡してるので、{}にして動作そのものを渡せって事みたいです。
それを踏まえて、ソースを書き直します。

<h5>正常に動作するソース</h5>

```ruby
      expect{
        find('input[name="commit"]').click 
      }.to change{User.count}.by(1)
```

これで実行したら正常に動作しました。

ブロックは メゾット名 do / end って書き方もあるのでついでにこのようにソースを書き換えて実行しました。

<h5>実験1</h5>

```ruby
      expect do
        find('input[name="commit"]').click 
      end.to change{User.count}.by(1) 
```
<h5>実験1結果 成功！！</h5>

```ruby

    27:       # }.to change{User.count}.by(1)
    28:       #実験
    29:       # expect(
    30:       #   find('input[name="commit"]').click 
    31:       # ).to change{User.count}.by(1)
 => 32:       binding.pry
    33:       expect do
    34:         find('input[name="commit"]').click 
    35:       end.to change{User.count}.by(1) 
    36: 
    37: 

[1] pry(#<RSpec::ExampleGroups::Nested::Nested>)> exit
    正しい情報を入力すればユーザー新規登録ができてトップページに移動する
  ユーザー新規登録ができないとき
    誤った情報ではユーザー新規登録ができずに新規登録ページへ戻ってくる

Finished in 17.61 seconds (files took 1.73 seconds to load)
2 examples, 0 failures

```

メゾット名 do / end でも正常に動くことを確認しました。

ついでに、もう一つ確認しました。chage のブロックを do / end に変更。
<h5>実験2</h5>

```ruby
      expect do
        find('input[name="commit"]').click 
      end.to change do User.count end.by(1) 
```
<h5>実験２結果　失敗。。。</h5>

```ruby
     Failure/Error:
       expect do
         find('input[name="commit"]').click 
       end.to change do User.count end.by(1) 
     
     SyntaxError:
       Block not received by the `change` matcher. Perhaps you want to use `{ ... }` instead of do/end?
```

構文エラーになりました。

<h5> エラーの内容 </h5>

エラー　　Block not received by the `change` matcher. Perhaps you want to use `{ ... }` instead of do/end?
翻訳　　`change`マッチャーがブロックを受信していません。 おそらく、do / endの代わりに `{...}`を使用したいですか？

結果は、{} 使えって言われました。
わざわざ、do / end なんて使わず{}で統一するのが良さそうですね。

# まとめ
<ul>
<li>（）だと引数になって、{}だとブロックをわたす。</li>
<li>expect {}.to change{}.by() と書く。</li>
<li>do / end は使わない。</li>
</ul>
最後まで読んでくださり、ありがとうございました。
RailsにおけるURLの直打ちを阻止する方法

# きっかけ
viewファイルに条件分岐を作っていても、そもそもUrlから直打ちされてしまうとページに飛ばれてしまうことに気づいたため。

# 結論
任意のコントローラーにbefore_actionを使って、アクションを起こす前段階の条件分岐を作っておく。

# コード
```ruby:items.controller.rb
class ItemsController < ApplicationController
  #before_actionを使って、コントーラーのアクションに飛ぶ前に条件分岐をかける
  before_action :correct_user, only: [:edit]
  before_action :item_find, only: [:show, :edit, :update, :destroy]
  
  def edit
  end

  private

  def item_params
    params.require(:item).permit(:title, :explain, :category_id, :condition_id, :price, :delivery_fee_id, :prefecture_id, :delivery_date_id, :image).merge(user_id: current_user.id)
  end
# before_actionをかけたメソッドでユーザーの選別を行っている
  def correct_user
    @item = Item.find(params[:id])
    if user_signed_in? && @item.user == current_user
      render :edit
    else 
      redirect_to root_path
    end
  end
```
# 補足
Urlに直打ちしているということは、ルーティングを経由して必ずコントローラーにページの開示を求めにくるから、コントーラーに記述する必要がある。MVCの流れを今一度再確認できた。
[OutSystems]SQLやAggregateのSQLを開発時に確認する

SQL要素やAggregateを使ってEntity検索機能を作る際に、テストデータを使って検索結果のプレビューをすることができます。このプレビューした際に使われたSQLを確認することができます。

# SQL要素のプレビュー時SQL
SQL要素をダブルクリックしてダイアログを開き、（必要ならTest Inputsに入力して）、TESTボタンをクリックします。すると、Executed SQLタブ内にSQLが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d66879e0-a583-e573-19bf-74bde86dc4f0.png)

# Aggregateのプレビュー時SQL
Aggregateをダブルクリックして開き、プレビューが表示されるまで待ちます。
右下に表示されるAggregateのプロパティウィンドウ内にExecuted SQLプロパティが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/98123732-dab4-0c09-c818-1c440bc183af.png)

# 参照列のフィルタで不思議な現象
この機能を使ってプレビュー用SQLを確認しているとたまに不思議な記述が見つかります。
どうも、他Entityを参照する列（他のEntityIdentifier型の列）へのフィルタをすると、条件に「IS NOT NULL」が追加されるようです。

以下のようなDetail Entityを例に確認してみます。MasterId属性はMaster Entityを参照しています。このMasterId、Integer型の属性、Text型の属性それぞれにFilter条件を設定してExecuted SQLを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/88ae1164-cb0e-1f7d-0926-664fa80b00f5.png)


@がついているのは、Local Variableの値を渡している部分です。MasterIdについてだけ、Local Variablerとの一致条件による検索の後に「AND ([ENDETAIL1].[MASTERID] IS NOT NULL)」という条件が追加されています。

``` SQL
SELECT TOP (32) [ENDETAIL1].[ID] o0, [ENDETAIL1].[MASTERID] o1, [ENDETAIL1].[DETAIL1INTEGER] o2, [ENDETAIL1].[DETAIL1TEXT] o3
FROM [ALQGU5013].DBO.[OSUSR_W8T_DETAIL1] [ENDETAIL1]
WHERE (([ENDETAIL1].[MASTERID] = @MasterId)
	AND ([ENDETAIL1].[MASTERID] IS NOT NULL))
	AND ([ENDETAIL1].[DETAIL1INTEGER] = @Detail1Integer)
	AND ([ENDETAIL1].[DETAIL1TEXT] = @Detail1Text)
```

ちょっと意味がわかっていないんですが、記録の為残しておきます。

# 運用中のSQL
実際にPublishしてサーバーで動作したときのSQLはこの方法では確認できないようです。
Service StudioでExecuted SQLを確認すると、実行時のSQLは、最適化がかかったものに変化するとのこと。

また、私の知る限りでは、SQLやAggregateに運用中に実際に実行された際のSQLをログ出力するような機能がありません。

よって、問題確認のためにSQLを見たいときは、DB側で実行されたSQLをトレースする機能を使うことになりますね。SQL ServerならSQL Profilerでしょうか。
LPIC レベル1メモ


# ログ

[Linuxの主なログファイル](https://qiita.com/Yorinton/items/897c1ccd6797a7df7805)

[組み込みLinuxの起動シーケンスを理解し、自社開発のLinuxアプリケーションをシステムへ統合する](https://www.aps-web.jp/academy/wr-linux/22717/#Linux)

起動シーケンスを見やすく可視化してるよ。

# 仮想化


[仮想マシンとコンテナの違いから仮想環境の構築まで](https://original-game.com/introduction-to-docker-virtual-machine-container-virtual-environment/)


[docker hub](https://hub.docker.com/)　があるからさらに便利。


[「準仮想化」と「完全仮想化」の違いを確実に理解する](https://awsjp.com/AWS/hikaku/paravirtualPV-Hardware-assistedVM-compare.html)

[ゲストOS](https://wa3.i-3-i.info/word1200.html)

仮想化で操作されるOS。操作する方をホストOS。

# BIOSとUEFI

[UEFIについての調べてみた](https://qiita.com/hot_study_man/items/0dc8034fdc0d631e5c94)

[MBR、GPT、UEFI、GRUB2、パーティションの理解を深める](https://qiita.com/YukiMiyatake/items/d3f235db55cf37afc037)

[MBR wiki](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%96%E3%83%BC%E3%83%88%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89)

[セキュアブート](https://wa3.i-3-i.info/word16972.html)

[ゼビバイト](https://wa3.i-3-i.info/word17603.html)

[UEFI のシステムで MBR のディスクドライブを使用する
](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/installation_guide/sect-uefi-support-drives-x86)
Laravelで「npm run dev」してもCSS＆JSが反映されない？それはブラウザのキャッシュが原因かも！

## 「npm run dev」してもCSSとJSファイルが反映されない…

Laravel 8で「Laravel Mix」を使用してアプリ開発の練習をしていた際に、`npm run dev`コマンドを打った後、ブラウザで確認してもCSSとJSファイルが反映されなかったことがあったので、その解決メモ。

最初に答えを言ってしまうと、**バージョン付け** をすることで、ブラウザのキャッシュ対策をすれば解決できました。

Laravel 8をインストールした直後では、`webpack.mix.js`は以下のような感じだと思います。

```js:webpack.mix.js
mix.js('resources/js/app.js', 'public/js')
    .postCss('resources/css/app.css', 'public/css', [
        // 略
    ]);
```

これを以下のように `.version()` を付けくわえてください。

```diff:webpack.mix.js
mix.js('resources/js/app.js', 'public/js')
    .postCss('resources/css/app.css', 'public/css', [
        // 略
    ])
+   .version();
```

この様に`.version()`を付けた後に、`npm run dev`を実行します。

この **「`webpack.mix.js` に `.version()` を付けて、コマンドで `npm run dev`を実行する」** というのは、以前のキャッシュファイルが読み込まれないようにするために、コンパイルされたCSSファイル及びJSファイル名に一意のハッシュを付け加えていることを意味します。

`public/mix-manifest.json`を見てみてください。

```js:public/mix-manifest.json
{
    "/js/app.js": "/js/app.js?id=********************",
    "/css/app.css": "/css/app.css?id=********************"
}
```

`***` のところはハッシュの文字列になっていると思います。
これで、一意なハッシュを加えたファイル名として読み込めば、以前のキャッシュされたファイルを読み込むことを防げるというわけです。

あとは、`resources/views` フォルダ内のレイアウトファイル等に書かれている `asset` 関数の部分を `mix関数`に変更することで、再程、`npm run dev` を実行して生成された `最新のバージョン付けされたファイル` を自動的に読み込むことができます。

```diff
  <!-- Styles -->
- <link rel="stylesheet" href="{{ asset('css/app.css') }}">
+ <link rel="stylesheet" href="{{ mix('css/app.css') }}">

  <!-- Scripts -->
- <script src="{{ asset('js/app.js') }}" defer></script>
+ <script src="{{ mix('js/app.js') }}" defer></script>
```

もし、`npm run dev`してもCSSが反映されない…となったときは、ぜひ`.version()`のことを思い出してください。

参考URL https://readouble.com/laravel/8.x/ja/mix.html
:cookie:Cookie講座:cookie: ~概要から詳細まで~

# :cookie::cookie:Cookie講座:cookie::cookie:

## :cookie:初級:cookie:

### Cookieとは

WebサイトからスマホやPCに保存されるテキストファイル。
「タイトル、値、有効期限、サイズ、ドメイン」などの情報を保持している。

### 良くある使われ方
- ログイン情報がcookieに保存されていることで、何度もログイン情報を入力せずともログインできる。
- Amazonで閲覧した商品の広告が他のアプリでも表示される。

### Chromeでの確認方法
Dev tools＞Applicationタブ＞Storage＞Cookies＞知りたいURLを選択
Dev tools上でタイトルや値を変更したり、削除・追加・検索・ソートしたりできる。


## :cookie:中級:cookie:

### 種類

#### - 1st party Cookie
実際に訪問しているWebサイトのドメインから発行される。
同じドメインといえど、別のブラウザからの呼び出しは不可能。

#### - 3rd party Cookie
実際に訪問しているWebサイトのドメイン以外から発行される。
主にWebサイト上に掲載されている広告のドメインから発行される。
複数のWebサイトやブラウザを横断が可能。

### キャッシュとの違い
キャッシュとはCookieと全くの別物で、一度表示したページの情報を一時的に保存するためのもの。
キャッシュにより、同じページを再び開く際により速く情報を表示できるようになる。

### ユーザーがCookieを削除・無効にする導線
ブラウザの設定からCookieを有効/無効の設定ができる。
ブラウザの履歴画面からCookieを削除できる。

※端末に保存されるテキストファイルなので、ネットを通じてCookieが流出することは基本的にない。削除すべき状況としては、他人と端末を共有する場合など。

## :cookie:上級:cookie:

### 応用的な利用方法
- アクセス解析

一定期間に訪問したユニークユーザー数を計測する。
ページ遷移・セッション数の変遷などを計測する。...etc

### Cookieの規制について
ユーザーのアクセス履歴を追跡することができるため、プライバシー侵害と捉える人も少なくない。
そのため欧州では2018年からCookieの使用意図や管理方法などをユーザーへ伝えるように定める法規制が制定されている。

### セッションハイジャック

Cookieでセッション管理を行う場合、第三者にセッションIDが漏れれば、そのIDを名乗ることで本来のユーザになりすますことができる。
Cookieがネットを経由して流出することはないが、セッションIDが漏れることによってログイン情報が流用される、というケースが起こり得る。
セッションID流出経路としては、通信の盗聴…
（以下こちらを参照：[セッションハイジャックとは？その原因と対策を徹底解説](https://cybersecurity-jp.com/security-measures/18583)

## 参考文献

[クッキー（Cookie）とは？削除方法や「Cookieを有効にする」方法など解説](https://www.onemarketing.jp/knowledge/word/cookie)
[初心者でもわかる『cookie（クッキー）』講座 危険性やスマホでの設定方法もズバリ解説](https://time-space.kddi.com/ict-keywords/20180726/2392)
[有効にしても大丈夫？ネットで見かける「クッキー」の仕組み](https://securitynews.so-net.ne.jp/topics/sec_20034.html)
オンデマンド画像タイルレンダリングに PlayWright を使いたい

# オンデマンド画像タイルレンダリングとは
ベクトルタイルをホストするサーバに付加する機能で、そこにアクセスすると、持っているベクトルタイルを画像タイルにして返すものです。

# 既存の実装
UNVT では [hasekura](https://github.com/un-vector-tile-toolkit/hasekura) というサーバに、 Mapbox GL Native を用いたオンデマンド画像タイルレンダリングを実装しています。

# 懸念点
Mapbox GL Native の Node.js バインディングは、Node.js 10 を要求します。Node.js の本日時点の最新バージョンは 14/15 のようです。10 はさすがに古くて、不安です。Mapbox GL Native の Node.js の将来が不安です。

また、hasekura を動かすために導入しなければならないライブラリが非常に多いことも問題でした。Mapbox GL Native は基本的にはモバイルでベクトルタイルをレンダリングするものであるためか、 Open GL 関係のさまざまなライブラリを入れなければならないのも面倒でした。

# 新たな展望
最近、[PlayWright](https://playwright.dev/)というものが良いようですね。やや富豪的アプローチになるとは思いますが、 Mapbox GL Native ではなくて Mapbox GL JS を使う形で、PlayWright 経由でオンデマンド画像タイルレンダリングを実装できないかなと考えています。
Firestore ドキュメントのIDって自分で設定できるんだ！！

#FirestoreのドキュメントIDって自分で設定できないの？
![スクリーンショット 2021-01-07 23.00.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/515b903f-73bb-613d-c609-e6debeada8b7.jpeg)
FirestoreのドキュメントIDって、多くの人は自動生成されるやつを使ってるかと。

**これをランダムな文字列じゃなくて、こっちで設定した文字列にする事はできないか？**

やってみました。

#docの引数を指定すればできた！

```typescript:index.ts
let dt = new Date();
    let y = dt.getFullYear();
    let m = ('00' + (dt.getMonth() + 1)).slice(-2);
    const nowMonth = y + '年' + m + '月';

    const countsRef = db.collection(`users/${userId}/counts`).doc(nowMonth);
```

仮に上記のようなコードだった場合、ドキュメントの名前？（ID？）を「2021年1月」みたいな形にできます！
![スクリーンショット 2021-01-07 23.05.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/aad7373a-1499-3727-86c7-1dd074ed94d5.jpeg)

本来はこういう使い方をするべきじゃないのかもれませんが、「毎月１つのドキュメントを生成する」という事をやりたかったので。。。
環境変数を使ったReact Native+Firebaseの連携方法

# 手順
1.React Nativeでアプリを作る
2.firebaseでプロジェクトを作成する
3.ターミナルで`yarn add firebase`を実行
4.ターミナルで`yarn add babel-plugin-dotenv-import`を実行
5.プロジェクトのルートディレクトリに.envファイルを作成
6..envファイルにはfirebaseプロジェクトで作成されたAPIKEYなどを以下のように記述(""をつけないで正常に作動しました)

```
FB_APIKEY=hogehogehogehogehoge
FB_AUTH_DOMAIN=hoge-95.firebaseapp.com
FB_PROJECT_ID=hoge-2eXXXX
FB_STORAGE_BUCKET=hoge-XXXXX.appspot.com
FB_MESSAGING_SENDER_ID=XXXXXXXXXXXX
FB_APP_ID=X:XXXXXXXXXXXXX:web:XXXXXXXXXXXX
FB_MEASUREMENT_ID=XXXXXXXXXXX
```

7.babel.config.jsのpluginsに配列を追加することで`@env`というモジュールからimportできるようになる。

```js
module.exports = function (api) {
  api.cache(true);
  return {
    plugins: [
      //追加部分 
      [
        'dotenv-import', {
          'moduleName': '@env',
          'path': '.env',
          'blacklist': null,
          'whitelist': null,
          'safe': false,
          'allowUndefined': false,
        }],
      //ここまで追加
    ],
    presets: ['babel-preset-expo'],
  };
};

```

8.componentsフォルダの中にfirebase.js or firebase.tsを作成し、

```ts
import firebase from 'firebase'
import {
  FB_APIKEY,
  FB_AUTH_DOMAIN,
  FB_PROJECT_ID,
  FB_STORAGE_BUCKET,
  FB_MESSAGING_SENDER_ID,
  FB_APP_ID,
  FB_MEASUREMENT_ID,
} from '@env'

export const firebaseConfig = {
  apiKey: FB_APIKEY,
  authDomain: FB_AUTH_DOMAIN,
  projectId: FB_PROJECT_ID,
  storageBucket: FB_STORAGE_BUCKET,
  messagingSenderId: FB_MESSAGING_SENDER_ID,
  appId: FB_APP_ID,
  measurementId: FB_MEASUREMENT_ID
}
// Initialize Firebase
try {
  firebase.initializeApp(firebaseConfig)
  firebase.analytics();
} catch (e) {
  console.log(e)
}
export const db = firebase.firestore()

export const getAllUser = async () => {
	const users:any[] = []
	db.collection('users')
		.get()
		.then((docs) => {
			if (docs) {
				docs.forEach((doc) => {
					users.push(doc.data())
				})
			}
			console.log(users)
		})
		.catch((error) => {
			console.log(error.message)
		})
}



```

firestoreにusersというテーブルを作って適当なデータを登録すればこのgetAllUserというメソッドで全ユーザー情報を取得することができます。
[Rspec] テストのMysql2::Error

Rspecテストコードを実行したところ、Mysql2::Errorが発生しました。

現在のVer
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
Rails 6.0.3.4


[![Image from Gyazo](https://i.gyazo.com/d913fa5423b776ccce12fb5c4d6eccca.png)](https://gyazo.com/d913fa5423b776ccce12fb5c4d6eccca)
Verの関係で起きる環境系エラーのようです。
詳細は分かりませんが、下記のように記述すると解決できましたので、
今後のためにも記録しておきます。



config/environments/test.rbファイルの
  　# Raises error for missing translations.
　# config.action_view.raise_on_missing_translations = true
　という記述の下に

 　 config.active_job.queue_adapter = :inline

　と記述しターミナルでテストを実行すると、解決しました。
<a href="https://gyazo.com/328d2498bd337562bb6e68272d279635"><img src="https://i.gyazo.com/328d2498bd337562bb6e68272d279635.png" alt="Image from Gyazo" width="490"/></a>

---

もしお役に立てたなら嬉しいです😌
kaminariにもう少しだけ詳しくなってみた。kaminari_themesの使用、configファイルの生成

## 何をしたか
何度も使っているgemではあるのですが、故になかなかしっかりreadmeも読んだことのないgem。kaminariを[公式ドキュメント](https://github.com/kaminari/kaminari)も読みながら、もう少し丁寧に実装してみました。

具体的には、
- `config`ファイルの生成
- `kaminari_themes`の利用

をしました。kaminariの実装そのものには深く込み入っていません。

### 設定ファイル kaminari_config.rbの生成

kaminariの表示件数は、こんな感じでずっと描いていたのですが、

```Ruby
@posts = Post.page(params[:page]).per(15)
```

諸々のコードを見ていくうちに、設定ファイルがありそうということに気づき、調べてみました。すると、[公式のこちらの記載](https://github.com/kaminari/kaminari#configuring-kaminari)を見つけました。

```Ruby:
rails g kaminari:config
```

↑このコマンドで、`config/initializers/`配下に`kaminari_config.rb`というファイルが生成されます。（同様のファイルならgenerateコマンドを使って生成しなくても良いみたいです。）

設定ファイルにはデフォルトでこんな内容が書かれています。

```ruby:config/initializers/kaminari_config.rb
Kaminari.configure do |config|
  # config.default_per_page = 25
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end
```

よく使うオプションが一通りそろっているみたいです。
この中の`default_per_page`を

```Ruby:
config.default_per_page = 10
```

にすれば、表示件数がデフォルトで調整できる様になりました。

### 見た目の変更について

見た目については、以下のコマンドで設定できる様でした。

```
$ rails g kaminari:views テーマ名
```

この、「テーマ名」の部分には、[gem kaminariとは別のページ](https://github.com/amatsuda/kaminari_themes)にライブラリがあって、そこから選択できる様です。

今回は`Bootstrap4`&`slim`でテーマを適用したかったので、こちらのコマンドを実行しました。

```
$ rails g kaminari:views bootstrap4 -e slim
```

実際に、できたファイルがこちらです。
[![Image from Gyazo](https://i.gyazo.com/cb6ce2f2fe40a4e810d63e27be6b91bc.png)](https://gyazo.com/cb6ce2f2fe40a4e810d63e27be6b91bc)

## 感想等

仕事場で見かけた`pagenate array`や、以前作成したけど没になった**ajaxによるページネーション**もいつか調べて作ってみたいです。