OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelのリレーション（hasOne、hasMany、belongsTo）

#はじめに
以前[正規化とは](https://qiita.com/yukachin0414/items/9f465e6c7c20635efcf6)で学んだように、効率よくデータを扱うためデータを一定のルールに基づいてテーブルを変形し整理しましたが、分割したテーブルにある内容を1つのviewで表示するための手続きについてまとめます。
<img width="486" alt="スクリーンショット 2019-12-08 17.19.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/29681291-08c4-6df6-5967-e58112ed1be6.png">
テーブル同士にリレーションを持たせることにより、例えば【people】テーブルと【lendings】テーブルの内容を1つのviewで表示できます。

#Laravelのリレーションの種類
Laravelではテーブルに対応したModelを定義することにより、関連を明示することでデータをうまく扱うことができます。
テーブル同士の関連の種類は、1対1、1対多、多対多、その他にも関係の構文があります。

#hasOne（1対1）について
hasOneは主テーブルのあるレコードに対して、従テーブルの1つのレコードが紐付けられるときに用いられます。
<img width="486" alt="スクリーンショット 2019-12-08 18.32.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/f5df7ae9-e435-af69-2ec7-e27bd454cef0.png">

例えば上記のような場合です。
主テーブルのある人に対して従テーブルのパスポート情報は1つしか持ちません。

###hasOne（1対1）の記述について
```php:models/Person.php
public function lending()
{
  return $this->hasOne('App\Models\lending');
}
```
```php:person/index.blade.php
{{$item->passports->getData()}}
```

#hasMany（1対多）について
hasManyは主テーブルのあるレコードに対して、従テーブルの複数のレコードが紐付けるときに用いられます。
<img width="486" alt="スクリーンショット 2019-12-08 17.19.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/0e1f80e2-a0df-133f-d327-35f828283768.png">
例えば上記のような場合です。
主テーブルのある人に対して従テーブルの貸出情報は複数もちます（もつ場合もあります）。

###hasMany（1対多）の記述について
```php:models/Person.php
public function lendings()
{
  return $this->hasMany('App\Models\lending');
}
```
```php:person/index.blade.php
@foreach ($item->$lending as $obj)
  <tr>{{$obj->getData()}}</tr>
@endforeach
```

#belongsToについて
belongsToは従テーブルの複数レコードに対して、主テーブルの1つのレコードが紐付けるときに用いられます。
*※hasOneやhasManyは主テーブルから関連する従テーブルのレコードを取り出すものでしたが、belongsToは逆に従テーブルから関連する主テーブルのレコードを取り出すものです。
<img width="486" alt="スクリーンショット 2019-12-08 17.19.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/0e1f80e2-a0df-133f-d327-35f828283768.png">
例えば上記のような場合です。
従テーブルの複数の貸出情報に対しては主テーブルのある人をさします。

####belongsToの記述について
```php:models/lending.php
public function person()
{
  return $this->belongsTo('App\Models\Person');
}
public function getData()
{
  return $this->id.'： ' .$this->person->name.' 貸出日:'. $this->id;
}
```

#おわりに
正規化したデータをリレーションによって関連付けすることに整理されたまま扱えますね。
データ分析　概要　python

今回は機械学習の勉強のアウトプットとして、書かせていただきます。

#内容
・用語解説
・ツールとその使い方

##データ分析とは
顧客情報や投資でよく使われるチャートなどのデータを用いて、過去の情報をグラフなどで可視化して傾向をつかんだり、回帰などを用いてデータの未来予測をすることです。


##よく使われるツールとその特質
データ分析でよく使わるツールとしてはjupyter notebookがよく使われます。
特質としては以下の通りです。
・ブラウザ上で起動
・インタラクティブ(対話型)
・データの可視化が簡単にできる

##データ分析をするうえで
データ分析をするうえで気を付けておくべきこととしては
・データの外枠(概要)を把握すること
・データが綺麗すぎたらそのデータを疑うこと
・地道に行くことが大事(急がば回れ)

##jupyter notebookの基本的な使い方
jupyter notebookはコマンドモードと編集モードで分かれている
コマンドモード・・・セル(コードを打ち込む欄)を選択していない状態
　　　　　　　　　　 このモードで「h」を押すとhelpが参照できる
編集モード　　・・・セルを選択している状態、プログラムを打てる状態
                  「b」を押すと新しいセルを生成する
　　　　　　　　　　「d」を二回押すと選択中のセルを消去できる
　　　　　　　　　　「shift+Enter」で実行
　　　　　　　　　　 セルの上のメニューのキーボードの隣の欄から
　　　　　　　　　　 markdownを選択すればコメントアウトのようにメモ書きできる

##基礎分析について
基礎分析とはデータをおおまかに把握することです。詳細としては
・データを簡単に見てみる
・データを少し掘り下げてみる
・グラフ化する
・欠損地を確かめる
・データの関連を調べる(相関関係)

###基礎分析を怠ると
・データの不足ですべてやり直しになったり
・間違ったデータを挿入して、本来の結果と違う結果になってしまう
Djangoでwebサービスを作ってみた振り返り2

Djangoでwebサービスを作ってみました。完成はしましたが、ふんわりやっていたところを再度調べました。

#views.pyで使ったあれこれ

##クラスビューで使ったもの
例：

```views.py
class ThreadView(ModelFormMixin, generic.DetailView):
	model = Group
	form_class = CommentCreateForm

	def form_valid(self, form):
		group_pk = self.kwargs['pk']
		comment = form.save(commit=False)
		comment.create_user = self.request.user
		comment.post = get_object_or_404(Group, pk=group_pk)
		comment.save()
		return redirect('<app名>:group_thread', pk=group_pk)
		
	def post(self, request, *args, **kwargs):
		form = self.get_form()
		if form.is_valid():
			return self.form_valid(form)
		else:
			self.object = self.get_object()
			return self.form_invalid(form)
```
###form.save(commit=False)
formに紐ついたModelオブジェクトのインスタンスを返す。DBに登録はしない

##関数ビューで使ったもの
###returnの後に続くページ遷移メソッド
renderとか使いましたが、使い分けまとめ

####HttpResponse
文字列やイテレータを引き渡す(と、公式に書かれていますが使っていないのであまりイメージできていない。。)

####render
renderメソッドは、基本的にrequest、template_name、contextという3つの引数を取る。
request：getかpostか
template_name：htmlファイル
context：DBに入っているデータの情報
公式ドキュメントの説明では、
『テンプレートをロードしてコンテキストに値を入れ、テンプレートをレンダリングした結果を HttpResponse オブジェクトで返す』

####redirect
POSTで返って来たデータを破棄して違うviewに遷移させる
【R】ggplot2でよく使う省略表記について、lty, lwd

Rはデータ分析者のおともだち。
だが、書籍やwebの情報は意外とディティールの情報が不足しがち。

省略表記はその１つ。

ggplot2で使う省略表記、lty, lwd
---
[戦略的データサイエンス入門 ―ビジネスに活かすコンセプトとテクニック](https://www.amazon.co.jp/dp/4873116856/ref=cm_sw_r_tw_dp_U_x_PWl7Db3SX34M1)
この本の第４章のRコードに下記のようなものがある。


```test.R
duid$log_date<- as.Date(duid$log_date)
limits<- c(0, max(duid$dau))
ggplot(duid,
       aes(x=log_date, y=dau, col=device_type,lty=device_type, shape=device_type))+
      geom_line(lwd=1)+
      geom_point(size=4)+
      scale_y_continuous(label=comma, limits=limits)
```


4行目の lty は　linetype
5行目の lwd は　linewidth

ぶっちゃけこれだけのことだが、説明が省かれていることが多い印象を受ける。
そりゃ色々値を差し替えれば気づくけどね。

そういうとこやぞ。

---
#### 随時更新予定
アコーディオンを自作する

# 始めに
アコーディオンはjQueryだと`slideToggle`が優秀でこれを使えばいいですが、Vue.jsとかではどうやったらいいか悩むことがあるかもしれません。
幸いVue.jsには`vue-slide-up-down`というライブラリがあるのでこれを使えばいいかもしれませんが、もし自作をする場合はどうやって実装するかをまとめたいと思います。
（僕も最初は知らなくて自作してました・・・）

https://www.npmjs.com/package/vue-slide-up-down

# 実装方法
## 開く処理
前提として、アコーディオンの高さは`0px`にして、`overflow: hidden`も設定しておきます。これをしないと中身が見えちゃいますので（汗）。
この状態で以下の手順を踏んで開くアニメーションをします。

1. コンテンツの高さ(図ではelContent)を取得して、その値を親にセットする
2. CSS transitionで目標の値までアニメーションする
3. アニメーション終了後スタイルをリセットする（リセットしないと開いた後にサイズが変更しても調整されなくなってしまいます）

![0bf0edc2-a0fc-4043-b697-d9b31354bc14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/c6d0110e-aa86-2946-6bcd-26f0a2e4dfd7.jpeg)

## 閉じる処理
閉じる場合は以下のような手順を踏みます。ワンテンポ置くというのはVue.jsのtransitionと同じ発想で、activeに初期値をセットし、toで目標の値をセットするやり方と一緒です。

1. アコーディオン全体の今の高さを取得し、その値をセットする。**その後ワンテンポ置いてから0pxをセットする。**
2. CSS transitionで0pxに向かってアニメーションされる
3. 閉じた場合はスタイルのリセットは行わない（リセットすると中身が見えてしまうため）
![f0ff08f0-41c0-47bf-a650-5e92738922f3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/cdfffd8e-4aa7-8934-3557-1dcca9a16adc.jpeg)

## まとめ
まとめると、以下のようなコードになります。
コンポーネント化しているので、開閉のタイミングはwatchで監視しています。

```javascript
const Accordion = Vue.extend({
  props: {
    isOpen: Boolean,
  },
  data() {
    return {
      heightStyle: this.$props.isOpen ? '' : '0px',
      isOverflow: !this.$props.isOpen,
    };
  },
  watch: {
    // 開閉フラグの監視
    '$props.isOpen'(isOpen) {
      this.$data.isOverflow = true;
      // 現在の高さを設定
      this.$data.heightStyle = `${this.$refs.elAccordion.clientHeight}px`;
      // ワンテンポおいてから目標の高さを設定するが、$nextTickだとうまくいかないのでsetTimeoutに変更
      window.setTimeout(() => {
        this.$data.heightStyle = isOpen ? `${this.$refs.elContent.clientHeight}px` : '0px';
      }, 10);
    },
  },
  methods: {
    // アニメーション終了時
    onTransitionEnd() {
      // 開いたときは高さとoverflowの設定を解除する
      if (this.$props.isOpen) {
        this.$data.heightStyle = '';
        this.$data.isOverflow = false;
      }
    },
  },
  template: `
    <div
      ref="elAccordion"
      class="accordion"
      :style="{
        height: $data.heightStyle,
        overflow: $data.isOverflow ? 'hidden' : '',
      }"
      @transitionend="onTransitionEnd"
    >
      <div
        ref="elContent"
      >
        <slot></slot>
      </div>
    </div>
  `,
});
```

# 終わりに
以上がアコーディオンを自作する場合の方法でした。
最後にサンプルコードを置きますので、詳しい実装はこちらを参考にしてみてください。

<p class="codepen" data-height="445" data-theme-id="default" data-default-tab="js,result" data-user="wintyo" data-slug-hash="yLyNgam" style="height: 445px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="アコーディオン">
  <span>See the Pen <a href="https://codepen.io/wintyo/pen/yLyNgam">
  アコーディオン</a> by wintyo (<a href="https://codepen.io/wintyo">@wintyo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
reduceの使い方

この記事は, [Lisp Advent Calendar 2019](https://qiita.com/advent-calendar/2019/lisp)の11日目の記事です.

この記事のライセンスは[CC-BY](https://creativecommons.org/licenses/by/4.0/deed.ja)とします.

この記事は, [10日目の記事](https://qiita.com/MYAO/private/d8a7d52e53b9e23dea67)の補足になるかもしれない小ネタ記事です.

reduceの使い方の指針について触れます.

使用プログラミング言語は, Common Lispです.
が, JavaScriptの`reduce`, `reduceRight`や, Haskellの`foldl`, `foldr`とかも同じだと思うので, もしかしたら参考になるかも.

## 再掲 10日目の補足 andの展開形

各処理系の実装は参考にしてないけど, 展開系は参考にしました. [^sbcl-and]

```common-lisp:repl
CL-USER> (macroexpand '(and))
T
T
CL-USER> (macroexpand '(and a))
(THE T A)
T
CL-USER> (macroexpand '(and a b c))
(IF (IF A
        B)
    C)
T
```

`THE`は無視して, `A`は, `(IF T A)`だと思うと,

```common-lisp:expanded
(IF (IF (IF T A) B) C)
```

この形を見ると, `reduce`で処理できることが分かります.

[^sbcl-and]: SBCL 1.5.9

## reduceの使い方 より具体的にのその前に

reduceの使い方の指針を示す前に, 以下の関数を定義しておきます.

```common-lisp:reduce-sample.lisp
(defun snoc (list elt)
  (append list (list elt)))
```

これを使うと, リスト`(1 2 3)`は, 以下の2パターンで書けます.

```common-lisp:repl
CL-USER> (snoc (snoc (snoc nil 1) 2) 3)
(1 2 3)
CL-USER> (cons 1 (cons 2 (cons 3 nil)))
(1 2 3)
```

### reduceの使い方

上のパターンの,

```common-lisp:repl
CL-USER> (snoc (snoc (snoc nil 1) 2) 3)
(1 2 3)
```

について, この式の`snoc`をある関数`func`, `nil`をある値`z`と入れ替えたような形,

```common-lisp:code
(func (func (func z 1) 2) 3)
```

で書ける場合は,

```common-lisp:reduce-sample.lisp
(reduce #'func '(1 2 3) :initial-value z)
```

とreduceで書けます.

### reduce (from-endオプションがt)

逆に, 下のパターンの,

```common-lisp:repl
CL-USER> (cons 1 (cons 2 (cons 3 nil)))
(1 2 3)
```

について, この式の`cons`をある関数`func`, `nil`をある値`z`と入れ替えたような形,

```common-lisp:code
(func 1 (func 2 (func 3 z)))
```

で書ける場合は,

```common-lisp:reduce-sample.lisp
(reduce #'func '(1 2 3) :initial-value z :from-end t)
```

と`:from-end`オプションが`t`のreduceで書けます.

## まとめ

reduce難しくないよ.

この記事中の例で使ったリスト`(1 2 3)`は適当に自分が使いたい場合に読み替えて使ってください.

あと, 数学が好きな人はcatamorphismとか調べてみると幸せになれるかもしれません. [^catamorphism]

[^catamorphism]: 著者もあんまりちゃんとは分かってないので, 優しく教えてくれる人が居ると嬉しい.
Rubyでoptparserの使用方法【備忘録】

# 背景
現場で使うことがあったので備忘録として

# optparseとは
バッチなど.rbファイルを実行(ruby test.rb等)するときオプションを追加できる。

# 使い方
### ●一例
```ruby:test.rb
require 'optparse'

opt = OptionParser.new
opt.on('-a', 'add option -a') do # onメソッドでハンドルすべきオプションを設定
  puts 'Add -a option'
end

opt.parse!(ARGV)
```

```
$ ruby test.rb -a
Add -a option # 出力
```

onメソッドでは
`on(short, long, desc = "") {|v| ... }`
`on(short, desc = "") {|v| ... }`
`on(long, desc = "") {|v| ... }`
上記のような形で指定可能で

shortには `'-a'`や `'-D'`等を指定
longには `'--add'`や `'--delete'`等を指定
descには--help オプションを指定して実行した場合に表示される説明文を設定する。

```:--helpオプション指定
ruby test.rb --help
Usage: test [options]
  -a                               add option -a
```

最後にparse!(ARGV) を実行すると、指定したオプションに一致するブロックが実行される。

#### ●オプションにパラメータを指定することも可能

```ruby:test.rb
require 'optparse'

opt = OptionParser.new
opt.on('-a v', '--add v', 'add param') do |v| #パラメータを指定
  puts "Add #{v}"
end

opt.parse!(ARGV)
```

```
$ ruby test.rb -a foo
Add foo
$ ruby test.rb --add bar
Add bar
```

##### ※注意点
理由はよくわかっていないが

```ruby:test.rb
opt.on('-a', '--add', 'add param') do |v| #パラメータを指定
  puts "Add #{v}"
end
```

`'-a'` などの後にパラメータを指定しなかった場合、boolean型が返ってくるので注意

# 最後に
ざっくりと簡単なコードだけ説明していきました。
optparseを使うことでプログラム実行するときにオプションが指定でき、可変に実行することが出来ます。
signal: broken pipe が解消されないときはGoのバージョンも関係してるかも

こんにちはこんにちは
本記事は`signal: broken pipe`について調べた記録。

自分がハマった環境は以下。

```
❯ go version
go version go1.11.4 darwin/amd64
```

次のようなコードを書き、パイプで別プロセスにつなげる。
パイプ先が終了すると`signal: broken pipe`と表示される。

```golang
package main

import (
	"fmt"
)

func main() {
	for {
		fmt.Println("hello")
	}
}
```

```
❯ go run main.go | head -n 1
hello
signal: broken pipe
```

この挙動自体は[ドキュメント](https://golang.org/pkg/os/signal/#hdr-SIGPIPE)に書いてある。

> If the program has not called Notify to receive SIGPIPE signals, then the behavior depends on the file descriptor number. A write to a broken pipe on file descriptors 1 or 2 (standard output or standard error) will cause the program to exit with a SIGPIPE signal. A write to a broken pipe on some other file descriptor will take no action on the SIGPIPE signal, and the write will fail with an EPIPE error.

またsignal.Ignore()という関数もあるので、[こちら](https://qiita.com/Maki-Daisuke/items/fbb514acc7bb8cf4a36b)を参考にしながらパイプ先が閉じても`signal: broken pipe`を出さないようにしてみる。

```golang
package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

func main() {
	signal.Ignore(syscall.SIGPIPE)
	for {
		_, err := fmt.Println("hello")
		if err != nil {
			if e, ok := err.(*os.PathError); ok && e.Err == syscall.EPIPE {
				break
			} else {
				panic(err)
			}
		}
	}
}
```
```
❯ go run main.go | head -n 1
hello
signal: broken pipe
```
あれ？変わらない。

ぐぐってみると、次のIssueが見つかった。
[runtime: signal.Ignore(syscall.SIGPIPE) does not work as documented · Issue #32386 · golang/go](https://github.com/golang/go/issues/32386)

どうやら[SIGPIPEを無視する場合の考慮が漏れていた模様。](https://github.com/golang/go/commit/0c75eb824ca7ca41970c2265ad1bccb82bbb408f)

Go 1.13.4には上記修正が含まれているようなので、Goのバージョンを上げて再度試す。

```
❯ go version
go version go1.13.4 darwin/amd64
```
```
❯ go run main.go | head -n 1
hello
```

おけ。

## おまけ(その1)
Go 1.13であれば errors.Is()が使えるため、もう少しシンプルに書ける。

```golang
		_, err := fmt.Println("hello")
		if err != nil {
			if errors.Is(err, syscall.EPIPE) {
				break
			} else {
				panic(err)
			}
		}
```
## おまけ(その2)

Go 1.11.4ではどうしたらいいか？
signal.Notify()で受け無視することで、とりあえずの対処はできそう。

```golang
package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

func main() {
	c := make(chan os.Signal, 1)
	signal.Notify(c, syscall.SIGPIPE)
	go func() {
		<-c // ignore
	}()

	for {
		_, err := fmt.Println("hello")
		if err != nil {
			if e, ok := err.(*os.PathError); ok && e.Err == syscall.EPIPE {
				break
			} else {
				panic(err)
			}
		}
	}
}
```

## 参考
* [Go で "broken pipe" を無視したい僕達がハマる罠 - Qiita](https://qiita.com/Maki-Daisuke/items/fbb514acc7bb8cf4a36b)
* [pipeエラーのハンドリング - Carpe Diem](https://christina04.hatenablog.com/entry/pipe-error-handling)
* [signal - The Go Programming Language](https://golang.org/pkg/os/signal/#hdr-SIGPIPE)
* [runtime: signal.Ignore(syscall.SIGPIPE) does not work as documented · Issue #32386 · golang/go](https://github.com/golang/go/issues/32386)
人の話を深掘りするには

#経緯

　本日、スクールでチーム開発を円滑に進めるための議論の仕方について学びました。
　第一弾は、「相手の話を深掘りするにはどうすれば良いか」とういうテーマで、
　なるほどなーと思ったので、備忘録としてまとめます。

##相手に興味をもつ

　これは、一番大事。そもそも興味がなかったら、質問も思いつかない。

##気になったワードやそれに関連するワードについて聞く

　言葉の定義や、関連ワードについて聞く。
　「昨日、彼氏とフランス料理食べに行ったんだ〜」と友達が話した時に、
　「フランス料理」「彼氏」というワードを深掘る。

　また、関連したワードについては、例えば気になったワードが「フランス料理」だったら、
　他のジャンル料理（イタリアン、和食とか）という感じで話を広げる。



##相手の考えの理由を聞く

　・どうしてそう思うか。
　・そう思ったきっかけは？
　・根拠は？（記事や誰かから聞いたのか。）

　という風に聞くことで、もっと深く考えを理解できる。


##それを実行したらどうなるのかを聞く

　これから開発したいアプリや、夢について話てくれた際には、それができたらどうなるのか、について聞く。
　そうすることで、これからやるべきことをより具体的に考えられるようになる。

##その他

　深掘りと、少しずれますが、議論をする際には、
　・議論する前に、テーマについてメンバー各自で自分の意見をメモ書きし、考えをまとめる。
　・時間を決めて議論する。

　ということが大事だということも併せて学びました。
Nuxtで yarn dev した時のデフォルトのポート番号を変更する

`yarn run dev` もとい `yarn dev`はデフォルトで`3000`のポートを取ろうとするけど、そちらは既にRailsの方で使っていることがあるので適当に開いてるポートでサーバーが建てられてしまい少しめんどくさい。

### 常に5000番で立ち上げるように設定

`nuxt.config.js`でポート番号を指定してあげましょう。

```nuxt.config.js
export default {
  server: {
    port: 5000
  },
  //...
}
```
### 参考
https://nuxtjs.org/faq/host-port/
キャッシュレス決済ってつかってますか？

ポイントを貯めたり使ったりしてお得にしようという活動（ポイ活）がまきおこってますが、キャッシュレス決済になるとなにかいいことがあるのでしょうか？

#追い風のキャッシュレス決済

経済産業省が導入を推進しており、国が普及を後押ししています。

- 消費税率引上げ後の9カ月間に限り（2020年6月末まで）、中小・小規模事業者によるキャッシュレス手段を使ったポイント還元を支援する「キャッシュレス・消費者還元事業」を実施（対応店舗でのキャッシュレス利用で2～5%を還元）

- さらに。令和２年には次のポイント還元としてマイナンバーカードを活用した消費活性化策を検討中です
一定額を前払い等した者に対して、マイナンバーカードを活用したポイントである「マイナポイント」を国で付与するもの。ポイントの購入条件、購入対象者、プレミアム率、ポイントの利用環境や使途、有効期限等、具体的な内容は現在検討中（マイナポイント：　https://mynumbercard.point.soumu.go.jp/promotion/）

経産省のポイント還元公式アプリまであります。
![logo_consumer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92225/3ebdfb7d-f0e9-75d6-434e-4c3645702622.png)
(ポイント還元事業 : https://cashless.go.jp/consumer/index.html )


#国が後押しするのはなぜ？
経産省キャッシュレスビジョンより

1. 世界的にキャッシュレスの流れが加速し、「各国ではデジタル革命に伴う、通貨改革から生まれた『キャッシュレス文明』が興りつつある」とも形容すべき状況の中で、日本だけが取り残されてよいのかという問題意識。

2. キャッシュレス社会、すなわちデジタルな手段で支払が行われ、そこで生み出されたデータを利活用することにより、国全体の生産性が向上し、実店舗等、消費者、支払サービス事業者がそれぞれ付加価値を享受できる社会の実現が求められる。

3. 諸外国において、キャッシュレスはインバウンド、アウトバウンド、越境取引へとその範囲を拡大。この範囲の拡大は、データ利活用にも繋がる動きであり、利用可能なデータのあるところがマーケットとして認知されるといった変化も起こりうる。我が国のデータ利活用に向けた整備が不十分な場合、マーケットとして認知されず、また、国際的な標準化活動や連携活動からも取り残される可能性も否定できない。

（https://www.meti.go.jp/press/2018/04/20180411001/20180411001-2.pdf）

ようするに日本はかなりおくれているということですね。。。

#キャッシュレスといえば？
Suicaなどの電子マネー、クレカ、デビットカードも含まれるのでキャッシュレス自体は目新しいものではありませんが、最近どこでもみかけるようないなったQRコード決済（ID決済ともいう）が今どきですよね。
なかでも、PayPayはオフィスグリコや、お弁当の出店などでも、あちこちで送金のQRコードをみかけるようになりました。
![img_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92225/f6b31b48-b73f-a2ca-8678-aa4d2e41064c.png)
1日のアプリ起動ユーザー数が900万人を突破など破竹のいきおいです！

#でも手数料とかとられるのでは？
クレカの年間費や、ATMで現金引き出し手数料のような費用は一切ありません。
さらに、導入している店舗側でもトランザクションフィーなどの決済手数料もPayPayは３年間無料です。

PayPayは買い物しやすい環境を提供し、普及させることにより、

 - 利用ユーザーを増やし囲い込む（PayPayなれてそれ以外の支払い方法が面倒になるユーザーを量産）
 - 利用データを分析に利用するなど、将来的にビックビジネスになる
 
をみこして投資しているのです。国の狙い（２番）どおり手数料ビジネスからシフトしているのでしょうか。。

PayPayもリアル店舗では普及している様子を体感できますが、ECサイトではまだあまり一般的ではないようにおもわれます。

#そんなに一押しなら自社ECサイト導入したいんですけど？
EC-CUBEにも、専用プラグインや、GMOなどの決済代行プラグインの選択肢にもいまのところありません。
PayPayはYahooショッピングではつかえますが、一般サイトではまだ利用できないようです。

LinePayはAPIが提供されているため、自力であれば実装も可能です。(店舗側でトランザクションフィーは発生します)
![linecheckoutflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92225/8cdb9592-ea45-7ccf-6a9e-e97506f78822.png)
(linecheckout : https://linecorp.com/ja/pr/news/ja/2019/2807 )
仕組みとしてはLineアプリ側に決済をわたしてしまうため自社ECに完全に組み込むイメージにはなりませんが。。。

キャッシュレス決済（QRコード決済（＝ID決済））はリアル店舗に普及が着実にすすんでいるので、ECサイトにも流れがきますね。

いち早く導入せねば。。。
Notionには3つのコメントがある

[アルプ株式会社](https://thealp.co.jp/)でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2019](https://qiita.com/advent-calendar/2019/notion) 8日目のエントリです。
7日目は[Notionで数式を書く](https://qiita.com/pictiny/items/29c023fb0eb79cbac656)でした。

# コメント機能
Notionはコンテンツに対してスレッド形式でコメントを追加できる機能があります。
Microsoft Wordのコメント機能に代表されるような、一般的なコミュニケーションツールだと思います。

Notionにはコメントが3種類あるので、それぞれのコメントについてご紹介します。

## ページコメント

ページに対してコメントができます。1ページに1スレッド存在します。
スレッドはページタイトルとページコンテンツの間に表示されます。

<img width="741" alt="ページコメント1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/98e6a106-c7f5-5b46-bd94-f604a739b289.png">

コメント欄がない場合には、上部の**Add Discussion**を押すと表示されます。

<img width="436" alt="ページコメント2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/9b6b1b1c-f075-b6fa-86cd-b1180fdbc9a1.png">

ページコメントは3つの中で一番強いコメントです。
コメントが多くなってくると表示スペースを取ってしまうので、基本的には使わない方がよいでしょう。

## ブロックコメント

ブロックに対してコメントができます。1ブロックに1スレッド存在します。
ブロック左部のブロックメニューからコメントができます。

<img width="524" alt="ブロックコメント1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/dddf4014-7f4a-55b4-08f6-d88a548da537.png">

もしくは、文中の`/Comment`コマンドからもブロックコメントが追加できます。

<img width="506" alt="ブロックコメント2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/f24777cd-3286-346a-a5bc-29f56ba71ad5.png">

コメントを追加すると、ブロック右部にコメントアイコンが表示され、クリックするとスレッドが表示されます。

<img width="828" alt="ブロックコメント3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/4d9ff816-e24a-4e8d-f133-e7a904189b66.png">

ブロックコメントは、ブロックの内容が変更されてもブロックが消えない限り残り続けるので、一番おすすめです。
ただしコメントしたことが目立ちにくいので、気付いて欲しいユーザーがいるときにはコメントでメンションをしておくとよいでしょう。

## 文中コメント

テキストブロックの、任意の文字列に対してコメントができます。任意の文字列1つにつき1スレッド存在します。
文字列を範囲選択したとき上部に表示されるメニューからコメントができます。

<img width="502" alt="文中コメント1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/48d5baff-f299-08a3-b150-a7bd374bdaf5.png">

コメントされた文字列は黄色い修飾がされます。修飾された文字列をクリックすると、スレッドが表示されます。

<img width="547" alt="文中コメント2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/c0ebdf03-b74d-9ada-e360-0cd7c4f3265f.png">

文中コメントは目立ちますが、文字列を編集するとスレッドが辿りにくくなってしまうので注意しましょう。
ブロックコメントと文中コメントのスレッドは**Resolve**のボタンがあり、議論が終了したら意図的に非表示にできます。

# まとめ
コメントに関する公式ドキュメントは[Mentions, discussions & comments](https://www.notion.so/Mentions-discussions-comments-3f4aa425e0ae44989247f30e08158b41)にありますので、そちらもご覧ください。
やらかしまくった一人プロジェクトの経験談

#はじめに

この記事は、Qiita芸人 Advent Calender8日目の記事です！

過去の経験談です。
自戒の意味も込めて書きたいと思います。

#スペック
エンジニア歴約3年
業務でのWEB開発の経験無し
C言語やC++で組み込み系や業務系の開発を2年、JavaでAndroidアプリを半年ほど。
プロジェクト参画前、PHPは事前に「独習PHP」を一通りやったくらいしか触った経験がなかった。

#当時の開発時の状況や前提についてざっくり説明
・PHPのバージョン: 5.0系
・推奨ブラウザ: IE8
・エディタ： サクラエディタ
・VPN接続
・開発環境と本番環境が一緒
・バージョン管理: 無し
・別の会社からコードの保守権限を受け取り開発の中身や知見を知ってる人が他にいない
・一人プロジェクト(一応スケジュール管理だけするなんちゃってPMがいた)

#自分がやったこと
###開発環境を整える
・Git導入
・VSCode導入

###ソースコードを一通り読んで作りをざっくり理解する
・ModelBean、ViewBeanって"bean"を多用してたので恐らく前任者がJavaをメインでやってたのかなといった作りになってた。
・MVCの概念で作られてた。
・HTMLにPHP埋め込みはなかった。(これのおかげで仕組みを理解するのは難しくなかった)
・コメントが丁寧

###シーケンス図を書く
PlantUMLでざっくりシーケンス図を書きました。

###要件確認(RD)
やりたいことはまあなんとなくわかった。

###設計(SS)
正直、中のソースコードをまだ理解しきれてなかった段階での設計だったので考慮漏れが多数発生したグダグダな設計だった。
→ここから地獄は始まる・・・

###クソコードを製造(PG)
基本的に自分はコーディングする時、機能実現を優先するのだが思ってる以上に設計がグダグダだったので探り探りのコーディングになってしまった・・・
自分が一番システムについて理解しているという現状なので聞ける人もおらず、そのまま開発は進む。。。
開発の段階で結構手戻りとか設計漏れが発生し、コーディングを必死にやりつつ少しずつ先に進みはするものの刻々と時間は過ぎ、納期が近づいてくる・・・

具体的にどんなコードを書いてたのかは別記事で紹介しようと思ってます。
PHP Advent Calenderの14日目の記事で公開予定。。。
https://qiita.com/advent-calendar/2019/php

###コードレビュー無しでテスト工程へ・・・
これが一番やばかった・・・
自分は納期もあるし、後半の時点で既に開発の時間の締め切りが近づいてて余裕がなかったため、コードをちゃんと書けてる自信がないのでレビューをして欲しかった。

お願いした時のやりとり
わい「コードレビューして欲しいです、お願いできませんか？」
PM「いや俺、C#しか書けないしPHPは分からんわ」
わい「(⌒,_ゝ⌒)」

###テスト(PT)
Excelに画面スクショする例のやつです。
テスト仕様書は作る時間がなかったので設計書をそれ用にして色塗りしました。
ちなみに障害は40件以上出しました。
ほぼバリデーション系とかのエラーがほとんどでしたが設計時点での考慮漏れも複数ありました。
割と心が折れそうになった瞬間でした・・・

###テスト(IT)
このテストでは、ほぼ障害が出ませんでした。。。
正直これにはかなりホッとしました。
PTで網羅できてたからだと信じたい・・・

###引き継ぎ
この辺でVSCodeの使い方とかGitの使い方をExcelでまとめたりしてPMの人に色々引き継ぎをしました。。。
一応ちゃんと引き継ぎをしたつもりですが、正直この先そのPMの人が何とかかんとかこのプロジェクトを進めていくのかなぁと思うとプロジェクトを抜ける申し訳なさと罪悪感を感じました。

###終わりに
ギリギリ納品完了まではいれなかったのですが一応リリース作業は終わっていて大変でボロボロのプロジェクトだったけど不思議と達成感はありました。

きっとあの後、担当する人には負担をかけるなぁと思ってしまいましたがこの反省を生かしてゴミコードを生産しないように気をつけたいと思います。
OSSのプリザンターをダークテーマにカスタマイズするよ！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/11017c37-1377-bfba-0b81-9a63b1391b85.png" width=60%>


ダークテーマってかっこいいですよね～。
最近はスマホはもちろん、Youtubeでもダークテーマ機能が出ており、流行っている感が結構伝わってきます。
主に目への刺激が少ないことから好む方が多いのですが、プリザンターにもダークテーマを実装してほしいという要望がGithubのとあるIssuesから来ていました。

ところでプリザンターってダークテーマ出来るの！？という感じの方もいると思いますが、拡張機能（スタイル）を用いれば出来ちゃうのです。
<br>
[【プリザンターユーザーマニュアル】スタイル機能](https://pleasanter.net/fs/publishes/422274)
<br>
実際に公式ブログでも見た目をカスタマイズした記事がありますのでぜひ興味のある方は見てみるのも良いかもですね！
<br>
[CSSを使ってプリザンターの見た目を自由にカスタマイズ！](https://pleasanter.org/archives/1147)
<br>
そこで今回は試しに一覧画面のみサクッとダークテーマにしてみましたので共有していこうと思います。
# ダークテーマ設定方法
まずは一覧画面右上より「管理」→「テーブルの管理」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/36da0ce6-abeb-7fe4-60ad-75515f2de6b6.png" width=60%>
<br>
「スタイル」タブを選択し、「新規作成」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/329ac351-0d58-56ad-0388-35e05b24d53c.png" width=60%>
<br>
タイトルに「ダークテーマ」等の任意のタイトルを入れてスタイルに以下のCSSを貼り付けます。

```CSS:DarkTheme.css
body{ 
    background-color: #333333;
}
.item a{
    color:white;
}
.separator{
    color:white;
}
#ViewFilters{
    color:white;
}
#ViewSelector{
    background-color: #3333;
}
.grid-row{ 
    background-color: #333333; 
    color:white;
}
.title a{
    color:white;
}
#ReduceAggregations{
    color:white;
}
.data{
    color:white;
}
.status-new{
    color:black;
}
.grid-title-body > p > pre >span > a{
    color: white;
}
.grid-row:hover{ 
    background-color: #333333;
}
table.grid tr:hover{
     background-color: #333333;
    }
table#Grid tr:hover{ 
    background-color: #333333;
}
.grid-row:hover .grid-title-body{ 
    background-color: #333333 !important;
}
.svg-progress-rate text{
    fill: white;
}
.svg-work-value {
    fill: white;
}
.field-label{
    color:white;
}
.crosstab-row td{
    color: white;
}
.container-normal{
    color:white;
}
.comment{
    background-color: gray !important;
}
.comment:hover{
    background-color: gray !important;
}
```

<br>
出力先は「全て」を外して「一覧」にチェックを入れます。
完了したら「追加」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/165db061-1434-a4c6-178d-39192fa36e7e.png" width=60%>
<br>
画面下の「更新」ボタンを押すのも忘れずにクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/e5886695-e59f-7ad3-76b0-29583aa7009e.png" width=60%>
<br>
一覧画面に戻ると・・・良い感じのダークテーマになっていることが分かります!(^^)!
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/401f48b1-575d-2b34-2f90-7454561b19c2.png" width=60%>
<br>
# おわりに

ということで！とりあえず流行っているということで今回はプリザンターの一覧画面のみダークテーマにしてみましたがいかがでしたでしょうか？？
<br>
今後、時間を見つけて画面一つずつダークテーマを適用していこうと思います！
<br>
何かカッコいいデザイン等がありましたらぜひ教えてください。
エンジニアの情報収集法・学習法をまとめる

## はじめに

最近色々な人たちとお話しする機会があり、「どうやって勉強したらいいか分からない」という悩みを多く聞きました。
そんな方へ自分の知っているリソースを紹介させていただきます。
特に、**新人エンジニア**や**実開発の経験がない**方々の参考になればと思います。

※情報量が多くならないよう気をつけようと思います。

## 学習系サイト

#### □ [Progate](https://prog-8.com)

- 環境構築の必要はなく、ブラウザ上で実際に手を動かしていく形式です。
- お手軽で初心者向け。
- （たしか東大の学生が始めたサービス）

#### □ [ドットインストール](https://dotinstall.com)

- 短い動画で学習していく形式です。
- 様々なプログラミング言語の入門情報がまとめられているので、新しい言語に挑戦するにはもってこい。

#### □ [Udemy](https://www.udemy.com)

- ごめんなさい、私はまだ利用したことはないです。
- 広告を最近よく目にして、気になっていたので記録しておきます。

## 勉強会・イベント検索サイト

自分の中で区別・使い分けができていないので、むしろ私が教えて欲しいカテゴリです。
とりあえず紹介しておきます。

#### □ [connpass](https://connpass.com)

#### □ [TECH PLAY](https://techplay.jp)

#### □ [Doorkeeper](https://www.doorkeeper.jp)

## ソースコード管理サービス

有無を言わさずとりあえずこれ。
OSSやヒトのソースコード見るのって結構勉強になります。

#### □ [GitHub](https://github.com)

## スライド共有サービス

プレゼン資料の共有サービスです。
カンファレンス登壇者のほとんどが、次のどちらかに資料をアップしていることが多いです。

#### □ [Speaker Deck](https://speakerdeck.com/)
#### □ [SlideShare](https://www.slideshare.net/)

## Q&Aサイト

ググったら勝手に上位に出てくるのであまり意識することはないかもしれませんが、一応の紹介。

#### □ [Stack Overflow](https://stackoverflow.com/)

- おそらく世界で１番有名なQAサイト。
- ベータ版ですが、[日本語版](https://ja.stackoverflow.com)もあるようです。（こっちはあまり使ったことないですが...）

#### □ [teratail](https://teratail.com)

- 日本版StackOverflowくらいの認識です。

## さいごに

雑多にまとめましたが、この記事が最初の一歩を踏み出すキッカケにでもなれば幸いです。

あくまで自分が知っている・活用しているリソースの一部をまとめただけです。
他にも世の中には便利なものがごまんとあります。

この記事を読んだエンジニアの皆さん、他にオススメがあればコメントください！！

## ご参考

情報をまとめてくださっている方は、他にも多くいらっしゃいます。
少し情報量は多いですが、とても参考になります。

- [エンジニアの情報収集法まとめ](https://qiita.com/nesheep5/items/e7196ba496e59bb2aa28)
- [エンジニアが情報収集とトレンドを追うのに読むと良いサイト](https://qiita.com/ryuichi1208/items/604a68abb91949e79ece)
- [エンジニアが活用したい情報リソースまとめ](https://qiita.com/EaE/items/eb8f28223c9c2926b44f)
シェルスクリプト export コマンド

export コマンドはシェル変数を環境変数としてエクスポートするのに使用する。
あまり意識されていないかもしれないが、シェルにおいて環境変数を設定するためには、以下の２ステップが行われる必要がある。
１．シェル変数を設定する
２．そのシェル変数を環境変数としてエクスポートする

##### シェル変数を環境変数としてエクスポート
```bash:example1
$ TEST_VAL=thanks # シェル変数を設定する
$ echo "${TEST_VAL}"
thanks # シェル変数として値が表示される
$ printenv TEST_VAL # 環境変数としては設定されていないため、値は表示されない
$ export TEST_VAL # 環境変数としてエクスポートする
$ printenv TEST_VAL
thanks # 環境変数として値が表示される
```

##### シェル変数に値を入れる前に export しても大丈夫
```bash:example2
$ export TEST_VAL2 # シェル変数に値を入れる前に export
$ printenv TEST_VAL2 # 値は入っていないので何も表示されない
$ TEST_VAL2=thanks2 # そのシェル変数に値を設定
$ printenv TEST_VAL2 # 値が入っているので表示される
thanks2
```

##### 複数（2つ以上）の環境変数を同時に設定
```bash:example3
$ TEST_VAL3=thanks3
$ TEST_VAL4=thanks4
$ export TEST_VAL3 TEST_VAL4
$ printenv TEST_VAL3 TEST_VAL4
thanks3
thanks4
```

##### export の取り消し（シェル変数も空にする）
```bash:example4
$ TEST_VAL5=thanks5
$ export TEST_VAL5
$ printenv TEST_VAL5
thanks5
$ unset TEST_VAL5 # unset コマンドで export の取り消し
$ printenv TEST_VAL5
$ echo "${TEST_VAL5}" # シェル変数も空になる
```

##### export の取り消し（シェル変数は残す）
```bash:example5
$ TEST_VAL6=thanks6
$ export TEST_VAL6
$ printenv TEST_VAL6
thanks6
$ export -n TEST_VAL6 # export -n コマンドで export の取り消し
$ printenv TEST_VAL6
$ echo "${TEST_VAL6}"
thanks6 # シェル変数としては値が残る
```

##### export されている変数の一覧を表示
export -p で表示される。
-p	display a list of all exported variables and functions

```bash:example6(一部抜粋)
$ export -p
declare -x COLORTERM="truecolor"
declare -x CONDA_DEFAULT_ENV="base"
....
declare -x TEST_VAL="thanks"
declare -x TEST_VAL2="thanks2"
declare -x TEST_VAL3="thanks3"
declare -x TEST_VAL4="thanks4"
....
```

##### シェル変数設定と同時に export する
bash などのシェルでは、シェル変数の設定と同時に環境変数として export することが可能。
このやり方をよく見かける気がしますが、他のシェルとの互換性の観点では別々に分けた方がよいかもしれません。

```bash:example7
$ export TEST_VAL7=thanks7
$ echo ${TEST_VAL7}
thanks7
$ printenv TEST_VAL7
thanks7
```
スラ最小

スライド最小値とはなにか

長さnの数列a0,,,an-1と数kが与えられます。bi=min{ai,,,ai+k-1}(i=0,1,,,,n-k)として定義される数列biを計算しなさい

これはRMQを使えばO(n logn)で解くことができるがdequeを使えばO(n)で解ける

数列を左から右に舐めるのを考える。dequeに値の位置を突っ込んでいく。dequeのfrontに常に区間の最小値の内一番後の位置が入るようにする。

```cpp

int a[1000100];
int b[1000100];
int deq[1000100];
int main() {
	int n, k; cin >> n >> k;
	REP(i, n)cin >> a[i];
	int s = 0, t = 0;//デックの先頭と末尾
	for (int i = 0; i < n; ++i) {
		//デックにiを追加
		while (s < t&&a[deq[t - 1]] >= a[i])t--;
		deq[t++] = i;
		if (i - k + 1 >= 0) {
			b[i - k + 1] = a[deq[s]];
			if (deq[s] == i - k + 1) {
				s++;
			}
		}
	}
	for (int i = 0; i <= n - k; ++i) {
		cout << b[i] << " ";
	}
	cout << endl;
	return 0;
}
```
量子耐性をもつ暗号まとめ①

## 概要

今回は量子コンピュータが台頭したあとに多項式時間で破られると言われている既存暗号とは違う数学的背景を持った、次世代型暗号とか、量子耐性暗号と呼ばれる暗号のうち、格子暗号について書いていきます。

量子耐性を持つと言われ、アメリカの標準技術機構NISTが数年のうちに安全性を評価し、標準化するという風に実際にもう動いている暗号は、大きく３つのカテゴリに分けられるようです。

1. 符号理論に基づいた暗号
2. 有限体上の多変数多項式の求解問題に基づいた暗号
3. 格子理論に基づいた暗号

今回はこの中でも格子暗号に焦点をあてて書いていきますが、他も面白そうです。
ちなみに、格子暗号は量子耐性があるという観点だけではなく、それが完全準同型性をもつ暗号方式である（つまり、暗号化した後も足し算や掛け算などの計算可能）という利点もあります。（1.2 に関してもそうなのかはまだ勉強していません、すみません。）

このまとめ①では格子暗号の中でも歴史の古い

- Ajtai-Dwork暗号
- GGH (Goldreich, Goldwasser, Halevi)暗号

について簡単にまとめます。また、複雑な計算式に関してはわかりやすく書かれている参考文献へのリンクを貼っていきます。

まとめ②では

- NTRU暗号
- LWE（Ring-LWE）暗号

についてまとめていきますので、どうぞごらんください。

また、[深瀬道晴さんの論文:格子と暗号に関する研究動向について
-暗号攻撃、格子暗号、完全準同型暗号](https://dokkyo.repo.nii.ac.jp/?action=repository_action_common_download&item_id=244&item_no=1&attribute_id=22&file_no=1)が非常にわかりやすく、参考にさせていただきました。


## 格子暗号にもいろいろあるよ

こちらの、[日本銀行の清藤武暢さんのスライド](https://www.imes.boj.or.jp/citecs/symp/16/ref3_seito.pdf)に各格子暗号についてとてもわかりやすくまとめられています。特に、２７枚目のスライドが有用だと思ったので、それだけここに紹介させていただきます。

<img width="1063" alt="Screen Shot 2019-12-08 at 15.44.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/04d59eb4-7ea3-aa34-6eaa-24f9421bf4d1.png">

今回紹介するAjtai-Dwork暗号、ならびにGGH暗号はビット毎での暗号化になることと、セキュリティを達成する時に必要な次元数がNTRUやLWE形式に比べて膨大なため、あまり実用的では無いようです。しかしながら、格子理論を用いた初めての暗号がこのAjtai-Dwork暗号だったり、その次に出てきたのがGGH暗号だったりするので、それらの歴史を知っておくのは必ず有益だと考えます。


## Ajtai-Dwork暗号
自分的には、[Michael Hartmannさんの修士論文の42ページから](http://user.math.uzh.ch/rosenthal/masterthesis/07711484/Hartmann2015.pdf)の解説がとても分かり易かったです。

先ほども書いたように、このAD暗号は、初めて格子理論を暗号構成に応用したものです。何事も初めてというものは大事です。うん。
秘密鍵には超平面が使われ、公開鍵はその超平面を元にして超平面に近いベクトルになります。
面白いところは、平文をビットで書き直し、ビット毎に暗号化するのですが、０の時は公開鍵を用いて超平面に近いところに暗号化されるのに対し、１の時は完全にランダムのベクトルに暗号化されるところです。
論文を見ていても、ビット毎に暗号化する時の線形演算が多く、処理が重そうですね。

論文にも紹介されている通り、復号化するときに、１を０と復号してしまうエラーが大きく、そこをGoldreich, Goldwasser and Halevi が解決した論文を97年に出したようです。すごい。。

この暗号は、任意の暗号文が０であるか１であるかがわかるかどうかが、特殊な格子のSVPの最悪な場合を解くことと同じ、ということが示されているので、この特殊な格子のSVPを計算困難と仮定することで安全性を保証しているようです。

## GGH暗号

GGH暗号は視覚的に比較的理解しやすい暗号です。視覚的にとてもわかりやすく書かれているのは、これまた[日本銀行の清藤武暢さんのスライド](https://www.imes.boj.or.jp/citecs/symp/16/ref3_seito.pdf)であり、１８ページになります。こちらも参考のため貼らせていただくと、
<img width="1038" alt="Screen Shot 2019-12-08 at 16.10.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/78ed12de-9451-4dd7-4528-e369a1df8af0.png">
このスライドになります。

この暗号は、見てもわかる通りCVP問題を安全性の基点としているのですが、
視覚的にわかりやすいところは、暗号化したい平文を２つの整数で表現し、公開鍵（比較的直交していない格子の基底）と、ランダムノイズによって格子点を決定するということです。また、秘密鍵は（直交基底に近いもの）になるので、復号の時はそれらを用いて暗号文Cの最近点を計算し、暗号文を２変数の連立方程式によって求めるということになります。これはすごく直感的でわかりやすいです。

## Nguyenらによる暗号攻撃

上で紹介した２つのAD, GGH暗号ですが、Nguyenによって実用的なセキュリティレベルで使用するには非常に非効率である（格子の次元がかなり大きく無いといけない）ということが示されています。それが理由で鍵長がかなり必要だ、という上のグラフになっています。
このNguyenという人、格子暗号の安全性を研究するコンテスト[TU DARMSTADT LATTICE CHALLENGE](https://www.latticechallenge.org/halloffame.php)というコンテストでありえないくらい上位独占してるんですけど、どんな人なんでしょう。。。あと日本の研究者めっちゃすごいです！！


## おわりに
結局参考文献を薄くまとめたものにはなってしまいますが、格子暗号の中にも歴史がありすごく面白いですね。また、格子暗号以外の符号や多変数多項式に基づいた次世代暗号についてもまとめてみたいです。

とりあえず次は、NTRUとLWE形式の格子暗号についてまとめます。

おわり。
量子耐性をもつ暗号まとめ②

## 概要
これは、[前記事](https://qiita.com/kenmaro/items/356095457e21c1930865)の続きになります。

量子耐性を持つと言われ、アメリカの標準技術機構NISTが数年のうちに安全性を評価し、標準化するという風に実際にもう動いている暗号は、大きく３つのカテゴリに分けられるようです。

1. 符号理論に基づいた暗号
2. 有限体上の多変数多項式の求解問題に基づいた暗号
3. 格子理論に基づいた暗号

となりますが、このうちの３.格子理論に基づいた暗号のうち、

- NTRU暗号
- LWE(Ring-LWE)暗号

についてまとめていきます。

参考文献は、
[小柴薫居さんの論文：多変数多項式環を用いた NTRU 暗号の拡張](http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1815-09.pdf)や、
[NTRUのウィキペディア](https://ja.wikipedia.org/wiki/NTRU%E6%9A%97%E5%8F%B7)
[id:u874072e藍屋えんさんのはてなブログの記事：暗号のしくみ～格子暗号編（NTRU）～](https://clean-copy-of-onenote.hatenablog.com/entry/intro_lattice_based_crypto)
[深瀬道晴さんの論文：格子と暗号に関する研究動向について
-暗号攻撃、格子暗号、完全準同型暗号](https://dokkyo.repo.nii.ac.jp/?action=repository_action_common_download&item_id=244&item_no=1&attribute_id=22&file_no=1)
[makoさんのブログ：SageMathでRing-LWEによる鍵共有](https://tex2e.github.io/blog/crypto/ring-lwe-key-exchange)

などです。日本には素晴らしい技術者、研究者の方がいらっしゃいますね。


## NTRU暗号
NTRじゃないです。NTRUです。

格子暗号の中で唯一標準化されている暗号がこの　NTRU暗号になります。
<img width="565" alt="Screen Shot 2019-12-08 at 17.13.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/7eae7b7c-00e5-7532-c328-d14c2783daf9.png">

このときのfが秘密鍵になるのですが、fの逆元が暗号化の時にかけられているのを利用して、fを復号時にかけることで、埋め込まれた（足された）平文多項式の最近房の格子を求めることができます。
ここはやり方は違えど考え方は次のLWE形式とも同じです。



## LWE(Ring-LWE)暗号
Learning with Error という問題を安全性の基点としており、Regevさんが提唱したのでRegev暗号とも呼ばれています。

>LWE（Learning with Errors）問題とは、誤差を付加した多元連立一次方程式を解く問題です。 簡単に説明すると、Zq 上の誤差 e を付加した連立方程式について、行列 A,b が与えられたときに、秘密 s を求める問題です。

<img width="191" alt="Screen Shot 2019-12-08 at 16.37.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/2211a6ab-d201-6abe-798f-c113aa22a646.png">

このとき、NTRUの時と同じように、イデアルをとる作業がこのsと掛け算をするときの作業であり、SVPもしくはCVPを求める問題に帰着させるためにノイズであるeを足したものが格子点として公開されます。

誤差がない場合の線型方程式はガウスの消去法などを用いて容易に解けますが、誤差が加わった線形方程式を効率的に解くアルゴリズムは現時点で見つかっていません。
LWE暗号に対して特筆すべきはその完全準同型性でしょう。LWE格子暗号では、素数qを法とする有限体上での演算のもとでの格子を考えます。 また、LWE格子暗号には暗号文のまま演算ができるという性質があり、このような性質を持つ暗号は準同型暗号と呼ばれます。

#### Ring-LWE
Ring-LWE（RLWE）問題とは、LWE問題を有限体上の多項式環に限定した問題です。 簡単に説明すると、以下の方程式で多項式 a(x),b(x) が与えられたとき、秘密の多項式 s(x) を求める問題です。
<img width="209" alt="Screen Shot 2019-12-08 at 17.11.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/2391d8d8-741f-d175-a279-8f7684bb8962.png">



本来のLWE格子暗号は格子の次元をnとしたとき公開鍵の鍵長がO(n2)となります。 また暗号文の長さは平文のn倍になりますが、有限体の代わりに円分体の整数環上での演算を用いたRing-LWE（RLWE）格子暗号があります。 Ring-LWE格子暗号では、公開鍵の鍵長を数千bit程度にでき、また、複数ビットの平文を対応する多項式の係数で表すことにより暗号文の長さを格段に小さくできるため、多くの研究がこのRing-LWEベースの暗号に対して行われています。また、暗号文同士の演算が多項式演算のため、DFTおよびFFTを用いた計算の高速化を行うことができるのも利点です。


## おわりに
準同型性や、Ring-LWEによる効率化を考えるとRing-LWEが注目を浴びて研究されているのもうなづけます。
次は格子だけでなく符号や多変数多項式に基づいた次世代暗号も調べてみたいです。


おわり。
社内でAWSに繋がりたいんじゃ!!!

#社内で高品質なAWSを利用できるDirect Connect
![direct.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/627cd6c5-099e-2b1d-2ecd-bbb0c17c4e0b.jpeg)

Direct Connectを採用する企業は最近増えてきています．
特にAWSを社内で使う企業ですね．

まずよくあるパターンとして，
データセンターからAWSへのプライマリの接続を専用機で接続して
バックアップ回線をネットで接続する
なんてことがあります．


まずはネットと有線の特色から行きましょう
それを知った上で，接続方法を説明しましょう．

##特色
###ネット
- コスト安い
- 短期間で利用できる
- ネットなので暗号化などの制限がある．
- 経路上のネットの影響を受ける
- 障害がおきた時にエラーになる

###有線
- コスト高い
- 利用開始まで数週間かかる
- 「専有型」帯域が　1Gbps , 10Gbps　「共有型」~10Gbps(後で説明します)
- 高品質
- 障害対応が楽


##接続構成
まず，基本的な接続構成は2つです
物理接続．
論理接続．

ひとつの物理接続の中に複数の論理接続（VLAN）を構成することで、複数のAmazon VPCネットワークにアクセスすることができます（Amazon VPCと一対一でひもづくのは論理接続）

###物理接続
AWSに専用機で直接接続！！

といってもデータセンターの場所は非公表．
なので，手配される相互接続ポイントを介してAWSと接続します．

###論理接続
物理的な接続を論理的に分割し，複数のAWSアカウントで利用可能にする．
これで社内ネットワークが可能になるのですね〜

###利用ケース例
例えば，
企業で一つの物理的な接続を行います．
その企業の部署や用途に分割して利用をするということです!!

##プライベート接続とパブリック接続
いずれかを設定します．
###プライベート接続
プライベートIPアドレス空間を使って，[VPC](https://qiita.com/moyuta/items/78e50804e63d7ca70952)への接続をします
ネットワークアドレスなしでAWSネットワークにルーティング可能です
###パブリック接続
パブリックIPを使うんで，アクセスはNAT(Netowork Address Translation)経由にする必要があります．
つまり，パブリックIPにネットワークからのアドレスを変換させないといけません．

##料金について
料金体系は2パターンで，
**ポート使用料**
**転送料**
の2つに分けて請求される仕組みです

消費されたポート時間ごとに設定(1時間未満の場合は1時間分になります)・
転送に関しては転送レートに応じて課金されます．
rqt_graph をかわいくする(?)

## TL;DR
ROSにはかわいさが足りない。
`rqt_graph`で使われているフォントを変更してかわいくします。

## フォントはどこで設定されているのか？
`rqt_graph`をはじめとして、ROS上のグラフ構造をdot言語を介してqtのGUI上に表現する処理は、`qt_gui_core`メタパッケージ(https://github.com/ros-visualization/qt_gui_core) 内の`qt_dotgraph`パッケージ(https://github.com/ros-visualization/qt_gui_core/tree/kinetic-devel/qt_dotgraph) にまとめられています。

その中で、フォントは、`GraphItem`クラスにクラス変数`_LABEL_FONT`として設定されています。このクラスではフォントと線の色が設定されています。
>```graph_item.py
class GraphItem(QGraphicsItemGroup):
>
    _COLOR_BLACK = QColor(0, 0, 0)
    _COLOR_BLUE = QColor(0, 0, 204)
    _COLOR_GREEN = QColor(0, 170, 0)
    _COLOR_ORANGE = QColor(255, 165, 0)
    _COLOR_RED = QColor(255, 0, 0)
    _COLOR_TEAL = QColor(0, 170, 170)
>
    _LABEL_FONT = QFont('sans', weight=QFont.Light)
>
    def __init__(self, highlight_level, parent=None):
        super(GraphItem, self).__init__(parent)
        self._highlight_level = highlight_level
        # use device depended font size to produce
        GraphItem._LABEL_FONT.setPixelSize(11)
>```

(`qt_dotgraph`パッケージ `graph_item.py`より)

## フォントを変えてみよう
さて、いよいよフォントを変えてrqt_graphをかわいくします。今回はふい字を使います。まずはフォントをインストールしましょう。

```shell
# フォントをダウンロードして解凍
sudo apt install lhasa
wget http://marie.saiin.net/~huiko/huifonts/HuiFont109.lzh
lha x FuiFont109.lzh

# Ubuntuでは~/.fonts以下にフォントファイルを保存するとインストールできる
mkdir ~/.fonts
cp FuiFonts109.ttf ~/.fonts
fc-cache -fv

# インストール結果
fc-list | grep Hui
/home/user/.fonts/HuiFont29.ttf: ふい字,HuiFont:style=Regular
```

qt_dotgraphパッケージも用意しましょう

```sh
cd ~/catkin_ws/src
git clone https://github.com/ros-visualization/qt_gui_core
catkin build qt_gui_core
```

ソースコードは`graph_item.py`の44行目を以下のように変更します

```python:qt_gui_core/qt_dotgraph/src/graph_item.py
_LABEL_FONT = QFont('HuiFont', weight=QFont.Light)
```

ここまで来たら準備完了です。適当なノードを立ち上げて`rqt_graph`を見てみましょう。
![rqt_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27616/0013d36f-82c0-0e5f-5f45-fd89e1d3d237.png)

かわいいですね！かわいい気がします！
`qt_dotgraph`は`rqt_graph`以外にも`rqt_tf_tree`にも使われています。試してみましょう。
![tf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27616/c32cca5f-ed30-eeca-21ce-61ccc8881bc2.png)
めちゃくちゃ読みにくいけどかわいくなった気がします！やったぜ！

## まとめ
今回は`qt_dotgraph`パッケージのコードを書き換えて`rqt_graph`や`rqt_tf_tree`に使われているフォントを変更しました。
今回の結果がかわいいかはさておき、皆さんもお気に入りのフォントを設定して自分だけの`rqt_graph`を楽しんでください。
新卒総合職の私がGAS入門してみた

# 新卒総合職の私がGAS入門してみた

これは[ウィルゲート Advent Calendar 2019](https://qiita.com/advent-calendar/2019/willgate)の8日目です。  
  
はじめまして。  
田中晴子です。新卒1年目で、ソリューションユニットとコンサルティングユニットを兼任しています。アドベントカレンダーで唯一、コンサルティング部門からの参戦です。

## GASとの出会い

冒頭に書いた様に、現在はソリューションとコンサルを兼任しているのですが、
新卒で入社してから半年間はソリューションユニットで仕事をしてきました。

SEOはもちろん、Webの知識も皆無で右も左も分からないまま入社した私は、
知識がなさすぎてググっても分からないことがたくさんありました。
どんなクエリで検索したらほしい情報が手に入るかも分からなかったのです。

そのため事あるごとに先輩を質問攻めにしていたのですが、
次第に『分からないことをオンラインで気軽に質問出来る場を作りたい』『質問と回答を共有して蓄積したら先輩社員のコスト削減にもなるし、来年以降の新卒の役に立ちそう』と思うようになりました。  
そこで思いついたのが、特定のSlackチャンネルで質問をしてSlackで回答をもらい、
質問と回答をスプレッドシートに蓄積するということです。
調べたら、GASを叩いたら出来るということだったので開発の大石くんに教わりながらやってみました！  

## お悩み解決チャンネル
作ったものは、Slackチャンネル内での書き込み（質問事項と回答事項）をスプレッドシートに蓄積していく『お悩み解決チャンネル』です。  
あくまでも、新卒が気軽に質問出来る場を作りたかったので、手軽に使えるSlackにしました。  
  
▼チャンネルの運用ルール 
- 質問者は【SEO知識】【案件関連】【その他】のカテゴリを指定し、【カテゴリ】を質問の文頭につけて投稿する
- 回答者は、質問に対してスレッドで回答する
  
▼機能 
- 質問事項・回答内容の記録は24時間ごとに実行される
- 編集の保証は12時間で、書き込みから12時間以内なら質問と回答の編集内容が蓄積シートに反映される。

## GAS入門してみて学んだこと

GAS入門してみて分かったことは、要件定義がとても大事だということです。
どんな機能を付けるのか？例外にはどう対応するのか？どうやったら使いやすいか？どうやったら使ってもらえるか？などの要件定義に時間を使いました。  

今回、プログラミングの部分は大石くんに手伝ったもらったのですが、
プログラミングを教わりながら、なぜそのチャンネルを作る意味があって、なぜスラックでないといけなくて、なぜスプレッドシートにログを残すのかなどの議論が多かった様に感じます。
いざ開発を始めてしまうと、自分が作っているものがさぞ素晴らしく意味があるものに思えてならないのですが、ユーザーにとっては製作時間などは関係なく、使いやすくて便利なものの方が価値が高いのだと感じました。

目的や動機に立ち返って要件定義を詰めることの重要性を学びました。

## お悩み解決ちゃんねるの今
  
お悩み解決チャンネルの現在は、”質問と回答を得る場”というよりも事例共有の場として使われています。  
本来想定していなかった使われ方ですが、事例共有の場としてニーズがあることが分かったので、今後は利用方法に合わせて改修していこうと考えています。

## 今後やりたいこと
  
今後は、日常であったら良いなと思ったことを実現し、もっと仕事をしやすい・便利な環境を構築する手段としてエンジニアリングに挑戦したいです。  
お悩み解決チャンネルにおいての直近の目標は、事例共有とQ&Aのどちらの面でも利用しやすいものにするため、GAS,Slack以外のツール導入を検討しています。  
   
馴染みがない人にとってエンジニアリングは難しそうでとっつきにくいかもしれませんが、エンジニアリングは実はとても身近なもので、難しそうだけどびびることはないということを身をもって証明していきたいです。 

　
明日12/9のアドベントカレンダーは[@y-miya0420](https://qiita.com/y-miya0420)さんです！
matplotlibを使って世界一有名な鶏頭図（ナイチンゲールによるクリミア戦争の死亡原因）を作る

# 世界一有名な鶏頭図って？
![Nightingale-mortality.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196857/dba2cb19-c846-3181-168b-1985c3e4b159.jpeg)
引用元：https://en.wikipedia.org/wiki/Florence_Nightingale#Statistics_and_sanitary_reform

これ。
クリミア戦争における月別の死因を可視化。
赤色が負傷、青が病気、黒が他。
これを見れば病気による死亡が圧倒的に多く、負傷による死亡は比較的少ないことがわかる。

# matplotlibで可視化[^1][^2]

```python
# ライブラリ
import numpy as np
import matplotlib.pyplot as plt

#data, 画像からだいたいで作る
wound = [0,0,0,0,np.sqrt(0.05**2+0.03**2),1.44,2.25,np.sqrt(1.78**2+3.04**2),2.06,1.76,np.sqrt(1.07**2+0.6**2),1.07]
other = [0.74,np.sqrt(0.29**2+0.49**2),0.41,0.94,np.sqrt(0.92**2+0.53**2),1.67,2.25,np.sqrt(1.06**2+1.78**2),2.23,3.62,np.sqrt(2.01**2+3.42**2),2.7]
disease = [0,np.sqrt(0.36**2+0.61**2),0.62,4.14,np.sqrt(5.28**2+3.04**2),5.93,4.68,np.sqrt(3.09**2+5.35**2),8.5,10.84,np.sqrt(4.86**2+8.41**2),7.38]

# 色をオリジナルのものに近づける
ori_red = "#EFC6C2"
ori_gray = "#8D7D7D"
ori_blue = "#C5CCD6"

# ラベル
label = ["APRIL\n1854", "MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER",
         "DECEMBER","JANUARY 1855","FEBRUARY","MARCH"]

# 月の数、今回は12ヶ月分
N = 12
# 各円弧の中心の位置、単位円の角度で表す
theta = [-2*np.pi/12*i+2*np.pi/24*11 for i in range(12)]
# 円弧の角度、今回は等分
width = [2*np.pi/12 for _ in range(12)]

fig = plt.figure(figsize=(12,12))
# 今回は棒グラフをprojection="polar"にすることで実現
ax = fig.add_subplot(1, 1, 1, projection='polar')

# 各項目のプロット
ax.bar(theta, disease, width=width, color= ori_blue)
ax.bar(theta, other, width=width, color=ori_gray)
ax.bar(theta, wound, width=width, color=ori_red)

# legend 
ax.annotate("■ wound",xy=(0.1,0.8),xycoords='figure fraction',color=ori_red,fontsize=22)
ax.annotate("■ other",xy=(0.1,0.75),xycoords='figure fraction',color=ori_gray,fontsize=22)
ax.annotate("■ disease",xy=(0.1,0.7),xycoords='figure fraction',color=ori_blue,fontsize=22)

# 月ラベル
for i,(d,o,w,l) in enumerate(zip(disease,other,wound,label)):
    maxi = max(d,o,w)
    ref_theta = -2*np.pi/12*i+2*np.pi/24*11
    # 半径が小さすぎる場合は3で固定
    if maxi <=3:
        maxi = 3
    ax.annotate(l, xy =(ref_theta, maxi+0.2),
                ha="center",va="center",
                rotation=np.degrees(ref_theta)-90,
                fontsize=14
               )
# 軸など非表示
plt.axis('off')
plt.show()
```

![polar_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196857/29439199-508b-847e-62c5-68e25cb226bd.png)



[^1]: https://matplotlib.org/3.1.1/gallery/pie_and_polar_charts/polar_bar.html
[^2]: https://twitter.com/ritz_tableau/status/1076551585935745024
アルファベットが何番目にあるか取り出す関数 (JavaScript)

```js
const getAlphabetIndex = (str) => {
    const alphabet = "abcdefghijklmnopqrstuvwxyz";
    return (alphabet.indexOf(str) === -1) ? (alphabet.indexOf(str.toLowerCase())) : (alphabet.indexOf(str));
}

getAlphabetIndex("C"); // →2
```
大文字でも小文字でも両方いける。

## 解説
`Array.prototype.indexOf()`
Array.prototype内から検索しインデックスを返すメソッド。
該当文字がないと-1になる。
ちなみに文字列は配列扱いすることができて、[1文字目, 2文字目, 3文字目…] のような形になる。

`String.prototype.toLowerCase()`
文字列を小文字に変換するメソッド。(文字列以外が入るとエラーになるので注意)
【Rails6】10分でRails + Vue + Vuetifyの環境を構築する

# 前提条件
- Rails6
- Vue.js 2.6.10
- vuetify 2.1.13
- yarnが入っていること

# 構築手順
## 1. rails newでプロジェクトを作成

この時、--webpack=vueを指定する

```ruby:bash
rails new --webpack=vue
```
この時yarnやwebpacker関連のエラーが出た場合は以下の記事を参考にしてください
#####Rails6 開発時につまづきそうな webpacker, yarn 関係のエラーと解決方法
https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0

サーバーを起動

```ruby:bash
rails s
```

http://localhost:3000/ に接続して以下の画面が表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375365/25b140cd-eb22-b69b-b018-dc199d47d5bc.png)

# 2.VueのHello Worldを表示させる

#### データベースを作成
```ruby:bash
rails db:create
```

#### コントローラー作成
```ruby:bash
rails g controller home index
```

#### ルーティングを設定
```ruby:config/routes.rb
Rails.application.routes.draw do
  root to: 'home#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
```

### viewを作成
```ruby:app/views/home/index.html.erb
<%= javascript_pack_tag 'hello_vue' %>
```

再びhttp://localhost:3000 に接続して以下の画面が表示されればVueの環境構築は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375365/819d7810-a7af-3116-ed02-b4e11f57ef31.png)

# 3. Vuetifyをインストール
yarnを使ってvuetifyをインストールします

```ruby:bash
yarn add vuetify
```
以下の表示がされればインストール完了です

```ruby:bash
✨  Done in 7.03s.
```

#4. Vuetifyのボタンを表示させる
#### Vuetifyの読み込み

rails new --webpack=vueのおかげでデフォルトで作成されていると思います

```javascript:app/javascript/packs/hello_vue.js
import Vue from "vue";
import App from "../app.vue";


document.addEventListener("DOMContentLoaded", () => {
  const app = new Vue({
    render: h => h(App)
  }).$mount();
  document.body.appendChild(app.$el);

  console.log(app);
});
```

このファイルを編集していきます。

```javascript:app/javascript/packs/hello_vue.js
import Vue from "vue";
import Vuetify from "vuetify"; // 追加
import "vuetify/dist/vuetify.min.css"; // 追加
import App from "../app.vue";

Vue.use(Vuetify); // 追加
const vuetify = new Vuetify(); // 追加

document.addEventListener("DOMContentLoaded", () => {
  const app = new Vue({
    vuetify, // 追加
    render: h => h(App)
  }).$mount();
  document.body.appendChild(app.$el);

  console.log(app);
});
```

#### Vuetifyで表示させるファイルを作成

こちらもデフォルトで作成されていると思います

```vue:app/javascript/app.vue
<template>
  <div id="app">
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data: function() {
    return {
      message: "Hello Vue!"
    };
  }
};
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>
```

こちらのファイルにVuetifyのボタンを追加します。

```vue:app/javascript/app.vue
<template>
  <v-app id="app"> <!-- 追加 -->
    <v-btn>Vuetifyのボタン</v-btn> <!-- 追加 -->
    <div>  <!-- 更新 -->
      <p>{{ message }}</p>
    </div>
  </v-app> <!-- 追加 -->
</template>

<script>
```

これでhttp://localhost:3000 に接続し、以下のような表示になれば
Rails + Vue + Vuetifyの環境構築は完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375365/43e63c4c-5532-d3d7-295f-9a9636403aa3.png)

おつかれさまでした！

# 終わりに

この記事が皆様のRailsライフのお役にたてれば幸いです。
この他にもRails中心の記事を書いています！
functions.https.onCallを試してみる


今までFunctionsのhttps経由の呼び出しといえばhttps.onRequest（通常のWebAPI）でしたが、https.onCallというのも使えるようになりました（だいぶ前ですが）。

この呼出は基本SDKからになるため呼び出し元をある程度制限できます。また認証情報も保持しているためAPI側で認証情報を取得し、処理を分岐させたりできます。

簡単に見てみます。


## Functions側

onCallはdataとcontextの２つの引数を取るようで、

* data: 送られてきたパラメータ
* context:認証情報等

が入っているみたい。とりあえず内容を確認するため下記のようなコードを書いてみました。

```bash
const functions = require('firebase-functions');

//onCall
exports.helloWorld = functions.https.onCall((data, context) => {
    return { data: data, auth: context.auth }
});
```

## 呼び出し側

クライアントは何でもいいのですが、こなれたReactで下記のように書いてみました。jsならだいたい同じでしょう。
ボタンをクリックしたらonCallします。

```js:App.js
import React from 'react';
import './App.css';

import firebase from './Firebase';
import { sign } from 'crypto';

class App extends React.Component {

  handlePush = async () => {

    // await firebase.auth().signInAnonymously();
    // await firebase.auth().signOut();
	
	//functionsを使う
    const functions = firebase.functions();
    //参照？を取得
    const func = functions.httpsCallable("helloWorld");
    //引数を付けて呼び出し
    func({ name: 'hoge' }).then(res => {
      console.log(res);
    }).catch(e => {
      console.log(e);
    })
  }

  render() {
    return (
      <div>
        <p>App</p>
        <button onClick={this.handlePush}>push</button>
      </div>
    );
  }
}

export default App;
```

## 結果

### 非ログイン時

dataの中にname:"hoge"が確認できます。authはnullです。

![スクリーンショット 2019-12-08 17.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/351a3d9f-1ea8-94d6-8185-6d8cfecf66ec.png "スクリーンショット 2019-12-08 17.02.54.png")


### ログイン時（匿名）

ログイン時はauthの中にuidを始めとする各種情報が帰ってきます。


![スクリーンショット 2019-12-08 17.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/7d00f172-d575-ce88-bc62-2c2a71738d9c.png "スクリーンショット 2019-12-08 17.02.02.png")