OmniAICreator/Qiita-1.07M huggingface dataset:
HTTPSなWordPressをDocker + Let's Encryptで速攻デプロイ

初投稿です。
今さら需要があるのかは謎ですが、docker-compose一発でHTTPSなWordPressを立ち上げたいと思ったら自分の環境でベストっぽいのが見当たらなかったので書いてみました。
docker初心者なので問題あれば指摘いただけると幸いです。

# ざっくり説明
WordPressの前にリバースプロキシ(nginx-proxy)を置いてSSL化。
Virtual Hostで切ってやればホスト名でアクセス先を制御できるので、複数のサービスをぶら下げることもできる。
letsencrypt-nginx-proxy-companionはLet's Encryptの証明書を取得してくれて、しかも1時間に1回自動で確認して必要であれば更新してくれる。
神イメージたちに感謝。


# 前提

- 80/443 portにインターネット側からアクセス可能。(Let's Encryptでhttp-01チャレンジが必要なので80も必須)
- 使うドメインが動かす環境に名前解決ができる状態になっている
- docker/docker-composeが使える

# 実行例

###サンプルファイル

DBのパスワードとかドメイン名とかは自分の環境に応じてお好きにどうぞ。
基本これで動くはず。/home/webは作らないとだめかも。
ファイル永続化の場所が気に入らないなら変えてどうぞ。

```yaml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    restart: always
    volumes:
      - /home/web/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: #######
      MYSQL_DATABASE: #######
      MYSQL_USER: #######
      MYSQL_PASSWORD: #######

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    restart: always
    volumes:
      - /home/web/wordpress:/var/www/html
    links:
      - db
    expose:
      - 80
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: #######
      WORDPRESS_DB_PASSWORD: #######
      VIRTUAL_HOST: test1.example.com
      LETSENCRYPT_HOST: test1.example.com
      LETSENCRYPT_EMAIL: test1@example.com

  nginx-proxy:
    image: jwilder/nginx-proxy:latest
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - /home/web/certs:/etc/nginx/certs:ro
      - /home/web/wordpress/htpasswd:/etc/nginx/htpasswd
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion:latest
    restart: always
    volumes:
      - /home/web/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy

```

###起動

```
docker-compose up -d
```

#その他Tips

###他のOSSやMyAppをぶら下げたい
wordpress:の項目と同じように書いて

- VIRTUAL_HOST
- LETSENCRYPT_HOST

を書き換えればOK。

###docker-compose.ymlのファイルを分けたい
プロキシとアプリでdocer-compose.ymlファイルを分けたい場合などは、ネットワークを共有する必要があるので
取りあえずネットワーク名(今回はshare)を指定して作成。

```
docker network create --driver bridge share
```

各ファイル最下あたりに↓を記述してネットワーク指定してやればOK。

```yaml:docker-compose.yml
networks:
  default:
    external:
      name: share
```

###ドメインも固定IPもないんだが？

無料ドメイン＋DDNSでいいと思うよ。


###docker楽しい

ほんまにね。
rails newを実行しても、構成ファイルが作成されない

Dockerのコンテナ上で`raile new .`を実行しても、本来作成されるはずのファイルやディレクトリが作成されない状況に直面したので、その対処方法について書きます。

Docker以外の環境でも上記の現象は起こりうる可能性があるため、異なる環境で同じよな問題が発生された方にも参考にしていただけるかと思います。

# 環境
- Host OS
 - macOS 10.15.3 Beta
- Docker
 - version 2.1.0.5
- Docker Image
 - ruby: 2.7-slim


# 問題
`rails new .`を実行すると、本来`app`ディレクトリ等が生成されるはずですが、以下のような出力結果がされました。

```
root@[container_id]:~# rails new ./
      create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  Gemfile
         run  git init from "."

```

特にエラーも出ていなかったので、何も考えず`rails s`を実行したところ、**rails new をする必要がある**と出力され、何度`rails new .`をしても状況は変わりませんでした。

# 解決方法
上記の出力を見ると、`git`を`init`する部分で処理が終了しています。
エラーが出ていなかったので、何も気にはしていませんでしたが、`git`がインストールされていないのが原因でした。
なので、以下のコマンドを実行することで、一旦、appディレクトリとうの作成に関しては解決はしました。

```
apt install git
```

ただ、今度は、`sqlite3`のインストール(gem)に失敗するため、`apt-get install libsqlite3-dev`あたりを実行して、rails newを成功させる必要があります。


根本的な原因としては、Docker Imageでrailsの`slim`を使用しているため、必要最低限のアプリケーションしかインストールされておらず、gitが含まれていなかったことが原因だと思われます。
`slim`意外にも`alpine`版も同じ現象が起こるかと思います。
SwiftUIのListにRefreshControlを追加する

## SwiftUIでもPull To Refreshを追加したい
SwiftUIではUIKitでサポートしていたUIRefreshControlが存在しない。
どうSwiftUIで再現するか調査していたところGitHubでUIKitのパーツをSwiftUIでも利用できる`UIViewRepresentable `を使ったライブラリを公開してたので使ってみた。

## Swift Package Managerを使用
- 今回使用したライブラリは`SwiftUIRefresh`
  -  https://github.com/siteline/SwiftUIRefresh

- ソースコード

```swift
import SwiftUI
import SwiftUIRefresh

struct ContentView: View {

  @State var isShowing: Bool = false

  let array = ["北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県",
               "茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県",
               "新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県",
               "静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県",
               "奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県",
               "徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県",
               "熊本県","大分県","宮崎県","鹿児島県","沖縄県"
  ]

  var body: some View {
    NavigationView {
      List(array, id: \.self) { text in
        Text(text)
      }
      .navigationBarTitle("都道府県")
    }
    .background(PullToRefresh(action: {
      DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        self.isShowing = false
      }
    }, isShowing: $isShowing))
  }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView()
  }
}

```

##　実行結果
<img width="579" alt="スクリーンショット 2020-01-11 19.22.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/a379937c-6b6e-43f2-9f3f-febe44b12752.png">

<img width="579" alt="スクリーンショット 2020-01-11 19.22.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/07f82b5b-08f3-73ed-9f5a-b408011a4e0a.png">

## まとめ
- 今回は`DispatchQueue.main.asyncAfter`をしようして1秒後にリフレッシュを終わるようにしているが本来はここでAPI実行など処理を書くといいだろう...
- UIKitであったUIパーツがSwiftUIでは存在しないことが多々あるので`UIViewRepresentable`を使えるようになりたい

## リポジトリ
- 作成したプロジェクトです
    -  https://github.com/shira-shun/SwiftUI_PullToRefresh
【Linux】pwd「今どこのディレクトリにいるかわかる」


##何気に困る事
クライアント先で検証する時に、地味に困った事はないだろうか。

クライアント先であるという緊張感だけではない。

まだ新人だった頃、linuxに慣れるためにある簡単な作業を依頼される事になる。
__手順書通りに、あるスクリプトを適用して欲しいとの事だった。
そしてスクリプト適用後に、終了ステータスを見て異常だった場合、
連絡して欲しいとこの事だった。__

カタカタカタ。。。。
慣れた様子で先輩が作業を進めている。

手順書通りに、コマンドを入力して終わった所に手順書にチェックを入れていく。
黒字に白い文字が浮かぶその様子は、windowsに慣れ親しんだ身としては
不思議なカッコ良さを覚えた。

ログインすると

```
$
```
ダラーが浮かんでいる。

手順書通りに作業ディレクトリに移動する

```
$cd work
$
$
```

```
$su root
.略
.
#echo $?
0
#
```
お分かりだろうか。
__ディレクトリ移動しても、$(ダラー)か#(シャープ、場所によってはイゲタという）しか表示されない__のだ。
はたして指定の場所で実行されているのか、手順書に○✖︎つけてる
だけじゃわからない。
そんな時は心の友として__pwd__を覚えておいた方がいい。
そして#か$しか表示しない画面にpwdの3文字を打ってみるといい。
彼は__「今、どこの場所にいるのか」__教えてくれるのだ。
GitHubへのCommitによりCircleCIを起動し、S3静的サイトを更新するプロジェクトをつくってみた

#目的
CircleCIとGitHubのキャッチアップのため、前回作ったS3静的サイトを更新するCD環境を作ってみました。

#構成図
![Arch2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/db410f19-4305-16f3-d834-a1ea66e554c4.png)


#流れ
1.GitHubの準備
2.CircleCIとGitHubとS3の連携
3.検証

##1.GitHubの準備
S3とローカルに保存しているだけでしたので、休眠していたGitHubアカウントを復活させ、ローカルGitと接続しました。
https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000

##2.CircleCIとGitHubとS3の連携
@kenta_ojapi さんの記事を参考にさせて頂きました。ありがとうございました。
https://qiita.com/kenta_ojapi/items/221dd147944b87cee479

#検証での気づき
##1.隠しファイルも一緒にS3に保存されてしまう。
手順のyamlファイルをそのまま利用させて頂きS3とaws s3 syncコマンドを動かすことができましたが、隠しファイルの.gitファイルと.circleciファイルも同時に保存されてしましました。

そこでちょっと調べて、S3 syncのオプションに「--exclude」というものがありましたので、下記のように「AWS_S3_BUCKET_EXCLUDE」のパラメータを追加し、.gitと.circleciをS3 syncから除外してみました。

```yaml:config.yml
version: 2
jobs:
  build:
    working_directory: ~/repo
    environment:
      - AWS_S3_BUCKET_NAME: my-bucket-name
      - AWS_S3_BUCKET_EXCLUDE: .*/*
    docker:
      - image: innovatorjapan/awscli:latest
    steps:
      - checkout
      - run:
          name: Deploy to S3 if branch is Master.
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              aws s3 sync ~/repo s3://${AWS_S3_BUCKET_NAME}/ --exact-timestamps --delete  --exclude "${AWS_S3_BUCKET_EXCLUDE}"
            fi
```


##2.environmentのパラメータ値の前に半角スペースが必要
これはCircleCiのエラーで気づいたミスなのですが、「AWS_S3_BUCKET_NAME:my-bucket-name」ではなく「AWS_S3_BUCKET_NAME: my-bucket-name」のようにパラメータの値の前に半角スペースが必要でした。


#今後について
Test環境と本番環境のmaster/branchへのPushの挙動に合わせ、デプロイ先を変更するようなCircleCIの設定（まだ何というかわからない）に変えていきたいと考えてます。他人の作ったJenkinsのbuild.xml数十ファイルを読み解いて頃を思い出し、各種設定のパラメータ化に努めたいです。。。
whitenoiseをインストールしてHerokuにデプロイしたときのエラーの対処法

使用している教材によってはDjangoのアプリを動かすために必要なパッケージとしてwhitenoiseをインストールして使うように書かれてあります。

そのときに起きたエラーについて書きたいと思います。

古い教材ではwsgi.py に以下の内容を追加するように書かれています。

```python:wsgi.py
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

```
そしてアプリを起動させようとするとこのようなエラーが出ます

```
ImportError:
Your WhiteNoise configuration is incompatible with WhiteNoise v4.0
This can be fixed by following the upgrade instructions at:
http://whitenoise.evans.io/en/stable/changelog.html#v4-0
```

http://whitenoise.evans.io/en/stable/changelog.html#v4-0

2020年1月の最新のバージョンはwhitenoise 5.0でバージョンwhitenoise 4.0からDjangoでのWhiteNoiseを有効にする表記の仕方が変わったみたいです。

その書いてある通りに以下の文を追加します。

```python:settings.py
MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
```

注意点はミドルウェアリストの一番上に追加することです。


そしてwsgi.pyに追加した分は消しましょう。

```python:wsgi.py
from whitenoise.django import DjangoWhiteNoise　#この行を削除します
application = DjangoWhiteNoise(application)　　 #この行を削除します　

```

これでうまく動くようになりました。
RISC-Vエミュレータ上で動作するリアルタイムOSに対してデバッガを使う(QEMU + NuttX + GDB)

[前回の記事](https://qiita.com/__sgy__/items/0e978d978fcc16a38fb8) の続きの小ネタです。
# 手順

ビルドを終えてnuttxバイナリが作られたディレクトリに移動します。
まず、QEMUを実行します。
QEMU実行時には `-s` と `-S` のオプションを用います。

```zsh
$ qemu-system-riscv32 -s -S -nographic -machine sifive_e -kernel ./nuttx
```

|オプション  |意味  |
|---|---|
|-s|shorthand for -gdb tcp::1234|
|-S|freeze CPU at startup (use 'c' to start execution)|

`-S` を指定したため待ってくれているのでその状態で、別のウィンドウからGDBを実行します。

```zsh
$ riscv64-unknown-elf-gdb ./nuttx -ex "target remote localhost:1234"
```

そのときに

```
Reading symbols from ./nuttx...
```
というシンボルを読み込んでいる表示が見られるはずです。

ビルド時にデバッグシンボルを含めるには、コンフィグDEBUG_SYMBOLSを有効にする必要があります。
`hifive1-revb:nsh` ではデフォルトで有効になっていました。

![debug_symbols.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561901/3160e81f-5bb0-1742-2cad-685337060e33.png)


あとは好きにブレークポイントを設定するなどしてください。
以下は例

```
(gdb) b nsh_main
Breakpoint 1 at 0x20403972: file nsh_main.c, line 218.
(gdb) c
Continuing.

Breakpoint 1, nsh_main (argc=1, argv=0x80002128) at nsh_main.c:218
218       (void)sched_getparam(0, &param);
(gdb)
```
自分の開発環境について（macOS Catalina版）

## はじめに

自分が開発で使用しているmacの設定（環境）を公表すれば何か反応が得られるのではないかと思ったので公表することにしました。
基本設定なので、エディタなどの開発ツールに関する設定はここには記述しません。
もっといい環境にしたいので、何かあれば編集リクエストやコメントお待ちしてます。

## 開発マシン

- MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
 - CPU:2.3GHz デュアルコアintel Core i5
 - メモリ:16GB
 - キーボード:日本語（Karabiner-Elementsで[USキーボード](https://www.apple.com/jp/shop/product/MLA22LL/A/magic-keyboard-%E8%8B%B1%E8%AA%9Eus)を上に乗せて使ってます）

## MojaveからCatalinaにする際にやったこと
- アップデートの通知からCatalinaにアップデート（しなくていいかも？）
- ディスクを削除（これをしないでOSを再インストールしたら前の設定が残ってしまった）
 - [Mac のディスクを消去する方法](https://support.apple.com/ja-jp/HT208496)
- OSを再インストール
 - [macOSを再インストールする](https://support.apple.com/ja-jp/guide/mac-help/mchlp1599/mac)

## 設定変更
- Apple アイコン -> システム環境設定 -> Dock -> 画面上の位置[左]
- Apple アイコン -> キーボード -> [タブ]入力ソース -> 半角カタカナ[チェック]
- Apple アイコン -> キーボード -> [タブ]入力ソース -> F1、F2などのキーを標準のファンクションキーとして使用[チェック]
- Apple アイコン -> キーボード -> [タブ]入力ソース -> "¥"キーで入力する文字[\（バックスラッシュ）]
- Apple アイコン -> キーボード -> [タブ]ユーザ辞書 -> スマート引用符とスマートダッシュを使用[チェックを外す]
- Apple アイコン -> ディスプレイ -> [タブ]ディスプレイ -> スペースを拡大
- Apple アイコン -> Dock -> 最近使ったアプリケーションをDockに表示[チェックを外す]
- Finderを開く -> 環境設定... -> [タブ]一般 -> 新規Finderウインドウで次を表示:ホームディレクトリ

## インストール
- Google Chrome
- HomeBrew
- Karabiner-Elements
 - [MacBookで外部キーボード接続時に内蔵キーボードを無効にする](https://medium.com/@TomonariTakai/macbook%E3%81%A7%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E6%8E%A5%E7%B6%9A%E6%99%82%E3%81%AB%E5%86%85%E8%94%B5%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-4c354e6d612b)
- slack
- goenv
- direnv
- npm
- Docker Desktop
- Cloud SDK
 - Homebrewは使用しない。（最新ではない可能性がある）
- Visual Studio Code
- GoLand
- Spectacle
 - Left Half: ⌘[
 - Right Half: ⌘]

## エイリアス
- ls
 - [zshでlsに色をつける](http://mkit2009.hatenablog.com/entry/2013/01/28/001213)
- ll
 - ls -la
AllenNLPにあるloggingを消す方法

### AllenNLPを組み込んでプログラム開発を行うとAllenNLP内のモジュールにあるlogも表示されてウザいというときの解決方法．
## 目的:
AllenNLPモジュール内のlog levelだけを引き上げたい
### 僕の場合
AllenNLPモジュール ー> WARNING level
それ以外 ー> INFO level
## 解決方法
そんなときは以下の行をmain.pyに追記してやるとAllenNLPモジュール内のlog levelだけをwarningレベルまで引き上げることができる．
```logging.getLogger('allennlp').setLevel(logging.WARNING) 
```

## 参考文献
- [loggingってなに??](https://www.sejuku.net/blog/23149)
- [AllenNLPのlogレベルの変更方法(英語記事)](https://github.com/allenai/allennlp/issues/2506) <ー 英語読める人はこれ読むと解決する
スマホカメラ撮影

iphoneにて、下記URLのコードをsafari/chrome にて実行しました。

https://qiita.com/mml/items/71644bcf10cb3ab923d9

safariでは、「〇〇〇がカメラへのアクセスを求めています」の表示が出て、許可をタップするとカメラ映像が表示されます。

chromeでは許可を求めてくるメッセージが表示されずに、カメラ映像が出せておりません。

chromeでも同様な処理が成されるために抜けている条件をご存じの方いらっしゃいましたら、ご教示頂けませんでしょうか。

OSとブラウザのバージョンは下記になります
ios 13.3
safari 604.1
chrome 79.0.3945.73
Qiitaの記事内容をJSONで取得する方法

Qiitaの記事内容をJSONで取得したいですか？

この記事のURLは、
https://qiita.com/AKKYM/items/fc1d8930b7478601b66c

ですが、JSONで取得する場合は、
https://qiita.com/api/v2/items/fc1d8930b7478601b66c

です。

# 参考

https://qiita.com/api/v2/docs
インフルで死にかけた時にGoogle Assistantに助けてもらった話

#はじめに
数日間、高熱で寝込むことがあり、その際に***スマートスピーカーがとても有能***
ということに気づいたので、記事にしました。
当たり前っちゃ当たり前のことなのですが、いざ使ってみると感動しました。

#高熱時の私の状態
1. 基本ずっと寝込んでいる
2. 感染拡大防止のため、隔離されている
3. 寝すぎて今が何時なのかかもよくわかってない
4. しんどすぎて目も開けたくない（暗い部屋の中で光を見るのもつらい）
5. しんどすぎて腕も動かしたくない

#高熱下の人間の楽しみとできること
上述の通り、39℃を超えてくると、***しんどすぎて目を開けることすら辛い***（たぶん）です。
なので、耳から入ってくる音で情報を集めることが唯一の楽しみになります。
一方で、体は動かせないので、自分からのアウトプット手段は声だけです。

#スマートスピーカーがあると何が便利なのか
##目を開けなくてもいい
***熱にうなされながらでも、マスクをしながらでも、寝返りをうつことなく、スピーカーの方向を意識することなく***、
「OK Google, ラジオかけて」と言えばラジオが聞けます。
地味にラジオ聞けるのは楽しいです。***なぜなら目を開けるのもつらい***から。

また、ず～～っと寝ていると***時間すらもわかりません***。
自分が何時間寝たのかもよくわからないので、日常生活ではほぼ使うことのない、
「OK Google, 何時か教えて」というのも使っていました。

##腕を動かさなくてもいい
我が家ではIFTTTやNature Remoと連動させているので、
照明のON/OFFや室温の取得、エアコンの操作ができます。
寝ながらにして、これらが操作できるのはとても重宝しました。
だって***寝ていてGoogleにお願いすれば、すぐにやってくれる***から。

##孤独感からの解放
とりあえず***話しかけたら必ず返事をしてくれる***　というのは、
一人暮らしの人なんかには特にありがたいです。
そしてGoogle Assistantは基本ネガティブなことは言わず、***ほぼ100％励まして***くれます。
実はこれがなによりうれしかったりします。。。
「OK Google, しんどい」とか言うと、「大丈夫ですか？頑張りすぎなくてもいいですよ」とか言ってくれる。やさしい。

#その他
スマートスピーカーと書きましたが、別にスマホのGoogle Assistantや
Siriでも似たようなことはできると思います。
ただ、***毎回スマホの画面が光る***のは、意外と鬱陶しいので、スマートスピーカーがおすすめです。
初心者による DOM 要素ノードの取得一覧-2

#ノードウォーキング
queryメソッドやgetメソッドを使いたいときには、ピンポイントで特定の要素を指定しないといけないため使いずらい時がある。その時に、近くの要素を指定した後にその近くの要素を取得する方法がある。これがノードウォーキングというものである。つまり、

getメソッドやqueryメソッドで特定の要素を取得した後、近接するノードはノードウォーキングで取得する。

#相対関係によりノードを取得するプロパティ

親ノード : parentNode
兄ノード : previousSilbing
兄要素 : previousElementSilbing
弟ノード : nextSilbing
弟要素 : nextElementSilbing
最初の子ノード : firstChild
最初の子要素 : firstElementChild
最後の子ノード : lastChild
最後の子要素 : lastElementChild
すべての子ノード : childNodes

node(ノード)とsilbing(要素)の二つがあるが、ノードにはたくさんの種類がありそのうちに要素ノードが存在する。ノードの種類を表すnodeTypeプロパティがあり、

1 : 要素ノード
2 : 属性ノード
3 : テキストノード
...etc

#実装方法
select id="car"要素の配下にあるoptionのvalue値を列挙するコードをいろいろな手法でやってみる。

##childNodes

```html:sample.html
<form>
 <select id="car">
  <option value="トヨタ">トヨタ</option>
  <option value="日産">日産</value>
  <option value="ホンダ">ホンダ</value>
 </select>
 <input type="submit" value="送信" />
</form>
```

```javascript:sample.js
let s = document.getElementById('car')
//基準ノードの子ノードをすべて取得
let opts = s.childNodes
for(let i = 0, length = opts.length; i < length; i++){
 let opt = opts.item(i)
 //opt.nodeTypeで要素ノードかを判断 -> 要素ノードならその中身を出力
 if(opt.nodeType === 1){
  console.log(opt.value)
 }
}
```

##firstChilds / nextSibling

```javascript:sample.js
let s = document.getElementById('car')
let child = s.firstChild
//子供が存在する
whils(child){
 if(child.nodeType === 1){
  console.log(child.value)
 }
 //次の兄弟に
 child = child.nextSibling
}
```
##firstElementChild / nextElementSibling

```javascript:sample.js
let s = document.getElementById('car')
//次の要素
let child = s.firstElementChild
while(child){
 console.log(child.value)
 //兄弟要素
 child = child.nextElementSibling
}

```

#参考資料
山田祥寛様　「javascript 本格入門」
pythonで画像の輝度値のヒストグラムを表示する

# 目的
pythonで画像の輝度値のヒストグラムを表示した際の備忘録です

# コード

### カラー画像のヒストグラム表示する

```python:histgram.py
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

def color_hist(filename):
    img = np.asarray(Image.open(filename).convert("RGB")).reshape(-1,3)
    plt.hist(img, color=["red", "green", "blue"], bins=128)
    plt.show()

color_hist("./test.jpg")
```

![hist1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/56234f65-2991-7e3e-6a43-5d31434b7b8d.png)


### カラー画像をグレイスケールで読み込んでヒストグラム表示する

```python:histgram.py
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

def color_hist(filename):
    img = np.asarray(Image.open(filename).convert("L")).reshape(-1,1)
    plt.hist(img, bins=128)
    plt.show()

color_hist("./test.jpg")
```

![hist2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/9a93d8e8-4b4c-d8d6-1383-4c2d7d8d1920.png)

元画像
![depth_02254.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/593b0ede-cabf-3e0e-d5a7-94378e888dad.jpeg)

# 追記

画像を切り出す場合

```
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import cv2

def color_hist(filename):
    img = np.asarray(Image.open(filename).convert("L")).reshape(-1,1)
    plt.hist(img, bins=256)
    plt.show()

def cut_image(filename):
    im = cv2.imread(filename,0)
    dst = im[0:400,250:410] #y,x
    cv2.imwrite('./tmp.jpg',dst)

cut_image("./test.jpg")
color_hist("./tmp.jpg")
```

# CodingError対策
特になし

# 参考
[Pythonで画像のピクセル操作](https://qiita.com/zaburo/items/0b9db87d0a52191b164b)
[Python でグレースケール(grayscale)化](https://qiita.com/yoya/items/dba7c40b31f832e9bc2a)
[Pythonで画像のカラーヒストグラムを簡単に表示する方法](python-image-colorhist)
Spring起動時のロゴをどうにかこうにかする

アプリ起動したときに出てくるあれね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/397527d3-5470-9254-4e6d-e0f728d773fe.png)

# 環境

Spring Boot 2.2.2.RELEASE - 2.2.4.RELEASE
Kotlin 1.3.61
Gradle

環境は以下の記事のまんま

https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede

# 邪魔だから消す

`src/main/resources/application.properties`に以下を追加

```properties
# ロゴを消す
spring.main.banner-mode=off
```

modeにはいろいろあるみたい
デフォルトで全部の場所にロゴを出す

|mode|概要|
|---|---|
|off|どこにもロゴを出さない|
|console|<font color="red">コンソールにしかロゴを出さない？</font>|
|log|<font color="red">ログにしかロゴを出さない？</font>|

<b><font color="red">off以外を指定しても表示されてる気がする・・・？書き方が間違ってるのかな・・・</font></b>

# ロゴを変えたい

`src/main/resources`配下に文字だけなら`banner.txt`を、
画像もほしかったら`banner.jpg`を置いとく
対応してる画像の拡張子は`jpg``png``gif`っぽい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/279dc225-e4be-80cb-d667-76a3642e0458.png)

文字間隔が広くてちょっと縦長だなぁ・・・

テキストに入れた文字はこれ

```banner.txt
がぶがぶー
```

結果は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/f37dc417-f18a-79d6-2b8f-39126e8579b7.png)

<b><font color="red">うーん・・・</font></b>
文字コードもUTF-8のはずなんだけどなぁ・・・

banner.txtの文字コードがUTF-8以外の場合は`src/main/resources/application.properties`に以下を追加

```application.properties
spring.banner.charset=SJIS
```

結果は・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/047bfeb3-dc74-d0b9-a177-42ee5209b6f1.png)

<b><font color="red">うーん・・・・・</font></b>

# banner.txtで使える変数

``` banner.txt
Application Version : ${application.version}
Application Formatted Version : ${application.formatted-version}
Spring Boot Version : ${spring-boot.version}
Spring Boot Formatted Version : ${spring-boot.formatted-version}
Ansi Name : ${Ansi.NAME}
Ansi Color Name : ${AnsiColor.NAME}
Ansi Background Name : ${AnsiBackground.NAME}
Ansi Style Name : ${AnsiStyle.NAME}
Application Title : ${application.title}
```

結果は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/c9b04624-4030-4752-336e-905ece93bfee.png)

<b><font color="red">どっかで指定しないと空文字扱いなのかな・・・？</font></b>

# banner.txtやbanner画像の場所を変更したい

<b><font color="red">少なくとも`src/main/resources/`配下の階層じゃないとだめなのかな？</font></b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/f4ed857d-06d6-b379-6c5f-27e93e222611.png)

bannerフォルダを作ってその中に画像とかを入れてみた

`src/main/resources/application.properties`に以下を追加

```application.properties

# banner.txtの場所を指定
spring.banner.location=/banner/banner.txt

# バナー画像の場所を指定
spring.banner.image.location=/banner/banner.jpg

```

いえーい

# 課題

* ロゴの表示非表示の指定が甘い
* banner.txtに日本語使えないのか？文字コード周りの調査不足
* banner.txtで使える変数はどこで設定する？
* banner.txtやbanner画像はresources配下じゃないとだめ？
RailsアプリでCSSの変更が反映されない時の対処【アセットパイプライン】

Railsアプリケーションのレイアウトを修正しても、CSSが反映されない時がある。
そんな時、まずはブラウザのキャッシュを削除するが、それでも反映されないのならアセットパイプラインが原因と考えられる。

CSSなどの静的なファイルは頻繁に変更がされないため、毎回は読み込まれないようになっているらしい。

##開発環境
・Rails 5.2.3 ・Ruby 2.5.1
・ConoHa VPS ・CentOS 7.6 ・Capistrano3
・Nginx
・Unicorn

##アセットパイプライン

アセットパイプラインとは、JavaScriptやCSSのアセットを最小化または圧縮して連結するためのフレームワークで、アセットの読み込みを高速化するためのもの。
Railsではデフォルトで有効になっている。

##アセットパイプラインの働き
###①変換
Saasで書かれたスタイルシートをCSS形式に変換したり、CoffeeScriptのスクリプトをJavaScriptに変換したりする。
###②圧縮・結合
CSSやJavaScriptの改行や空白を除去してサイズを縮小し（圧縮）、複数のファイルを1つのファイルにまとめる（結合）。
###③キャッシュ
public/assetsディレクトリの下にキャッシュファイルを生成し、ブラウザにはそのキャッシュファイルを送信する。

アセットパイプラインがうまく機能していないと、レイアウトの修正が反映されない。

##通常のデプロイ

まずは通常のデプロイ。

```
# Capistranoで自動デプロイ
$ git add .
$ git commit -m "layout"
$ git push origin master
$ bundle exec cap production deploy

# サーバー再起動
$ systemctl restart nginx
```

##CSSの変更が反映されない時の対処

###単にデプロイ時のプリコンパイルがうまくいっていなかっただけの場合
次のコマンドでプリコンパイルを再試行する。

```
# ローカルでプリコンパイル
$ bundle exec cap production deploy:assets:precompile
# デプロイ
$ bundle exec cap production deploy
# サーバー再起動
$ systemctl restart nginx
```

解決しなければ次へ進む。


###サーバーで手動プリコンパイル

```
# サーバーで手動プリコンパイル
$ bundle exec rake assets:precompile RAILS_ENV=production 
# サーバー再起動
$ systemctl restart nginx
```

##production.rbの設定修正

上記の手順で解決しなければ、プロダクションの設定を変更。
Railsアプリケーション

```config/environments/production.rb
config.assets.compile = true #動的コンパイルを有効化
config.assets.css_compressor = :sass # sass-rails gemを使用している場合コメントアウトを外す
config.public_file_server.enabled = true # publicディレクトリ以下のアセットを返す設定
```

以上。

これでもダメなら、サーバー自体を再起動して、再度デプロイし直す。
それでもダメなら、リバースプロキシの設定を見直す。

##参考
https://railsguides.jp/asset_pipeline.html
https://qiita.com/gymnstcs/items/00ae23b7fdf0c69b57c5
http://thoames.hatenadiary.jp/entry/2018/07/10/225204
https://numb86-tech.hatenablog.com/entry/2018/11/10/002439
Ubuntu18.04でdpg0101のビルド

### これは何?

Ubuntu18.04で[PEX-361316](http://www.interface.co.jp/catalog/prdc.asp?name=PEX-361316)を利用したい。
いくつかモジュールを組み込む必要があるが、カーネルが新しいため、ビルドが必要。ビルドを通す際の記録。
いくつかビルドを通す必要があるが、長くなるため、`dpg0101`のみを取り上げます。

### ビルドを通すまで

```
$ cd ~/work/PEX-361316/common/dpg0101/src
```

`Makefile`を編集。

```Makefile
CFLAGS += -I$(INCLUDEDIR)
CFLAGS += -fno-pie # 追加
```

`dpg0101.c`を編集。

```dpg0101.c
#include <linux/kconfig.h> // 追加
#include <linux/module.h>
```

`make`すると`dpg0101.mod.c`が生成され、ビルドエラーで止まる。
`dpg0101.mod.c`を編集。

```dpg0101.mod.c
#include <linux/kconfig.h> // 追加
#include <linux/build-salt.h>
```

ビルドが通る。

```
$ make
…
ld -m elf_x86_64 -r -o dpg0101.ko dpg0101.o dpg0101.mod.o
$ sudo make install
mkdir -p /lib/modules/5.0.0-37-generic/misc
cp -f dpg0101.ko /lib/modules/5.0.0-37-generic/misc
$
```

### カーネル 5.0.37 から 5.3.26 への対応

カーネルの変化でビルドの通し方がちょっと変わった。
以下以外は5.0.37と同じです。

```dpg0101.c
#include <linux/kconfig.h>
typedef long long __kernel_time64_t; // 追加
```

```dpg0101.mod.c
#include <linux/kconfig.h> // 追加( 5.0.37の時も )
typedef long long __kernel_time64_t; // 追加
```

### ロード

```
$ sudo depmod -a
$ sudo modprobe dpg0101
$ dmesg 
...
[  612.428485] dpg0101: module license 'unspecified' taints kernel.
[  612.428486] Disabling lock debugging due to kernel taint
[  612.428507] dpg0101: module verification failed: signature and/or required key missing - tainting kernel
[  612.429001] dpg0101:Interface Common Device Driver (Ver1.50.06.00) loaded.
$
```

ワーニングはでるものの、ロードできているようです。

### 参考ページ
- [Ubuntu18.04でdpg0100のビルド - Qiita](https://qiita.com/ProjectM_TACCMI/items/7360b26d70cc2c866efb)
PHP変数のスコープ

#PHP変数のスコープ

##はじめに
PHP7のtry catch構文を書いていると変数のスコープについて、理解できていないと思ったので理解を深めるためにまとめました。また他にPHPの変数のスコープの内容の記事がたくさんありましたが、自分のために残しておくために記述しておきます。

##try catch構文の変数のスコープで疑問
わからなかったのが以下の記述です。テストAとテストBで違う点は最後の行でechoしている`$test`をtry catchの前で宣言しているかしていないかです。
try catchの前に宣言していない、testA.phpは正常に動くのか。`$test`はtryブロックの中で宣言されているためブロックの外側ではアクセスすることができないのではないかと思いました。
答えは動きます。理由は後述します。

```php:testA.php
<?php

    try {
      $test = 'test';
    } catch(Exception $e) {
    // 何かしらの処理
    }

echo $test;
```

```php:testB.php
<?php
    $test = ''; // 変数宣言をtryブロック外でしている
    try {
      $test = 'test';
    } catch(Exception $e) {
    // 何かしらの処理
    }

echo $test;
```
## PHPのスコープと変数の種類
2つの概念を理解することスコープとは有効な範囲をしめし、変数の種類はそのスコープを組み合わせによって有効な範囲が違う

PHPのスコープには**2つ種類**がある

- ローカルスコープ
  - 関数の中でのみ有効 
- グローバルスコープ
  - 関数の外でのみ有効(*関数の引数で渡すまたはglobal宣言を使うと関数内でアクセス可能)

PHPの変数の種類には**4つ種類**がある

- ローカル変数
  - ローカルスコープの変数
- グローバル変数
  - グローバルスコープの変数
- スーパーグローバル変数
  - ローカルスコープとグローバルスコープの両方をもつスコープ（つまりどこからでもアクセスすることができる）
  - $GROBALSなど
- スタティック変数
  - ローカルスコープで、その値はグローバルスコープと同様にずっと保持される
  - 初期化は1回しかされない
 
## PHPはブロック内で宣言した変数は、そのブロックを出ても有効
以上のスコープと変数の種類を知った上で、tyr catch構文でtestA.phpの`$test`にアクセスすることができるのかについては、  
**ブロック内で宣言した変数はグローバル変数となる**
そのため、tryブロックの後のコードでもアクセスすることができる。
**関数内で定義されたのかがスコープを判断する基準になる**

##所感  
基本のスコープに関して理解ができていなかったので、感覚的に書いていると思うので他の部分も潰していきたいですね。。。
以下のコードは不要な記述となることを覚えておきます。  

```php:testB.php
<?php
    $test = '';
    try {
      $test = 'test';
    } catch(Exception $e) {
    // 何かしらの処理
    }

echo $test;
```
【Java8】UTC時刻をDate型で返す関数(OffsetZoneを用いて計算)

UTC時刻で
UTCに設定したZonedDateTimeをDate.from(***.toInstant())しても現地時間しかしか返してくれなかったので、
なんでやねんとキレながらOffsetDateTimeからOffsetZone取得してminusSeconds(時間をずらす)することで回避したよという話。
#####問題のコード

```Java:example.java
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("UTC")); 
Instant instant = zonedDateTime.toInstant();
return Date.fron(Instant);
//"Asisa/Tokyo"時間が返ってくる　なんでやねん
```
↑(よくわからんけどJavaの環境のせい...??)



#####解決したコード
```Java:myexample.java

public static Date getUTCDate() {
    OffsetDateTime offsetDateTime = OffsetDateTime.now();
    //ここでは日本時間（+9:00)
    OffsetZone offsetZone = offsetDateTime.getOffset();
    //(+9:00)を取得
    OffsetDateTime UTCDateTime = offsetDateTime.minusSeconds(offsetZone.getTotalSeconds());
    //これでUTC時刻になる。

    //Instant化してDate型でreturn 日本時間(Date型)が返ってくる
    Instant instant = UTCDateTime.toInstant();
    return Date.from(instant);
}
```

調べてる最中に思ったんですけど、(LocalDateTime,ZonedDateTime使わずに)JavaでUTC時刻を出すQiita記事そこそこあるけど、そのほとんどがString型でreturnしている。　~~みんなDate型きらいなん?~~ 

あとDate型って1970/1/1 00:00:00からの経過ミリ秒を保持してるだけっていうのを今回新しく知りました。
日付周りは奥が深いっスね...
Python グラフを分けて表示（メモ）

#Pythonで1つにグラフ表示されていたのを2つに分けたい

Pythonでグラフを無意識に書くと縦軸の値を一緒に使うので値がすごく大きいグラフと小さいグラフが一緒に表示される．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/fe322dc1-04ff-21ab-e8ea-3614ff756f59.png)

こんな感じ（多分僕だけかもしれませんが…）

ちなみに青の凡例が生データ，オレンジの凡例が傾きになる．

これを二つのグラフ表示に分ける．

#subplot

グラフ上に規則的に複数表示させるためにsubplot関数を使った．

```
subplot(行数, 列数, プロット番号)
```

行数☓列数でfigureが分割される．プロット番号は1行目から右方向に番号が増えるようになる．ちなみに今回使ったのは2行1列なのでプロット番号は

|  プロット番号  |  
| :----: | ---- |
|  1 |  TD  |
|  2  |  TD  |

となる．

実際のコードは

```
#figureの作成
fig = plt.figure()
plt.subplot(2,1,1)
plt.plot(data7)#生データ

…

plt.subplot(2,1,2)
plt.plot(huge7)#傾き
```

途中省略してるところあり．実際の結果は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/c8ca8040-58bf-6fe6-c75f-e77d01ca1a02.png)

で，上が生データ，下が傾きである．縦軸がメモリ粗めなのでこれから加工する必要がある．

とりあえず自分用のメモ書きになってるので今回のキーのところだけ書いてみた．
M5StickCをはじめよう　Arduino編

M5StickCとはESP-32が入ったマイコンボードです。
M5Stackが良いところは、ケースに入っており、日本人受けしやすいところです。
（外人さんは基板むき出しても問題ないですが、日本人はむき出しを嫌がります。）
M5StickCはM5Stackを小型にかつ安価にしたものでスイッチサイエンスで1,980 円です(2020年1月11日時点）

ハンズオンでM5StickCを使用する際にトラブってしまったので自戒の念を込めて書いてみます。
なお、内容は、「M5Stackをはじめよう　Arduino編」を流用しています。
https://qiita.com/usashirou/items/3d5f03b0de320cf0ee57
##Arduinoをインストール
まずは、Arduinoをインストールします。
https://www.arduino.cc/en/Main/Software
Arduinoをダウンロードしま、インストールします。
![Arduino-DL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8504c9e0-0eda-e79e-9184-2ffd18ce38dd.jpeg)

##ボード設定
ファイル⇒環境設定を開きます
![ESP-32-Arduino-0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f28ce29d-373c-dbd4-fe9d-972e1ee43eca.jpeg)

以下のアドレスをボードマネージャーのURLに入力します。
https://dl.espressif.com/dl/package_esp32_index.json
![ESP-32-Arduino.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/17b79639-855d-a025-0a7e-86ac1255cd59.jpeg)

ツール→ボード（？？？ここは気にしないでね）→ボードマネージャーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/84836bc9-8a68-dc55-c8a6-3903c4bb8b94.png)

「ESP32」と入力し、インストールします。
![M5Stack-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b7dda189-7637-9555-8b9a-bfb2d55c8410.jpeg)

インストール完了後、ツール⇒ボードにてM5Stickを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bb86d41c-5cd5-14eb-b29a-c478d6af9d2c.png)

これでM5Stickが使用可能になります。
ただし、ライブラリが入っていないために、センサーなどが使用できません。

##ライブラリのインストール
スケッチ⇒ライブラリをインクルード⇒ライブラリ管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2f241f16-3ed0-5583-6c05-a01fa2a5cc0e.png)
m5stickcと入力し、「M5StickC by M5StickC をインストールします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/90c62b4d-82d1-b7d2-2ee5-b9e5a91513e8.png)
以上で、M5StickCの機能が使えるようになったはずです。

##サンプルスケッチを実行しよう
動かしてみましょう
ファイル⇒スケッチ例⇒M5StickC から動かしたいアプリケーションを選択して動かしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c9dee51f-77ce-88c1-1029-e12b7f338bde.png)

##センサー確認
M5StickCの背面に記載しているセンサーを確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d4c89b83-94c7-7bd8-6781-342dbe9109b8.png" alt="" width="300"height="" border="0" />
私のM5tickCの加速度センサーはMPU6886でした。
ファイル⇒スケッチ例⇒M5StickC⇒Basics⇒MPU6886を選択します（SH2000の場合、SH2000を選択します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4c36b8e9-2737-0232-9e3d-f1eaad2556ea.png)

