OmniAICreator/Qiita-1.07M huggingface dataset:
うみのれすきゅーたい　アプリ開発工程

###１．チームでアプリの完成イメージを合わせるため、scratchによる試作を行いました。
#####決定事項
・クイズは海洋生物ごとに設定する
・海洋生物は海がごみでいっぱいになってしまい、困っているというシチュエーション
・クイズの正誤によって背景を変えていき、クイズに正解すると海のごみが減っていく
・最後の画面では正答数に関係なく、海がきれいになった背景をうつす。
→少しでも、海洋プラスチック問題のことを知ってもらえたということでプラスのイメージを出すため。

静岡県にある御前崎市がウミガメの産卵地として有名であることや、海洋プラスチック問題の中で実際にウミガメが被害にあっているということから、試作は”ウミガメ”を使って行うことにしました。
#####このときに作成したもの
・背景のイラスト
・ウミガメのイラスト
・ウミガメに関するクイズ（３問）
・[scratchによる試作品](https://scratch.mit.edu/projects/334622075/)
###２．チーム内でアプリの完成イメージが固まったところで、各担当ごとに仕事を割り振りました。
・ディレクター→クイズデータの作成
・デザイナー→アイコン、背景、海洋生物のイラストの作成
・プログラマー→Ｍｏｎａｃａでのコーディング
###クイズデータの作成
静岡県廃棄物リサイクル課様のご協力のもと、「６Ｒ県民運動」のサイトを参考に海洋プラスチック問題に関するクイズを作成しました。
ターゲットが小学生であることから、漢字のルビを（）でつけることにし、言い換えも小学生に伝わるように工夫しました。
###アイコン、背景、海洋生物のイラストの作成
ターゲットとなる小学生の低学年の方に好まれるようイラストを可愛らしいものになるようにしました。また背景デザインは薄い配色、キャラクターデザインは濃い配色にし、その他のデザインもなるべくシンプルなものにしてイラストがはっきりするように意識し作成しました。
###Monacaでのコーディング
まず、クイズが正しく表示され、答えが正しく表示されるようにプログラムを組みました。
次に、ユーザーが答えた結果によって背景が変わるプログラムを組みました。背景が変わる仕組みをクイズの正答数によって変化するように設定し、クイズの正答数を保持するため、ローカルストレージを利用しました。
試作とほぼ同じものができたので、クイズ数を３問から５問に増やし、海洋生物ごとにカテゴリ分けしたものも同じように完成させました。
monacaのファイルをGitHubにあげてＷＥＢアプリとして公開しました。
うみのれすきゅーたい

#アプリはこちら
[うみのれすきゅーたいリンク](https://sites.google.com/shizuoka-shimasho.com/uminoresukyu-tai-app/%E3%83%9B%E3%83%BC%E3%83%A0)
#目次
1.　[SDGｓの項目](#SDGsの項目)
2.　[アプリについて](#アプリについて)
3.　[ターゲット](#ターゲット)
4.　[アプリの内容](#内容)
5.　[アプリの特徴](#アプリの特徴)
6.　[開発行程](#開発行程)

# SDGsの項目
####14 海の豊かさを守ろう
このSDGsに注目した理由
「海洋プラスチック問題」を調べていた時に出てきた写真に衝撃を受けたから。
![shutterstock_1120768061.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551968/2b82207c-7f60-b83a-718e-1d7a376dfad1.jpeg)
Rich Carey/shutterstock

#アプリについて
 深刻化する海洋プラスチック問題を、一般人に知ってもらい、簡単にできる対策を伝えていきたいと思い、このアプリを作成しました。
#ターゲット
####海洋生物が好きな静岡県の小学生
私たちの住んでいる静岡県には日本一深い湾である駿河湾があり、日々恩恵を受けています。
海洋生物が好きな小学生に、「海で深刻な問題が起きていて、海洋生物が被害を受けている」ということを投げかけ、「海洋生物がかわいそうだから助けてあげたい」というところから海洋プラスチック問題を知ってもらい、実際に対策をしてほしいという思いから”海洋生物が好きな静岡県の小学生”に設定しました。
★大変だったこと★
・G20が開催されたことにより、この問題の知名度があがり、初期設定ターゲットの主婦ではあまり企画が生かされなくなってしまいました。
・１学期まで大雑把なターゲットしか考えていなかったため、企画が思うように進みませんでした。
#アプリの内容
海洋プラスチック問題に関する○×（まるばつ）クイズ
#アプリの特徴
海洋生物ごとにクイズのカテゴリーが分かれている。
クイズに正解すると、汚れた海の背景から綺麗な海の背景へと変わっていく。
![無題202_20191030135129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551968/f79bd7f8-3142-3b00-7ade-723715186719.png)
![無題202_20191030135208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551968/4a882d3b-91c6-08a7-9153-5c2ed4caca0c.png)
![無題202_20191030135254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551968/681da430-efc0-999b-89df-feb13ad383bd.png)
上記画像は"ジュゴン"の背景変化の一部
#開発行程
課題設定～アプリの要件定義はチームで話し合いながら行い、その後、
プログラマー、デザイナー、ディレクターに分かれて仕事を行いました。
[詳しい工程はこちら](https://qiita.com/drafts/5d638517930c905302d4/edit?resume=true)
workaround for panic when defining the same flag in multiple packages and go test -coverpkg.

# Issue

- go version: 1.13.5

複数のパッケージが同じ名前のフラグを定義している時、 `go test -coverpkg=all ./...` のように `-coverpkg` をつけて `go test`すると、 `flag redefined` でpanicする問題。

- [cmd/go: test coverpkg panics when defining the same flag in multiple packages · Issue \#27336 · golang/go](https://github.com/golang/go/issues/27336)
- [Go 1\.13 にアップデートするとテスト時に "flag provided but not defined" エラーが発生するケース \- blog\.syfm](https://syfm.hatenablog.com/entry/2019/10/01/063436)

```
$ go test -v -cover -coverpkg=all ./...
?       _/Users/y-goto/dev/go/flag-for-test/cmd1        [no test files]
?       _/Users/y-goto/dev/go/flag-for-test/cmd2        [no test files]
/var/folders/k7/2f4m6jwx6jjc2js45m62y9b00000gp/T/go-build687459203/b034/conf.test flag redefined: foo
panic: /var/folders/k7/2f4m6jwx6jjc2js45m62y9b00000gp/T/go-build687459203/b034/conf.test flag redefined: foo

```

# TL;DR

とりあえず以下で避けられる。

- `init()` でのフラグパースを避ける
- `flag.NewFlagSet`を使う

# How to reproduce

```
- cmd1
    - main.go // defines "foo" flag
- cmd2
    - main.go // defines "foo" flag
- cfg
    - conf_test.go // no-op _test
```

## `cmd1/main.go`
```go
package main

import (
        "flag"
        "fmt"
)

var foo = flag.String("foo", "", "flag foo")

func main() {
        flag.Parse()
        fmt.Println("foo", *foo)
}
```

## `cmd2/main.go`
same as `cmd1/main.go`

## `cfg/conf_test.go`

```go
package conf
```

## go test -coverpkg
```
$ go test -v -cover -coverpkg=all ./...
?       _/Users/y-goto/dev/go/flag-for-test/cmd1        [no test files]
?       _/Users/y-goto/dev/go/flag-for-test/cmd2        [no test files]
/var/folders/k7/2f4m6jwx6jjc2js45m62y9b00000gp/T/go-build687459203/b034/conf.test flag redefined: foo
panic: /var/folders/k7/2f4m6jwx6jjc2js45m62y9b00000gp/T/go-build687459203/b034/conf.test flag redefined: foo

goroutine 1 [running]:
flag.(*FlagSet).Var(0xc0000221e0, 0x11b58e0, 0xc0000523a0, 0x118c9d9, 0x3, 0x118d345, 0x8)
        /usr/local/go/src/flag/flag.go:848 +0x521
flag.(*FlagSet).StringVar(0xc0000221e0, 0xc0000523a0, 0x118c9d9, 0x3, 0x0, 0x0, 0x118d345, 0x8)
        /usr/local/go/src/flag/flag.go:751 +0x9e
flag.(*FlagSet).String(...)
        /usr/local/go/src/flag/flag.go:764
flag.String(0x118c9d9, 0x3, 0x0, 0x0, 0x118d345, 0x8, 0xc000052390)
        /usr/local/go/src/flag/flag.go:771 +0xab
_/Users/y-goto/dev/go/flag-for-test/cmd2.init()
        /Users/y-goto/dev/go/flag-for-test/cmd2/main.go:9 +0x53
FAIL    _/Users/y-goto/dev/go/flag-for-test/conf        0.227s
FAIL
```

"flag redefined: foo" と怒られる。

# Workaround

どうも `flag.CommandLine` (デフォルトのFlagSet) に同名のFlagをセットしているとして怒られているっぽい(go testの初期化ロジックが変わった影響？)。そこで、各パッケージで個別のFlagSetを作ってそこにフラグをセットするように変更した。あと init() でフラグをパースしてもダメなのでmain()でやってください。

```go
package main

import (
        "flag"
        "fmt"
        "os"
)

var (
        command = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
        foo     = command.String("foo", "", "flag foo")
)

func main() {
        command.Parse(os.Args[1:])
        fmt.Println("foo", *foo)
}
```
Railsアプリケーションのメモリが膨れ上がる問題

次のグラフは、Herokuで運用している、とあるRailsアプリケーションのMemory Usageです。1日1回再起動がかかったあと、スワップが発生するまでメモリ使用量が増え続けます。特に大きなデータをメモリ上に置き続けているわけではありません。

![memory-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308595/e66cace3-badf-7916-099b-900f3a04e09d.png)

Passengerの作者Hongli Lai氏が、Rubyのメモリが膨れ上がる問題について研究して記事を書いています（2019年3月）。

- [What causes Ruby memory bloat? – Joyful Bikeshedding](https://www.joyfulbikeshedding.com/blog/2019-03-14-what-causes-ruby-memory-bloat.html)

日本語での概略は、次の記事の真ん中あたりで読めます。

- [EuRuKo 2019 で発表してきました - クックパッド開発者ブログ](https://techlife.cookpad.com/entry/2019/07/10/083318)

Hongli Lai氏が見つけたのは、Rubyはメモリを正しく解放しているが、Cのライブラリ（glibc）のmalloc周りがなかなかメモリを回収してくれない、ということです。メモリ使用量よりパフォーマンスを優先しているせい、との見立てです。

メモリ使用量が膨れ上がるのを防ぐ方法は、3つあります。1と2は以前から知られた方法で、3はHongli Lai氏が発見した方法です。Hongli Lai氏の説が正しければ、3が本質的な解決方法ということになります。

1. mallocの代わりにjemallocを使ってRubyをコンパイルする。
2. 環境変数 MALLOC_ARENA_MAX=2 を指定する。
3. ガベージコレクションの後でmalloc_trimを呼ぶ。

Hongli Lai氏は、この件について一緒に研究してくれるよう呼びかけています。

- [The status of Ruby memory trimming & how you can help with testing – Joyful Bikeshedding](https://www.joyfulbikeshedding.com/blog/2019-03-29-the-status-of-ruby-memory-trimming-and-how-you-can-help-with-testing.html)

RubyのBug trackerでも報告されていますが、話は進んでいないもよう。

- [Feature #15667: Introduce malloc_trim(0) in full gc cycles - Ruby master - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/15667)

Rubyに上記の3のパッチを当てるプロジェクトが公開されています。残念ながらHeroku用は開発が進んでいないようです。

- [Fullstaq Ruby: Ruby, optimized for production](https://fullstaqruby.org/)

Herokuでは、上記の2の環境変数MALLOC_ARENA_MAX=2はデフォルトになりました。ただし、2019年9月24日より前に作られたアプリケーションでは自分で設定する必要があります。

- [Tuning glibc Memory Behavior | Heroku Dev Center](https://devcenter.heroku.com/articles/tuning-glibc-memory-behavior)

MALLOC_ARENA_MAXを指定すると、レスポンスタイムが若干増えるという実験結果があります。

- [Testing Cedar-14 Memory Use | Heroku Dev Center](https://devcenter.heroku.com/articles/testing-cedar-14-memory-use)

以上です。私自身は上記1-3のどれも実際には試していません、すいません。🙇‍♂️
CentOS7の最新版をVirtualBoxにインストールするときにKernel panicを起こしちゃう人が読むページ

#とにかく読むのも面倒ならば

BitTorrentでこのイメージをDLしてこのイメージでインストール＆アップデートする。Kernelの選択時に古いカーネルを選択。
http://archive.kernel.org/centos-vault/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.torrent

# Q.解決方法
A.古いイメージならば起こらないので古いイメージを持ってくる。

### Q.古いイメージのDL先がわからない

A.コ↑コ↓
有志のサーバーを直リンクするのは色々問題なのでみんなBitTorrentでDLしようね。

http://archive.kernel.org/centos-vault/7.3.1611/isos/x86_64/CentOS-7-x86_64-Everything-1611.torrent
http://archive.kernel.org/centos-vault/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.torrent
http://archive.kernel.org/centos-vault/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.torrent

### Q.アップデートしたら同様の症状に――

A.Kernelの選択時に古いカーネルを選択せざるを得ない。

### Q. VirtualBoxのバージョンのせいじゃない？

A.そうかもしれない。コメントで報告求む。
via https://forums.virtualbox.org/viewtopic.php?f=3&t=93990


### Q.他に解決方法があるならば

A.コメントに書いてください。
smartyでhtmlエスケープしない方法

備忘録

smartyでhtmlエスケープしない方法を検索したら、

```{$param|smarty:nodefaults}```

ってでてくるんですが、
やってみたらできなかったので、
いろいろと検索したら、

```{$param nofilter}```

で、できた。
眺めて覚えるGo言語 その10 panic

#Go言語のpanicを知ってパニクッタのである。
なんかエラーがあって継続するのに難しいときに使うのが**panic**です。

```f9.go
package main

import (
	"fmt"
)

func main() {
	defer fmt.Println("パニクリました。")
	fmt.Println("Start")
	panic("パニックになりました")
}
実行結果
>go run f9.go
Start
パニクリました。
panic: パニックになりました

goroutine 1 [running]:
main.main()
        C:/Users/hirat/go-work/function/f9.go:10 +0x12b
exit status 2
```
上記のようにdeferと共に使うとプログラムの中断がうまく行く。

```f10.go
package main

import (
    "fmt"
)

func helloworld() {
    defer fmt.Println("End")
    fmt.Println("Start")
    panic("Panic!")
}


func main() {
    helloworld()
}

実行結果
>go run f10.go
Start
End
panic: Panic!

goroutine 1 [running]:
main.helloworld()
        C:/Users/hirat/go-work/function/f10.go:10 +0x12b
main.main()
        C:/Users/hirat/go-work/function/f10.go:15 +0x27
exit status 2

```
###関数の中でパニクッても大丈夫。
**難しい言い方するとスタックポインターをちゃんと戻す。**

 - メモリーリークが起きない。
【Mac】VSCodeでExplorerからファイルを開く時のショートカット

# はじめに
VSCodeを快適に使いたく、色々ショートカットを調べていたのですが、Explorerに開いたフォルダからファイルを開く方法がどうしてもわからなかった。。。

# 結論
結論からいうと、`Space`でした。
違うグループで開きたい場合は、`ctrl + enter`。

# 調べ方
一応調べた方法も記録しておきます。
色々とガチャガチャやっていたら、`ctrl + enter`で違うグループにファイルを開くことができるということがわかったので、ショートカットの設定を`cmd + k cmd + s`開き、

> ショートカット設定画面
![setting_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241394/c18716d5-4134-97a2-b0c3-04f428d1d0ed.png)

オレンジ丸をクリックすると、ショートカットキーに対応するコマンドを検索できるので、そこで`ctrl + enter`を検索。

> `ctrl + enter`の検索結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241394/f7f360d7-6ccd-e6e5-6593-638278885a39.png)

すると、`ctrl + enter`が`explorer.openToSide`に対応していることがわかりました。ここで、`explorer.open...`的なコマンドがきっとあると想像して検索してみると、

> なんかそれっぽいやつが！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241394/75d95293-1a68-6aaa-361d-8e0051faedb8.png)

以上です。
RStudioでGitが正常に連携しないときの解決法

# 1. 趣旨

大学院の友人に「RStudioとGitHub繋げたらすっげー便利になったからYOUもやっちゃいなよ」と言われた翌日、ポチポチPCを弄りながら導入を試みたところ、こんな状態に。
![git.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/b6f90d33-79f8-1507-496f-9902c91b7fa2.png)

あっれー。
ということで、色々変えること2時間、だいぶ遠いところに原因がありましたとさ。

ところで、「解決方法だけ知りたいんだよ！」という~~せっかちさん~~時間を大切に使いたい方は、今すぐ**解決策2**へGO。

# 2. 細かいことはさておき。
Gitにも文字コードにも全く明るくないが、これに限った話ではなく、とにかくSHIFT-JISはあちこちでエラーを起こしまくる問題児。
Gitでも、SHIFT-JISを使おうとすると、それなりに手間がかかるようだ。

（参考）[Git / SourceTree で、Shift JIS ファイルの差分を文字化けなく表示する- Qiita](https://qiita.com/matsuoshi/items/c93a0b55df827a28514e)

この~~諸悪の根源~~**SHIFT-JISが、GitとRStudioの連携を阻んでいる**、かもしれない。
この時点ではまだ推測。

# 3. WindowsのデフォがSHIFT-JISなので。
~~そろそろSHIFT-JISなんて廃止してほしいと思うのだが、~~RStudioとGit (両方ともUTF-8のほうが相性が良い。らしい。) の架け橋であるWindowsそれ自体がSHIFT-JIS (正確にはCP932) がデフォみたいなので、どうも相性がわるい。
で、色々実験しているうちに分かったのは、**フォルダやファイルのパスに日本語が含まれていると、連携ができない**ということ。~~やってんなーお前~~。
実際、**パスが英数字のみの場合は、普通に連携できた**。

# 4. 解決策1 (強硬篇) : システム・ロケールをUTF-8にする
というわけで、`コントロールパネル > 時計と地域 > 地域 > 管理`と開きーの。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/88040a5a-1f53-713b-561a-c035625ae4d1.png" width="450">
`システムロケールの変更`をクリックして、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/da5dc38c-f6f9-f35f-79cf-853de7bf2fd2.png" width="450">
`ベータ: ワールドワイド言語サポートでUTF-8を使用`をチェック。すぐPCの再起動が求めらます。

そして改めてRStudioを起動すると...

![git2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/6a7494a4-5185-19cc-d4fc-e19f47d8952a.png)

\ﾊﾟﾝﾊﾟｶﾊﾟｰﾝｯ/
めでたしめでたし。

## 4-1. 副作用（悪い意味で）
ただし、この方法はあんまり**オススメできません**。

### 4-1-1. その1
この状態のままプロジェクトを保存しようとすると、**RStudioがクラッシュします**。ホントです。
なので、プロジェクトは保存しないこと前提に使う分にはまぁ・・・という。本末転倒感、半端ない。

### 4-1-2. その2
**他のプログラムが文字化けする**ことがあります。
なので、一時的でいいからどうしても連携させたい場合「だけ」ならアリですが...

# 5. 解決策2 (妥協篇) : ファイル名やフォルダ名に日本語を使わない。
はい、これに尽きます。システムの文字コードが何であろうとエラーにならないです。
そして、ローカル・スケールも変更する必要もないので、他のプログラムへの影響はゼロ！
まあしょうがないよね！**僕と一緒に妥協しましょう**。


**2020/01/22 追記**
たまたまかもしれませんが、一応ファイル名に関しては日本語が入っていても動作しました。
とはいえ、念のため避けておくほうが無難です。


# 6. おわりに
文字コードは大事。

おしまい。

# 7. 参考
Git自体の導入や、RStudioの連携手順等は、こちらが大変参考になりました。

- [RStudioではじめるGitによるバージョン管理 - Qiita](https://qiita.com/uri/items/6b94609f156173ed43ed)
- [IT苦手な人のためのWindows+gitでRStudioによるバージョン管理入門 - Analyze IT.](https://eulerdijkstra.hatenadiary.org/entry/20130327/1364392046)
🍰【CakePHP2】Fromをsubmitする前にRemodalを表示させる

## 環境
PHP 7.2.21
CakePHP 2.10.18
MySQL 5.7.27

## やりたいこと

Form内容を入力後にRemodalを表示させ、その「OK」ボタン押下をsubmitボタンとしたい

## やったこと

兎にも角にも公式ページよりダウンロード
https://github.com/VodkaBears/Remodal/releases

↓

distディレクトリにある4ファイルをすべて所定のディレクトリに配置する
remodal.min.jsが欠けているとオプションが無効になり
cssが欠けていると当然デザインが壊れる



```Hoge.ctp
<!--jsとcssを読み込む-->
<script type="text/javascript" src="/js/vendor/1.1.1/remodal.js"></script>
<script type="text/javascript" src="/js/vendor/1.1.1/remodal.min.js"></script>
<link rel="stylesheet" type="text/css" href="/js/vendor/1.1.1/css/remodal.css">
<link rel="stylesheet" type="text/css" href="/js/vendor/1.1.1/css/remodal-default-theme.css">


<!-- Remodalの「OK」ボタンが押された後にForm内容を送信させる -->
<script>
$(function($) {
    $(document).on('confirmation', '.remodal', function () {
        $('#HogeHogeConfForm').submit();
    });
});
</script>


<!-- Remodalの表示内容 -->
<div class="remodal" data-remodal-id="setting-caution-modal">
    <h1>Hoge設定の保存</h1>
    <div style="text-align: left">
        <p>
            <div id="setting-caution-modal-message">この内容にて保存してもよろしいですか？</div>
        </p>
    </div>
    <div style="text-align: center">
        <button data-remodal-action="confirm" class="remodal-confirm">OK</button>
        <button data-remodal-action="cancel" class="remodal-cancel">キャンセル</button>
    </div>
</div>


<!-- Formのcreate() -->
<?php
    echo $this->Form->create('HogeHogeConf', [
        'url' => '/hoge/hoge_hoge/conf',
        'inputDefaults' => [
            'label' => false,
            'div'   => false,
        ],
    ]);
?>


<!-- Form入力欄を色々と用意 -->
<!-- ... -->
<!-- ... -->
<!-- ... -->


<!-- クリックでRemodalを表示させるボタン -->
<?php
    $setingButton  = '<button onclick="location.href=\'#setting-caution-modal\';return false;">保存</button>';
    echo $setingButton;
?>


<!-- Formのend() -->
<?= $this->Form->end(); ?>
```

## 結果

Remodalを呼び出しOK押下後にForm内容をsubmitすることができる
buttonの表示もCakePHPのFormHelperでやるべきだが思いつかなかった
React にて、publicフォルダ内の画像を参照する

# tl;dr
`process.env.PUBLIC_URL`もしくは`window.location.origin`から`public`フォルダのパスを取得できます。

# サンプル
🚀以下のサンプルは、`create-react-app`直後の`App.js`を編集したものです。

```Javascript:App.js
import React from 'react';

function App() {
  return (
    <div className="App">
        <img src={`${process.env.PUBLIC_URL}/logo192.png`} />
        <img src={`${window.location.origin}/logo192.png`} />
    </div>
  );
}

export default App;
```

# 参考
📖[ReactJS and images in public folder](https://stackoverflow.com/questions/47196800/reactjs-and-images-in-public-folder)
WSLでUbuntsuが動いてるけど、python3.7.1にしたい

# はじめに
作業のメモです。
どなたかの参考になれば。

# 参考サイト
[Windows10(WSL)で、2018年的Pythonプロジェクト（①pyenv/pipenvの導入）](https://qiita.com/e-a-st/items/72c2e2a6a566d1f5d2a2)

# pyenvを入れる
```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

# ライブラリを入れる
次の手順のトライ＆エラーでした

```
sudo apt -y install libzip-dev
sudo apt -y install libffi-dev
```

# pyenvでpythonを入れる
```
$ pyenv install 3.7.1
Downloading Python-3.7.1.tar.xz...
-> https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz
Installing Python-3.7.1...
Installed Python-3.7.1 to /home/yama/.pyenv/versions/3.7.1
```

# pyenvで切り替え
```
$ pyenv global 3.7.1
$ python --version
Python 3.7.1
```
CircleCI MySQL8.0 認証方式の変更

CircleCIの設定でLaravelのマイグレーションが上手くいかずにハマりました、、、

## 環境
mysql ver 8.0

## エラー

マイグレーションStep時にエラーになります

```bash:
#!/bin/bash -eo pipefail
php artisan migrate

In Connection.php line 669:
                                                                               
  SQLSTATE[HY000] [2054] The server requested authentication method unknown t  
  o the client (SQL: select * from information_schema.tables where table_sche  
  ma = circle_test and table_name = migrations and table_type = 'BASE TABLE')  
                                                                               

In Connector.php line 70:
                                                                               
  SQLSTATE[HY000] [2054] The server requested authentication method unknown t  
  o the client                                                                 
                                                                               

In Connector.php line 70:
                                                                               
  PDO::__construct(): The server requested authentication method unknown to t  
  he client [caching_sha2_password]                                            
                                                                               


Exited with code exit status 1
```


## 原因

MySQL8.0.4 デフォルトの認証方式変更

MySQL8.0.4以降のログイン認証方式は`caching_sha2_password`がデフォルトであり、
接続ライブラリが`caching_sha2_password`に未対応のため接続不可

参考: [MySQL8.0 認証方式を変更する(Laravel5)](https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917)


## 解決策

`.circleci/config.yml`に`command: [--default-authentication-plugin=mysql_native_password]`追記

```yml:.circleci/config.yml
docker:
  - image: circleci/mysql:8.0
    command: [--default-authentication-plugin=mysql_native_password]
```
【Intellij IDEA】auto importから特定のファイル・パッケージを除外する

# やること
`java.awt`内に定義された内容と名前が被るクラスがプロジェクト内に有り、一々補完の候補に出てきて邪魔だったので、`java.awt`内のクラスが補完に引っかからないように設定を行います。

# やり方
`Preferences` -> `Editor` -> `General` -> `Auto Import` -> `Java`に`Exclude import and completion`という項目があるので、そこにパッケージ指定を追加することでできます。
スコープは`IDE`と`Project`が選べます。
![スクリーンショット 2020-01-10 14.31.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/f1e5707e-3519-257b-7964-6e73b3728e4d.png)
初めてCDNを使ってみての感想

明けましておめでとうございます。この記事は[OpenSaaS Studio Advent Calendar 2019](https://adventar.org/calendars/3928)、24日目の記事、にしようと思っていたけど年またぎました。遅れてすいません。

昨年末に初めてCDNを触ってみて感じたことがあったので、整理も兼ねて所感をまとめました。

# 経緯
年末年始に向けて負荷対策を行うことになったので想定負荷を出してみたところ、それなりに高い負荷を迎え撃つ必要がありました。システムはマイクロサービス構成でKubernetes上にデプロイされており、podをスケールアウトすれば対応できる想定でしたが、障害につながる要因は排除したいですよね。ということで原因を探っていたところ、CDNのキャッシュヒット率が想定よりも低いことが分かったので、キャッシュキーの条件を見直すことにしました。

# 効果
## 負荷耐性
キャッシュキーはクエリ文字列、Cache、リクエストヘッダなど色々な条件を組み合わせて設定できる（[CloudFlontの例](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)）のですが、アプリの変更によって一部のリクエストがCDNにキャッシュされなくなっていたので、CDNの設定を見直してキャッシュされるようにしました。
これにより、例えばキャッシュヒット率が60%->90%まで向上した場合、originの負荷がリクエスト全体の40%->10%と1/4まで下がるので、負荷対策として大きな成果になりました。また、定常的に負荷が下がるため、平時のoriginのリソースを削減することができ、コストの削減にもつながりました。

## スパイク耐性
キャッシュヒット率を上げて定常的な負荷を下げることはできましたが、キャッシュがない状態でCDNにリクエストが来るとその数だけoriginまで問い合わせが来てしまい、スパイク時に負荷が高くなる懸念がありました。特にtoC向けのサービスだとスパイクが非常に大きくなる傾向があるため、リソースのスケールアウトが間に合わない可能性がありました。
そこで、リクエスト集約の仕組みを有効にしました。（Fastlyだと[リクエスト共有](https://docs.fastly.com/ja/guides/request-collapsing)、Akamaiだと[Make Public Early](https://www.akamai.com/jp/ja/our-customers/customer-stories-nintendo-super-mario-run.jsp)という名前らしい。)これは、キャッシュキーが同一のリクエストがCDNに届くと、一つ目のリクエストだけoriginに問い合わせを行い、二つ目以降のリクエストはCDNのキューに貯めておき一つ目の問い合わせの結果をそれらのリクエストのレスポンスとして返す、という仕組みです。
これにより、大きくスパイクしてもキャッシュがあればそのキャッシュを返し、なければCDNでoriginへの問い合わせを待ち合わせしてくれる、という状態になりました。スパイク時のoriginへの影響がほぼなくなりリソースが非常に計画しやすくなりました。

# 気になった点
## キャッシュの設計
上で挙げた[CloudFlontの例](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)のように様々な条件をキーとして指定でき、それらを組み合わせてキャッシュのバリエーションや可否を細かく制御しようとすると複雑になるので、使いこなそうとすると大変そうです。また、キャッシュ周りの設計が変わる頻度は小さいと思うので、設計意図や知識/意識をチームに残すには意識的な施策が必要かもしれません。例えば、設計意図なら前提知識も含めたドキュメントの整備、知識や意識はCDNに関する定期的な障害対応など。後者は別の観点でカオスエンジニアリングに興味があるので、その仕組みを使って自動化できると施策の運用も楽になりそうな気がします。

## CDN設定の運用
設定の変更はCDNが提供しているGUIで行っているのですが、設定自体の数が多いためキャッシュキーなど複数の設定で共通している内容を変更する場合は画面上で同じ操作を繰り返す必要があります。手間や操作ミスの可能性と設定が増えていった場合に備えて、APIなどを利用してこちらの運用に合わせたツールを用意できると良さそうです。
また、可能であれば設定をコード化したりCI/CDに組み込んで運用フローに乗せられると、CDNの運用を特別意識する必要がなくなり、反映漏れなどを防ぐことができそう。

## キャッシュ漏れの検知
意図せずにキャッシュヒット率が下がってきたら検知したいです。CDNに検知する仕組みがあればそちらを使っても良いし、CDNとintegrationできるモニタリングツールを採用していればそちらでアラートを仕込んでも良さそう。今回は管理するツール/設定を増やしたくなかったのでモニタリングツールの方で仕込みました。
ただし、キャッシュされなくなると上で挙げたリクエスト集約の仕組みに乗らなくなるので、スパイクした場合にoriginがリクエストを捌けなくて503エラーなどを返すのが先になるかもしれません。

# まとめ
メリットが大きいので、課題を解決しつつCDNと上手く付き合っていければと。
Voidを返す関数内でのreturnは気をつけた方がいい

# 追記

- Warningは正しかったです。

# 問題

- 以下はどういう出力になるでしょうか。

```swift
func foo() {
  print(#function)
  return // ← この後の処理は一旦無視したいからreturnしておこう

  bar()
}

func bar() {
  print(#function)
}
```

**答え**

- `bar()` も実行され出力されます。

```
foo()
bar()
```

# 理由

- 構文上、returnの後の改行は無視されて解釈されるので `return bar()` となり、 `bar()` が実行されるため。

```swift
func foo() { // 暗黙的に戻り値はVoidを返す関数
  print(#function)
  return
   
  bar() // return bar() と解釈されるのでbar()は実行される
}

func bar() { // 暗黙的に戻り値はVoidを返す関数
  print(#function)
}
```

- 以下が構文上許されているのと同じ意味です。

```swift
func baz() -> Int {
  return
    
    
  1
}
```

# 解決方法

- セミコロンをつけます。

```swift
func foo() { // 暗黙的に戻り値はVoidを返す関数
  print(#function)
  return; // セミコロンをつければ `return ()` として解釈される
   
  bar() // 実行されない
}
```

# ~~バグ？~~

**追記**

- あれ！Warningの内容が **Expression following 'return' is treated as an argument of the 'return'   ('return' に続く式は'return'の引数として扱われます)** だ！よく一時的な早期returnで遭遇する `Code after 'return' will never be executed` と勘違いしていた…なのでWarningはあっていますね。

---

- ~~`return` 後の改行が無視されて解釈されるのは言語仕様としては正しいと思いますが、Warningで `Expression following 'return' is treated as an argument of the 'return'` が表示されるのはバグだと思われます。~~ あってる🙇‍♂️


<img width="972" alt="スクリーンショット 2020-01-10 14.08.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16700/97b92ce3-eb08-43a5-f19b-a30498f4db43.png">

- ちなみにIntの方も表示された…。

<img width="965" alt="スクリーンショット 2020-01-10 14.21.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16700/8e724d22-30b7-3cc2-d701-980669604f43.png">

# まとめ

- Voidを返す関数でreturnを使う場合はセミコロンをつけないと意図しない挙動になる可能性がある。 **追記:** Warningはちゃんと読みましょう。。。
- [DevSap](https://twitter.com/iphone_dev_sap)にて `return` が無視されるんだけどって話題が出て、僕自身も遭遇した経験があるので今回調査してみました。今までは差分コンパイル時のバグかな？って思って `return` は避けてコメントアウトするようにしていたのですが、今回やっと原因がわかりました。~~これは罠すぎる。。。~~
rails usersテーブルの値をpasswordなしで更新する

##はじめに
Userテーブルのカラムを**passwordなし**で更新しようと思ったときに、更新ができずに手間取ってしまったのでその備忘録として記載する。


##概要
usersテーブルに**profile**というカラムを持たせていたのだが、**ユーザー登録後**にユーザーページからユーザー情報を更新したい。

##ぶつかった課題
controllerで以下のように定義して実行した際にRollbackが起こり、値が更新されなかった。

```ruby:mypage_controller.rb
   class MypageController < ApplicationController
    # 途中略
    def update
    
      user=User.find(current_user.id)

      #パスワードなしでのプロフィールの変更    
      user.update_without_password(nickname:params[:mypage][:nickname],profile: params[:mypage][:profile])
    
      redirect_to root_path,notice: 'プロフィールが変更されました'
    end
    # 途中略
   end

```
- エラー内容

```ruby:
[2] pry(#<MypageController>)> user.update_without_password(nickname:params[:mypage][:nickname],profile: params[:mypage][:profile])
   (0.3ms)  BEGIN
  ↳ (pry):2
  User Exists (3.4ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY 'ytest@gmail.com' AND `users`.`id` != 21 LIMIT 1
  ↳ (pry):2
   (0.2ms)  ROLLBACK
  ↳ (pry):2
=> false
[3] pry(#<MypageController>)> user.errors
=> #<ActiveModel::Errors:0x00007f8b3304a270
 @base=
  #<User id: 21, email: "ytest@gmail.com", last_name: "test", first_name: "test", last_name_kana: "test", first_name_kana: "test", nickname: "test", profile_image: nil, birthday: "1990-12-04", telephone: "12345678", created_at: "2020-01-10 04:36:29", updated_at: "2020-01-10 04:36:29", provider: nil, uid: nil, profile: "test">,
 @details={:password=>[{:error=>:too_short, :count=>6}, {:error=>:blank}], :password_confirmation=>[{:error=>:blank}]},
 @messages={:password=>["は6文字以上で入力してください", "を入力してください"], :password_confirmation=>["を入力してください"]}>
```

##解決策
modelファイルのバリデーションいじった。

詳細は以下

- 変更前

```ruby:user.rb
   class User < ApplicationRecord
    # 途中略
     validates :password, length: { minimum: 6 }
     validates :password_confirmation, presence: true
     validates :password, presence: true, unless: :uid?
   end
```


- 変更後

passwordのバリデーションに対して、on create  を追加することで、　userの**新規登録するときにのみ**バリデーションによる入力チェックがかかるように変更した。コード内容は以下

```ruby:user.rb
   class User < ApplicationRecord
    # 途中略
     # create のみバリーデーションをかける
     validates :password, length: { minimum: 6 }, on: :create
     validates :password_confirmation, presence: true, on: :create
     validates :password, presence: true, unless: :uid?, on: :create
   end
```

とりあえずバリデーションを状況によって、かけたい場合には、オプションとしてon< xxx >を指定すればよいらしい。
ちなみに参考資料はこちら

- [状況によってsave時に実行するバリデーションを切り替える](https://qiita.com/kadoppe/items/061d137e6022fa099872)

もっと勉強しないとなぁ〜
AWSに構築したWordPressをhttps対応してみた

# はじめに
「[AWSにWordPressを構築してみた](https://qiita.com/olaf_system/items/e5e17cd8ead71ec9a096)」
「[AWSに構築したWordPressに独自ドメインを割り当ててみた](https://qiita.com/olaf_system/items/46723a020456120ffd65)」
の続き。
WordPressを構築して独自ドメインを割り当ててSSL対応したところまで終わった。
が、WordPress側がhttpsに対応してないのでデザイン崩れが発生しているのと
httpでのアクセスがまだできる状態なのでその２つを対応していく。

# https対応設定
現状、こんな感じ。
<img width="1425" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3536333632352f65636663333433632d346563342d663334332d663032362d3735656331636436613133662e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563625/ec7dc549-31a6-e05c-3fe1-498a277747bd.png">

httpsのページからhttpのコンテンツを参照しようとするとセキュリティレベルの問題でブラウザが読み込みを止めるのでこういう現象が起こる。

```html
<link rel='stylesheet' id='dashicons-css'  href='http://olafblog.org/wp-includes/css/dashicons.min.css?ver=4.7.2' type='text/css' media='all' />
```

こういうの。ってことでコンテンツの読み込みもhttpsでするようにしていく。

### WordPress側での設定
ちょっと調べたらWordPressのプラグインで一発で対応できそうなのでそのプラグインを試してみる。

http://xxx.xxx.xxx.xxx/wp-login.php

で管理ツールにログイン。[プラグイン]>[新規追加]で画面を開いて
「Really Simple SSL」
を検索してインストールして、有効化！

はい、完成。

https://olafblog.org

でログイン。・・・あれ崩れたまま？
管理画面に入って原因ch・・・リダイレクトループ？

ぐぐるとどうやらサーバー側での設定が必要みたい。

### サーバー側での設定
サーバー側にログインして設定を追加していく。

```
$ cd /var/www/html

# 管理画面から設定が変えれるように権限変更しておく
$ chmod 660 wp-config.php

# 下記設定を
# require_once(ABSPATH . 'wp-settings.php');
# の上部に追加
$ vi wp-config.php
_/_/_/_/_/_/_/_/_/_/_/_/_/_/
$_SERVER['HTTPS']='on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
_/_/_/_/_/_/_/_/_/_/_/_/_/_/
```

再度アクセス。・・・うん。管理画面に入れるようになった。

### 再度、WordPress側ので設定
[設定]の「WordPressアドレス(URL)」と「サイトアドレス(URL)」をhttpsに変更。
あとなんか上の方にボタンが出てたのでSSL有効ボタンをポチる。

![スクリーンショット 2020-01-10 13.25.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563625/5cb24dd1-3914-8e66-765d-ff95ed699721.png)

さて、トップページにアクセス。
![スクリーンショット 2020-01-10 13.28.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563625/136c6f3f-5295-44e1-869d-659c0eac4ea5.png)

お、できた。余裕ですねぇ。

# http->httpsリダイレクト設定
最後にhttpアクセスをhttpsリダイレクトするように設定していく。

```
# server_nameを正規ルートのみ許可するように不要な記述を削除
# httpアクセスに対して301リダイレクトするよう設定を追加
$ sudo vi /etc/nginx/conf.d/wordpres.conf
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
server {
  listen 80;
  server_name olafblog.org;

  location / {
    if ($http_x_forwarded_proto = 'http'){
      return 301 https://$host$request_uri;
    }
    root /var/www/html;
    index index.php index.html;
  }
  location ~ \.php$ {
    root /var/www/html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

# 再起動だとうまく設定が反映されなかったので再起動
$ sudo nginx -s stop
$ sudo nginx
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
```

オッケー。設定完了したのでhttpでアクセス。

http://olafblog.org

httpsにリダイレクトされることを確認。
簡単ですねぇ。お疲れ様でした。
次回「[WordPressにGoogleAnalyticsを導入してみた](https://qiita.com/olaf_system/items/4da6854d6ecb3e8355f3)」
OSXでTypeScriptのビルド時に大文字と小文字を区別する

## 起こった問題
ローカル環境（OSX）では通っていたTypeScriptnのビルドが、ステージング環境（Linux）では失敗した。

## 原因
OSXのデフォルトのファイルシステムがcase insentive（大文字と小文字を区別しない）するのに対して、 Linuxの方がcase sensitive（大文字と小文字を区別する）であったため。

UIコンポーネントを開発している時は、モジュール名の先頭を大文字にしていたが、import時に小文字にtypoしてしまっていた。それでもMacの場合は、ビルドが通ってしまう。

*Linux Kernelでもファイルシステムによっては case insentiveになる模様。

## 解決策
一旦はtypoを修正してことなきを得たが、恒久対応をしたい。

`tsconfig.json`のcompilerOptionsで設定できないかなと思ったが出来なかった。

`forceconsistentcasinginfilenames` という名前がそれっぽいのがあるが、これは同じ参照への一貫性を担保するだけで根本的な解決はしてくれない。

`case sensitive`なビルドについては2018年から議論をしているが導入までには至っていないようだった。個人的にはcompilerOptionsで設定出来るようにして欲しい。
[該当のissue](https://github.com/microsoft/TypeScript/issues/21736)

最終的には、以下のwebpackのpluginで解決した。
https://github.com/Urthen/case-sensitive-paths-webpack-plugin

> This Webpack plugin enforces the entire path of all required modules match the exact case of the actual path on disk. Using this plugin helps alleviate cases where developers working on OSX, which does not follow strict path case sensitivity, will cause conflicts with other developers or build boxes running other operating systems which require correctly cased paths.

OSXで開発する人向けであり、今回の問題解決にドンピシャのpluginだった。

```.webpack.config.js
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');

module.exports = {
  // other plugins ...
  plugins: [
    new CaseSensitivePathsPlugin(),
  ]
  // other webpack config ...
};

```

moduleをinstallすれば特にオプションを追加することもなく、上記のようにプラグインを設定するだけで、大文字と小文字を区別することが出来る。

eslintでも対応できそうだが、あくまでlintなので現時点ではwebpackで対応した方が良さそう。
Macで開発する時は常に入れておいた方が良い気がする。
WordPressでPHPデビューする際にお勧めの勉強法

#前提
・HTML & CSS　習得済み
・PHP知らない

##出来るようになること
・phpファイルを扱えて自分でテーマが作れる

#手順
1.
progateのPHPコースをクリアする

2.
WordPressのphp本を読む
『WordPressユーザーのためのPHP入門 はじめから、ていねいに。』

3.
自分でテーマを作る教本を参考に作ってみる

##理由
特に伝えたいことは、手順1のprogateのPHPコースが優秀だと言うこと。
手順2の本もかなり優良だが、progateの方が資料のわかりやすさ、実際に手を動かせる点で理解度が抜群に高い。
とりあえずこのあたりから慣れて行ったあとで、テーマ作成に入った方がいいと思う。
FactoryBotの記述についての備忘録

まずFactoryBotの記述を簡略化するために
以下の記述をする。

```ruby:spec/spec_helper.rb
#〜省略〜
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
  #RSpec~ の　do~end内に上記の記述をする。
  #〜省略〜
end
```

下記の記述に関して他に応用が効くように公式化してみようと思う。

```ruby:spec/factories/messages.rb
FactoryBot.define do
  factory :message do
    content {Faker::Lorem.sentence}
    image {File.open("#{Rails.root}/public/images/test_image.jpg")}
    user
    group
  end
end
```

公式化

```ruby:spec/factories/message
FactoryBot.define do
# gem名.define do
  factory :message do
  #factry :モデル名 do                      　以下で左記モデルのテストデータを定義する。
  #factry :テストデータ名, class モデル名 do     左記のような形だと、左記モデル内の"テストデータ名"というテストデータを定義する

    content {Faker::Lorem.sentence}
    # カラム名 {gem名::Lolem.表示形式}     　カッコ内はFakerというgemの記法。Lolem はダミーテキストの１種で.sentenceはその表示形式（今回は文章として表示）
    # カラム名 '任意の文字列'                左記で任意の文字列を表示させることも可能
    image {File.open("#{Rails.root}/public/images/test_image.jpg")}
    # カラム名 {表示形式.open("写真のルート")}
    user
    group 
  end
end
```

現状の理解ではこのようなイメージ。
File.openのところや、Rails.rootのところ
FactoryBotの記述を簡略化するための記述に関する理解に自信がないので、
もし解釈が異なるところがありましたらご教示ください。
【Rails】redirect_toで変数やflashを渡す

`redirect_to`でページ遷移する先に、変数やflashを引き渡す方法がわかったのでメモ。

##変数
###送る側
```rb
redirect_to hoge_url(user_id: @customer.id)
```

###受け取る側
```rb
user_id = params[:user_id]
```

##flash
###alert, notice
```rb
redirect_to hoge_url, alert: 'エラーが発生しました'
redirect_to hoge_url, notice: '登録しました'
```

###それ以外
```rb
redirect_to hoge_url, flash: { key: 'message' }
redirect_to hoge_url, flash: { info: 'メールを送信しました' }
```

## おまけ
以下のような書き方もできる

```rb
redirect_to '/user/show'
```

##参考
[flashを使って簡易メッセージを表示する](https://rails-study.net/flash/#redirect_toflash)
bundle install時に"[DEPRECATED] The `--path` flag is deprecated"という警告が発生した場合の対応手順

## はじめに
Bundler 2.1ではBundler 3で使えなくなる機能に対して警告が表示されるようになりました。

参考：[【翻訳】Bundler 3アップグレードガイド \- Qiita](https://qiita.com/jnchito/items/d3257a5f46f4f1aee200)

この関係でBundler 2.1では`bundle install`に`--path`オプションを付けると以下のような警告が発生します。

```console
$ bundle install --path vendor/bundle
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set path 'vendor/bundle'`, and stop using this flag
```

この記事ではこの警告に対する対応手順を説明します。

なお、「今日初めてBundlerを使った」というRuby初心者さんは、必ずこの記事を最後まで読んでください！（大事な話が書いてあります）

## 対応手順

### すでにbundle installを実行した場合

警告は出るものの、`bundle install`実行後も`--path vendor/bundle`のオプションは記憶されます。
ですので、それ以上の操作は必要ありません。

### bundle installをまだ実行していない場合

`bundle install`をまだ実行していない場合は、`bundle install`を実行する前に`bundle config`コマンドで明示的にpathを設定してください。
それから`--path`オプションなしで`bundle install`を実行すると警告は発生しません。

なお、pathの設定方法はglobalとlocalの2種類があります。
従来の`bundle install --path vendor/bundle`と同じ動きになるのはlocalの方です。

```console 
# マシン全体でbundle install実行時のインストール先を
# vendor/bundleに設定する場合（global）
bundle config set path 'vendor/bundle'

# そのプロジェクト内でのみ、bundle install実行時の
# インストール先をvendor/bundleに設定する場合（local）
bundle config set --local path 'vendor/bundle'

# --pathオプションなしでインストールを実行する
bundle install
```

## 最後に：でもちょっと待って！！本当にpathの指定は必要？

もしあなたが今までBundlerを使ったことがなく、「ネットで見つけたBundlerの紹介記事を見ながら`bundle install`をしようとしたら警告が出たので、警告メッセージでググってこのページにやってきた」という人であれば、きっと`--path vendor/bundle`を付ける必要はありません。

`--path vendor/bundle`のオプションを付けることを推奨している多くのWeb記事は、その必要性を十分に理解していないものが多いです。

pathオプションは特殊な条件下でしか必要になりません。
ですので、「今日初めてBundlerを使います」というような初心者さんは、 **pathを指定せずにシンプルに`bundle install`を実行してください。**

（すでに`bundle install --path vendor/bundle`を実行した人は、次回からpathオプションなしで`bundle install`してください）

この件に関する詳しい話は以下の記事にまとめているので、こちらも読んでもらえると幸いです。

[bundle install時に\-\-path vendor/bundleを付ける必要性は本当にあるのか、もう一度よく考えてみよう \- Qiita](https://qiita.com/jnchito/items/99b1dbea1767a5095d85)
競プロの基本事項確認~累積和といもす法~

いもす法を[ABC035-C](https://atcoder.jp/contests/abc035/tasks/abc035_c)を解いている際に実装したのでメモとして残しておきます。また、累積和を含めどのような時に使えば良さそうかについても最後に触れたいと思います。(今回初めていもす法を勉強したので間違っている箇所があるかもしれません。ご指摘していただくとありがたいです。)

#いもす法とその実装

ABC035-Cの問題文は以下のようになります。
<img width="1104" alt="スクリーンショット 2020-01-10 11.35.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331393/b4cf4d8e-b1d8-1705-3564-3efce06c99c4.png">

問題文通りに実装する場合、$l$から$r$までの駒を裏返す操作を繰り返せば良いので、N個の駒用の配列を用意して(最初はTrueかFalseで初期化)、Q回のそれぞれで$l_i$から$r_i$までのそれぞれの要素を反転させれば良く、以下のようなコードになります。

```python:answerC1.py
def int2(k):
    return int(k)-1
n,q=map(int,input().split())
lr=[list(map(int2,input().split())) for i in range(q)]
x=[False]*n
for i in range(q):
    for j in range(lr[i][0],lr[i][1]+1):
        x[j]=not x[j]
print("".join(list(map(str,map(int,x)))))
```

しかし、n,qの制約が$2\times{10}^5$であり、最悪計算時間がO($nq$)になることから制限時間に間に合わないことがわかります。

ここで用いることができるのが[いもす法](https://imoz.jp/algorithms/imos_method.html)になります(次元拡張や特殊な図形についても考えることができるので非常に有効な方法と考えられています。)。
いもす法では入口で加算、出口で減算をします(記録)。そして、記録の段階が終わったら前から順に足していきます(シミュレート)。

したがって、この問題ではl番目からr番目からまでを裏返すとした時にl番目の要素に+1をしてr+1番目の要素に-1をして記録をしています。このようにすると、記録の後にシミュレートする際に前の要素の値を順に足していく(累積和を前の要素から順に求めていく)ことで、それぞれの要素が何回裏返されたかをより少ない計算量で求めることができます。(l番目の要素に+1をしてr+1番目の要素に-1をする際を考えると、i:0→nでループを回せばちょうどl番目からr番目だけ1で他の要素は0になっていることがわかります。)
以上をそのまま実装すると以下のようなコードになります(O($n+q$)になります。)。



```python:answerC2.py
#いもす法
import sys
#input→sys.stdin.readline半分の時間に
input=sys.stdin.readline
n,q=map(int,input().split())
x=[0]*n
for i in range(q):
    l,r=map(int,input().split())
    x[l-1]+=1
    if r<n:
        x[r]-=1
for i in range(n-1):
    x[i+1]+=x[i]
    x[i]%=2
x[n-1]%=2
print("".join(list(map(str,x))))
```

#いもす法と累積和の使用法

前節でABC035におけるいもす法の実装については説明できたと思うので、実際にどんな時に使えば良いかを一般化して残しておきたいと思います。

まず、いもす法の場合は、**それぞれの区間の値に対して更新が何回も行われ、最後にまとめて全体の値を求めたい場合**に用いると考えられます。このような場合は**その区間の入口と出口のみ**に対し、加算と減算をそれぞれ先に行い、最後に累積和を求めていくことで大幅に計算量を減らすことができます。

それに対し、累積和の場合は、**区間の値の更新は起きず、最後にいくつもの区間の値を求めたい場合**に用いられると考えられます。このような場合は、**基準となる要素(多くの場合は一番初めや一番最後の要素)からの累積和**を考え、求める際にはそれぞれの要素までの累積和の差分を考えることで大幅に計算量を減らすことができます。

#おまけ(いもす法を使う問題)

[ABC014-C](https://atcoder.jp/contests/abc014/tasks/abc014_3)

```python:answerC.cc
import sys
#input→sys.stdin.readline3/4の時間に
input=sys.stdin.readline
n=int(input())
x=[0]*1000001
for i in range(n):
    a,b=map(int,input().split())
    x[a]+=1
    if b+1<1000001:
        x[b+1]-=1
ans=x[0]
for i in range(1000000):
    x[i+1]+=x[i]
    ans=max(ans,x[i+1])
print(ans)
```
LambdaでCognito認証(ユーザー認証)

#はじめに

SDKをローカルに持ってきてゴニョるサンプルは検索に引っかかるのですが、
クラウド側(Lambda関数内部)で完結するサンプルが見つからない...
よし、ならば投稿してしまえ。

[トップ](https://qiita.com/minmax/items/a36b081c073eff4a6533)
├[ユーザー作成](https://qiita.com/minmax/items/8c2aa57b76e09b8192ed)
├[ユーザー確認](https://qiita.com/minmax/items/ed4f81e61c2617d5c6cf)
├__ユーザー認証　←イマココ__
└[ユーザー認可](https://qiita.com/minmax/items/acf44e144f4ee9be7949)

#ユーザー認証 (InitiateAuth)
通知されたIDとパスワードの組み合わせが正しいかを検証します。
登録された情報と一致した場合、ユーザー認証に必要なIDトークンを発行します。

##ドキュメント
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#initiateAuth-property

##ソースコード
```javascript
'use strict';

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider();

/**
 * initiateAuthする
 * @param {string} userId ユーザーのメールアドレスor電話番号
 * @param {string} userPassword ユーザーのパスワード
 * @returns {Promise<Object>} HTTPレスポンス 200 OK
 */
module.exports = async (userId, userPassword) => {

  // ConfirmSignUpのパラメーター
  const params = {
    AuthFlow: 'USER_PASSWORD_AUTH', // ユーザープールの 全般設定>アプリクライアント>認証フローの設定 で指定した認証方法
    ClientId: '{アプリクライアントID}', // ユーザープールの 全般設定>アプリクライアント で確認する
    AuthParameters: {
      'USERNAME': userId,
      'PASSWORD': userPassword,
    },
  };

  // initiateAuth実行
  const result = await cognito.initiateAuth(params).promise().catch(error => {
    // 必要に応じて例外処理を追加する。
    // 例えば、パスワード不一致の例外は→「error.code == 'NotAuthorizedException'」
    throw error;
  });

  // HTTPレスポンス 必要に応じて編集する。
  // 例えば、IDトークンをcookieに設定したい場合は、headersに↓これを追加する。
  // 'Set-Cookie': `IdToken=${result.AuthenticationResult.IdToken}; Max-Age=${result.AuthenticationResult.ExpiresIn}`
  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json; charset=utf-8',
    },
    body: JSON.stringify({
      IdToken: result.AuthenticationResult.IdToken,
    }),
  };
};
```
LambdaでCognito認証(ユーザー確認)

#はじめに

SDKをローカルに持ってきてゴニョるサンプルは検索に引っかかるのですが、
クラウド側(Lambda関数内部)で完結するサンプルが見つからない...
よし、ならば投稿してしまえ。

[トップ](https://qiita.com/minmax/items/a36b081c073eff4a6533)
├[ユーザー作成](https://qiita.com/minmax/items/8c2aa57b76e09b8192ed)
├__ユーザー確認　←イマココ__
├[ユーザー認証](https://qiita.com/minmax/items/12e65cd51d85f419faa5)
└[ユーザー認可](https://qiita.com/minmax/items/acf44e144f4ee9be7949)

#ユーザー確認 (ConfirmSignUp)
作成したユーザーの連絡手段(メールアドレスor電話番号)が有効か確認します。
通知された確認コードが正しければ、ユーザーのアカウントステータスを「CONFIRMED」にします。

##ドキュメント
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#confirmSignUp-property

##ソースコード
```javascript
'use strict';

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider();

/**
 * ConfirmSignUpする
 * @param {string} userId ユーザーのメールアドレスor電話番号
 * @param {string} confCode ユーザーに通知した確認コード
 * @returns {Promise<Object>} HTTPレスポンス 200 OK
 */
module.exports = async (userId, confCode) => {

  // ConfirmSignUpのパラメーター
  const params = {
    ClientId: '{アプリクライアントID}', // ユーザープールの 全般設定>アプリクライアント で確認する
    Username: userId,
    ConfirmationCode: confCode,
  };

  // ConfirmSignUp実行
  const result = await cognito.confirmSignUp(params).promise().catch(error => {
    // 必要に応じて例外処理を追加する。
    // 例えば、確認コード不一致の例外は→「error.code == 'CodeMismatchException'」
    throw error;
  });

  // HTTPレスポンス 必要に応じて編集する。
  return {
    statusCode: 200,
  };
};
```
LambdaでCognito認証(ユーザー作成)

#はじめに

SDKをローカルに持ってきてゴニョるサンプルは検索に引っかかるのですが、
クラウド側(Lambda関数内部)で完結するサンプルが見つからない...
よし、ならば投稿してしまえ。

[トップ](https://qiita.com/minmax/items/a36b081c073eff4a6533)
├__ユーザー作成　←イマココ__
├[ユーザー確認](https://qiita.com/minmax/items/ed4f81e61c2617d5c6cf)
├[ユーザー認証](https://qiita.com/minmax/items/12e65cd51d85f419faa5)
└[ユーザー認可](https://qiita.com/minmax/items/acf44e144f4ee9be7949)

#ユーザー作成 (SignUp)
通知されたIDとパスワード(とその他の情報)でユーザーアカウントを作成します。
続けて、登録したメールアドレスor電話番号に確認コードを通知します。

##ドキュメント
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#signUp-property

##ソースコード
```javascript
'use strict';

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider();

/**
 * SignUpする
 * @param {string} userId ユーザーのメールアドレスor電話番号
 * @param {string} userPassword ユーザーのパスワード
 * @returns {Promise<Object>} HTTPレスポンス 200 OK
 */
module.exports = async (userId, userPassword) => {

  // SignUpのパラメーター
  const params = {
    ClientId: '{アプリクライアントID}', // ユーザープールの 全般設定>アプリクライアント で確認する
    Username: userId, 
    Password: userPassword,
    UserAttributes: [
      {Name: '{属性名1}', Value: '{属性値1}'}, // 必要に応じて増減する。
      {Name: '{属性名2}', Value: '{属性値2}'}, // ユーザープールの 全般設定>属性 の 
      {Name: '{属性名3}', Value: '{属性値3}'}, // 標準属性とカスタム属性が該当する。
      {Name: '{属性名4}', Value: '{属性値4}'}, // 必須指定したものは、もちろん必須。
    ],
  };

  // SignUp実行
  const result = await cognito.signUp(params).promise().catch(error => {
    // 必要に応じて例外処理を追加する。
    // 例えば、IDが重複したときの例外は→「error.code == 'UsernameExistsException'」
    throw error;
  });

  // HTTPレスポンス 必要に応じて編集する。
  return {
    statusCode: 200,
  };
};
```
LambdaでCognito認証

#はじめに

SDKをローカルに持ってきてゴニョるサンプルは検索に引っかかるのですが、
クラウド側(Lambda関数内部)で完結するサンプルが見つからない...
よし、ならば投稿してしまえ。

__トップ　←イマココ__
├[ユーザー作成](https://qiita.com/minmax/items/8c2aa57b76e09b8192ed)
├[ユーザー確認](https://qiita.com/minmax/items/ed4f81e61c2617d5c6cf)
├[ユーザー認証](https://qiita.com/minmax/items/12e65cd51d85f419faa5)
└[ユーザー認可](https://qiita.com/minmax/items/acf44e144f4ee9be7949) ※Lambdaで認可する方法を解説します。

※メインはLambda関数のコードの紹介です。付随する情報は簡潔に記します。

#概要
ローカルにダウンロードしたSDKを使うのではなく、
クラウド側で用意されているSDKを使ってCognito認証しよう。
というのが今回のコンセプトです。

↓こちらを使います。
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546599/586d967b-0a0a-f13c-f154-0460bb96b588.png)
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546599/f4c6fcfb-9df5-4d6c-a2e5-ea1dc6968cb8.png)

##Cognito
1. ユーザープールを作成する。  
※必須属性は任意。
2. 全般設定>アプリクライアント からアプリクライアントを作成する。  
※認証フローは"__ALLOW_USER_PASSWORD_AUTH__"を選択する。

##Lambda
1. Lambda関数を作成する。  
※ランタイムはNode.jsの最新版を選択する。
2. Cognitoのポリシーをアタッチする。  
※とりあえずは「AmazonCognitoPowerUser」だけでOK。必要に応じて取捨選択を。
3. 関数コードを書く。詳細は各ページにて。
 1. [ユーザー作成](https://qiita.com/minmax/items/8c2aa57b76e09b8192ed)
 2. [ユーザー確認](https://qiita.com/minmax/items/ed4f81e61c2617d5c6cf)  
 3. [ユーザー認証](https://qiita.com/minmax/items/12e65cd51d85f419faa5)
 4. [ユーザー認可](https://qiita.com/minmax/items/acf44e144f4ee9be7949)

##API Gateway
1. "__REST API__" または "__HTTP API__"を作成する。  
※REST APIの場合は、Lambdaプロキシ統合を使用する。
2. 先に作成したLambda関数を、統合先に指定する。  
※REST APIの場合は、デプロイを忘れずに。
FlaskによるGET／POST通信（ついでにCORS対応についても）

# 概要

　FlaskにおけるPOST通信の内容が曖昧だったので、GET／POST通信どちらもここにまとめる。
　内容としては、「フォームによる通信」／「Json形式による通信」が存在する。「Flask POST」的に検索すると情報がごちゃごちゃで出てくる。ちなみにPython 3.7です。

# GET通信

```python
from flask import Flask, request, jsonfy
app = Flask(__name__)

@app.route("/", methods=["GET"])
def test():
    data = request.args.get('hoge', '') # ?hoge=valueの値を取得
    return data # サンプルのためそのまま返す
```

# POST通信
## Json形式による通信

```python
from flask import Flask, request, jsonfy
import json
app = Flask(__name__)

@app.route("/", methods=["POST"])
def test():
    if not request.is_json:
        return jsonify({"error": "Missing JSON in request"}), 400

    data = request.json # request.dataをutf-8にデコードしてjsonライブラリにてディクショナリ型とする
    return jsonfy(data) # サンプルのためそのまま返す
```


## フォームによる通信

```python
from flask import Flask, request, jsonfy
app = Flask(__name__)

@app.route("/", methods=["POST"])
def test():
    data = request.form["hoge"] # フォームに存在する「"hoge"」キーの値を取得
    return jsonfy(data) # サンプルのためそのまま返す
```

# CORS(Cross-Origin Resource Sharing)対応について
 今回の内容では特に関係ないですが、次いでにCORS対応について説明します。
　私はWeb系エンジニアではなので、詳しいことは分からないんですが、簡単に言うと別のサーバリソースを使用する際ためのルールとかって話らしいです（もう少し突っ込んで説明すると、URLのベースが同じか同じかどうかって感じですかね）。

ひとまずpipにて「flask-cors」をインストールする。

```
pip install flask-cors
```

あとは以下のような感じで。

```python
from flask import Flask
from flask_cors import CORS # これと
app = Flask(__name__)
CORS(
    app,
    supports_credentials=True
) #これ
```

# 参考

- Flask クイックスタート：[https://a2c.bitbucket.io/flask/quickstart.html](https://a2c.bitbucket.io/flask/quickstart.html)
- 1AngularからFlask APIを呼んで、No 'Access-Control-Allow-Origin...で怒られた時の対処法：[https://qiita.com/mitch0807/items/cd18e8fc15bb12416f3d](https://qiita.com/mitch0807/items/cd18e8fc15bb12416f3d)
- JSONでPOSTしたものをpythonで使う方法：[https://qiita.com/naoko_s/items/04d68998cfdbe9c1b5f2](https://qiita.com/naoko_s/items/04d68998cfdbe9c1b5f2)
- Flask-CORS：[https://flask-cors.readthedocs.io/en/latest/](https://flask-cors.readthedocs.io/en/latest/)
- CORS (Cross-Origin Resource Sharing) ってなに？：[https://aloerina01.github.io/blog/2016-10-13-1](https://aloerina01.github.io/blog/2016-10-13-1)
Vimで編集中に落ちた→.swpまとめて消したい。。

# スワップファイル（*.swp）を見つける。

```
$ find ./ -name '*.swp'
```

# 見つかったスワップファイルをまとめて消し去る。

```
$ find ./ -name '*.swp' | xargs rm
```

# 消すファイルを確認して消し去る。

```
$ find ./ -name '*.swp' | xargs -p rm
```
Rails Datetime型のカラムの値を日付（mm/dd/yyyy）単位で集計する方法

## はじめに
gem chatkickを使用して、値を日付（mm/dd/yyyy）ごとにカウントしようとした際に、ハマってしまったのでその備忘録になります。

##概要
やりたかったことは簡単グラフ表示　gem 'charkick'を使用して、テーブルの値を日付単位でカウントして表示したかった。
ちなみに、charkick の一次情報は[こちら。](http://qiita.com "Qiita")
また、charkickを使っての日付単位での集計には[gem 'groupdate'](https://github.com/ankane/groupdate)を使うことがベストプラクティスらしい

##導入
以下の記事を参考にcharkickを導入しました
ｰ [Railsメモ(29) : Chartkickで簡単にグラフを描画する](https://wonderwall.hatenablog.com/entry/2015/08/22/225258)


##ここから本題
ぶつかった問題

エラー発生
ActiveRecord::Base.default_timezone must be :utc to use Groupdate
<img width="1012" alt="スクリーンショット 2020-01-10 11 57 39" src="https://user-images.githubusercontent.com/56288101/72122326-e0f29680-33a0-11ea-9f93-8b10d7102c2e.png">

どうやらtimezoneがUTCでないといけないらしい。アプリのtimezoneをtokyoにしていたが、あくまでtokyoのままカウントしたい。

```ruby:application.rb

  class Application < Rails::Application
   ## 途中略
   config.time_zone = 'Tokyo'
  end
```


##対応策
groupdateのメソッドgroup_by_day を使うとエラーの回避ができず、しょうがなくあきらめることに。
ちなみにエラーが出ていたコードは以下。

- 対応前

```ruby:user_controller.rb

  class UsersController < ApplicationController
   ## 途中略
    def show
    
      @data2 = Message.where(user_id: current_user.id).group_by_day(:created_at).count
      ## 途中略
     end
  end
```
- 対応後

```ruby:user_controller.rb

  class UsersController < ApplicationController
   ## 途中略
    def show
     # messageテーブル値の取得
     data2 = Message.where(user_id: current_user.id)

     # 配列の宣言
     c = []

     # data2の値を日付（mm/dd/yyyy）形式で取得し配列に格納
     data2.each do |d|
       c << d.created_at.strftime('%Y%m%d').to_s
     end

     # 配列に含まれている重複している値を数える
     @data2 = c.each_with_object(Hash.new(0)){|v,o| o[v]+=1}

     @today = Date.today
     @lastmonth_today = @today.prev_day(14)
    end
  end
```

もっといい書き方ができるかもしれませんが、とりあえずこれで日付単位でのカウントができた。

ちなみに表示側のHTML以下

```ruby:show.html.haml.rb
.learning-curve
  #　途中略
  .learning-curve_graph
  = line_chart @data2, width: "100%", height: "300px",min: 0, max: 20, xmin: @lastmonth_today, xmax: @today,label: "Value",xtitle: "日付",ytitle: "登録件数"
```


##結果
無事に日付単位でのカウントに成功し、グラフの表示ができた。

<img width="660" alt="スクリーンショット 2020-01-10 12 53 15" src="https://user-images.githubusercontent.com/56288101/72124481-41390680-33a8-11ea-9136-dabce7ec3544.png">