OmniAICreator/Qiita-1.07M huggingface dataset:
css　→（Sass記法）ネスト可について （自分用）


###＜css ネスト が可能＞###

###[Sassについて学ぶ](https://sass-lang.com/guide)###

##【変数として指定】##
（cssは上から読み込む為）変数名は上に記法。また、スコープ範囲注意。

```
$変数名： 内容；

クラス等 {
プロパティー： $変数名;
}
```



#【scssを別ファイルに分けて読み込む場合】
###・ファイル拡張子は　.scss###
####・別ファイルscssの前に　_アンダースコア必須####
　（パーシャル：先頭にアンダースコアが付いた名前のSassファイル　[Sassについて学ぶ](https://sass-lang.com/guide)）
####・別ファイルscss内の ＄変数 を呼び出し可能。####


###@import " 別ファイルscss名 ";　
（＠useもしくは@import）　

```style.scss 
                        //別ファイルscss名を””で囲む
 @import "???";          //一番上で読み込む  
                        //import時は アンダースコア、拡張子は略可
.class {
  color: $color;       //変数の利用可となる
}
```


```_???.scss
 $color: #000;           //変数の指定

```


##【共通としたい　＝　@mixin 名 →　@include 名　】##

```scss
＠mixin ミックスイン名 {

//複数箇所、共通の内容指定

}


  ＠mixinの呼び出したいクラスなど名 {
               ＠include ミックスイン名;            //＠mixinの呼び出し　
  }

```
【@mixin ミックスイン　＋　引数】

```scss
＠mixin ミックスイン名($color) {
              background: $color;  
              color: $color;             
}


　クラスなど名 {
       ＠include ミックスイン名(引数);   //引数は$colorへ渡される
}

```


##{}セレクタ内に　 別{}セレクタの指定可##



```css
                       
.class {               //この場合、class名変更時１箇所修正で済む
    color: red;

   h1{
     color: blue;
    &:hover{             //h1スコープ内に、&
      opacity: 0.6;
    }
   }
}

ーーーーーーーーーーーーーーーーーーーーーー
<cssのみだと>

.class {            //この場合、class名変更時２箇所修正が必要
    color: red;
}

.class h1{
   color: blue;
}

.class h1:hover{
  opacity: 0.6;
}
```
[Android]リアルタイムデベロッパー通知をFirestoreに保存

少し前に、Androidのサブスクリプションについて、GooglePlayから更新情報を取得しFirestoreに保存する実装をしたので、思い出しながらまとめてみた。

## 前提
- Firebaseでプロジェクトを作成している
- FirebaseでCloud Functionsを編集できる権限を持つ
- Google Play Consoleで編集できる権限を持つ
- Cloud PubSubを設定する権限を持つ


## 実装手順

### Cloud PubSubでトピックの作成
参考：[トピック作成手順](https://cloud.google.com/pubsub/docs/quickstart-console?hl=ja#create_a_topic)

- [Cloud Pub/Sub設定ページ](https://console.cloud.google.com/cloudpubsub/topic/list)に移動
- (必要であれば)プロジェクトを変更
- 「トピックを作成」を押すと、作成ダイアログが表示される
- トピックIDを入力
- 暗号化は「Googleが管理する鍵」
-「トピックを作成」を押す


### Cloud PubSubでサブスクリプションの作成
参考：[サブスクリプションの追加](https://cloud.google.com/pubsub/docs/quickstart-console?hl=ja#add_a_subscription)

- [Cloud Pub/Sub設定ページ](https://console.cloud.google.com/cloudpubsub/topic/list)に移動
- 対象のトピックのメニュー＞サブスクリプションを作成
- サブスクリプションIDを入力
- 配信タイプはpull
- 「作成」を押す

### Cloud PubSubで公開権限を付与
参考；[公開権限を付与](https://developer.android.com/google/play/billing/realtime_developer_notifications?hl=ja#grant_publish_rights_on_your_topic)

- [Cloud Pub/Sub設定ページ](https://console.cloud.google.com/cloudpubsub/topic/list)に移動
- 対象のトピックのメニュー＞権限の表示
- 「メンバーを追加」を押す
- `google-play-developer-notifications@system.gserviceaccount.com`を入力
- 役割は「Pub/Subパブリッシャー」を選択する
- 「追加」を押す

※Cloud Pub/Subの「トピックの名前」をコピーしておく。

### GooglePlayConsoleでトピックの設定
参考：[トピックの設定](https://developer.android.com/google/play/billing/realtime_developer_notifications?hl=ja#enable_real-time_developer_notifications_for_your_app)

- Consoleに移動する
- 該当のAndroid アプリを選択
- [開発ツール] > [サービスと API] ページに移動
- ページ下部の [リアルタイム デベロッパー通知] までスクロール
- Cloud Pub/Subの「トピックの名前」をコピーし、入力する
- 「保存」を押す

### Cloud Functionの実装
参考：[Firebase Cloud FunctionsとCloud Pub/Subの連携](https://firebase.google.com/docs/functions/pubsub-events?hl=ja)
Firebase Cloud Functionsを使い、Firestoreに保存する。コレクションの名前は`googleplay`とする。

Cloud Functionsのindex.jsに以下を追加する。

```
//GooglePlayからの通知
exports.androidUpdateNotification = functions.pubsub.topic('[subscription]').onPublish((message) => {    
  try {
    var json = message.json;
    json.timestamp = admin.firestore.FieldValue.serverTimestamp();  
    json.date = new Date().getTime();
    
    let ref = admin.firestore().collection("googleplay").doc();
    ref.set(json).then(ref => {
      console.log("success to add");
    }).catch(error => {
      console.log(error);
    });
    
  } catch (e) {
    console.error('PubSub message was not JSON', e);
  }
});
```

[subscription]のところには、Cloud Pub/Subの`トピックID`(トピック名でない)を入力する。
編集が終わったらDeployする。

### テスト
GooglePlayConsoleからテストの通知を送ることができます。

- Consoleに移動する
- 該当のAndroid アプリを選択
- [開発ツール] > [サービスと API] ページに移動
- ページ下部の [リアルタイム デベロッパー通知] までスクロール
- 「テスト通知を送信」を押す

## 終わりに
リアルタイムデベロッパー通知を利用し、Firestoreに保存するところまでできました。
これで、ユーザーのサブスクリプション状態の変更を受け取ることができます。
PostgreSQL テーブルのバックアップ作成と削除

## 既存テーブルのバックアップと削除

###### 前提として。
テーブルAを複製し、テーブルBを作る場合

```sql
CREATE TABLE "tbl_b" AS SELECT * FROM "tbl_a"
```


複製元のテーブル名称がtbl_a_yyyymmdd等になっており、テーブル名称にtbl_aを含むテーブルすべてを複製したい場合

まずは、以下SQLを実行し、テーブルの数分のSQLを発行し、
抽出結果のSQLをコピーし、それを実行する。
`relname`はテーブル、インデックス、ビューなどの名前を表しているので、変更しなくてOK
`pg_stat_user_tables`はPostgreSQLのユーザテーブル情報を指しており、こちらも変更せずそのままでOK。
WHERE句でテーブル名のLIKE検索をする。


```sql
SELECT
  'CREATE TABLE '||'"'||relname||'_backup" AS '||'SELECT * FROM ' ||'"'||relname||'";'
FROM
  pg_stat_user_tables
WHERE
  relname LIKE 'tbl_a%';
```

逆にバックアップ作成後に、バックアップ元のテーブルのみを削除したい場合

```sql
SELECT
  'DROP TABLE '||'"'||relname||'"'||';'
FROM
  pg_stat_user_tables
WHERE
  relname LIKE 'tbl_a%'
AND
  relname NOT LIKE '%_backup'
;
```
SQLserver: 文字列をn字ずつレコードに格納する

# SAMPLE
非常に特殊な用途ですが
下記の文字列を指定の字数ずつ分離してレコードに格納します。
XXXYYYWWW
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/9c17f990-0833-a673-52e9-3d5ec4a32391.png)

# SQL SERVER
```SQL
CREATE FUNCTION [dbo].[Onecharacter]
(
    @string NVARCHAR(4000),
　　@n INT
)
RETURNS TABLE
AS
RETURN
(
    WITH Onecharacter(stpos,endpos)
	AS( 
	SELECT 1 AS stpos, 1+@n AS endpos
	UNION ALL
	SELECT endpos,endpos+@n
	FROM Onecharacter
	WHERE endpos > 0
		AND endpos < LEN(@string)+1
	)
	SELECT 'data' = SUBSTRING(@string,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
	FROM Onecharacter
)
```

# HOW TO USE
```SQL
DECLARE @string NVARCHAR(100) = 'XXXYYYWWW';
SELECT data
FROM dbo.Onecharacter(@string,3)
```
【SharePoint Framework】listen EADDRINUSE: address already in use :::5432 エラー対処

#はじめに
開発したWebパーツをgulp serve コマンドを実行して確認しようとした所、以下のエラーが発生しました。

```shell
listen EADDRINUSE: address already in use :::5432
```

#原因
前回gulp serveによって実行されたインスタンスが適切に閉じられていない事が原因です。

#解決策
以下のコマンドを実行し、再度gulp serveコマンドを実行する事で解決しました。

```shell
taskkill /f /im node.exe
```

#参考
Fix For Address Already In Use :::5432: SPFx Development With Gulp
https://www.c-sharpcorner.com/blogs/fix-for-address-already-in-use-5432-sffx-development-wit-gulp
laravel + vue.jsでSPAの開発をしていてデバッグがしたい！！！


SPAだとlaravelのエラー内容や変数とかの中身をブラウザに返すことができないけどデバッグがしたい！人用

結論
そのためには、、、
laravel debugbarとclock workの両方をcomposerでインストールする必要あり。

#STEP1 laravel debugbarのインストール

これはいつも通りですね
こちらの↓READ MEを参考に開発環境にインストール
https://github.com/barryvdh/laravel-debugbar

```
$ composer require barryvdh/laravel-debugbar --dev
```

#STEP2 clock workのインストール

これはSPAだとHTMLに返ってこないデバッグの結果をChromeのデベロッパーツールで確認できるようにするツールです！
google chrome自体へのインストールとcomposerへの両方のインストールが必要

これも以下を参照！

https://github.com/itsgoingd/clockwork

- google chromeへのインストール

https://chrome.google.com/webstore/detail/clockwork/dmggabnehkmmfmdffgajcflpdjlnoemp

- composerへのインストール

```
$ composer require itsgoingd/clockwork
```

#用法
インストールするとclockヘルパメソッドが使えるようになります！
使い方は以下のように変数の中身を確認したり、メソッドを組み合わせて使うことができる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362153/531c06f7-239a-b961-7ca9-f47d25d38636.png)

これも詳しい使い方は公式ドキュメント↓参照
https://underground.works/clockwork/logging?#content

また.envに以下をの設定を追加するとlaravel dubagbarが画面に表示されなくなります！

```:.env
DEBUGBAR_ENABLED=false
```

すると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362153/b3379413-ab02-df8e-bb7a-a656fd8c91fd.png)


めちゃエラー出てるの恥ずかしいけどこんな感じで出ます！！！！！

デバッグできずに困ってた人は参考にしてみてください～
micro:bitの傾きをRaspberryPiでモニタ

#モニタの方法
micro:bitとRaspberryPiをBlueToothで接続して、micro:bitの傾き具合をリアルタイムにRaspberryPiのコンソールに表示してみる。

##micro:bit側のプログラム
micro:bit側は、Bluetoothのサービスを並べるだけ。
ただ、たくさん並べすぎてしまうと、micro:bit上でメモリ不足のエラー(泣き顔020エラー)が出たので、少し減らしてみたら動くことがわかった。
![2020-02-01-002646_725x551_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/5a580667-028d-47df-2862-c4d3036b62a8.png)
そしてペアリングしなくてもコネクションできるように設定するために、
プロジェクトの設定から ```No Paring Required: Anyone can connect via Bluetooth.```を有効にしておく。
![2020-02-02-203357_898x542_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/74f17ece-26c3-8ebb-4487-218000d40e9a.png)

##RaspberryPi側
こちらはPythonで作ってみた。

まずは、bluepyモジュールを使うのでインストール
```% sudo pip3 install bluepy```

[Pythonのプログラムはgitにも置いてある](https://github.com/roxa-delphi/microbit/blob/master/sens.py)が、こんな感じ。 
HANDLEの番号はmicro:bit側のプログラムの構成で変わる様子なので、あらかじめ調べておく必要がある。

```python:sens.py
from bluepy.btle import Peripheral
import bluepy.btle as btle
import binascii
import struct
from time import sleep

HANDLE_BUTTON_A = 0x003a
HANDLE_BUTTON_B = 0x003d
HANDLE_ACCELE   = 0x0027

devadr     = "e4:1e:1f:1f:f4:49"

exflag = False

class MyDelegate(btle.DefaultDelegate):
  def __init__(self, params):
    btle.DefaultDelegate.__init__(self)

  def handleNotification(self, cHandle, data):
    global exflag
    c_data = binascii.b2a_hex(data)

    if cHandle == 0x27 :
      accX = struct.unpack('h', data[0:2] )[0]
      accY = struct.unpack('h', data[2:4] )[0]
      accZ = struct.unpack('h', data[4:6] )[0]
      strX = "Flat"
      strY = "Flat"
      if accX > 700  : strX = "Plus"
      if accX < -700 : strX = "Minus"
      if accY > 700  : strY = "Plus"
      if accY < -700 : strY = "Minus"

      #print("%s: %d, %d, %d : %s %s" %(c_data, accX, accY, accZ, strX, strY))
      print("pitch = %s : role = %s" %(accY, accX))
      return

    b = ""
    if cHandle == 0x3a : #left button
      b = "button1"
      if data[0] == 0x02 : exflag = True

    if cHandle == 0x3d : #right button
      b = "button2"
      if data[0] == 0x02 : exflag = True

    print("%s %X: %s" %(b, cHandle, c_data))

class MyPeripheral(Peripheral):
  def __init__(self, addr):
    Peripheral.__init__(self, addr, addrType="random")

def main():
  peri = MyPeripheral(devadr)
  peri.setDelegate(MyDelegate(btle.DefaultDelegate))

  #Button
  peri.writeCharacteristic(HANDLE_BUTTON_A + 1, b"\x01\x00", True)
  peri.writeCharacteristic(HANDLE_BUTTON_B + 1, b"\x01\x00", True)

  #acc
  #peri.writeCharacteristic(0x002a, b"\x50\x00", True)
  peri.writeCharacteristic(HANDLE_ACCELE + 1, b"\x01\x00", True)

  while exflag == False:
    if peri.waitForNotifications(1.0):
      #sleep(0.3)
      continue

  peri.disconnect()

if __name__ == "__main__":
  main()
```
##実行
micro:bitを傾けると、コマンドを実行したコンソールにピッチとロールが表示される。
これでmicro:bitのセンサー情報をBlueTooth経由で取り出せるようになった。
```% python3 sens.py```
![bluetooth_level.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/fb8d89f9-fb74-019e-2c3f-7267f9bc4c21.gif)
config/initializersにカスタムバリデータを定義する

## 電話番号にバリデーションを使用する
[telephone_number](https://github.com/mobi/telephone_number)というgemを使用してカスタムバリデーションを定義する。


まずはgemを定義

```
gem 'telephone_number'
```

そしてbundle install!

```
$ bundle
```

config/initializeに下記のように定義



```config/initializers/tel_validator.rb

module ActiveModel
  module Validations
    class TelValidator < EachValidator
      def validate_each(record, attribute, value)
        return if value.blank?

        record.errors.add attribute, :invalid unless TelephoneNumber.valid?(value, :jp)
      end

      module HelperMethods
        def validates_tel_of(*attr_names)
          validates_with TelValidator, _merge_attributes(attr_names)
        end
      end
    end
  end
end
```

そしてあとは個別のモデルで下記のようにすれば電話番号のバリデーションがかかってくれる。

```hoge.rb
validates :tel, tel: true
```

## 参考記事
- [telephone_number](https://github.com/mobi/telephone_number)
- [Custom Validators - Githubより](https://github.com/DavyJonesLocker/client_side_validations/wiki/custom-validators)
MySQL の Docker コンテナで実行した SQL の履歴を保持する

MySQL クライアントの `mysql` コマンドで実行した SQL は、`~/.mysql_hisotry` というファイルに保存されるのですが、`docker-compose down` とかしてコンテナを削除すると、当然このファイルも消えてしまい、履歴が消えてしまいます。
これでは不便なので、ホスト側にファイルを書き込むようにして、毎回これをマウントする方法を考えました。

まずホスト側に `.mysql_history` を保存するディレクトリを作ります。
名前や場所はなんでも構いません。

```console
$ mkdir -p docker/mysql/history
```

次にこれをマウントし、環境変数 `MYSQL_HISTFILE` で `.mysql_history` の保存先を変更します。
マウント先もファイル名も、`MYSQL_HISTFILE` でパスさえ指定できれば、どこでも構いません。

```console
$ docker run --rm -e MYSQL_HISTFILE=/root/.config/mysql/.mysql_hisotry -v ${PWD}/docker/mysql/history:/root/.config/mysql mysql
```

`docker-compose.yml` の場合はこんな感じ。

```yaml
version: '3'
services:
  mysql:
    container_name: mysql
    image: mysql
    restart: always
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/history:/root/.config/mysql  # ← これと
    environment:
      MYSQL_HISTFILE: /root/.config/mysql/.mysql_hisotry  # ← これ
```

やってみると簡単だけど、ググってもあまり情報が見付からなかったのでメモでした。
EC-CUBE4のプラグインインストールでエラーが出るときの対処法

EC-CUBE4のプラグインをインストールするときに、サーバーによってはうまく行かない場合がある（というか大半うまく行かない）

様々な記事を参照してきたため、他に記載がなかった手法を明記する

○使用環境
- MAMP
- VSCODE
- php7.3.1
- macbook pro 2016

○php.iniを修正してみる。
MAMP⁩ ▸ ⁨bin⁩ ▸ ⁨php⁩ ▸ ⁨php7.3.1⁩（使用バージョン） ▸ ⁨conf　⁩▸　php.ini

```[xdebug]
zend_extension="/Applications/MAMP/bin/php/php7.3.1/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_autostart=1
xdebug.remote_port=9000
xdebug.max_nesting_level=10000
xdebug.remote_enable=false
xdebug.profiler_enable=0
```

xdebug.max_nesting_level=1００　→　10000にあげてます。

プラグインをインストールし終わった後は、その行を削除するか、小さくしてあげてくださいね。
Windows10でTensorFlowとKerasの環境構築が簡単だった話

#はじめに
Anacondaの導入が済んでいる方向けです
記事の最後でIDE(PyCharm)での動かし方を説明します

#筆者の環境
・Nvidia RTX2060
・Windows10 Home
・Anaconda 4.7.10

#仮想環境の構築
Anaconda Promptを管理者として実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/8b3acbc1-75cb-d6fc-d7e7-77cf0399eaff.png)

conda info -e で現在の環境を確認します
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/870daaab-5d36-f710-1b90-ab12315ef512.png)

＊の位置が現在の環境です
(base)はデフォルトです

`conda create -n myTensorFlow python=3.6`で新たに環境を作成します
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/b462b42d-7af5-789e-ff01-934d57d84af3.png)


`conda activate myTensorFlow`で仮想環境を有効化できます


仮想環境に正しく入れている場合(myTensorFlow)と表示されます
![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/4d071293-d36a-1bd1-cc09-65b0e1c1b79b.png)

この状態で`conda install tensorflow-gpu`と入力します
そうするとcudnnやcudatoolkitなどの必要なパッケージが自動的にインストールされます



#Kerasの導入

`conda install keras`でTensorFlow Backendのkerasが導入可能です
※この時管理者で実行していないとうまくいきません

#Pycharmでの実行

作成した仮想環境上で実行することができます

[File]-[Settings]-[Project interpreter]を選択

![pycharm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/df6da874-9133-9a84-8fa1-7ec9b05c1c0f.png)


そして，作成した仮想環境を選択してください

![pycharm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/f4741079-1e02-d624-1f36-9f4de80d406f.png)

Project Interpreterに表示される仮想環境を選択してください




もし表示されない場合は，歯車から[show all]を選択します

Project Interpretersからプラスマークを選択します
![project interpreters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/1646d2e4-c1e4-e84b-d2b2-97c215f7e9c5.png)



[Conda Environment]-[Existing Environment]と選択し，<No interpreter>と書かれている場所に
先程作成した仮想環境のアドレスの中にある，python.exeを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456482/192c4844-6087-c6bc-3735-2b80b974ac9e.png)


そうすることで，仮想環境上でpycharmを動かすことができます．
styled-components の theme型定義


styled-components の theme、使っていますか？styled-components には、`ThemeProvider`という、装飾などに関する規定値を提供する仕組みがあります。この様な構成になっているとします（通常 ThemeProvider は SPA ルーティングの上あたりに位置しますが、説明のため簡易な構成としています）

```tsx
const Component: React.FC = () => (
  <ThemeProvider theme={theme}>
    <RedButton>RedButton</RedButton>
    <GreenButton>GreenButton</GreenButton>
    <BlueButton>BlueButton</BlueButton>
  </ThemeProvider>
)
```

ThemeProvider に渡している `theme` は次の様なものです。

```typescript
export const theme = {
  colors: {
    red: '#f00',
    green: '#0f0',
    blue: '#00f'
  },
  layout: {
    width: 960
  }
} as const
```

theme は、styled-components コンストラクタ`（styled(...)）` にラップされた Component props に注入され、Template リテラルから参照するのが通常です。次の例は、Generics どころか型情報もありません。それにも関わらず、この参照`props.theme.colors.blue`にはキッチリ型推論が効いています。いったいどこから提供されたものでしょうか？

```BlueButton.tsx
const StyledComponent = styled(Component)`
  background-color: ${props => props.theme.colors.blue}; /* (property) blue: "#00f" */
`
```



## DefaultTheme 型を宣言結合拡張する

`@types/styled-components` を確認しましょう（v4.4.2）。`DefaultTheme`という型定義があります。これは[先日の投稿](https://qiita.com/Takepepe/items/6addcb1b0facb8c6ff1f)と同じ仕組みを使った、型定義の注入テクニックです。`DefaultTheme` として用意された空っぽの interface に対し、宣言結合拡張することで、プロジェクト固有の型定義を注入することが出来ます。


```typescript
import 'styled-components'
// ______________________________________________________
//
export const theme = {
  colors: {
    red: '#f00',
    green: '#0f0',
    blue: '#00f'
  },
  layout: {
    width: 960
  }
} as const
// ______________________________________________________
//
type AppTheme = typeof theme
// ______________________________________________________
//
declare module 'styled-components' {
  interface DefaultTheme extends AppTheme {}
}
```

今のところ私は遭遇したことがありませんが、ThemeProvider が複数ある場合は、この手法は使えません。ここで紹介した内容は以下のリポジトリで確認できます。

https://github.com/takefumi-yoshii/styled-components-theme-type-definition
UICollectionViewでカルーセルを作る時の注意点

## UICollectionViewでカルーセル
[iOS] UICollectionView のレイアウトクラスを作成して「左右のアイテムをチラ見せするレイアウト」を実現する
https://dev.classmethod.jp/smartphone/iphone/collection-view-layout-cell-snap/

上記から引用してSwiftで書き直したものが↓。

```swift:CarouselCollectionViewFlowLayout.swift
final class CarouselCollectionViewFlowLayout: UICollectionViewFlowLayout {
    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
        guard let collectionView = collectionView else { return .zero }
        let pageWidth = itemSize.width + minimumLineSpacing
        let currentPage = collectionView.contentOffset.x / pageWidth

        if abs(velocity.x) > 0.2 {
            let nextPage = (velocity.x > 0) ? ceil(currentPage) : floor(currentPage)
            return CGPoint(x: nextPage * pageWidth, y: proposedContentOffset.y)
        } else {
            return CGPoint(x: round(currentPage) * pageWidth, y: proposedContentOffset.y)
        }
    }
}
```

この`CarouselCollectionViewFlowLayout`をCollectionView.layoutに渡してやれば良い。

## `isPagingEnabled = true`をやってはいけない

```swift
func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { ... }
```

`collectionView.isPagingEnabled = true`を行うと、上記処理を通るものの、returnで返しているCGPointの値は無視された挙動をする。
これに何回か引っかかっている気がするので、備忘録がてら書いた。
Pepper SDK入門(12) アニメーション編集

前々回のAnimation Browser、前回のRobot Viewerでの内容を踏まえた上で、様々なエディターを解説していきたいと思います。今回はAnimation Editorについて学習してみましょう。

#1.Animation Timelineファイルの作成
まずはAnimation Timelineファイルを作成してみましょう。

**<手順>**
1.FileメニューのNewから、Animation Timelineを選択してください。
2.アニメーションファイルの名前を入力しCreateボタンをクリックしてください。すると、空のアニメーションファイルのAnimationEditorが表示されます。
<a href="http://4.bp.blogspot.com/-oSBI-6P2GnQ/XIcfSxfPPBI/AAAAAAAAAPE/G66H0Qm_e2QA4CqLfMDxKpRBBYyZXQPgwCK4BGAYYCw/s1600/WS000000.JPG" imageanchor="1"><img border="0" height="192" src="https://4.bp.blogspot.com/-oSBI-6P2GnQ/XIcfSxfPPBI/AAAAAAAAAPE/G66H0Qm_e2QA4CqLfMDxKpRBBYyZXQPgwCK4BGAYYCw/s640/WS000000.JPG" width="640" /></a>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-xCdI32d_lvM/XglgajPuOtI/AAAAAAAADZI/6_9b_eTaNa0nrIVga0oUM6oO-Xp3Yin5gCLcBGAsYHQ/s1600/WS000000.JPG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 10em;"><img border="0" height="356" src="https://1.bp.blogspot.com/-xCdI32d_lvM/XglgajPuOtI/AAAAAAAADZI/6_9b_eTaNa0nrIVga0oUM6oO-Xp3Yin5gCLcBGAsYHQ/s640/WS000000.JPG" width="640" /></a></div>

DopesheetとCurvesビューはデフォルトで表示されており、Animation Timelineは.qianimファイルで保存されます。
Animation Editorが表示されない場合、文末の[トラブルシューティング](https://qiita.com/kskrin/private/0966d821b32e02ad0529#%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)を参照して下さい。

#2.Animation Timelineファイルの編集
**<手順>**
ファイル名をダブルクリックすると、Animation Editorが起動します。
<img width="1006" alt="スクリーンショット 2020-02-03 18.59.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/4b5cb357-01e2-3aca-fff1-dd471b73cfcb.png" />

<p class="info">コンテキストメニューからEdit Animationを選択してもAnimation Editorは起動します。</p>
<img width="448" alt="スクリーンショット 2020-02-04 11.12.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/8ad3c9a8-2f07-0225-f3f6-8ff41037e231.png" /> 

#《トラブルシューティング》

Animation Editorが起動しない場合や、Android Studio内に表示された場合[^1]は、[最新のバージョンのPepper SDK pluginをインストール](https://qiita.com/kskrin/items/65de908992c2a0e2751d)してみてください。
[^1]: 最新のバージョンのPepper SDK pluginでは、Animation Editorは別ウィンドウで開きます。
フロントエンド言語とJavaScript の役割

フロントエンド言語とは主にユーザーが目にする部分で主にhtml,css,JavaScriptから成り立っている。

「JavaScript」とは、動的なWebページを作成する事のできるプログラミング言語です。通常はブラウザー上で実行されます。JavaScriptを使うと、ユーザーのアクションに応じたコンテンツの表示の他、ブラウザー上で表示される地図やグラフィックアニメーションなども表示する事ができます。
「JavaScript」を使ってできる事はたくさんあります。開発当初のJavaScriptはクライアントサイドで実行され動的Webページを作成していましたが、現在ではサーバーサイドで動作する「Node.js」の他、Adobe Acrobat、Yahoo! ウィジェットエンジン、組み込みコンピューターなど様々な所で使われています。
JavaScriptを使うとWebページで表示するHTMLコンテンツを変更する事ができます。サンプルのボタンをクリックすると表示されているテキストが変わります。
JJavaScriptでHTMLコードそのものを変更する事ができます。
CSSで指定する、文字の大きさや色なども変更する事ができます。ボタンをクリックするとテキストの色が変わります。
JavaScriptでHTMLコンテンツを表示・非表示にする事ができます。
具体的には以下のようなことができます。
ポップアップウィンドウ
Ajax
サイトの利便性アップ
サイトのブラッシュアップ
カウントダウンタイマーが作れる
ソートや検索機能を作れる
ffmpeg 動画編集 コマンド 

#はじめに

LinuxのTerminal上で， 動画編集を行うためのコマンドラインについてのメモです．

#version
ffmpeg-4.2.2

#分割手法
ffmpegでの動画分割の手法を記載します．
本稿ではコマンドライン上でのスクリプトです．

＜条件＞
・入力をinput.mp4とする．
・出力をoutput.mp4とする．


1. 最初から最後まで出力する
    
```shell
ffmpeg -i input.mp4 -c copy output.mp4
```

2. 開始0秒から指定時間を出力する
    
```shell
ffmpeg -i input.mp4 -t [切り出す時間] -c copy output.mp4
```

3. 指定時間までカットし，最後まで出力する
    
```shell
ffmpeg -ss [切り出す部分の開始地点を動画開始からの秒数] -i input.mp4 -c copy output.mp4
```

4．指定時間までカットし，指定した再生時間まで出力する

```shell
ffmpeg -ss [切り出す部分の開始地点を動画開始からの秒数] -t [切り出す時間] -i input.mp4 -c copy output.mp4
```

5．指定時間までカットし，指定区間を出力する

```shell
ffmpeg -ss [切り出す部分の開始地点を動画開始からの秒数] -i input.mp4 -t [切り出す時間] -c copy output.mp4
```

6．開始0秒から，最後から指定時間前まで出力する．sseof はマイナス時間を指定

```shell
ffmpeg -sseof -[動画最後からのマイナス時間] -i input.mp4 -c copy output.mp4
```

7．最後から指定時間さかのぼり、指定時間を出力する

```shell
ffmpeg -sseof -[動画最後からのマイナス時間] -i input.mp4 -t [切り出す時間] -c copy output.mp4
```

#結合手法
ffmpegを用いた動画つなぎ合わせの手法を記載する．

・入力をinput.mp4 , input2.mp4とする．
・出力をoutput.mp4とする．

-i  は入力指定ファイル
n は連結するファイル数　，規定値は3である
v は連結する映像ファイルの可否，規定値は1である
a は連結する音声ファイルの可否，規定値は1である

1. 2つの動画を繋ぐ

```shell
ffmpeg -i input.mp4 -i input2.mp4 -filter_complex "concat=n=2:v=1:a=1" output.mp4
```

2. 複数の動画を繋ぐ
    ```　手順1に対して -i [動画.mp4]を付け加え，concat=n=? ?の部分を個数に変更する```
【Android】カメラ等の権限リクエスト実装方法まとめ

# 概要
自作のアプリでカメラやマイクを使いたい、位置情報を取得したい、などで、ユーザーに権限を許可してもらいたいときがあります。Android 6.0（API レベル 23）以降では、実行時に必要な権限を許可するようリクエストする必要があります（それ以前はアプリのインストール時にまとめてリクエストされる）。
権限リクエストの実装方法をまとめます。必要な権限は`AndroidManifest`に記述しておいてください。

# 権限をリクエストする
以下ではカメラの権限をリクエストすることにします。

まず、現在のカメラのアクセス権限の状態を確認します。
[`checkSelfPermission()`](https://developer.android.com/reference/kotlin/androidx/core/content/ContextCompat.html?hl=ja#checkSelfPermission(android.content.Context,%20kotlin.String))で特定の権限があるかどうかをチェックします。ある場合は0（`PackageManager.PERMISSION_GRANTED`）、ない場合は1（`PackageManager.PERMISSION_DENIED`）が返ります。

```kotlin
val cameraPermission = ContextCompat.checkSelfPermission(context!!, Manifest.permission.CAMERA)
```

（ここで既に権限がある（granted）場合は、そのままカメラ起動などの処理に進んでください:relaxed:）

そして、カメラの権限をリクエストします。
[`requestPermissions()`](https://developer.android.com/reference/kotlin/androidx/core/app/ActivityCompat.html?hl=ja#requestPermissions(android.app.Activity,%20kotlin.Array,%20kotlin.Int))で特定の権限を許可するようにユーザーにリクエストします。第二引数で複数の権限を指定することで、まとめてリクエストできます。
ここで表示されるAndroid標準ダイアログはカスタマイズできません。

```kotlin
if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.CAMERA), REQUEST_PERMISSION) // REQUEST_PERMISSION は定数
}
```

これで単純な権限リクエストは完了です。

# 権限リクエストの説明を表示する
例えば、「この機能を使うにはカメラの権限を許可してください」のような権限リクエストについて説明を表示したいときがあります。許可されていない（denied）場合に毎回表示する方法の他に、[`shouldShowRequestPermissionRationale()`](https://developer.android.com/reference/kotlin/androidx/core/app/ActivityCompat.html?hl=ja#shouldShowRequestPermissionRationale(android.app.Activity,%20kotlin.String))を使って、ユーザーがリクエストを許可しなかったことがある場合のみ表示する方法もあります。
`shouldShowRequestPermissionRationale()`は、以前ユーザーがリクエストを許可しなかった場合`true`を返しますが、「今後表示しない」を選択していた場合は`false`を返します。

# ダイアログで「今後表示しない」が選択された後にリクエストが必要な場合
ユーザーがカメラの権限リクエストで「今後表示しない」を選択した後に、「やっぱりカメラ機能を使いたい……」と考えるかもしれません。その場合、デバイスの「設定」で権限を許可するしかなく、再び権限リクエストのダイアログを表示することは**できません**。
権限が許可されている場合、`shouldShowRequestPermissionRationale()`は`false`を返します。「今後表示しない」を選択していたときに何かアクションをしたい（「"設定"で許可してください」のような説明を表示するなど）場合は、`checkSelfPermission()`と`shouldShowRequestPermissionRationale()`の両方を確認する必要があります。

```kotlin
val cameraPermission = ContextCompat.checkSelfPermission(context!!, Manifest.permission.CAMERA)
val cameraRationale = ActivityCompat.shouldShowRequestPermissionRationale(activity!!, Manifest.permission.CAMERA)
if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
    if (cameraRationale) {
        ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.CAMERA), REQUEST_PERMISSION)
    } else {
        AlertDialog.Builder(context!!)
            .setMessage("デバイスの「設定」でカメラの権限を許可してください。")
            .setPositiveButton("OK") { _, _ ->
                // OK button pressed
            }
            .create().show()
    }
}
```

上記のコード例で、PositiveButtonを押した後に設定画面を開くようにする場合は、こちらの記事もご覧ください: [【Android】アプリの権限を許可してもらうために「設定」を開きたい](https://5thfloor.qiita.com/mmmmk/items/5b6592b843115940715f)

# 参考
https://developer.android.com/training/permissions/requesting?hl=ja
[Python]No value for argument 'self' in unbound method callが出た



Python初心者です。
selfの考え方をイマイチ理解出来ておらず、地味に躓いたのでメモ

~~~ hello.py
class HelloWorld:
    def __init__(self):
        self.message = 'Hello,World'
    def gree(self):
        print(self.message)
~~~

~~~ sample.py
import hello

h = hello.HelloWorld
h.gree()
~~~

このコードだとh.gree()で「No value for argument 'self' in unbound method call」というエラーになる。
エラーの内容は関数greeの引数selfがないよというもの

selfって関数呼び出し時の引数に指定しなくていいんじゃないんだっけ？と躓いた。

sample.pyのコードを以下にすることで解決

~~~ sample.py
import hello

h = hello.HelloWorld()
h.gree()
~~~

参考

~~~ sample.py
h = hello.HelloWorld
print(type(h))
h = hello.HelloWorld()
print(type(h))
~~~

~~~
<class 'type'>
<class 'hello.HelloWorld'>
~~~


hello.HelloWorld　だとクラス定義を代入
hello.HelloWorld()だとクラスのインスタンスを代入

selfはクラスのインスタンス情報を保持するものなので、hello.HelloWorld だと動かないと理解
UbuntuでNode.js + Expressの環境を作る

# Ubuntu で Node.js + Express の環境を作って試してみる
Ubuntu の環境は既に作成済なのが前提

## Node.js を動かす環境を作る
 - 参考サイト→https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
   - とりあえず最新のを入れようとしてみる

下記を順番に入力したら完了

```
sudo apt install -y nodejs npm
sudo npm install n -g
sudo n stable
sudo apt purge -y nodejs npm
exec $SHELL -l
```

versionを確認するなら↓コレ

```
node -v
```

v12.14.1 とか出るはず

### Node.js で Hello World してみる
node と入力して node を起動
↓こんなのが出る

```
 Welcome to Node.js v12.14.1.
 Type ".help" for more information.
 >
```

以下を入力

```
console.log('Hello world')
```

出力を確認

```
 Hello world
 undefined
```

CTRL+Cを２回押すとvagrantターミナルに戻る

## express を動かす環境を作る
- 参考サイト→https://expressjs.com/ja/starter/installing.html

- フォルダ作成

```
mkdir (フォルダ名)
```
cd (フォルダ名) でフォルダ移動しとこう

- Package.jsonを作る

```
npm init
```
色々質問されるけど、最初は全部Enter押下でも良い
必要に応じて記入する

- express をインストール

以下を実行

```
npm install express --save
```
これでようやく express が使える

### express に hello world させる
先ほど作ったフォルダに移動

```
cd (フォルダ名)
```

- app.js を作る
  - nano と入力してテキストエディタを起動
（他のテキストエディタが良いならそれでも可）

↓コレを入力(orコピペ)して、 app.js として保存

```javascript:app.js
const express = require('express')
const app = express()

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(3000, () => console.log('Example app listening on port 3000!'))
```

- node app.js を起動

コンソールには↓こんなのが出る

```
Example app listening on port 3000!
```
GUIのUbuntu-Desktopがあれば、
ブラウザで http://localhost:3000/ にアクセスすると、
Hello World! がブラウザに表示される。

IPの設定は[以前書いたやつ](https://qiita.com/bonkoturyu/items/fcef25c7318beaa64d2d)のVagrantfileで設定してたはずなので、
そのままだったら、 http://192.168.123.222:3000/ にアクセスしたら、
Hello World! がブラウザに表示される。

これで完了。

あとは MySQL との接続&表示とかをしていけばいい。

# おまけ
express-generatorを、なんでみんな -g して install してしまうん？ってのが、凄い気になった。
[ここのサイト](https://qiita.com/janus_wel/items/207672dc29e22fa2c343)みたいに、ローカルだけに install したらいいよ。
呼び方ちょっとめんどいけど、↓とかしたらいいだけだから。

```
./node_modules/.bin/express app
```

# 参考
- Ubuntu に Node.js を入れる
  - https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
- Ubuntu に express を入れる
  - https://expressjs.com/ja/starter/installing.html
- express で hello world してみる
  - https://expressjs.com/ja/starter/hello-world.html  
- express-generator を使う
  - https://qiita.com/janus_wel/items/207672dc29e22fa2c343
TeXで箇条書きの第1レベルのインデントがバグるときの対処法

学校で配布されたTeXなどで箇条書で書くときに、箇条書きの第1レベルのインデントが何故かバグることがあります。（僕はありました）
そういう場合は

```
\setlength{\labelwidth}{-10mm}
```
これを消せば第1レベルの謎のインデントがなくなります。
学習のためにQiitaのクローンサイトを作ろうと思ったのでまずは、URLから調べてみた。

# 背景
qiitaのクローンを作りたくてurlがどうなっているか調べてみました。

# 目次
- 一覧
- 各URLの内容
- 調べてみて

# 一覧


```
qiita.com/
    ├ {ユーザー名}/
    │    ├ items/
    │    │    └ {記事ID}/
    │    ├ contributes/
    │    ├ followers/
    │    ├ likes/
    │    ├ privates/
    │    └ comments/
    ├ advent-calendar/
    │    └ {西暦}/
    │         ├ {カレンダー名}/
    │         ├ categories/
    │         │    └ {カテゴリー名}
    │         └ rankings/
    │              ├ subscription/
    │              │    └ categories/...
    │              └ feedbacks/
    │                   └ categories/...
    ├ drafts/
    │    ├ new/
    │    └ {記事ID}/
    │        └ edit/
    ├ organizations/
    │    └ {組織名}
    │         └ members/
    ├ search/
    ├ settings/
    │    ├ account/
    │    ├ analytics/
    │    ├ application/
    │    ├ mutes/
    │    ├ notifications/
    │    ├ organization/
    │    ├ password/
    │    ├ profile/
    │    ├ security/
    │    └ two_factor
    ├ stocks
    ├ tags/
    │    └ {タグ名}/
    ├ tag-feed/
    ├ timeline/
    └ users/
```

# URLの内容

## qiita.com
ドメイン名。ホーム画面と記事のトレンドを表示する
##### URLパラメータ

- ?search・・・トレンドの週間と月間を指定する。日間はパラメータを指定しないとき表示される。

search/へのGET(パラム渡し)。その他リンクへのGET

## {ユーザー名}
react-native のMetro bundlerでNodeエラーが出るときの対処

## 概要
React Native開発をしているとMetro Bundlerが上がってきます。
このときに自動で立ち上がってくるTerminal上のMetroでエラーが出た時の対処方法のメモとなります。

## 対象読者
- React Native v0.59.x >=　利用者

## 事象
React Native開発をしていると（古いバージョンでは）必ずMetro Bundlerのお世話になります。Metro Bundlerは `react-native-cli`の`run-ios`コマンドを叩くなどすると上がってきます。

その際、新規PCで何気なく実行すると下記のエラーが出ました。
<img width="985" alt="Screenshot 2020-02-04 13.05.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123578/503bafbc-b15b-24d4-4c6f-0427a8b2b4e1.png">

あれ？nodeがない？となりましたが、普段使いしているterminalで確認したところ下記の通り、nodeは入っていました。

```bash
$ node -v
v10.17.0
```

## 原因
NVMなどを使っていると、参照しているnodeはホームディレクトリ配下のことが多いです。
しかし、`react-native run-ios`で起動するターミナルが参照するNodeのPATHは`/usr/local/bin/node`のようです。

よって、自身が利用しているnodeのパスを確認して、`/usr/local/bin/node`へリンクを通してあげると解決します。

```bash
# nodeが存在することを確認できます
$ which node
/home/USERNAME/.nvm/versions/node/v10.17.0/bin/node

# 上記パスに対して、シンボリックリンクをはります
# $()とすることで()内コマンドの結果を利用できます
$ ln -s $(which node) /usr/local/bin/node
``` 

## 参考リンク
- https://stackoverflow.com/questions/51576877/react-native-packager-sh-line-11-node-command-not-found
X, Yが0を中心に対称な分布に従うなら、X+Yもそうか？

## Introduction : 対称な分布

確率分布が確率質量関数または確率密度関数によって定義されているものとし、これを$f(x)$と書くことにします。このとき、$f(x)$が$x_0$で対称、要するに任意の実数$c$に対して$f(x_0+c)=f(x_0-c)$をみたすような確率分布を「**$x_0$で対称な分布**」といいます。


## 1. 問題
この記事では次のような問題を考えます。

**問題** : 確率変数$X,Y$が従う確率分布が0を中心に対称ならば、$X+Y$もまた同様であるか？

この問題は、$X,Y$が独立であれば正しいことを難しくなく示すことが出来ます。

**命題** : 上の問題は、$X,Y$が**独立であれば**正しい。

**証明** : 連続型の場合のみで示します。（離散型の場合も証明は同様です。）畳み込みを用いましょう。$Z:=X+Y$, $f_{X}(x), f_{Y}(y), f_{Z}(z)$はそれぞれの確率密度関数とします。以下の等式が成り立ちます。

```math
\begin{eqnarray*}
f_{Z}(z) &=& \int_{-\infty}^{\infty}f_{X}(x)f_{Y}(z-x)dx\\
&=& \int_{-\infty}^{\infty}f_{X}(-x)f_{Y}(-z+x)dx\\
&=& \int_{-\infty}^{\infty}f_{X}(x')f_{Y}(-z-x')dx'\\
&=& f_{Z}(-z)
\end{eqnarray*}
```
なお、2段目では$f_{X}(x),f_{Y}(y)$が0を中心に対称（要するに偶関数）であることを用い、3段目では$x'=-x$とおいて置換積分しました。■

本題は$X,Y$が独立ではない場合です。

## 2. 解答
結論から言うと、**正しくありません**。以下のような反例を構成できます。

**反例** : 次のような同時確率質量関数を考えればよい。

|X\Y|-1|0|1|
|:-:|:-:|:-:|:-:|
|-1|0|1/3|0|
|0|1/3|0|0|
|1|0|0|1/3|

$X$, $Y$の確率分布は$x,y=-1,0,1$上の離散一様分布になり、0を中心に対称です。しかし、$Z=X+Y$の分布は$\mathbb{P}[Z=-1]=2/3$, $\mathbb{P}[Z=2]=1/3$となり0を中心に対称にはなりません。

## 3. 考察
上の例で用いた$x,y=-1,0,1$の場合の$(X,Y)$の同時分布の場合で、

* $X,Y$が0を中心に対称な分布
* さらに$X+Y$が0を中心に対称な分布

を求め、パラメータ空間の次元を比較しましょう。$X,Y$が0を中心に対称な分布を持つ場合、$(X,Y)$の同時分布は6つのパラメータ$t_1,\cdots,t_6$を用いて以下のように書き下すことが出来ます。

|X\Y|-1|0|1|
|:-:|:-:|:-:|:-:|
|-1|$t_1$|$t_2$|$t_3$|
|0|$1-(t_4+t_5)-2(t_1+t_2+t_3)$|$t_4$|$t_5$|
|1|$-1+(t_1+t_4+t_6)+2(t_2+t_5)+3t_3$|$1-(t_2+t_4)-2(t_3+t_5+t_6)$|$t_6$|

さらに$X+Y$が0を中心に対称な分布の場合、$t_1=t_6$が成り立ち、以下のように書き下すことができます。

|X\Y|-1|0|1|
|:-:|:-:|:-:|:-:|
|-1|$t_1$|$t_2$|$t_3$|
|0|$1-(t_4+t_5)-2(t_1+t_2+t_3)$|$t_4$|$t_5$|
|1|$-1+t_4+2(t_1+t_2+t_5)+3t_3$|$1-(t_2+t_4)-2(t_1+t_3+t_5)$|$t_1$|

要するに、$(X,Y)$の同時分布のパラメータ空間8次元のうち、$X,Y$が0を中心に対称な分布になる場合が6次元、さらに$X+Y$が0を中心に対称な分布になる場合は5次元あることが分かりました。

## Acknowledgement
<a href="https://qiita.com/utaka233/items/1937bfcb3d1cbae0e8df">前記事</a>でのみなさまの温かい応援がありがたいです。心から感謝しております！
yum install時 error: cannot open Packages index using db5 などのエラー対策

```
error: rpmdb: BDB0113 Thread/process 22633/140077984761664 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 -  (-30973)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:

```

対策

```
sudo rpm --rebuilddb

```
WebサーバにIPv6で接続したときだけ特別感を出す

# 特別感？

といっても画像を変えるだけだったりします。期待させてすみません……。IIJやKDDIみたいに、IPv6だったらトップページの表示が（ほんの少し）変わるのをやりたいな、という話です。

## IIJの場合

* トップページ<br/>https://www.iij.ad.jp
* 取り組み紹介のページ<br/>https://www.iij.ad.jp/IPv6/ipv4v6.html

## KDDIの場合

* トップページ<br/>https://www.kddi.com
* 取り組み紹介のページ<br/>https://www.kddi.com/ipv6/

# 画像を用意しましょう

IPv6用、IPv4用で同じサイズの画像を用意します。IPv6では色つき、IPv4だとモノクロのようにすると特別感が出ます。（※個人の感想です（※とはいえIIJもKDDIもそんな感じにしていますね））

私には絵の才能がないので次のような感じに落ち着きました。しょぼい。

* IPv6の場合<br/>
![via_ipv6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223758/aaffcb7f-655d-4688-9d4d-0950e92f7187.png)
* IPv4の場合<br/>![via_ipv4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223758/1f6f4b82-fa5a-4ce5-f634-3558c9f960c8.png)

# ディレクトリを用意します

画像のパスを `/img/connected/via.png` とし、トップのディレクトリから `/img/connected` を作り、ファイルを置きます。

# .htaccess ファイルを書きます

画像をキャッシュされないようにします。

```apache
<Files "*.png">
    FileEtag None
    Header set Cache-Control no-store
</Files>

<If "%{REQUEST_URI} == '/img/connected/via.png'">
    RewriteEngine on
    RewriteCond %{IPV6} on
    RewriteRule ^.*$ /img/connected/via_ipv6.png [L]
    RewriteCond %{IPV6} off
    RewriteRule ^.*$ /img/connected/via_ipv4.png [L]
</If>
```

# 最終確認をします

以下のように配置されているはずです。

```
$ ls -la /var/www/img/connected
total 12
drwxr-xr-x 2 keys keys  63 Jan 31 16:38 ./
drwxrwxr-x 3 keys keys  23 Jan 31 16:00 ../
-rw-r--r-- 1 keys keys 354 Jan 31 16:38 .htaccess
-rw-r--r-- 1 keys keys 760 Jan 31 15:57 via_ipv4.png
-rw-r--r-- 1 keys keys 810 Jan 31 15:57 via_ipv6.png
```

# れっつごー

ではブラウザでアクセスして確認してみましょう。

https://devel.keys.jp/img/connected/via.png
※これは私のサイトのものです。みなさんのサイトにあわせて変えてください

簡単でしたね！
あとは特別な作業は不要で、Webページから普通に `<img>` タグで表示するようにするだけです。

ぜひ、みなさんのWebサイトでも試してみてください！
Visual Studio Code Makrdown表示時のミニマップを非表示にする方法

# 目的

- Visual Studio Code(以下VScode)でMarkdownファイルを表示した時のミニマップを非表示にする方法をまとめる

# 実施方法

1. VScodeを開いてウインドウ左下の歯車マークをクリックする。
1. 「設定」をクリックする。
1. 「設定の検索」に「ミニマップ」と入力する。
1. 「Editor › Minimap: Enabled」の下にある「ミニマップを表示するかどうかを制御します。」のチェックを外す
GCP 学習リソースまとめ

# GCP 学習リソースまとめ

## 公式スライド

[Google Cloud Platform - Japan Presentations on SlideShar](https://www.slideshare.net/GoogleCloudPlatformJP/presentations)


## ハンズオン形式のチュートリアル

[Google Codelabs](https://codelabs.developers.google.com/?cat=Cloud)

## 動画（Youtube）

[#CloudOnAir 2019 年 1 月〜 放送 - YouTube]
(https://www.youtube.com/playlist?list=PLmoHjhhs3ySFmQZRmae2C6dVmrS7l79Rh)

## 公式ハンズオンチュートリアル

[はじめてみよう Google Cloud Platform Online Handson](https://inthecloud.withgoogle.com/gcp-online-handson/index.html)

## CIer のブログ
[apps-gcp.com | G Suite（旧：Google Apps） やGoogle Cloud Platform サービスについて紹介します](https://apps-gcp.com/)


## 内外の有志によるブログ

[google-cloud-jp – Medium](https://medium.com/google-cloud-jp)


## ユーザーコミュニティ『GCPUG』

（※漏れてるのあれば、MR お願いします・・ :pray:）


[GCPUG Tokyo - connpass](https://gcpug-tokyo.connpass.com/)

[GCPUG KOBE(Google Cloud Platform User Group Kobe) - connpass]
(https://gcpug-kobe.connpass.com/)

[GCPUG Kyoto - connpass](https://gcpug-kyoto.connpass.com/)

[GCPUG Shiga - connpass](https://gcpug-shiga.connpass.com/)

[GCPUG Yokohama - connpass](https://ygcpug.connpass.com/)

[GCPUG NARA - connpass](https://gcpug-nara.connpass.com/)

[GCPUG Shonan - connpass](https://gcpug-shonan.connpass.com/)

[GCPUG Okinawa - connpass](https://okipug.connpass.com/)

[GCPUG Osaka - connpass](https://gcpug-osaka.connpass.com/)


## Github
（※ちょっと日付が古い）

[GoogleCloudPlatform/scalable-resilient-web-app](https://github.com/GoogleCloudPlatform/scalable-resilient-web-app)


## GCP w/ Terraform

[GoogleCloudPlatform/terraform-google-examples: Collection of examples for using Terraform with Google Cloud Platform.](https://github.com/GoogleCloudPlatform/terraform-google-examples)

[TerraformによるGCP環境の管理](https://gist.github.com/MisaKondo/cb46b0ecd106e9c824a641b14954b8e1)

[TerraformでGCP環境を構築してみる | GMOアドパートナーズグループ TECH BLOG byGMO](https://techblog.gmo-ap.jp/2017/11/16/terraform%E3%81%A7gcp%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)

[Getting started with Terraform on Google Cloud Platform](https://cloud.google.com/community/tutorials/getting-started-on-gcp-with-terraform)

[Terraform+GCPを体験する - Qiita](https://qiita.com/tamata78/items/9c9ba401642000a8693c)
Taprootで気をつけること

# はじめに（Introduction）

BIP-340、BIP-341、BIP-342がDraftになり、ますます活気の出てきているTaprootですが、
TaprootのScriptを使う時に気をつけなければならない事について、仕様などではあまり明記されてい部分について記述してみたいと思います。

**※：詳しいアーキテクチャに関しては仕様を確認してください。**

# Taproot

送信先は、Segwitの`witness version`を1（`OP_1`/`0x51`）として先頭に置き、次に楕円曲線（Secp256k1）ポイント$Q$の$x$座標を32byteで連結します。
この$Q$というポイントは次の式で求めます。

```math
Q=P+tG
```

$t$は、Scriptのマークルツリーのルート$m$と公開鍵$P$を連結し、タグハッシュ（"TapTweak"）したものです。
式にすると以下のようになります。

```math
t=\text{hash}_{\text{TapTweak}}(P || m)
```

Taprootでこの送信先に送られたものを使うには、$Q$の署名か、$t$でコミットメントされたScriptを使用するのかどちらかとなります。

Taprootを場合分けしてみます。

### Schnorr署名を使う場合

Schnorr署名だけを使いたい場合（Script less scriptなどを含む）、これについては用途毎に注意する事がありますが、パターンが多すぎるのでここでは述べません。

### Scriptを使う場合

$t\ $でコミットメントされたScriptを使う場合、これはScriptの正確性などに注意する必要があります、これについてもここでは述べません。
ただし、注意すべき点として述べたいのは**$P$の生成**に関してです。

基本的にScriptを使う場合、２人以上が関わります。
再度の確認となりますが、使用するには以下の２つの方法があります。

- $Q$の署名
- $t$でコミットメントされたScriptを使用

$P$が１人だけで決まってしまうと、$Q$の署名で使用できてしまうので、Scriptの意味が無くなってしまいます。

$P_1$と$P_2$を足した、$P=P_1+P_2$を利用すれば良いと考えるかもしれません。
ただし、単純に$P_1$と$P_2$を交換するだけですと危険な状況になります。
$P_1$を渡された側が、$P_2'=P_2-P_1$とした、$P_2'$を相手に渡せば、$P=P_1+P_2'=P_2$となってしまいます。

#### 方法１

$P_1$と$P_2$を渡す前にお互いに、コミットメントを送っておきます。
$c_1=\text{hash}(P_1)$、$c_2=\text{hash}(P_2)$をお互いに送っておく事によって不正な$P_2'$などを生成できなくなります。

ただし、プレコミットメントを送るターンが増えてしまいます。

#### 方法２

$P_1$と$P_2$からハッシュ値を用いて$P$を生成します。

```math
\begin{align*}
& c=\text{hash}(P_1||P_2) \\
& \mu_1=\text{hash}(c||1) \\
& \mu_2=\text{hash}(c||2) \\
& P = \mu_1P_1 +  \mu_2P_2\\
\end{align*}
```

もちろん、$P_1$を渡された側が不正な$P_2'$を見つける事ができるかもしれませんが、
ある程度の短い時間内で見つけるのは非常に困難であるとされています。

# おわりに（Conclusion）

Schnorr署名の導入により、署名の加法準同型が可能となるため、より便利になりますが、
それに伴い、注意すべき点も増えてきています。
使用するには、ちゃんと原理を知って安全に使わなければなりません。

署名に関しても、メッセージが決まる前にナンスポイントを教えたりすることで、
バースデー問題に持ち込まれてしまう恐れがあるため、署名のシーケンス等も十分に注意する必要があります。

# 参照（Reference）

- BIP-340 : Schnorr Signatures for secp256k1<br>
  https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
- BIP-341 : Taproot: SegWit version 1 spending rules<br>
  https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki
- BIP-342 : Validation of Taproot Scripts<br>
  https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki
初心者が先輩のコードを真似してはいけない理由

（※この記事の会話や例は、事実に基づかない説明用のフィクションです）

> チームに新人が入った際の、最初のコードレビューでのやりとり
>
> 先輩「var変数ではなくconst変数を使ってください」
> 後輩「既存のコードに合わせてvarにしたんですけど」
> 先輩「既存のコードは真似しないでください」
> 後輩「ハァ！？既存のコードってのは、先輩が書いたコードですよ！？それを真似しただけなのに何で叱られなきゃならんのですか！？やってられませんよ！！」

「初心者は既存のコードを真似すればOK」「優秀なプログラマーは、常に良いコードを書く（悪いコードが書かれたのは、プログラマーが劣っていたから）」と、素朴に信じている人はそこそこいるようで、「そうではない」と訂正した経験が何度かあります。皆さんもあるのではないでしょうか？

しかし、よく考えると **「なぜ既存のコードを真似してはいけないのか」** を文章にしたものは見たことがなかったので、そこで思考の整理がてら書き起こしてみました。

なお、この記事で言いたいのは **「既存のコードに囚われず常にベストのコードを書いてください」** ということで、むやみに先輩を疑えと言いたいわけでも、自分の過去の過ちを糊塗したいわけでもありません。

# 理由１：「チャンネル回し」とか言ってた

プログラミングの常識は時代と共に変わります。

例えば、今ではどの言語にも `for x in list` のような「リストの要素を走査するfor文」がありますが、かつてはメジャーな言語機能ではありませんでした。

コーディングのレベルでは、「早期return」は現在では常識ですが、「returnは関数の最後に1回だけ書くべき」という説が'90年代ごろまでは幅を効かせていました。

そんなわけで、**当時としては当たり前を書き方をしたのに、今から見るとベストではなくなってしまっていること**はよくあります。

# 理由２：紅顔の美少年だった

5年前にコードを書いた時、先輩は５歳若かった。

今でこそKotlin界のデストロイヤーと呼ばれている先輩も、そのコードを書いた時には、まだ未熟なJava1年生だったのです。コード品質が低くとも無理はありません、

「あの先輩のことだから、この奇っ怪なコードにも意味があるに違いない！！」と思い込まずに、素直に「なぜこうしているんですか」と聞きましょう。

# 理由３：現場はマンションの一室だった

既存のコードが書かれた当時、会社のシェアは何%だったでしょうか？会社住所は社長の自宅マンションだったのではありませんか？

初期の企業がシェアを獲得するにはスピードが大変重要です。そして、急ぐ時には**品質が犠牲にされがちです。** 不具合があっても致命的でなければリリースしたし、可読性なんか問題ではなかったのです。

（[質とスピードはトレードオフではない](https://speakerdeck.com/twada/quality-and-speed)という話もありますが、昔はトレードオフだと信じられていました）

# 理由４： フフフ・・・それは残像だ

最後に。忘れがちですが商用のコードは複数人で開発しています。

`git blame` で俺の名前が出たとしても、それはインデントを変えただけで、オリジナルのコードを書いたのは3年前に辞めたクソ野郎なので、俺を責めるのはやめろください。

# キレないで :heart:

以上のように、なぜ既存のコードがクソ（なこともある）のか説明しました。

ところで、記事冒頭の会話文のように**既存コードを真似しているのを指摘するとキレる人**が時々います。キレるパターンには2種類あるようです。

まず、自信が無い人のパターン：

> 「ここでは `let`を使ってください」
> 「私は既存のコードを真似しただけなんです！　私は入社1年目の初心者なんですよ！？　そんなに言わなくてもいいじゃないですか！？」

コードレビューはあなたの人格を責めているのではありません。あくまでコードの問題や、あなたの誤解を指摘しているのです。だから、たくさん指摘されたからと言って、凹む必要はありません。

（レビュワーがコミュ障で、言い方がムカつくというケースもありますが、それは別の問題です）

一方で「初心者であること」は、コードがクソであることの言い訳にはなりません。製品にクソコードが組み込まれてしまうのは、あなた１人の問題ではないからです。いやしくも職業プログラマーなら、常にベストのコードを書くように務めてください。

また、自分の技量が不足していると感じているなら、上司と交渉して、コードを書く前に勉強時間を確保したり、先輩に教わる機会を設けたりしてください。上司も、初心者がいきなりコードを書けるとは思っていないので、Noとは言わないはずです。

# キレないで :heart::heart:

もう一方のキレるパターンは、自信がありすぎる人のもので：

> 「ここではletを使わないでください」
> 「才能ある俺様が、わざわざお前のクソコードに合わせてletを使ってやったんだぞ！？　それに文句つけてんじゃねーよ！」

このパターンでは **レビュワーもキレ出して収拾がつかなくなりがち** なので、キレないでください。

クソコードが今そこにあるのは、上述のような様々な経緯があるのです。そこの事情を慮ってあげてください。また、 **ソフトウェア開発の成果は、個人ではなく、チーム・組織に属するものです。** 個人の有能さ・無能さには意味はありません。チーム全体のアウトプットを向上させることに注力してください。

# むすび

繰り返しになりますが、この記事で言いたいのは　**「既存のコードに囚われず常にベストのコードを書いてください」**　ということで、むやみに先輩を疑えと言いたいわけでも、自分の過去の過ちを糊塗したいわけでもありません。

また、この記事はまともな職場を想定しています。狂った職場では別の対処をしてください。
[MEMO][TERMINAL] HYPER + FiraCode

# はじめに
LinuxでもFiraCodeをターミナルで使いかったので

# やり方

## Hyper

https://hyper.is/#installation

```
wget https://releases.hyper.is/download/deb
```
```
sudo dpkg -i package-x.x.x.deb
```



## FiraCode

https://github.com/tonsky/FiraCode/wiki/Linux-instructions

```
sudo add-apt-repository universe
```
```
sudo apt install fonts-firacode
```
```
fc-list | grep fira
>
/usr/share/fonts/woff/firacode/FiraCode-Regular.woff: Fira Code:style=Regular
/usr/share/fonts/opentype/firacode/FiraCode-Retina.otf: Fira Code,Fira Code Retina:style=Retina,Regular
/usr/share/fonts/woff/firacode/FiraCode-Light.woff: Fira Code,Fira Code Light:style=Light,Regular
/usr/share/fonts/woff/firacode/FiraCode-Bold.woff: Fira Code:style=Bold
/usr/share/fonts/opentype/firacode/FiraCode-Bold.otf: Fira Code:style=Bold
/usr/share/fonts/opentype/firacode/FiraCode-Regular.otf: Fira Code:style=Regular
/usr/share/fonts/opentype/firacode/FiraCode-Medium.otf: Fira Code,Fira Code Medium:style=Medium,Regular
/usr/share/fonts/opentype/firacode/FiraCode-Light.otf: Fira Code,Fira Code Light:style=Light,Regular
/usr/share/fonts/woff/firacode/FiraCode-Medium.woff: Fira Code,Fira Code Medium:style=Medium,Regular
```

#設定
```~/.hypter.js
module.exports = {
  config: {
    // choose either `'stable'` for receiving highly polished,
    // or `'canary'` for less polished but more frequent updates
    updateChannel: 'stable',

    // default font size in pixels for all tabs
    fontSize: 12,

    // font family with optional fallbacks
    fontFamily: 'Fira Code, "Menlo", "DejaVu Sans Mono", Consolas, "Lucida Console", monospace',
```
【Go】SHA-1で文字列をハッシュ化


# SHA-1ハッシュ関数で文字列をハッシュ化

ちなみにパスワードとかのハッシュ化にこれを用いるのは推奨されてない

```go

package main

import (
	"crypto/sha1"
	"encoding/hex"
	"fmt"
	"io"
)

func main() {
	str := HashedBySha1("あかさたな")
	fmt.Print(str) // d6c286cf2c63d5c718eb6c51e26bfc79d11d332c
}

func HashedBySha1(str string) string {
	sha1 := sha1.New()
	io.WriteString(sha1, str)
	return hex.EncodeToString(sha1.Sum(nil))
}
```

# The Go Playground

https://play.golang.org/p/kvZdRZJJd2T
macをアクセスポイントにしてWIFI接続する

# 起
職場にメンバーが増えたことで無線LANの接続台数が増えて検証端末が繋がらなくなってきた
そうだ、macをAPにして検証端末を繋げよう

# やったこと
1.　システム環境設定 -> 共有
2.　共有設定画面を開いたらサービスから「インターネット共有」を選択
3.　共有する接続経路、相手のコンピュータでのポートを選択
<img width="500" alt="スクリーンショット 2020-02-04 10.31.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324924/8a8cb5e9-f1ab-ac0c-5bf0-c4794decd49d.png" />

4.　WI-FIオプションで適当にネットワーク名、パスワードを設定
<img width="500" alt="スクリーンショット 2020-02-04 10.31.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324924/58c5a94a-19eb-e2c8-1ab8-ee1782807c8f.png">
5.　設定が終わったらサービスのインターネット接続にチェックを入れて共有開始
<img width="500" alt="スクリーンショット 2020-02-04 10.31.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324924/178fb909-577b-e43b-837a-cf043a2251fd.png" />

以上でAPとして利用できるようになります。

# まとめ
端末や人が増えたりすると無線LANの接続上限は結構問題になってきたりするかと思います。
macから繋いでやることで回避は可能なので、どうしても繋がらなかったりした際はお試しあれ
UnityからビルドしてOculus Quest内でキューブを見られるようになるまで

# Unity Hubのインストール
[Download \- Unity](https://unity3d.com/jp/get-unity/download)
Unity HubはUnityのバージョン管理用アプリケーションらしい
最新版のUnityをUnity Hubを通してインストールしておく

# Oculus側の設定や手順
基本的に以下の記事に従っていればok
[Unityで作ったアプリをOculus Questで動かす \- Qiita](https://qiita.com/pira/items/1c935f30d5ba6c020333)

ただ、ちょこちょこ細かいところで詰まった部分があったので以下対処法メモ

# AndroidへSwitch Platformする
Unityの File > Build Settings > Android へ Switch Platformする時、
モジュールはそのウィンドウ上で案内されているリンクからダウンロードするのではなく、
Unity Hubの インストール > 自分が利用中のUnityのバージョンの右上にある三点メニュー > モジュールを加える > Android Build Support を選択して追加する
(リンクからダウンロードしたモジュールはエラーが出てインストールできない)

また、 Android Build Supportの文字の左にある下三角を押して Android SDK & NDK Tools と Open JDK もインストールする
<img width="641" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67311/75db1052-980b-5e06-7409-152846a262ff.png">

Unityの Platform > External Tools にJDKとAndroid SDK/NGKの設定欄があるのでエラーが出ていないか確認しておく

参考 :
* [Android SDK, NDKをUnity Hubからインストールする方法｜安西先生、ゲームが作りたいです](https://yanpen.net/unity/install_android-sdk-ndk_from_unity_hub/)
* [【Oculus Go×Unity】JDKの設定にハマった【mac】 \- Qiita](https://qiita.com/fkana/items/a92a1aaa12a3a567b6d7)

# Renderingの設定
Build Setting > Player Setting ＞Other Settings＞Rendering＞Graphics APIs から Vulkan を選択し「-」を押して外しておく

参考 :
* [UnityでVRアプリを作ったら上下が逆転してしまった \- Qiita](https://qiita.com/Ihal/items/5135521915b70d9c0e91)
docker exec で ヒアドキュメントを使いたいんじゃ

## タイトルのような状況に遭遇してしまった場合
以下のように実行する。

```shell-session
$ docker exec -i postgres /usr/local/bin/psql db -U db_user <<EOT
select version();
EOT

                                        version
---------------------------------------------------------------------------------------
 PostgreSQL 11.2 on x86_64-pc-linux-musl, compiled by gcc (Alpine 8.2.0) 8.2.0, 64-bit
(1 row)
```

ヒアドキュメントを入力とするので -t オプション（疑似TTYの割り当て）は不要
つけた場合はエラーになる。

```shell-session
$ docker exec -it postgres /usr/local/bin/psql db -U db_user <<EOT
select version();
EOT
the input device is not a TTY
```

以下のように sh -c で実行することもできる。

```shell-session
$ docker exec -it postgres sh -c "/usr/local/bin/psql db -U db_user <<EOT
select version();
EOT"

                                        version
---------------------------------------------------------------------------------------
 PostgreSQL 11.2 on x86_64-pc-linux-musl, compiled by gcc (Alpine 8.2.0) 8.2.0, 64-bit
(1 row)
```
VScodeでrubocopを使ったらエラーが出た

#前提
・rbenvでrubyのバージョンを2.6.0に指定
> system
* 2.6.0 (set by /PATH/)
  2.7.0

・2.6.0の環境下でrubocopをインストール
> gem install rubocop

・VSCode拡張機能であるruby-rubocopをインストール

#エラー
VSCodeの右下に以下のようなエラーが出てきた


> rbenv: rubocop: command not found 
The `rubocop' command exists in these Ruby versions: 2.6.0

#問題の原因
以下の２つのファイルが置いてある場所に問題があった
`~/.vscode`
`~/project/.ruby-version`

VScode上でruby-rubocopを実行する時にデフォルトのruby環境(rbenv versionsコマンドを打った時のsystem)のままであり、rubocopがインストールされていない状況であった

#解決方法
以下のどちらかの方法で解決できる

１.VScodeのruby実行環境を2.6.0にする
.ruby-versionを.vscodeがある~/に置く

２. デフォルトのruby環境にrubocopをインストールする