コンパイルを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/40e74182-906c-2521-21d8-d5420ca9c280.png)

画面にこのような表示がされれば成功です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/264290ee-3841-290a-988b-f8c940a57374.jpeg" alt="" width="300"height="" border="0" />
AWS(Amazon) Cloud9でPostgreSQLを起動しようとしたらpostgresql: unrecognized serviceと表示される問題の解決方法

#AWS Cloud9でPostgreSQLを起動しようとしたらpostgresql: unrecognized serviceと表示される問題でハマった

```
##$ rails new . --database=postgresql
```
新規プロジェクト作成！　がしかし、まず最初から入っているpg ~>0.18でなく0.21を入れろと怒られます。なので、Gemfileのpgの所を0.21にしてインストールを試みます。しかしlibpq-fe.h..noとエラーがでるので、必要なライブラリをインストールします。

```
$ sudo yum install postgresql-devel
```
再度bundle installで無事gemのインストールはできるはずです。

```
##$ bundle install
```
次にdbを作ります。が、ここでdbと接続できないというエラーが発生する。

```
$ rails db:create
could not connect to server: No such file or directory Is the server running 
locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```

これはPostgreSQLが起動してないから？と思って調べてみると、AWS Cloud9にはPostgreSQLプリインストールしてあるからstartさせればOKだぜ！という記事がたくさん見つかる。ので、素直にstartしてみる。

