OmniAICreator/Qiita-1.07M huggingface dataset:
alpineでbazelをビルドする

# 背景
* alpineでbazelを使いたい
  * デフォルトのapkリポジトリに存在しない[^1]
[^1]: apkのtestingリポジトリに存在するが、導入したいモジュールがこのバージョンに対応してないため使用しない
* Bazeliskはalpineのサポートをしていない
* コンパイルに時間がかかるのでビルド済みdockerイメージとして使えるようにしたい

## コンパイルのためのdocker image
./compile.shでコンパイルしている[gitリポジトリ](https://github.com/AfsmNGhr/alpine-tensorflow/blob/master/Dockerfile)があったので、参考に一部拝借・抜粋して[dockerfile](https://github.com/naka345/qiita_product/tree/master/docker/bazel_build)にしました。

```dockerfile:bazel-build
FROM python:3.8-alpine3.11

ARG bazel_ver=3.1.0
ENV JAVA_HOME=/usr/lib/jvm/default-jvm \
    PATH="$JAVA_HOME/bin:${PATH}" \
    BAZEL_VERSION=3.1.0

RUN apk add --virtual .bazel_build --no-cache g++ gcc \
  bash zip unzip cmake make linux-headers openjdk8 && \
  wget -q "https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-dist.zip" \
  -O bazel.zip && \
  mkdir "bazel-${BAZEL_VERSION}" && \
  unzip -qd "bazel-${BAZEL_VERSION}" bazel.zip && \
  rm bazel.zip && \
  cd "bazel-${BAZEL_VERSION}" && \
  sed -i -e 's/-classpath/-J-Xmx6096m -J-Xms128m -classpath/g' \
  scripts/bootstrap/compile.sh && \
  EXTRA_BAZEL_ARGS=--host_javabase=@local_jdk//:jdk ./compile.sh && \
  cp -p output/bazel /usr/bin/ && \
  cd ../ && rm -rf "bazel-${BAZEL_VERSION}" && \
  bazel version && \
  apk del --purge .bazel_build
```

あとは`docker build`してpushするだけ

## 注意点
1. ソースからコンパイルを行う場合は、openjdk11対応していないのでopenjdk8を入れる

1. `sed`で置き換えている箇所はJavaのヒープ・メモリのサイズを指定している。指定しないとメモリを食い尽くして途中で落ちるケースがある。

```
The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space
```

# 参考文献
- [AfsmNGhr/alpine-tensorflow](https://github.com/AfsmNGhr/alpine-tensorflow/blob/master/Dockerfile)
- [Javaのヒープ・メモリ管理の仕組み (1/2)](https://www.atmarkit.co.jp/ait/articles/0504/02/news005.html)
GCP Cloud Composer - GCSからBigQueryへデータをロード

[GCP Cloud Composerを使いこなすまでの道のり](https://qiita.com/minarai/items/28b4269736ea0df136ff)からの続き
前回はGCPのドキュメンを参考に`Airflow` 及び `Cloud Composer` の概要をまとめましたが今回は実際に`Cloud Composer` サービスを使ったサンプルアプリケーションを実装してみます。
# システム構成
### DAGフローチャート
今回は**start**と**from_exsample-composer-gcs_import_bigquery**と**end**の3つのタスクを作ります。

![alt](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuG8pkApIYl9purChYXDp2t9ITPFpSmloYrEBTDEJY-CpWUoYalYapFJ2qjIYIckkrBmKBWSW0TGE0000)

### タスクリスト

|タスク ID|説明|
|:--|:--|
|start|タスク開始を示すダミータスク|
|from_exsample-composer-gcs_import_bigquery|GCSからBigQueryへデータを流すタスク|
|end|タスク終了を示すダミータスク|

### システム構成図

![alt](http://www.plantuml.com/plantuml/png/VT6_IiH040RmVfzYk3u7QfT23j_09mYJP5oFIsxZpXoSY8MxXLW9Wje9WftOAuW-p73lOK9Cy8_OpJBVzrlOdR6WbrLTcH85SsG2MZFMJKLPuUh6CVciNLG4o90VzRCnBCwZ9PWCwMH89rmSKeqywGhzdELOB4ZWn00Sp2lgdCzDTpId_tgsw2rQDyxBBqlGMv8HQf6bW5rGrhYIZHacI9BT7_UcMrFGyABXIUEhnhlDvStcxVPRuwkURhVns6SlD5vhkDVmeF7nhzxmKYdiJ65lRlTNv8_rx5dZUGU4TmrN8sPcj2pRF_W0)

### サンプルアプリケーション
サンプルアプリケーションは[Githubリポジトリ](https://github.com/kirakirapq/gcp-samples)に上がっています。

# 準備
### サービスアカウントにIAMロール追加

| ユーザー名       |       ロール |  
|:-----------------|:------------------|
| minarai-cloud-composer| roles/composer.worker |  
| minarai-cloud-composer| ストレージ オブジェクト閲覧者 |
| minarai-composer-admin| roles/composer.admin |
| minarai-composer-admin| BigQuery 管理者 |

### BigQueryテーブルを作成

- `minarai-composer-admin`アカウントをアクティベートして下記を実行します

```
bq --location asia-northeast1 mk \
     --dataset \
     --description "exsample composer GCS to BQ" \
     ${PROJECT_ID}:exsample_composer_dataset

bq --location asia-northeast1  mk -t \
      --schema ./dags/schemas/exsample_composer_table.json \
      --time_partitioning_type DAY \
      --description "example composer GCS to BQ" \
      ${PROJECT_ID}:exsample_composer_dataset.exsample_composer_table
```

### Cloud Storageバケットを作成する

- BigQuery Schemaを置くバケットとBiqQueryへ流し込むデータを置くバケットを作成します

### Cloud Composer環境構築または環境更新
- Cloud Composer環境構築がまだの場合は下記コマンドの`update`を`create`に読み替えてください

```
gcloud composer environments update ${CLOUD_ENV} \
      --location asia-northeast1 \
      --update-env-variables=PROJECT_ID=${PROJECT_ID},BQ_LOCATION=${LOCATION}
```

# DAGを登録（アップロード）
**Cloud Composer環境**が作成されるとGCSに**Cloud Composer dagsバケット**が作成されます。
GCSバケットへDAGをアップロードすることでAirflow dagsディレクトリへマウントされます。
gcloudコマンドからアップロードするには下記コマンドを実行します。

```
gcloud composer environments storage dags import \
        --environment ${CLOUD_ENV} \
        --location ${LOCATION} \
        --source ./dags/gcs_to_bq.py
```
#Rails で指定回数/複数回  db:rollback する ( STEP=n rails db:rollback ) 

例

```
STEP=2 rails db:rollback
```

[ruby on rails - How to rollback just one step using rake db:migrate - Stack Overflow](https://stackoverflow.com/questions/4352848/how-to-rollback-just-one-step-using-rake-dbmigrate)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3167











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ubuntu20.04でheadlessなfirefoxをseleniumからたたいてみる

# 参考にしたサイト
https://qiita.com/derodero24/items/9b38bc4ca99bfd8d5ea3

# もろもろのダウンロードとインストール

```
#sudo apt-install python3-pip firefox-geckodriver -y
#sudo pip3 install selenium
```

# Firefox起動まで。

```
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.binary_location = '/usr/bin/firefox'
options.add_argument('-headless')
driver = webdriver.Firefox(options=options)
#あとは参考サイトと同じソースで動きます。
```

# メモ
geckodriverとは、Webdriverからfirefoxを使うためのwapperみたいなものらしい。
インスタンス変数とは

#そもそもインスタンスとは
インスタンスとは、クラスによって作られた実体のようなものです。
クラスとは設計図のことであり、クラス(設計図)によって作られたものをインスタンスと呼びます。

具体的な例として、車の設計図を基にベンツを作ったとします。
ここでは車の設計図がクラスにあたり、ベンツがインスタンスになります。

#インスタンス変数とは
インスタンス変数とは、特定のインスタンス内でのみ通用する値のことです。
また、インスタンス変数と意味が混ざりがちな用語としてクラス変数があります。
2つの単語の違いについて先ほどの車の例で考えます。

車の設計図に、「タイヤが4個」と「車の形」があったとします。
「タイヤが4個」という設計はどの車にも当てはまる設計であり、クラス内(設計図内)で共通の値になります。
言い換えると、どの車においてもタイヤは4個である必要があります。

一方、「車の形」は車種によって異なります。
そのため、ベンツを作る場合にはこの形、プリウスを作るためにはこの形、といった風に各インスタンス内で用いられる車の形は異なります。
この各インスタンス内でのみ通用する値をインスタンス変数といいます。

#最後に
この記事は、自身の理解を確かめるために頭の中を文章に書き起こしたものです。
間違っている場合もありますので、その際はぜひご指摘ください。
ドキュメント作成時に自己レビューの質を上げるには

#はじめに
ドキュメント作成でいつもたくさんレビュー指摘をもらう人のための記事です。

この記事は

* 私自身が1年目で作成した成果物に対していただいた指摘内容
* レビュー実施する前に確認しておけば良かったと思ったこと

をもとに以下の確認観点を挙げました。

参考までに私がこれまで作成したドキュメントの多くは以下のようなものでした。

* Excel
* ある程度フォーマットが決まっている
* リリース作業の手順書

ただし、上記に関わらずできるだけドキュメントを作成する上での汎用的な自己レビュー観点を挙げられるように努めました。
私個人の備忘も兼ねています。

読者としては社会人1年目など、ドキュメント作成に不慣れな方を想定しています。
ドキュメント作成玄人には当たり前のことかもしれません。

#目次
* ドキュメント作成前に
    * ドキュメントの目的は何？
    * ドキュメントの読者はどんな人？
    * どんな順番で記述する？
    * ドキュメントの作成完了の締め切りはいつまで？
* ドキュメント作成中に
    * わからないことは聞く
    * 1つの作業を途中でやめない
    * こまめに修正する
    * こまめに保存する
* ドキュメント作成後に
    * みため
    * ファイルの名称は適切か（エクセルだとシート名も）
    * 自分で流れを通してみる（簡単にできる作業であればやってみる）
* 再レビューの場合
* おわりに
* 参考


#ドキュメント作成前に

以下のことを先輩や上司に確認しメモを取りましょう。
わからないことがあれば、都度質問しましょう。

####ドキュメントの目的は何？
作成するドキュメントが最終的にどのようなことを達成したいものなのか確認します。

####ドキュメントの読者はどんな人？
以下の点を確認しましょう。

* どんな知識レベルの人？
* どのような状況の時に、ドキュメントを読む必要があるの？ 

####どんな順番で記述する？
ドキュメントの目的と読者を踏まえてドキュメントの全体構成を考えます。

例えば、知識が少ないユーザー向けのマニュアルであれば、
基本的な操作から記述する必要があるかもしれません。

ドキュメントのひな形が存在する場合はこの項目の考慮は不要です。

####ドキュメントの作成完了の締め切りはいつまで？
作成するドキュメントをいつまでに完成させればよいか確認しましょう。
そして、いつまでにどの程度終わってればよいのか計画を立てましょう。

#ドキュメント作成中に
「ドキュメント作成前に」で確認した情報をもとに手順書を作成しましょう。

以下のことを心掛けましょう。
####わからないことは聞く
不明な点や、作業前に確認し忘れたことは早い段階で聞いておきましょう。

多分これで良いだろう、という読みで作業を進めると間違っていた場合に
大幅な手戻りが発生します。
不確実なことはなるべく減らして、確実に作業を進めていきましょう。

####1つの作業を途中でやめない
やっている作業を頻繁に変えないようにしましょう。

####こまめに修正する
修正するべき点は気が付いたタイミングでやりましょう。

ただ、どうしても後で修正するのであれば、何をどう修正する必要があるのかメモし、後で確認しましょう。
####こまめに保存する
アプリの不調でデータが飛ぶことがあるのでドキュメントの保存はこまめにしましょう。

#ドキュメント作成後に
作成後5分ほど空けてから以下の作業に取り掛かりましょう。

なぜ5分空けるかというと、集中力を取り戻すためです。
トイレに行ったり、お茶を飲んだり、ほかの仕事を一度挟んでみたり、
新鮮な目で作成物を見れるようにしましょう。

#### みため
以下を確認しましょう。

* スペル、つづり
* インデント
* スタイル（エクセルなら罫線など）
* 不要なものは消し忘れていないか？
* 端から端まで見ているか？？（修正漏れ防止）
* 倍率を落として、全体を俯瞰的に見てみる
* 倍率を上げて、1項目ずつ細かく見てみる

#### ファイルの名称は適切か（エクセルだとシート名も）
作成物のファイル名が適切か確認しましょう。

#### 自分で一読し、流れを確認する
実際に実施できる作業であれば内容の確認のためにやってみましょう。
実施が無理な作業であればシミュレーションしてみましょう。

#再レビューの場合
これまでの内容を実施していれば、再レビューなど必要ない！<br>
…と言いたいところですが、実際は仕様変更などで「やっぱり当初想定してた状況と変わったから対応して」なんてこともあります。

そのような場合は以下の手順でレビュー指摘への対応を実施します。

####レビュー指摘の内容を確認する
指摘内容を確認します。

指摘内容自体が理解できない場合や、指摘への対応方法が思いつかない/わからない場合は質問しましょう。

####レビュー指摘への対応をする
指摘への対応を1つずつ実施します。
以下のように、エディタなどに指摘内容をコピペして、実施したものからチェックマークを付けていくと漏れなく実施できます。

```
☑⇒実施済
☑ログイン処理を追加する
・実施コマンドを修正する
・キャプチャを追加する
```

####レビュー対応後に
以下の確認作業を行ってください。

* レビュー指摘への対応を1つずつ確認
* レビュー指摘への対応によって修正が必要な部分が出ていないかの確認
　例：手順書の作成<br>　指摘への対応によって新規手順を追加した場合、<br>　項番の修正が必要になる、など
* 「ドキュメント作成後に」の「みため」部分を再確認

#おわりに
慣れないうちは1つ1つ丁寧に実施しましょう。


#参考
Qiita記事の書き方の参考

* [Qiitaで良い記事を書く技術](https://qiita.com/t12u/items/8c28484100dfd3a6351b)
* [Qiita記事の書き方〜基本の基本〜](https://qiita.com/48saaan/items/ec2e823e598b457d42eb)

勝手に参考にさせていただきました！
PlantUML:標準のダサい色をリセットする方法

PlantUMLの使い方を学んでいたんですが、標準で定義されている色がダサかったので
何とかできないかと調べていたら、色をリセットする方法を見つけたので残しておきます。

## 方法

以下の1行を@startumlの後ろにくっつければよいみたいです。

```
skinparam monochrome true
```

こうすることで白黒の表示に変更することができるみたいです。

```
@startuml サンプル
skinparam monochrome true

[*]-->トップ
トップ->ログイン

@enduml
```

![サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346267/d8e4563f-e6ca-97e9-6390-cce4ee0a43a3.png)

個人的には色がついているよりもこっちの方が好み

## 参考

[skinparamコマンドの使い方](https://plantuml.com/ja/skinparam)

skinparamコマンドを使うことでUMLの色やフォントを多種多様に変更できるらしい。
macOS Catalina で "エラー: メイン・クラス○○が見つからなかったかロードできませんでした" と言われたら


今回はMacOSさんがとっても優秀過ぎて勝手に沼にハマった私の備忘録です。

##環境
macOS Catallina

##なにがあったか
私が久しぶりにJavaのソースコードを書いていてターミナルからコンパイルしたくなった時のことです。

```
javac -cp "classpathをいろいろ" -d 出力先ディレクトリ ./package名/Example.java
```

と普通に打ちます。
classファイルが生成されます。
ここまでは順調でした。

```
$ cd 出力先ディレクトリ
$ java package名/Example
エラー: メイン・クラスExampleが見つからなかったかロードできませんでした
```

orz

やらかしました。

いろいろ調べた結果、最終的には事なきを得たのでよくあるパターンと共に記事にしてみました。
(後の伏線になるのですが、今回私はDesktopディレクトリ以下で作業していました。)
同じことやらかした人に届けこの想い…。

## Pattern1 ディレクトリ構成が違う
今回~~調子に乗って~~srcディレクトリとbinディレクトリに分けていて、
さらにパッケージも分けていましたので、まずディレクトリ構成からです。

これを最初にやっておくとエラー様の言う通り(場所の勘違いなどから)本当にclassファイルがない場合もここで発覚します。

```
Desktop/
      └─project/
             ├src/package名/
             │            └─Example.java
             └bin/package名/
                          └─Example.class
```

問題なかったです。

## Pattern2 mainメソッドが無い
`java`で実行するclassにはmainメソッドが必須です。
たまに書いてなくておなじみのエラーを出している人を見ます。

## Pattern3 環境変数CLASSPATH
私は使ったことなかったので意識したことなかったですが、これを下手に設定して失敗するパターンもあるようです。

```
$ echo $CLASSPATH
$
```

まぁ使ったこと無いので当然ですけど大丈夫でした。

### ここまで来るとなにがいけないのか。。。

### Pattern4 macOSさんかしこい
いろいろ試して疲れた頃、(そもそもこんなに発覚しないことある…？)o.(；´Д｀)とか思いだしました。
そこで、まさかと考えて「システム環境設定」→「セキュリティとプライバシー」を見ると![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230044/585b81f2-f0f8-d644-a142-4fa229319b21.png)
今回Desktopでプログラミングしていた私は ~~まんまと~~ Catalinaさんのセキュリティに止められていたのです。
これにて一件落着。解決です。

##まとめ
皆さんはこんなしょうもない設定してないと思うのですが、ネットで
"エラー: メイン・クラス○○が見つからなかったかロードできませんでした"
について調べても解決できず、（エラーメッセージも権限の問題らしきものなのに）それがわかりにくかったので、後に現れるかもしれない私と同じミスをする人のために書いてみました。
Elixirで超簡単にWebアプリケーションを作る

# はじめに
- @lambda_funtaro さんの[Haskellで超簡単にWebアプリケーションを作る(モナドも出てこないよ)](https://qiita.com/lambda_funtaro/items/589c2a93749927c33c96)を拝見しまして、ぜひ[Elixir](https://elixir-lang.org/)でやってみたいとおもってやってみました

## この記事でのハイライトコード !!!

```elixir:lib/example/router.ex
defmodule Example.Router do
  use Plug.Router

  plug :match
  plug :dispatch

  get "/" do
    send_resp(conn, 200, "hello Cowboy")
  end

  get "/foo" do
    send_resp(conn, 200, "bar buz")
  end

  match _ do
    send_resp(conn, 404, "not found")
  end
end
```


# 0. 準備
- まずは[Elixir](https://elixir-lang.org/)をインストールしましょう
- Windowsの方は
    - [公式](https://elixir-lang.org/install.html#windows) のインストーラーがあります
- macOSの方は
    - a. [asdf-vm](https://asdf-vm.com/#/)を使ってインストールする(オススメ)
        - (参考) [macOS Catalina(10.15.1)にasdfでElixirをインストールする](https://qiita.com/torifukukaiou/items/75fa25c55ce2f0b92496)
        - [Erlang](https://www.erlang.org/)のインストールにけっこう時間がかかります
    - b. [Homebrew](https://brew.sh/index_ja)を使ってインストールする
        - `$ brew install elixir`
        - まず手軽に試してみる感じならこちらのほうが詰まるところは少ないとおもいます
- Linuxの方は、[asdf-vm](https://asdf-vm.com/#/)がよいとおもいます(ふだんあまり使っていないのでよくわかっていません)

# 1. mix new (プロジェクトを作りましょう!)

```
$ elixir -v
Erlang/OTP 22 [erts-10.7.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Elixir 1.10.3 (compiled with Erlang/OTP 22)
$ mix new example --sup
```

- `--sup` オプションを指定して、supervision treeを含むOTPアプリケーションのスケルトンを生成しています


# 2. mix deps.get (依存関係を解決しましょう)

```elixir:lib/mix.exs
  defp deps do
    [
      {:plug_cowboy, "~> 2.0"}
    ]
  end
```
- 上記のように書き換えます
- [PlugCowboy](https://github.com/elixir-plug/plug_cowboy)を使います
    - A Plug Adapter for the [Erlang](https://www.erlang.org/) [Cowboy](https://github.com/ninenines/cowboy) web server.
    - だそうです

```
$ cd example
$ mix deps.get
```

# 3. router.exを書く

```elixir:lib/example/router.ex
defmodule Example.Router do
  use Plug.Router

  plug :match
  plug :dispatch

  get "/" do
    send_resp(conn, 200, "hello Cowboy")
  end

  get "/foo" do
    send_resp(conn, 200, "bar buz")
  end

  match _ do
    send_resp(conn, 404, "not found")
  end
end
```

# 4. アプリが起動したらCowboyウェブサーバーを起動してsuperviseするように伝えます

```elixir:lib/example/applicatio
  def start(_type, _args) do
    children = [
      {Plug.Cowboy, scheme: :http, plug: Example.Router, options: [port: 8000]}
    ]
```

# 5. 起動 🚀🚀🚀

```
$ mix run --no-halt
```

または

```
$ iex -S mix
```

Visit !!!

| | Response | Status Code    |
|:---|:---|:---:|
| http://localhost:8000/ | hello Cowboy | 200 |
| http://localhost:8000/foo | bar buz | 200 |
| http://localhost:8000/other | not found | 404 |


# 参考
- [Elixir School](https://elixirschool.com/en/)の[Plug](https://elixirschool.com/en/lessons/specifics/plug/) 記事をとても参考にしました


**Enjoy!!!**
Redis の WebAPI (oak)

こちらで定めた仕様を満たすサーバーのプログラムです。
[Redis の WebAPI を作成](https://qiita.com/ekzemplaro/items/1746b31beef382023f2d)

サーバープログラム

```ts:oak_webapi.ts
// ---------------------------------------------------------------
//	oak_webapi.ts
//
//					May/21/2020
//
// ---------------------------------------------------------------
import { Application,Router } from "https://deno.land/x/oak/mod.ts"
import { connect } from "https://denopkg.com/keroxp/deno-redis/mod.ts"

const router = new Router()
router
  .post("/", (context) => {
    context.response.body = "WebAPI"
  })
  .post("/read", async context => {
	const body = await context.request.body()
	const key:string = body.value.key
	const rvalue = await read_proc(key)
	context.response.body = rvalue
    })
  .post("/insert", async context => {
	const body = await context.request.body()
	const key:string = body.value.key
	const value:string = JSON.stringify(body.value.value)
	const ok = await insert_proc(key,value)
	context.response.body = ok
    })
  .post("/list", async context => {
	const json_str = await list_proc()
	context.response.body = json_str
    })

const app = new Application()
app.use(router.routes())
app.use(router.allowedMethods())

console.log("*** start ***")
await app.listen({ port: 8000 })

// ---------------------------------------------------------------
async function read_proc(key:string)
{
	const client = await connect({ hostname: "127.0.0.1", port: 6379 })
	const reply:any = await client.get(key)

	return reply
}

// ---------------------------------------------------------------
async function insert_proc(key:string, value:string)
{
	console.log("*** insert_proc *** start ***")
	console.log("key = " + key)
	console.log("value = " + value)

	const client = await connect({ hostname: "127.0.0.1", port: 6379 })

	const ok = await client.set(key, value)

	console.log(ok)
	console.log("*** insert_proc *** end ***")

	return ok
}

// ---------------------------------------------------------------
async function list_proc()
{
	const client = await connect({ hostname: "127.0.0.1", port: 6379 })
	const rvalue = await client.executor.exec("keys", "*")

	return rvalue[1]
}

// ---------------------------------------------------------------
```

サーバーの実行コマンド

```bash
deno run --allow-net oak_webapi.ts
```

テストスクリプト

Read

```bash
curl -X POST -H "Content-Type: application/json" \
	-d '{"key": "t1751"}' http://localhost:8000/read
```

Insert

```bash
curl -X POST -H "Content-Type: application/json" \
	-d '{"key": "t1751", "value": {"name": "宇都宮","population": 37516,"date_mod": "2001-5-18"}}' \
	http://localhost:8000/insert
```

List

```bash
curl -X POST -H "Content-Type: application/json" \
		http://localhost:8000/list
```
巨大なデータを取得する関数でデータを戻り値にする代わり

`sink` って名前がわかりやすいなと思ったので忘れないようにメモ。

Goで巨大なデータを取得する処理の場合、配列に入れて返すのどうなんってなりがち。

```go
func FetchTooBigData() ([]Datum, error) {
  var data []Datum
  ...
  data = append(data, Datum{...})
  ...
  return data
}
```
メモリに全部載せるの流石にキツイ。

受け取るための某を作って引数で渡してやるのが設計的に簡単で良さそう。

```go
type DataSink interface {
  Add(Datum) error
}

func FetchTooBigData(sink DataSink) error {
  ...
  if err := sink.Add(Datum{...}); err != nil {
    return err
  }
  ...
}
```

もっとちゃんと作り込んで、他の言語でよく見るチェーンっぽい書き方をするなら

```go
type EnumerableData interface {
  Next() bool
  Current() Datum
}

func FetchTooBigData() (EnumerableData, error) {
  ... // よしなに
}

data, err := FetchTooBigData()
if err != nil {
  panic(err)
}

for data.Next() {
  datum := data.Current()
  ...後続処理
}
```

みたいなコルーチンじみたアレを作るんだろうけど、流石に面倒くさい。
AWSのサービス多すぎ問題について

AWSのサービス多すぎ問題に対する処方箋になればいいなと。。。

#概要
以下のようなお悩みをお持ちの方向けです。

- AWSのサービスが多すぎて覚えられない
- AWSのサービスの適用範囲が分からない
- 全体を俯瞰できる図が欲しい

本記事は2020年5月時点の情報で作成しています。
全てのサービスは網羅していません。サービスの区分けについてのみの内容です。

#そもそもの用語

##アベイラビリティゾーン（AZ）
AWSが保有する物理的なデータセンタ群のこと。日本だと6箇所存在します。
<img width="1440" alt="スクリーンショット 2020-05-21 13.56.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/433facec-08d0-30b7-973c-b0c699783a84.png">
出典：https://infrastructure.aws/

##リージョン
複数のAZが存在する世界24箇所の地域のこと。日本だと2箇所(東京、大阪)存在します。
<img width="1180" alt="スクリーンショット 2020-05-21 12.42.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/083ac4fc-a210-81d4-5199-89a42551e133.png">
出典：https://aws.amazon.com/jp/about-aws/global-infrastructure/

> AWS東京リージョンで大規模障害か
出典：https://xtech.nikkei.com/atcl/nxt/news/18/07639/

リージョンで障害が発生すれば、リージョンに含まれるAZももちろん障害の範囲に含まれます。
冗長構成を考える場合は複数リージョンでシステムを構成しておくほうが安全です。
予算と要相談ですが…..（止まって困るシステムなら別リージョンは必須）

#サービスの種類
##グローバルサービス
どこのリージョンからでも共通のサービスとして利用できるグローバルサービス。
<img width="1122" alt="スクリーンショット 2020-05-21 14.57.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/92488824-1c94-3bb4-06b6-2fd5c79706cf.png">

##リージョンサービス
リージョンごとに作成・管理されるリージョンサービス。
<img width="1122" alt="スクリーンショット 2020-05-21 16.18.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/f37ee911-7d72-c1f9-79ec-eb61fe56fcf3.png">
※VPC毎に必要となる Security Group / VPC Endpoints / VPC Peering / EIP も リージョンサービス
※バックエンドで S3 を利用している EBS Snapshot / AMI も リージョンサービス

##AZサービス
AZごとに作成・管理されるAZサービス。
<img width="1122" alt="スクリーンショット 2020-05-21 16.30.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/09dbff92-fc4c-c7e2-215b-4c10600a574d.png">
※サブネット単位で必要となる NAT Gateway / NACL も AZ サービス
※AZ単位で設定する EBS / Placement Group も AZ サービス

#俯瞰図
グローバル、リージョン、AZサービスの関係性は以下の通りです。
<img width="963" alt="スクリーンショット 2020-05-21 17.24.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/4a118bf4-5fd7-ee31-8f31-d7bc1ce44c54.png">
処理範囲はAZだけどサービスの所属はリージョンだったり、
一見リージョンのサービスっぽく見えるが実態はAZをまたがっているだけ、というように
複数サービスに関係があるサービスは混乱しやすいので見極めが大事になってきます。

また、1つのリージョン内の AZ サービス間であればプライベート IP アドレスで接続できます。
リージョンサービスの場合、基本的にはグローバル IP アドレスで接続しなければいけないので注意しましょう。


#最後に
耳タコかもしれないですが、AWS触るのであれば資格試験の勉強から取り組むことをお勧めします。
ソリューションアーキテクト アソシエイトであれば、サービスを体系的に学ぶことができます。

書いている内容に誤りや不備があればコメントをお願いしますmm

#おまけ
[AWSアーキテクチャアイコン](https://aws.amazon.com/jp/architecture/icons/)からAWSのアイコン素材を落とせます。
提案時などの資料作成に役立つかと思います！
Python PyInstaller で急に　No module named pyinstaller

いままで
py -m pyinstaller Test.py
でできていたはずなのに、メモものこっていたのに・・・　パスもあっているのに・・・
急に　No module named pyinstaller　とでてくるようになりました。

##環境
・Windodws10
・Python　3.8.3
・PyInstaller　3.6

##結論
pyinstaller →　PyInstaller　にしたら解決しました。

##解決までの道のり
①そもそも pyinstaller　はあるのか
windowsなので以下のコマンドでpyinstallerがあるかどうか確認する
```py -m pip list```
②出力されたリストにあるのはなんと
```PyInstaller```
大文字になってるじゃない

以前からそうでしたっけ

自分の環境では
py -m PyInstaller Test.py
でできました。

ただの自分の勘違いで最初から PyInstaller　だったかもしれないですが、
それとも、pipでバージョンアップをしたからでしょうか。
とりあえず今回はこれで解決しました。
requirements.txtからpipenvに移行する

# はじめに
まだまだ、Pythonのパッケージ管理に`requirements.txt`を使っているなんて方は多いと思います。
わかりやすいですし、検索すると最初に出てくるためそのままという方が多いと思います。

ただ、`requiments.txt`だとパッケージ同士の依存関係が管理できないため、[pipenv](https://pipenv-ja.readthedocs.io/ja/translate-ja/)や[poetry](https://python-poetry.org/)など様々なパッケージ管理ツールが推奨されています。

今回、requimetns.txtからpipenvに変更することにしたのでそのときの手順をまとめます。
※poetryにはrequimetns.txtをimportする機能がないようです。

## 手順

- pipenvのインストール

```zsh
brew install pipenv
```

- requirements.txtからpipenvに移行

```zsh
pipenv install -r requirements.txt

# 依存関係を定義するlockファイルを生成
pipenv lock
```
文字列検索　ディレクトリ、ファイル、ファイル内の文

# 文字列検索
今いるディレクトリより下全てから、文字列をディレクトリ、ファイル、ファイル内の文から検索する方法をまとめた
## ディレクトリ検索
find . -name "\*文字列*"

## ファイル検索
指定フォルダ配下を再帰検索
find . -type f -name "\*文字列*" 

## ファイル内の文検索
指定フォルダ配下を再帰検索
grep "\*文字列*" -rl .

### ファイル内で文を検索
/文字列
実行中のRun数をターミナル上で数える

#導入

シミュレーションを複数個同時に実行している際に、一気に100個走らせるのはCPUを圧迫して結局終わらない。この問題を解決するために、CPUを100%程度を消費しつつ、それ以上はシミュレーションを走らせない方法を考えた。

#前提

前提として、CPU100%程度消費するシミュレーションの同時実行数を予め見積もること。

#解決策

解決方法として、現在走っているシミュレーション実行数をモニターし、上記同時実行数を超えているようなら走らせずに、超えていないようなら新しいシミュレーションを走らせる。

そのために、実行数をターミナル上でモニターする方法が以下である。

```
$ ps aux | grep [run file] | wc -l
```

これで行数を得られる。（ただし、grep [run file]の実行も数えるため、１行分余計に数えてしまうので注意）

#結論

上記の同時実行数をshellscripts上でモニターすることで適切にCPUを消費して計算することができる。
Stripeでの課金@Laravel 5.8

## まえがき

個人開発を行っているアプリで課金を行いため、調査を行った。

以前から気にはなっていたがテスト環境での課金が完了したため、記事とする。

日本語情報が少ない中試行錯誤したため更新していくかもしれない。

なお、動作確認を主としているためコードの可読性に関してはご容赦ください。

### 環境

Windows10 Pro 64bit 
PHP7.3
Laravel 5.8

### 必要な設定

#### composer

` composer require "stripe/stripe-php" `

以上。Stripeの色々やってくれる便利なやつ。

#### .env

```
STRIPE_KEY=pk_test_***************************************
STRIPE_SECRET=sk_test_***************************************
```
.envファイルに記載。わかりゃ何でもいいです。

これは、ダッシュボードから確認できるものですね。

#### 単独課金

```php
// コントローラのアクションにベタ書きしてます

$token = env('STRIPE_SECRET');

// キーの設定。
\Stripe\Stripe::setApiKey($token);

/* 
入力してもらったカード情報をsubmitすると、"stripeToken"というキーで取得できるトークンを利用。
5000円の課金。
*/
$charge = \Stripe\Charge::create([
    'amount' => 5000,
    'currency' => 'jpy',
    'description' => 'Example charge',
    'source' => $request->stripeToken,
]);
```

#### 顧客登録、顧客に基づく課金

```php
// コントローラのアクションにベタ書きしてます

$token = env('STRIPE_SECRET');

// キーの設定。
\Stripe\Stripe::setApiKey($token);

/* 
顧客の登録。
配列のキー追加で顧客のアドレス、名称等々設定できますが今は必要最低限のもの。
*/
$customer = \Stripe\Customer::create([
    'source' => $request->stripeToken,
]);

// 上記で登録した顧客IDを元に、登録できます。
$charge = \Stripe\Charge::create([
    'amount' => 1000,
    'currency' => 'jpy',
    'customer' => $customer->id,
]);
```

#### 登録済み顧客データから課金

前項の例で分かった方はいらっしゃるかと思いますが

```php
// コントローラのアクションにベタ書きしてます

$token = env('STRIPE_SECRET');

// キーの設定。
\Stripe\Stripe::setApiKey($token);

// 顧客の取得。適当なモデルに紐付けたstripe_idで課金します。
$customer_id = Customer::find(1)->stripe_id;

// 上記で登録した顧客IDを元に、登録できます。
$charge = \Stripe\Charge::create([
    'amount' => 1000,
    'currency' => 'jpy',
    'customer' => $customer_id,
]);
```

#### 参考
ドキュメント(カード登録んところ)：https://stripe.com/docs/saving-cards
ドキュメント(テストカード)：https://stripe.com/docs/testing

### おわり

雑記のようなものですが備忘録。
希望貧乏なエンジニアなので何卒ご容赦を。
SSH keys 備忘録

## 背景と目的
ssh keysの作り方を毎回忘れてしまうので備忘録として残しておく

### コマンド
```
ssh-keygen -t rsa -b 4096 -C "mailadress"
```

* t オプション キーペアの指定
* b オプション 鍵のbit数
* C オプション コメントの挿入 ※メールアドレス入れるのがお作法？


### 実行結果
```
$ ssh-keygen -t rsa -b 2048 -C XXX@example.com
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/XXXX/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/XXXX/.ssh/id_rsa.
Your public key has been saved in /c/Users/XXXX/.ssh/id_rsa.pub.
```

公開鍵と秘密鍵が.ssh配下にできる。公開鍵は然るべきところに登録して削除しておく

```
$ ls -l ~/.ssh/
total 13
-rw-r--r-- 1 XXXX 197609   62 5月  21 17:10 config
-rw-r--r-- 1 XXXX 197609 3326 5月  21 17:22 id_rsa
-rw-r--r-- 1 XXXX 197609  744 5月  21 17:22 id_rsa.pub
-rw-r--r-- 1 XXXX 197609 2083 5月  21 17:01 known_hosts

```
EC-CUBE4 受注明細入門

EC-CUBE4の受注明細について解説する。

# 目次

- 受注明細種別（商品/送料/手数料/割引）
- 税込/税抜
- 課税区分（課税/非課税/不課税）
- その他(税率/計算規則)
- 例
  - 商品
  - 送料
  - ポイント
  - クーポン
  - 課税割引

----

# 受注明細種別（OrderItemType）

明細の種類を表す。
受注金額の計算時に受注明細種別（OrderItemType）を参照して計算・更新される。

- 商品(PRODUCT)
- 送料(DELIVERY_FEE)
- 手数料(CHARGE)
- 値引き(DISCOUNT)
- 税(TAX)
- ポイント(POINT)

----

# 税込/税抜(TaxDisplayType)

明細の金額(price)が税込(INCLUDED)か税抜(EXCLUDED)か。
税抜(EXCLUDED)の場合は金額(price)に税の計算がされたものが明細の小計となる。

- 税込(INCLUDED)
- 税抜(EXCLUDED)

フロント画面は基本的に税込みの金額が表示されている。

----

# 課税区分（TaxType）

消費税の課税区分を表す。
課税区分によって受注の計算方法が変わってくる。

- 課税(TAXATION)
- 不課税(NON_TAXABLE)
- 非課税(TAX_EXEMPT)

「税込/税抜」とはまた違った観点であり、「税込の課税」「税抜の課税」などがありえる。

消費税┳課税┳課税┳課税
　　　┃　　┃　　┗免税
　　　┃　　┗非課税
　　　┗不課税

## 課税(TAXATION)

消費税は、国内において事業者が事業として対価を得て行う取引を課税の対象としています。

## 不課税(NON_TAXABLE)

消費税の課税の対象は、国内において事業者が事業として対価を得て行う資産の譲渡等と輸入取引です。
これに当たらない取引には消費税はかかりません。
例えば、国外取引、対価を得て行うことに当たらない寄附や単なる贈与、出資に対する配当などがこれに当たります。

## 非課税(TAX_EXEMPT)

国内において事業者が事業として対価を得て行う資産の譲渡等であっても、課税対象になじまないものや社会政策的配慮から消費税を課税しない取引があります。
これを非課税取引といいます。
例えば、土地、有価証券、商品券などの譲渡、預貯金の利子や社会保険医療などがこれに当たります。

## 免税(TAX_EXEMPT)

免税店の許可を受けた店舗が「非居住者」に対して一般物品・消耗品を販売する時に税金が免除されます。
EC-CUBE4ではデフォルトで設定がありません。

----

# その他

## 税率(TaxRate)

税率。2019年に10%になった。EC-CUBE 4.0.4からデフォルトが10%になる予定。

## 計算規則(RoundingType)

計算時の切り上げ、切り下げ、四捨五入などの指定ができる。

- 四捨五入(ROUND)
- 切り捨て(FLOOR)
- 切り上げ(CEIL)

----

# 例

## 商品

- 受注明細種別: 商品
- 税込/税抜: 税抜
- 課税区分: 課税

金額: 1,000円
消費税: 100円
小計: 1,100円

## 送料

- 受注明細種別: 送料
- 税込/税抜: 税込
- 課税区分: 課税

金額: 1,000円
消費税: 約91円
小計: 1,000円

## ポイント

EC-CUBEのデフォルトで実装されているポイント機能で利用する。
カスタマイズでは基本的にポイント明細は足せない。

- 受注明細種別: ポイント
- 税込/税抜: 税込（実質的に意味なし）
- 課税区分: 不課税

金額: -1,000円
消費税:    0円
小計: -1,000円

金額がマイナスになっていることに注意。
金券と同じ扱いとなり、「支払いのうち〇〇円をポイントで支払っている」というイメージをするとわかりやすい。


## クーポン

公式プラグインでのクーポンの明細の扱いはポイントと同じ不課税となる。

- 受注明細種別: 値引き
- 税込/税抜: 税込（実質的に意味なし）
- 課税区分: 不課税

金額: -1,000円
消費税:    0円
小計: -1,000円

ポイントと同様に金券と同じ扱いとなり、「支払いのうち〇〇円をポイントで支払っている」というイメージをするとわかりやすい。

## 課税割引

課税の割引明細も作成できる。

- 受注明細種別: 値引き
- 税込/税抜: 税抜
- 課税区分: 課税

金額: -1,000円
消費税:  -100円
小計: -1,100円

不課税の値引きは「金券と同じ扱い」のイメージなのに対し、課税の値引きは「商品値引き」をイメージするとよい。

税抜1,000円の商品を課税/不課税100円の割引で購入する場合を比較する。

|  | 割引なし | 課税割引 | 不課税割引 |
|:--|:--|:--|:--|
| 商品(税抜) | ¥1,000 | ¥1,000 | ¥1,000 |
| 商品割引(税抜) | ¥0 | -¥100 | ¥0 |
| 課税対象(税抜) | ¥1,000 | ¥900 | ¥1,000 |
| 購入金額(税込) | ¥1,100 | ¥990 | ¥1,100 |
|  |  |  |  |
| 金券支払い | ¥0 | ¥0 | ¥100 |
| 現金支払い | ¥1,100 | ¥990 | ¥1,000 |
| 支払い合計 | ¥1,100 | ¥990 | ¥1,100 |
GitLab Runner+docker でCIがうまく動かないときの対処法メモTips

# 環境
iMacでgitlab-runner+dockerを動かしてandroidアプリのCI環境を作っています。
gitlab-runnerは社内ランからしかアクセスできない設定で、CI環境の入っているiMacは社内にあります。

# うまく動かない事例とそれぞれの対処法

## 使っていないイメージが多すぎて悪さをしている。
  apt-get updateやapt-get installしているところで

```
Error writing to output file - write (28: No space left on device) [IP: xxx.xxx.xxx.xxx xx]
```

やら

```
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

やら

```
Reading package lists...
Building dependency tree...
Reading state information...
Package file is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Unable to locate package lib32stdc++6
E: Couldn't find any package by regex 'lib32stdc++6'
E: Unable to locate package lib32z1
E: Unable to locate package aapt
E: Package 'file' has no installation candidate
```

やら出た時

→
dockerの動いているマシンのターミナルから

```
docker image prune
```

で使っていないイメージを消してやる。


## WiFiなど、ネットワーク環境が悪い
サブモジュールなどを手動でgit cloneするところで

```
$ git clone http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.xxxxx/hoge/hugahuga.git hugahuga
Cloning into 'hugahuga'...
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
```

と出た時

→　
dockerの動いているマシンのWiFiが弱いのが原因っぽい。WiFiをつなぎなおしてやったり、ネットワーク環境を整えてやる。


## gitlab-runnerやdockerがうまく動いていない。固まっている。
しょっぱなから

```
Running with gitlab-runner 12.2.0 (xxxxxxx)
  on iMac-docker xxxxxx
ERROR: Preparation failed: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (executor_docker.go:983:120s)
Will be retried in 3s ...
ERROR: Preparation failed: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (executor_docker.go:983:120s)
Will be retried in 3s ...
ERROR: Preparation failed: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (executor_docker.go:983:120s)
Will be retried in 3s ...
ERROR: Job failed (system failure): Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (executor_docker.go:983:120s)

```

とか出てなにもできずにエラーになるとき

→dockerかgitlab-runnerのどちらかがうまく動いていないので、dockerとgitlab-runnerをそれぞれ再起動してやる。(本格的に固まっていてうんともすんとも言わずマシンの再起動になることも多々あり。)

## DockerがPC内の必要なファイルにアクセスできていない
```
Running with gitlab-runner 12.2.0 (a987417a)
  on iMac-docker xxxxxx
Using Docker executor with image xxx/hogehoge:latest ...
Pulling docker image xxx/hogehoge:latest ...
Using docker image sha256:××× for xxx/hogehoge:latest ...
ERROR: Job failed (system failure): Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (executor_docker.go:837:120s)
```

OSアップデート後にCIを走らせたらこういわれて失敗した。PCを開いて確認してみたら「Dockerがデスクトップ上のファイルにアクセスしようとしています」ようなことの書かれたダイアログが出ていて、OKを押してからCIを再度動かしたら成功したので、Dockerが必要なファイルへのアクセス権を持っていなかったのが原因っぽい。
Arduinoのシリアルモニターの使用：Arduinoコンピューティングプラットフォームでシリアルモニターを実装する2つの方法


Arduinoは、シングルボードマイクロコントローラーとマイクロコントローラーキットを提供するコンピューティングプラットフォームです。 Arduinoの製品は電子機器の開発に使用されています。

多くのハードウェア愛好家、ベテラン、および業界初心者は、Arduinoプラットフォームを使用してレスポンシブなインタラクティブデバイスを作成したり、電子機器に関連する興味深いプロジェクトを作成したりしています。

Arduinoプラットフォームは、小型のオープンソース回路基板（「マイクロコントローラー」として知られている）などの使いやすいハードウェアと、柔軟なIDE（統合開発環境）を提供します。 IDEは、物理的な回路基板（マイクロコントローラー）にアップロードできるコンピューターコードを書き込むために設計されたソフトウェアパーツです。

簡単なUSB接続を使用することにより、Arduinoは、他の競合他社のプログラマブル回路基板の従来の面倒なユーザーが過去に対処することを余儀なくされたことを否定します。 Arduinoに代わるものは、新しく書き込まれたコードをコンピューターから回路基板にアップロードするために追加のハードウェアを必要とします。
![arduino-uno-r3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/a5af1aa9-c7e8-b3f6-f0d5-289d8aa6cc85.png)

前述したように、Arduinoがコードデータを転送する必要があるのはUSBケーブルだけです。

Arduinoを際立たせる他の印象的な機能の1つは、そのIDEがC ++の単純化されたバリアントとして開発されたことです。これにより、ユーザーは経験レベルに関係なく、電気プロジェクトでの作業中に便利な小さなトリックを実行できます。

これらすべての機能により、Arduinoは市場で最も使いやすいプラットフォームの1つになっています。 Arduinoの高い評価を受けている実験的ツールは、アーティスト、デザイナー、ハッカー、愛好家の間で人気があります。

Arduinoは、誰かがGPSユニット、LED、カメラ、インターネット、さらにはスマートフォンとの回路基板通信を作成したいかどうかに関係なく、インタラクティブな環境で簡単に作業するのに最適なツールです。ほんの数行のコードと少しの練習で、誰でもArduinoを習得できます。


Arduinoシリアルモニター
Arduinoプラットフォームが提供する最も便利な機能の1つは、コンピューターシステムと対話するためにRS232シリアル通信を利用することです。

どういう意味ですか？

つまり、ユーザーは、使用しているコンピューターからArduino回路基板にコマンドを送信したり、簡単なUSB接続を介してArduino回路基板から送信/返されたメッセージを受信したりすることができます。

この機能を利用するには、ユーザーはArduino Serial Monitorポップアップウィンドウを開く必要があります。これはプラットフォームのソフトウェアに組み込まれているため、簡単な手順であり、Arduino IDEのツールバーに配置するだけでアクセスできます。ユーティリティにアクセスすることで、ユーザーはArduino回路基板に接続されているデバイスを簡単に読み取って制御できます。

ボードで生成されたデータを表示することに加えて、Arduino Serial Monitorは、Arduinoスケッチの開発とデバッグに最適なツールです。

![serialmon3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/00af2902-6e81-0b9f-a74a-1823a0e30a13.jpeg)

ユーザーにSerial.print（）関数を提供することにより、Arduinoのシリアル出力を自分のPCに送信してモニターに表示できるという便利さを楽しむことができます。

Arduinoのスケッチを開発するとき、なぜこれが好ましいのでしょうか？

簡単に言えば、コードがArduinoボードにアップロードされると、ユーザーの結果は最初に予想されたものと異なる場合があります。

例として、LEDを使用します。期待どおりに動作しておらず、頻繁に点滅している（または、少なくともユーザーが意図したより頻繁に点滅している）可能性があるとします。問題の原因は、変数のオンとオフがインクリメントされるだけである可能性があります。Arduinoシリアルモニターは、LEDの値の変化を確認する最も簡単で効果的な方法です。

## Arduinoシリアルモニターが機能しない場合：代替ソリューション

Arduino Serial Monitorは基本的なシリアル通信をサポートするための素晴らしいツールですが、その機能には制限があります。データロギングや「リアルタイム」のCOMポートモニタリングなどに関しては、Arduinoシリアルモニターは残念ながら役に立ちません。

ただし、ユーザーには、ユーザーフレンドリーで信頼性の高い別のシリアルモニターオプションがなくてはなりません。それは、Eltima（SPM）によるシリアルポートモニターのおかげです。

Eltimaの[Serial Port Monitor](https://www.virtual-serial-port.org/articles/arduino-serial-monitor-alternative/)を使用すると、スキルレベルに関係なく、誰もがすべてのCOMポートを管理できます。 Eltimaは、ポートの開閉、境界の設定と変更、または複数の形式（たとえば、文字列、バイナリ、8進数、10進数、16進数など）でのデータ通信に必要な場合でも、簡単に実行できます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/a89a0067-26fb-e1f9-20b9-fbdeec651de9.png)

ユーザーが「ブロック」を介してバイナリデータを送信する場合でも、Eltimaのシリアルポートモニターを使用すると簡単です。

Eltimaのシリアルポートモニターは、コンピューターとArduino回路基板の間で送信される情報の比較と分析に最適です。 EltimaのSPMアプリケーションは、受信したすべてのシリアルデータをログに記録して別のファイルに保存します。これにより、必要に応じて後でいつでも確認できます。

シリアルポートモニターを使用すると、ユーザーは「フロー制御」設定を変更できます。つまり、オペレーターは必要に応じてArduinoプラットフォームの機能を変更できます。その背後にある概念は単純です。ユーザーが「フロー制御」を「なし」に設定している限り、回路基板をリセットする必要なく、シリアルへのアクセスが可能になります。

これは、Arduinoスケッチをデバッグしているときに最も役立ちます。コネクタを接続するだけで、スケッチを再起動することなくデータを監視できるためです。
moment.jsで2つの日時の差分を計算する。（kintone編）

#2つの日時の差分を計算する
##最近kintoneのカスタマイズしかしてない
最近、kintoneのカスタマイズをjsでゴリゴリ書く仕事しかしてない感じがするのですが、日時差分を取って、所定の時間を超えていたら入力欄の背景を赤くしろ、とか、黄色くしろ、とかいう話が複数あって、その度に考えていたので備忘録としてメモ。

##前提条件
kintoneでアプリをカスタマイズする際にはmoment.jsを読み込んでおくのを忘れないように。

##例えば
kintoneでタイムカードアプリを作ったとしてですね…

![タイムカード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/bff3525c-6bf0-e68e-5289-704239321a31.png)

開始、終了、にそれぞれユーザ打刻してもらって、両方に値が入った状態で「保存」すると、「計算」欄に両者の差分時間が入る、なんてことをやりたい場合です。

###ソース例
```javascript:sample.js
    // レコード保存時休憩時間計算
    kintone.events.on(["app.record.edit.submit"], function(event){
        var record = event.record;

        // 休憩開始と終了が入っていれば計算する
        if(record['休憩開始']['value'] !== undefined && record['休憩終了']['value'] !== undefined){
            const timeFrom = moment(record['休憩開始']['value']);
            const timeTo = moment(record['休憩終了']['value']);
            let result = timeTo.diff(timeFrom);
            record['休憩時間計算']['value'] = moment.utc(result).format('HH:mm');
        }
        return event;
    });
```

###保存時アクション
最初の

```javascript:sample.js
    // レコード保存時休憩時間計算
    kintone.events.on(["app.record.edit.submit"], function(event){
    });
```

というのは、編集から、保存実行時の場合、というkintoneのお作法的コードですが、editなので、新規作成時はこのプログラムは動作しません。新規作成、編集時、問わず、動作させたい場合はこんな感じ。

```javascript:sample.js
    // レコード保存時休憩時間計算
    kintone.events.on(["app.record.create.submit","app.record.edit.submit"], function(event){
    });
```

###計算

```javascript:sample.js
        // 休憩開始と終了が入っていれば計算する
        if(record['休憩開始']['value'] !== undefined && record['休憩終了']['value'] !== undefined){
            const timeFrom = moment(record['休憩開始']['value']);
            const timeTo = moment(record['休憩終了']['value']);
            let result = timeTo.diff(timeFrom);
            record['休憩時間計算']['value'] = moment.utc(result).format('HH:mm');
        }
```

「休憩開始」と「休憩終了」に値があることを確認した上で、それぞれconst定義に詰め込んで、diffを取っているだけですね。この場合は、休憩時間の計算なので、1日跨ぎとかは仕様としてあり得ませんので、フォーマットは「HH:mm」にしてあります。
oracle procedure 

oracle procedure (無名ブロック) についていろいろ（文句）を書く！

1.構造のみだけはダメ！

```sql
DECLARE /*宣言セクション */

BEGIN /*実行可能セクション */

EXCEPTION /*例外セクション */

END;
/
```
これ、エラーになる。以下の最小限ソース、それぞれのセクションの中、なんかしらの処理が必要。

```sql
DECLARE /*宣言セクション */
    ddate date;
BEGIN  /*実行可能セクション */
    select sysdate into ddate from dual;
EXCEPTION  /*例外セクション */
    when others then
    dbms_output.put_line('エラー発生！！');
END;
/
```
if 文もそう

```sql
IF (condition) THEN

END IF;
```
だと、エラーになる。

```sql
IF (condition) THEN
    dbms_output.put_line('TARGET!');
END IF;
```
は大丈夫。

2.デフォルトはログ出力しない。

```sql
dbms_output.put_line('エラー発生！！');
```
出力は何もしない。
毎回 google が、[https://www.projectgroup.info/tips/Oracle/Oracle_000012.html](https://www.projectgroup.info/tips/Oracle/Oracle_000012.html) に解決方法がある。

```sql
SET SERVEROUTPUT ON;
```
をやらないとダメ。。。。。

```sql
DBMS_OUTPUT.ENABLE (buffer_size => NULL);
```
をやらないとダメ。。。。。の説もある。

3.動的SQL(結構面倒)
参考になるページ
[https://sql-oracle.com/?p=1468](https://sql-oracle.com/?p=1468)
[https://docs.oracle.com/cd/E16338_01/appdev.112/b56260/dynamic.htm](https://docs.oracle.com/cd/E16338_01/appdev.112/b56260/dynamic.htm)

4.エラーメッセージは糞。


付録（参考になったサイト）
[PL/SQL カーソルの実行方法メモ](http://onworks.s21.coreserver.jp/www.srv-shinra.com/wordpress/?p=702)
[PL/SQL で直前に実行したSQLの結果行数を取得する方法](
https://www.projectgroup.info/tips/Oracle/SQL/SQL000032.html)

付録２（比較的にいい例→何でもあり）
関数、動的SQLバインド変数更新、例外処理、カーソルクローズ、SQLエラー出力

```sql
--SET SERVEROUTPUT ON;

DECLARE 	/*宣言セクション */
	ddate date; -- テスト用、削除可

	PROCEDURE FUNC3(param VARCHAR2) IS
		RESULT_COUNT number;
		TYPE cur_typ IS REF CURSOR;  -- カーソル
		emp_cur cur_typ;
	BEGIN
		DBMS_OUTPUT.PUT_LINE('処理:'||param);

		EXECUTE IMMEDIATE 'update table1 set flag = ''1'' where XX_CODE = :XX_CODE' USING param;
		RESULT_COUNT := SQL%ROWCOUNT;
		dbms_output.put_line('RESULT_COUNT='||RESULT_COUNT);
	EXCEPTION
		when others then
	        -- 例外が起きた時も必ずcloseする
	        IF emp_cur%ISOPEN THEN
	            CLOSE emp_cur;
	        END IF;
			DBMS_OUTPUT.PUT_LINE(sqlcode);
			DBMS_OUTPUT.PUT_LINE(sqlerrm);
			RAISE;
	END FUNC3;

BEGIN   /*実行可能セクション */
	DBMS_OUTPUT.ENABLE (buffer_size => NULL);

	select sysdate into ddate from dual;
	dbms_output.put_line(ddate);

	FUNC3('aa');
	FUNC3('BB');

	COMMIT;

EXCEPTION    /*例外セクション */
	when others then
		ROLLBACK;
		RAISE;
END;
```

以上。
[Go]ElasticSearchの実行クエリをログ出力する

## モチベーション
GoからElasticSearchを操作するクライアントとして[github.com/olivere/elastic](https://github.com/olivere/elastic)がある。
実行時に展開される生queryをみたかった。以下のようにセットするとログ出力で確認できる。

## 
```sample.go
es, err := elastic.NewClient(
  // other option...
  elastic.SetTraceLog(log.New(os.Stdout, "[elastic-search]", 0)), // [elastic-search]はlog prefix
)
```

## 参考
https://github.com/olivere/elastic/wiki/Logging
JavaScriptでドット絵作成ツールを作ってみた

#JavaScriptでドット絵作成ツールを作ってみた
JavaScriptでドット絵作成ツールを作ってみました。作ってみた感想としては電卓の方が難しかった．．．
意外と少ないステップで完成します。



#作成手順
作成手順としては下記のようになります。

* 本の通りに作る
* マスを自由に作れるように改造する
* カラーピッカーを使用する

#マスを自由に作る
マスはテーブルで作りました。
HTMLにテキストを入力できるinputタグを使用し、そこからマス数を取得することで任意のマス数のテーブルを作成できるようにしました。
今思えば、縦と横は普通にheightとwidthで良かったなとこの記事を書いていて気付きました。
【JS】

```js
function dotTable() {
  let dotRow = Number(document.getElementById("vertical").value);
  let dotCell = Number(document.getElementById("side").value);
  for (let i = 0; i <= dotRow - 1; i++) {
    let row = dot.insertRow(-1);
    for (let j = 0; j <= dotCell - 1; j++) {
      let cell = row.insertCell(-1);
      cell.onclick = function () {
        this.style.backgroundColor = selectColor;
      }
    }
  }
}
```

#カラーピッカーを使用する
カラーピッカーはコード7区さんの記事を参考にしました。
使ったコードはたったこれだけ。inputタグでcolorを指定。HTML5で標準装備されたみたいです。
意外と簡単に設置できました。
【HTML】

```html
<input type="color" id="color-picker">
```

【JS】

```js
  $("#color-picker").on("change", function () {
    selectColor = $("#color-picker").val();
  });
```


#最後に
今回は主に本を参考にしたため、制作物や全てのソースコードは公開していません。
参考にさせていただいた方々、ありがとうございました。

#参考
いちばんやさしいJavaScript入門教室
[コード7区](http://ailaby.com/jquery_color/)
PowerShellコマンドを他の端末で遠隔実行させる方法

#背景
インフラ系の社内SEをしていると、ユーザーのPC上でPowerShellを叩かせたいということがよくあります。急ぎでなければログオンスクリプトでも良いのですが、ログオンスクリプトだと管理者の好きなタイミングで実行されないというデメリットがあります。遠隔でユーザーのPCのPowerShellを実行する方法を調べてみました。

#目的
他のPCのPowerShellコマンドを遠隔で実行する。

#前提条件
当然ですが、遠隔操作対象となるPCの管理者権限がある前提です。

#コードの解説
###1行目:
まず、実行したいコマンドを文字列として保存します。

```PowerShell
$command_str = '実行したいコマンド'
```

###2行目:
続いて、遠隔操作するPC名を指定します。

```PowerShell
$pc_name = '遠隔操作対象のPC名'
```

###3行目:
Invoke-Command　は他の端末を遠隔操作するためのコマンドです。
以下のようにPowerShellを打ち込むと実行コマンドが実行されます。
Invoke-Command $pc_name -ScriptBlock {実行コマンド}

ただ、↑の方法には1つ問題があります。
{}で括った中にはPowerShellで宣言した変数が利用できないのです。
例えば、以下のように入力しても\$pc_nameに対してpingを打ってくれません。
Invoke-Command \$pc_name -ScriptBlock {ping $pc_name}

その解決策が以下のコードになります。

```PowerShell
Invoke-Command $pc_name -ScriptBlock {invoke-expression $args[0]} -ArgumentList $command_str
```
{}に引数として１行目で作成した文字列化させたコマンドを渡します。
invoke-expressionで文字列化した$command_strを実行するという仕組みです。

#全体のコード
```PowerShell
$command_str = 'New-Item c:\tmp\test.txt -itemType Directory'
$pc_name = 'user_pc'
Invoke-Command $pc_name -ScriptBlock {invoke-expression $args[0]} -ArgumentList $command_str

```
Haskellで副作用をモックしてテストを書く

# Haskellで副作用をモックしてテストを書く

　どのような言語においても、テストを書こうと思ったときの悩みの種は、その9割方がIO等の副作用をどう扱うかだ。そしてその解決策は、DBへの接続や設定の読み込みなどをなるべく一か所に集め、その他の処理は純粋でテストしやすいよう維持するといったことである。
　上の問題と解決策は、純粋関数型言語であるHaskellでも変わらない。Haskellはその設計思想上テストを簡単に書くことができるといわれるが、純粋なコードと副作用を含むコードとを型で見分けることができるという大きなアドバンテージはあるものの、実際には副作用を含むコードのテストが困難なことに変わりはない。
　この記事では、Haskellで副作用の混ざったコードをいかにテストするか、特に`IO`モナドから副作用を切り出すことで、最終的にこれをモックしてテストを行う方法を紹介する。

## TL;DR

1. `IO`モナドをテストすることはできない
2. 型クラスを使って副作用を`IO`モナドから切り出す
3. 副作用をモックするモナドを作ってテストを書く

## IOモナドをテストすることはできない

　`IO`モナドは直観的には状態が`RealWorld`であるような`State`モナドであり、`RealWorld`は`main`を実行する際にプログラムを実行する側によって渡される。そのため、`RealWorld`の状態を変更するようなプログラム（＝副作用を伴う処理）をテストすることは不可能だ。
　それでは、例えば下の`prettyPrint`関数をテストしたいと思ったら、どのようにすればいいのだろうか。

```Haskell
prettyPrint :: MyObj -> IO ()
```

　はじめに思いつくのは、この関数内の`prettyPrintImpl :: MyObj -> String`な部分を切り出してきて、それをテストすることである。これで解決するならばそれがベストだが、例えば内部で設定を読み込んで出力方式を変えていたらどうだろうか？　副作用というものは導入するのは非常に簡単で、振り切るのは非常に難しいものだ。
　これを解決するために、`prettyPrint`の副作用を型クラスに切り出し、そのメソッドが使える任意の型を`prettyPrint`持つようにする。

## 型クラスを使って副作用を切り出す

　`prettyPrint`の持つ副作用がDBからの設定の読み出しと標準出力だとしよう。それぞれの副作用を、`MonadReadDB`と`MonadStdout`に切り出してみる。

```Haskell
prettyPrint :: (Monad m, MonadReadDB m, MonadStdout m) => MyObj -> m ()

class MonadReadDB m where
    readSettings :: m Settings

class MonadStdout m where
    putStrLnM :: String -> m ()
```

　次に、`IO`モナドでの実装を書く。副作用はここで`prettyPrint`から切り離される。

```Haskell
instance MonadReadDB IO where
    readSettings = readSettingsImpl

instance MonadStdout IO where
    putStrLnM = putStrLn
```

　これで`prettyPrint`は`IO`から切り離されてテスト可能な関数になった。
　余談だが、`pettyPrint`の呼び出し元を変更する必要はない。なぜなら、`prettyPrint`の呼び出し元は`IO`の文脈であるはずであり、`IO`の文脈で`prettyPrint`を呼び出せば自動的に上記`IO`の実装が選択されるからだ。

## テストのためにモックモナドを作ろう

　`MonadReadDB`と`MonadStdout`を実装したモナドさえ書いてしまえば、純粋な文脈で`prettyPrint`を実行することができる。
　モナドを自作するというと大仰なことに聞こえるが、ほとんどのケースでは簡単に作ることができる。
　ここでは、`prettyPrint`を実行できるモックモナドを次のように表現することにした。設定を`Reader`モナドから読み出し、出力を`Writer`モナドに書き出す、簡単な仕組みだ。

```Haskell
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

data Settings = Settings -- whatever you like

newtype MockT m a = MockT (WriterT String (ReaderT Settings m) a)
    deriving (Functor, Applicative, Monad)

runMockT :: MockT m a -> Settings -> m (a, String)
runMockT (MockT w) = runReaderT $ runWriterT w

runMock :: MockT Identity a -> Settings -> (a, String)
runMock = fmap runIdentity . runMockT

instance MonadTrans MockT where
    lift = MockT . lift . lift
```

　このモナドを使って、`MonadReadDB`と`MonadStdout`を以下のように実装する。

```Haskell
instance Monad m => MonadReadDB (MockT m) where
    readSettings = MockT $ lift $ ask

instance Monad m => MonadStdout (MockT m) where
    putStrLnM s = MockT $ tell $ s <> "\n"
```

　以上で`prettyPrint`のテストが書けるようになった。実際のテストでは以下のようにして`Settings`と引数を渡し、標準出力を得ることができる。

```Haskell
spec :: Monad m => m ((), String)
spec = flip runMockT Settings $
    prettyPrint "something1"
```

## まとめ

　Haskellでは、副作用を型クラスに切り出すことで副作用をモックすることができる。
　副作用が多数絡んだ関数はモックを行うのも大変だが、
それゆえ`IO`モナドを扱うときはなるべく副作用を意識して処理を分けて書くとよい。
Rails 基礎

###current_userメソッド
deviseでログイン機能を実装すると使えるようになるメソッド。
idが1のレコードの場合、User.find(1)と同じ意味を持ちます。
`current_user.name`などで値を取得できます。

ルーティングでユーザーごとに異なるページを表示するには普通とは違う記述方法を使います。

```routes.rb
get 'users/:id' => 'users#show'
```


whereメソッド
Active Recordの１つ
`モデル.where(条件)`で引数にとった条件に一致したレコードのインスタンスを配列型で取得できます。
条件を連続で記述すれば複数の条件にあったレコードを取得できます。

```
Sample.where('id < 3').where('user_id: 1')
```

####アソシエーション
モデル間の関係を定義することで、モデルを跨いだデータの呼び出しが簡単になります。
[漏洞通告]CVE-2020-9484/Apache Tomcat持久化Session反序列化远程代码执行漏洞

### 漏洞描述
Apache基金会发布安全通告修复了一个Tomcat的反序列化远程代码执行漏洞,如果Tomcat使用了session持久化功能,使用不安全的配置将导致攻击者可以发送恶意数据包造成远程代码执行.
成功利用此漏洞需要同时满足以下4个条件:

```
1.攻击者能够控制服务器上文件的内容和文件名称
2.服务器PersistenceManager配置中使用了FileStore
3.PersistenceManager中的sessionAttributeValueClassNameFilter被配置为“null”，或者过滤器不够严格，导致允许攻击者提供反序列化数据的对象
4.攻击者知道使用的FileStore存储位置到攻击者可控文件的相对路径
```
### CVE编号
CVE-2020-9484

### 漏洞威胁等级
由于该漏洞利用条件较为苛刻,亚信安全网络攻防实验室将其定为`中危`

### 影响范围
不受影响版本
Apache Tomcat 10.x >= 10.0.0-M5
Apache Tomcat 9.x >= 9.0.35
Apache Tomcat 8.x >= 8.5.55
Apache Tomcat 7.x >= 7.0.104

### 漏洞验证
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/671f6f3a-0747-9405-0d2d-946040f1507d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/f170575a-1378-ce41-4d26-28cc125b7707.png)

### 修复建议
1.升级Tomcat到如下版本
Apache Tomcat 10.x >= 10.0.0-M5
Apache Tomcat 9.x >= 9.0.35
Apache Tomcat 8.x >= 8.5.55
Apache Tomcat 7.x >= 7.0.104
2.禁止使用Session持久化功能FileStore

### 时间轴
[1] 2020/05/20 Apache基金会发布安全通告
[0] 2020/05/21 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://tomcat.apache.org/security.html
Vue.jsのcomputedとmethodsの違い(Vuexの話もちょこっと登場)レベル初心者

#初めに
JavaScriptを学び終え、Vueを学んでいると最初computedとmethods違いってなに？
という壁にあたることがあるあるだと思います。
まず一番の違いとして出てくるワードが**キャッシュ**かなと思います。
UIのデータ定義で使うdataプロパティについての話やVuexの話も含めて書いていきます。

#computed(算出プロパティ)
算出プロパティのキャッシュなんているワードがでてきますが、イメージ的には一度計算してくれて、再計算までデータの状態を保持してくれる。
これを利用して、コンポーネントで使うデータ定義をdataで書かずcomputedに持たせてあげる方法もあります。
※全く計算を行ってないデータをdataで定義せず、computedにデータを持たせて表示できますが、可読性が下がるのでやらないでください！


```HTML
<template>
  <div>
    <p>{{apple.price}}</p>
  </div>
</template>

<script>
export default {
  data(){
    return{
      apple: {
        price:100,
        number:3,
      }
    }
  }
};
</script>
```


可読性が下がるアンチパターン↓

```HTML
<template>
  <div>
    <p>{{apple}}</p>
  </div>
</template>

<script>
export default {
  computed:{
    apple:function(){
      return 100
    }
  }
  
};
</script>
```


detaで定義してあげたデータをthisを使ってcomputedから参照して、computedで計算してみましょう！

```HTML

<template>
  <div>
    <p>{{total}}</p>
  </div>
</template>

<script>
export default {
  data(){
    return{
      apple: {
        price:100,
        number:3,
      }
    }
  },
  computed:{
    total:function(){
      return this.apple.price * this.apple.number //300
    }
  }
  
};
</script>
```

計算処理を行った上でテンプレートに値を表示してますよね！そしてりんごの値段(apple.price)と個数(apple.number)が変化してお会計(total)が変化するまでキャッシュとしてデータの状態は保持してくれます！
※methodsはキャッシュをもってくれないので、methodsが呼ばれるたびに再計算されています。

##computedが再計算してれくない！？
computedはキャッシュしている依存するデータに対して変更があった時に再計算が必要になり、再計算をしてDOM側に反映(リアクティブ)してくれるのですが、再計算してくれない時があります。
その原因の一つとしてVueインスタンス内のデータではない、現在日時(Date.now())やDOMの状態といったVueインスタンス外とのやりとりはその値の変更を検知できないので、再計算が行われません。

##computed × Vuex(状態管理してくれるモジュール)
コンポーネントをデータをまたぐときに親から子どもに渡すときはpropsを使うと思いますが、コンポーネントをデータをまたぎまくって頭がスパゲティ状態になり、どんだけコンポーネントまたげばデータ渡せるんだよ。もう無理だ。なんて時にVuexを使うことになるんですが、
その時にもcomputedは活躍してくれます。stateやgetterからstoreを参照するときにcomputedから参照できますね！
コンポーネント内だけで使うデータ定義をdetaに書き、storeを参照する場合はcomputedに書いてあげれば、より綺麗なコードがかけると思います！
※Vueインスタンス内を一部抜粋しました

```javascript

  data() {
    return {
      apple: "りんご",

      orange: "みかん",
    };
  },
  computed: {
    Supermarket() {
      return this.$store.getters.Supermarket;
    },
    Convenience() {
      return this.$store.state.Convenience;
    },
  },

```

#methods(メソッド)
データの変更やv-on ディレクティブを使ってクリック時などイベントが起きた時にセットで使われることが多いのですが、
DOMの状態などをテンプレートから引数としてmethodsに渡しやすいのが特徴ですね。

##引数
computedsに書いた関数にもテンプレートから引数を渡すことは可能ですが、methodsに書いた関数に渡すことをお勧めします。
まずはmethodsに書いた関数に渡す方法の紹介です

```html
<template>
  <div>
    <button v-on:click="eat($event)">ボタン</button>
  </div>
</template>

<script>
export default {
  methods: {
    eat: function(event) {
      console.log(event.target); //<button>ボタン</button>
    }
  }
};
</script>
```

次にcomputedsに書いた関数に渡す方法の紹介です。
しかしなぜ引数を渡せているのか仕組みはわかりません。なんとなく書けちゃってます。ごめんなさい。
可読性が下がるであまり使わない方が良さげですね。

```html

<template>
  <div>
    <button v-on:click="eat($event)">ボタン</button>
  </div>
</template>

<script>
export default {
  computed: {
    eat: function() {
      return function(event){
        console.log(event.target); //<button>ボタン</button>
      }
    }
  }
};
</script>

```

テンプレートから引数を渡せるとv-forの中に関数を書いとおくと、今何番目にいるかもわかって便利ですね！


#まとめ
computedは**計算**、**再計算**、**キャッシュ**
methodsは**イベント**、**引数**

イメージするとこんな感じでしょう！