しかし、ここで表題のpostgresql: unrecognized serviceが表示されて進まない。

```
$ sudo service postgresql start
postgresql: unrecognized service
```


えーserviceとして認識されてない？とりあえず、PostreSQLに必要だったライブラリ達をインストールする。

```
$ sudo yum install postgresql postgresql-server postgresql-contrib postgresql-docs
```
そしてinitdbしてstartしてみる。

```
$ sudo service postgresql initdb && sudo service postgresql start
```
今度はうまく起動したみたい。

だけど、このままだとec2-userがいなくてテーブルとか作れないらしいので、psqlでユーザーを作成する必要がありとのこと。とりあえずpostgresユーザーを作ってpsqlを実行します。

```
$ sudo -u postgres createuser -s ec2-user
$ sudo su postgres
$ psql
```
で、psqlでALTER USERを実行して\qで抜け出します。

```
ALTER USER "ec2-user" WITH SUPERUSER;
\q
```
最後に元にユーザーに戻るためにexitし、

```
$ exit
```
再度rails db:createを実行してみます。

```
$ rails db:create
```
##まとめ
とりあえずエラー抜けれてよかったです:frowning2:
Cloud SDKで使われているPythonのバージョンを確認する

## はじめに
なんだかんだでPython 3への移行準備が進んでる感じがありますね。
お客さんによってはPython 3を使用するようにしたエビデンスを求められることもあると思うので、現状使用しているバージョンを確認する方法を書いておきます。

## 確認方法
確認環境はDockerのUbuntu18.04を使用しています。

今回は ```gcloud``` コマンドを例に記載しますが、各コマンド（bqやらgsutilやらgcloudやら）毎に実行しているスクリプトが違う為、必要であればその都度別途調べるしかないです。

### 対象のコマンドの場所を調べる
```bash
root@0ec7cd4678a7:~# which gcloud
/root/google-cloud-sdk/bin/gcloud
```

### 対象のスクリプト（コマンド）を書き換える
```bash:/root/google-cloud-sdk/bin/gcloud
...
# 最終行をコメントアウト
#exec "$CLOUDSDK_PYTHON" $CLOUDSDK_PYTHON_ARGS "${CLOUDSDK_ROOT_DIR}/lib/gcloud.py" "$@"
# 追加
exec "$CLOUDSDK_PYTHON" --version
```

### 実行
```bash
root@0ec7cd4678a7:~# gcloud 
Python 2.7.17
```

## おまけ（CLOUDSDK_PYTHONにpython3を設定する）
```bash
root@0ec7cd4678a7:~# ls -1 /usr/bin/python*
/usr/bin/python
/usr/bin/python2
/usr/bin/python2.7
/usr/bin/python3
/usr/bin/python3.6
/usr/bin/python3.6m
/usr/bin/python3m
root@0ec7cd4678a7:~# export CLOUDSDK_PYTHON=python3
root@0ec7cd4678a7:~# gcloud 
Python 3.6.9
```

はい
【サルが書く】非循環依存の関係の原則

## 二日酔い依存症を解決したい
大勢の開発者がいるところで発生するのが二日酔い症候群。
前日デプロイしたものが、その後デプロイされたものによって不具合が発生してしまうというものです。

解決するには

- 週次ビルド
- 非循環依存の関係の原則

がある。

**週次ビルド**
週の最初の4日間は開発に集中し手元のローカルで開発をすすめる、最後の1日で結合作業を行う。
これの辛い点はとにかく最後の結合が大変になるというところ。

**非循環依存の関係の原則**
そこで、開発環境をリリース可能な粒度にコンポーネントを分割すればよい。
こうすれば、作業がコンポーネントごとになり、他の作業に影響を与えることは少なくなるだろう。
しかし、コンポーネントを管理する必要が出てくる。
循環依存があってはならない。
コンポーネントの依存先をたどっていって、自分に帰ってこれるような依存の仕方をしてはいけない。有向非循環グラフとして書けるようなコンポーネントで有るべき。
とりあえず依存が循環してはだめ！

リリースするときはボトムアップでしていけば良い。

## 循環依存の影響
循環依存してしまうと、気にしなければならないコンポーネントが増える。
依存先、その先まで影響を気にしたり、テストを行ったりしなければならない。

## 循環依存の解決
2つの方法がある

1.依存関係逆転の原則(DIP)を適応することで、循環依存は解決できる。

メソッドを使いたいコンポーネントが、使われるコンポーネントに依存させるのではなく、使いたいコンポーネントにインターフェースを作り、インターフェースに使われるコンポーネントが依存することで、依存性を逆転させる。

依存性を逆転することで、循環依存ではなく、非循環依存へ変換する。

2.両方が依存するコンポーネントを新しく作り、使いたいクラスを移動する

クラスを移動させることで、コンポーネントの構造は常に変化し続ける。
循環依存が入り込まないように、常にコンポーネントを細かく変えていく必要がある。

## トップダウンの設計は無理
コンポーネントの依存関係をクラス設計前に理解するのは難しい。
共通の閉鎖性を泊するのは難しく、再利用可能な要素にも気づかない。
依存関係を気にするのは、保守運用フェーズになってからでも、良いかもしれない。
MacにAWSCLIのインストール(2要素認証)

やります。

**やること**
・2要素認証必須のIAMユーザを利用する
・AssumeRoleするだけの権限を付与する
・RESTAPI送付時にAssumeRoleする

本操作は公式でもアンチパターンとして明記されていて推奨する内容ではりません。
あくまで開発環境における検証に利用する目的で利用しています。

**ユーザのアクセス権限**
特定のRoleにsts:AssumeRoleする権限だけ付与しておき、Roleに
必要な権限を付与するRole利用時にはMFAの認証を必須とする。

```JSON:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::アカウントID:role/admin",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}
```

**AWSCLIの設定**

```.aws/config
[default]
output = json
region = ap-northeast-1

[profile prod]
source_profile = default
mfa_serial = arn:aws:iam::アカウントID:mfa/admin
role_arn = arn:aws:iam::アカウントID:role/admin
```

**認証情報**

```
.aws/credentials 
[default]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットキー
```

**コマンド**

```bash
$aws --profile prod s3 ls
Enter MFA code for arn:iam::アカウントID:mfa/admin:
S3のバケット名一覧
```

**CloudTrailのログ**
関連する箇所だけ抜粋

```json
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "userName": "admin"
    },
    "eventSource": "sts.amazonaws.com",
    "eventName": "AssumeRole",
    "userAgent": "aws-cli/1.17.0 Python/2.7.10 Darwin/18.7.0 botocore/1.14.0",
    "requestParameters": {
        "serialNumber": "arn:aws:iam::アカウントID:mfa/admin",
        "roleArn": "arn:aws:iam::アカウントID:role/admin",
    },
    "resources": [
        {
            "ARN": "arn:aws:iam::アカウントID:mfa/admin",
            "accountId": "アカウントID",
            "type": "AWS::IAM::MFADevice"
        }
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "アカウントID"
}
```
AR Meeting System Reference

# 資料

[ARで悪の組織の幹部会議を実現する 〜 進捗報告 〜 (.key 動画再生あり: GoogleDrive)](https://drive.google.com/file/d/1AsjyDS2ioZqJsUtDNG5CCEApo88xkwer/view?usp=sharing)

# その他

Metal Shader Tweets:
https://twitter.com/search?q=%23hundred_days_msl_challenge&src=typed_query
**#hundred_days_msl_challenge**

Effecting People Occlusion in Custom Renderers
https://developer.apple.com/documentation/arkit/effecting_people_occlusion_in_custom_renderers
npxでreactプロジェクトを新規作成の際エラーでハマったこと

## create-react-app
reactの初期設定には色々な方法がありますが今回は
`npx create-react-app xxx` (プロジェクト名)
でハマったこと

## エラーの内容
```
m:react-node-cloud m$ npx create-react-app client

Creating a new React app in /Users/m/Desktop/react-node-cloud/client.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts...

yarn add v0.27.5
info No lockfile found.
[1/4] Resolving packages...
warning react-scripts > jest > jest-cli > jest-config > jest-environment-jsdom > jsdom > left-pad@1.3.0: use String.prototype.padStart()
warning react-scripts > workbox-webpack-plugin > workbox-build > strip-comments > babel-plugin-transform-object-rest-spread > babel-runtime > core-js@2.6.11: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
[2/4] Fetching packages...
error @svgr/webpack@4.3.3: The engine "node" is incompatible with this module. Expected version ">=8".
error Found incompatible module
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

Aborting installation.
  yarnpkg add --exact react react-dom react-scripts has failed.

Deleting generated file... package.json
Deleting client / from /Users/m/Desktop/react-node-cloud
Done.
m:react-node-cloud m$ yarn cache clean
yarn cache v0.27.5
success Cleared cache.
Done in 29.64s.
m:react-node-cloud m$ npx create-react-app client

Creating a new React app in /Users/m/Desktop/react-node-cloud/client.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts...
```

## 結論
`The engine "node" is incompatible with this module. Expected version ">=8"`

英語翻訳かけたらverがだめといわれてるっぽい

## ndenvの確認
私の環境はndenvを入れていたので、みたらめっちゃ古い状態で何もしていなかった
一旦nodeのバージョンを `v12.10.0` にアップして再度 `create-react-app` コマンド

## 結果
無事行けた

が
ちょうどマックのOSのアップデートしたタイミングだったのでこの後
```
Aborting installation.
  yarnpkg add --exact react react-dom react-scripts cra-template --cwd /Users/m/Desktop/react-node-cloud/client has failed.
```
と表示されたので

`npm i -g yarn`

と設定をして再度  `create-react-app` コマンドで無事インストール完了


## まとめ
結果的に久々にreactを一から設定したが
英語読めないとダメですね（、、、、勉強します）

良い学びになったのでメモとして記録
Button2でチャタリング除去，（ダブルクリック等の）スイッチ処理

某箇所で紹介されていた

https://github.com/LennartHennigs/Button2

というのがありまして，いろいろなArduinoで使えるようなので試してみました。

手っ取り早く，micro:bitに2個のスイッチがありますので，これを使いました。

# 準備

- micro:bit 用の環境を揃える

    - 以下を参考に， Arduino IDE で micro:bit 用のスケッチを，コンパイル，書き込みできるようにします。
        - https://ht-deko.com/arduino/microbit.html

- Button2をインストールします。
    - https://github.com/LennartHennigs/Button2 にうつり，[Clone or download] で zip をダウンロード， Arduino IDE スケッチ - ライブラリをインクルード - .ZIP形式のライブラリをインストールします。

# 試してみる

- Arduino IDE で，スケッチ例 - Button2 - MultiHandler を選びます。

- ボタン定義部分を以下のように書き換えます。

```C++:変更前
#define BUTTON_A_PIN  2

/////////////////////////////////////////////////////////////////

Button2 buttonA = Button2(BUTTON_A_PIN);
```

```C++:変更後
// #define BUTTON_A_PIN  2

/////////////////////////////////////////////////////////////////

Button2 buttonA = Button2(PIN_BUTTON_A);
```

- 実行結果

1回押し，2回押し，3回押し，長押ししてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/4a7b99a7-71da-c5e7-83c4-1ceb2e625aa3.png)

良いようです。他のスケッチ例も動きました。

チャタリングの処理，2回押し等は，結構面倒なのですが，Button2を使うことで簡単に実装できますね。

いわゆる**オフトリガー（＝はなしたら反応する）**なので，オントリガーを必要とする場合はダメですが...

micro:bitの上記スケッチで，3692バイトでした。

# 参考URL

https://github.com/LennartHennigs/Button2
https://ht-deko.com/arduino/microbit.html
[Unity]Physicについて

2DのPhysicsに含まれるコンポーネントについて学んだ知識をメモ書していく。
###SpringJoint2D
リジッドボディ物理特性に制御されている2つのゲームオブジェクトを、バネで連結されているかのように動かす。スプリング(バネ)は二つのオブジェクトの軸に沿って力を加えて、その間の距離を一定に保つ。
詳細は下記のUnityのマニュアルから。
[Spring-Joint 2D](https://docs.unity3d.com/ja/2018.1/Manual/class-SpringJoint2D.html)

Spring Joint 2D内のプロパティー、**Auto Configure Distance**にチェックを入れておくとDistanceが自動的に書き換わるようで、自分でスクリプト内などにバネの両端についている物体間の距離を設定してもAuto Configure Distanceによって無効にされる場合があるので、ゲームを動かしてみた際にバネがたるんでしまうなどの不具合が起きた場合はこのチェックボックスを外してみると解決するかもしれない（自分はそれでうまく動いた）。
【Python競プロ用メモ】LRUキャッシュはプログラムでのメモ化より早い

#１．一言で言うと
デコレータ@lru_cacheを使ったメモ化は、プログラムを使ったメモ化よりも早かった。

#２．フィボナッチ数列の和
フィボナッチ数列の和を、以下の３通りの方法で再帰的に計算し、再帰関数が呼び出された回数と処理時間を記録する。(環境はGoogle Colaboratory。)
（１）普通の再帰
（２）メモ化再帰
（３）LRUキャッシュ　@lru_cache

#３．普通の再帰
まずは、普通の再帰関数でフィボナッチ数列の和を求め、計測してみよう。

```
%%time
fib_cnt=0
def fib(n):
    global fib_cnt
    fib_cnt+=1
    if n<=1:
        return n
    return fib(n-1)+fib(n-2)
fib1=fib(35)
print('fib1=',fib1)
print('fib1_cnt=',fib_cnt)
```
実行結果は以下の通り。まあ、時間が掛かるよね。

```
fib1= 9227465
fib1_cnt= 29860703
CPU times: user 4.93 s, sys: 5 ms, total: 4.94 s
Wall time: 4.94 s
```

#４．メモ化再帰
次に、メモ化再帰でフィボナッチ数列の和を求め、計測してみよう。

```
%%time
fib2_cnt=0
def fib2(n):
    memo=[0]*(n+1)
    def fib3(n):
        global fib2_cnt
        fib2_cnt+=1
        if n<=1:
            return n
        if memo[n]!=0:
            return memo[n]
        memo[n]=fib3(n-1)+fib3(n-2)
        return memo[n]
    return fib3(n)
fib2=fib2(35)
print('fib2=',fib2)
print('fib2_cnt=',fib2_cnt)
```
実行結果は以下の通り。当然、早くなる。

```
fib2= 9227465
fib2_cnt= 69
CPU times: user 0 ns, sys: 1.69 ms, total: 1.69 ms
Wall time: 2.74 ms
```
気になるのは、呼び出される回数。フィボナッチ数列なので、前２数の和になるからか、35までのフィボナッチ数列の和の場合、約２倍の69回、呼び出されている。

#５．LRUキャッシュ　@lru_cache

最後に、LRUキャッシュ　@lru_cache　を使ったメモ化でやってみよう。LRUはLeast Recently Usedの略。最も最近、使った、ということだ。

```
%%time
from functools import lru_cache
fib4_cnt=0
@lru_cache(maxsize=None)
def fib4(n):
    global fib4_cnt
    fib4_cnt+=1
    if n<=1:
        return n
    return fib4(n-1)+fib4(n-2)
fib4=fib4(35)
print('fib4=',fib4)
print('fib4_cnt=',fib4_cnt)
```
この場合、呼び出される回数は、0から35までの36回。先ほどのプログラムでの再帰より呼び出される回数が少ない。

```
fib4= 9227465
fib4_cnt= 36
CPU times: user 1.74 ms, sys: 4 µs, total: 1.75 ms
Wall time: 1.61 ms
```

#６．まとめ
プログラムの構造上、今回の例では、プログラムでのメモ化再帰よりLRUキャッシュ　@lru_cache　の方が早い。プログラムを上手く書けば良いのかもしれないが、LRUキャッシュに無駄がないことが分かった。
VScodeで構文エラーしてないのにエラーが出る時の対処法

vscodeによる構文エラーがないの赤波線でエラーが出る時の対処法について書いていきます。

<img width="751" alt="____________________________2020-01-10_23.41.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/d3e015d2-6c4d-ecbf-9975-174ff581b3e8.png">


##環境
Macbook
vscode バージョン:1.41.1
エラーが出た言語はDart、js(それ以外は試してない)

#対処法
vscodeのアプリケーションだけ消してもダメだったので設定ファイルも削除します。
入れているプラグインなどは一応スクショなどで残しておいてください(全部消える可能性がある)

##1.vscode 設定ファイルの削除
vscodeのアプリケーションを削除します。
/Library/Application Support/Code/Userフォルダごと削除します
これで削除は完了です

##2.vscodeインストール
[こちら](https://code.visualstudio.com/download)からインストールをします。
インストールができたらzipファイルを開きます。

**ここでvscode開けない方**	
僕もmacのセキュリティがなんたらってので開けませんでしたが
 1. Finderのvscodeをデスクトップに移す
 2. 開いてエラーが出たら
 自分のmacのシステム環境設定→セキュリティとプライバシー→一般のダウンロードしたアプリケーション 
 の実行許可のところにさっきのエラーで表示されてたのが出てくるので開くを押します
 3. これで開くことができます

##3.vscodeの設定
まずプラグインが残ってるか見ます。僕の場合は残ってましたが有効化されているはずなのに無効化されていたので、プラグインを全て無効化する→有効化するで全て有効にしました
消えてしまった方はまた入れ直してください。。。

無事赤波線エラーは無くなったのですがフォーマットが全くされていなかったので
[こちら](https://gurutaka-log.com/flutter-vscode-tips#format)のformatの自動保存というのをやったら無事フォーマットもされました！

##あと書き
このエラーで1日はイライラしながら作業していたので同じエラーが出てる方にはこの記事読んでほしいです。
ちなみにFlutterでの作業の時でした。
Visual Studio CodeでTexを書く

# Tex Liveのインストール
Texに必要な様々なソフト(？)をインストールします。
## for Windows
1. [Acquiring TeX Live as an ISO image](https://texwiki.texjp.org/?TeX%20Live%2FWindows)からISOイメージをダウンロード
2. ISOイメージをマウント
3. `install-tl-windows.bat`を実行
4. 1時間程待つとインストール完了

#VS Codeのセッティング
## 必須
1. 拡張機能から`Latex Workshop`をインストール
2. `ファイル`→`基本設定`→`設定`で右上の`{}`を選択し、setting.jsonを表示
3. 以下を追記　ここでビルドの設定を書く

   ```
"latex-workshop.latex.recipes": [
      {
          "name": "make_ptex2pdf",
          "tools": [
              "ptex2pdf",
          ]
      }
  ],
  "latex-workshop.latex.tools": [
      {
          "name": "ptex2pdf",
          "command": "ptex2pdf",
          "args": [
              "-l",
              "-ot",
              "-kanji=utf8 -synctex=1",
              "%DOC%"
          ]
      }
  ],
   ```
## オプション
ビルド結果のPDF表示画面とTexの編集画面を分けたい場合は下記の設定を行う

1. VS Code上で`Crtl`+`K`→`Crtl`+`S`を押し、キーボードショートカットを開く
2. `workbench.action.duplicateWorkspaceInNewWindow`を探す
3. キーバインディングを設定する　（例えば`Ctrl`+`Shift`+`N`）

# 参考サイト
Tex Liveのインストール：https://texwiki.texjp.org/?TeX%20Live%2FWindows
VS Codeのセッティング：https://qiita.com/ksg/items/5597fb9e49cdb313eae0
VS Codeの画面の分割：https://qiita.com/ksg/items/ced83faed79df2f9c0d2
Salesforce組織のメタデータを自動バックアップするツール作ってみた

#今回の成果物
Salesforceのメタデータをスケジュール実行で自動でバックアップを取りたいと思い、
WindowsのタスクスケジューラーからANTを実行して、自動バックアップをスケジュールするツールを作ってみました。

必要なものは以下の通り。
・Apache Antのインストール
・Java JDKのインストール
・Python3のインストール

ANTを利用して、Salesforceのリリースを行う詳細なガイドは以下のリンクから。(ANT,Javaのインストール方法も記載あり)
・[Ant 移行ツールを使用した変更のリリース](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_deploying_ant.htm)

Pythonのインストールは以下のリンクから。
・[Python3のインストール](https://www.python.jp/install/windows/install_py3.html)

#フォルダ構成

```
myorg/
┣unpackaged
┃ ┗package.xml
┣build.properties
┣build.xml
┣modifyXML.py
┣backupByDateTime.bat
```

・unpackaged/package.xml：取得したいメタデータの種類を定義
・build.properties ： Salesforce 組織への接続情報を定義。

```build.properties
sf.username = xxxxxxxxx@xxx.co.jp
sf.password = xxxyyyzzz
sf.serverurl = https://login.salesforce.com
sf.maxPoll = 20
```

・build.xml：Ant で実行されるコマンドを定義。

```build.xml
<?xml version='1.0' encoding='UTF-8'?>
<project xmlns:sf="antlib:com.salesforce" name="Sample usage of Salesforce Ant tasks" default="test" basedir=".">

    <property file="build.properties" />
    <property environment="env" />

    
    <condition property="sf.username" value=""> <not> <isset property="sf.username" /> </not> </condition>
    <condition property="sf.password" value=""> <not> <isset property="sf.password" /> </not> </condition>
    <condition property="sf.sessionId" value=""> <not> <isset property="sf.sessionId" /> </not> </condition>

    <taskdef resource="com/salesforce/antlib.xml" uri="antlib:com.salesforce">
        <classpath>
            <pathelement location="../ant-salesforce.jar" />        	
        </classpath>
    </taskdef>

    
    <target name="retrieveUnpackaged">
      <mkdir dir="backupxxxxxxxxx" />
      
      <sf:retrieve username="${sf.username}" password="${sf.password}" serverurl="${sf.serverurl}" maxPoll="${sf.maxPoll}" retrieveTarget="backup0111163434" unpackaged="unpackaged/package.xml" />
    </target>

    
</project>
```

・modifyXML.py：build.xmlを編集するプログラム

```modifyXML.py
import xml.etree.ElementTree as ET
import datetime

# XMLを解析 
tree = ET.parse('build.xml')
ET.register_namespace('sf', 'antlib:com.salesforce')

# XMLを取得 
root = tree.getroot()

now = datetime.datetime.now()
dt_string = now.strftime('%m%d%H%M%S')

for e_mkdir in root.iter('mkdir'):
    e_mkdir.set('dir', 'backup' + dt_string)

for e_ret in root.iter("{antlib:com.salesforce}retrieve"):
    e_ret.set('retrieveTarget', 'backup' + dt_string)

# 保存
tree.write('build.xml', 'UTF-8', True)
```

・backupByDateTime.bat：上記のpythonを実行して、ANTのコマンドを実行するバッチファイル。

```backupByDateTime.bat
python modifyXML.py
Ant retrieveUnpackaged
```

#実行
windowsタスクスケジューラーで上記のバッチファイルをスケジュールする。
スケジューラーの設定は[こちら](https://www.atmarkit.co.jp/ait/articles/1305/31/news049.html)を参考に。

上記フォルダを開いて、バッチファイルをダブルクリックでも実行可能。

実行するとフォルダ内に「backup実行日時秒」という名前のフォルダを作成し、
そのフォルダ内にメタデータが格納されます。

#まとめ
Salesforce開発プロジェクトで、定期的に本番、検証、開発環境からバックアップを取らなければいけない時などに活用してみてください。

社内で作成物を共有したときに、「取得してきたフォルダをGitで管理しろ」という声が上がったので、時間があればそちらも挑戦してみたいと思います。
bundleを使ったrailsプロジェクトの初期化

# ruby, railsコマンドのインストール
rubyコマンドも、railsコマンドもprojectで管理したい。[こちら](https://fukatsu.tech/create-rails-new-app#i-3)を参考にした。


```terminal
$ mkdir project_dir && cd project_dir
$ bundle init

$ vim Gemfile
* gem "rails"のアンコメントを外す

$ bundle install --path vendor/bundle
$ bundle exec rails new . -d postgresql -T

Overwrite /path/to/Gemfile? (enter "h" for help)
$ y

$ vim Gemfile
* group :developmentに gem 'rubocop', require: false を追加
$ bundle install

$ vim .rubocop.yml で以下を書き込む
Style/FrozenStringLiteralComment:
  Enabled: false

$ rails webpacker:install
```

* vendor/bundle内にrubyもrailsも他のgemも入る。(一回目のbundle installでpathを指定した)。今後はコマンドは`$ bundle exec (実行コマンド)`を使う。

# .bundle/configの設定変更([引用](https://qiita.com/k_senbei/items/02c4bacd5bb862535d9d))

bundle execで純粋にプロジェクトローカルのgemだけを使用するには、
.bundle/configのBUNDLE_DISABLE_SHARED_GEMSを"true"にすること。
"false"の場合、vender/bundle配下に存在しないgemをRubyグローバルから探してくる。

```terminal
$ vim .bundle/config
```

```:.bundle/config
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_DISABLE_SHARED_GEMS: "true"  #ここを"true"
```


# Gitにpush
```terminal
$ vim .gitignore => /vendor/bundle/ を追加
$ git add .
$ git commit -m "first commit"
$ git remote add origin (gitのurl)
$ git push -u origin master
```

# webpackでbootstrap4の導入([参考](https://qiita.com/take18k_tech/items/00cc14c0eff45073ffc7#4-1-bootstrap4-%E3%81%AE%E5%B0%8E%E5%85%A5))
```terminal
$ yarn add bootstrap jquery popper.js
.....
```