OmniAICreator/Qiita-1.07M huggingface dataset:
単にJSONをGoogle Cloud Storageに保存したいだけ

なのに、意外と困ってしまい、備忘録。

## これでいいっぽい
```JavaScript
const { Storage } = require('@google-cloud/storage');
const { Readable } = require('stream');
const gcs = new Storage({
    projectId: '<YOUR_PROJECT_NAME>'
});

const data = [
    { key: 'value' },
    { key: 'value' }
    // ...
];

// Writing GCS
const file = gcs.bucket('<YOUR_BUCKET>').file(`<YOUR_FILE_PATH>.json`);
const gcsStream = file.createWriteStream({
    metadata: {
        cacheControl: 'no-cache',
        contentType: 'application/json'
    }
});
const readStream = new Readable();
readStream.push(data.map(d => JSON.stringify(d)).join('\n'));
readStream.push(null);

readStream
    .on('error', error => {
        console.error('Stream error');
        res.status(500).send(JSON.stringify(error));
    })
    .pipe(gcsStream)
    .on('error', error => {
        console.error('Stream error');
        res.status(500).send(JSON.stringify(error));
    })
    .on('finish', () => {
        console.log('Stream writig to GCS is completed');
        res.send({ status: 'success' });
    });
```

定期バッチなんかをFunctionsに書いておいて、Cloud Scheduler(betaだけど) -> Functions -> GCS -> BigQuery でググれる(広義)ようにしておけば、ちょっとしたログ基盤すぐに作れて便利。
JavaScript プロジェクトで CircleCI から Code Climate Quality を使い、コードの品質をはかる

[Code Climate](https://codeclimate.com/) はコードの品質やチームの生産性をはかるクラウドサービスです。
いくつかの機能がありますが、OSS ならば「Quality」の機能は無料で利用することができます。

Quality の機能には大きく「Maintainability」「Test Coverage」の2つがあります。これらの設定方法を順番に説明していきます。

## 環境
- Windows 10 Pro 1809 / Windows Subsystem for Linux
- Node.js 11.8.0
- TypeScript 3.3.1
- Jest 23.3.13
- CircleCI


## Maintainability の設定
非常に簡単です。[Code Climate](https://codeclimate.com/) に GitHub アカウントを連携して、対象のリポジトリを追加するだけです。

しばらく待つと、リポジトリのページが発行され品質のスコアリングが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/50391/d8a9e4a3-76e2-c4e2-c9d7-039bf186f563.png)

issues から、実際のコード内の問題点を確認できます。
今回試したリポジトリでは、メソッド内の行数の長さと、[Cognitive Complexity (認知的複雑度)](https://docs.codeclimate.com/docs/cognitive-complexity) の高さが指摘されていました。これらをリファクタリングしていくことでコードの品質が向上すると思います。

(Cognitive Complexityについてはこちらを参照: [Cognitive Complexity で、コードの読みやすさを定量的に計測しよう \- Qiita](https://qiita.com/suzuki_sh/items/824c36b8d53dd2f1efcb) )

## Test Coverageの設定
こちらはCode Climate にテストカバレッジ情報を送信する機能です。そのため、別の方法で予めテストが実行されていてカバレッジが計測されている事が前提です。

今回は [Jest](https://jestjs.io/ja/) で記載されたテストに対して [--coverage オプション](https://jestjs.io/docs/ja/cli#coverage) を使ってカバレッジファイルを出力します。

```json:package.json(抜粋)
"scripts": {
  "test": "jest --coverage"
},
```

こちらのテストを CircleCI で自動実行しておきます。

ここから、 Code Climate Test Coverage の設定に移ります。[Code Climate 公式ドキュメント内にも CircleCI のPHPテストカバレッジレポート設定サンプル](https://docs.codeclimate.com/docs/circle-ci-test-coverage-example)があるので、そちらを参考に今回のJavaScriptプロジェクト用の設定ファイルを記述していきます。

カバレッジレポートの送信には Code Climate の提供する `cc-test-reporter` というツールを使います。こちらを `curl` で取得し、 `./cc-test-reporter after-build` というように使うことでカバレッジレポートを送信できます。今回のJest が出力するカバレッジレポートは `lcov` 形式のため、`--coverage-input-type lcov` を指定します

CircleCI の設定ファイルはこんな感じになります。

```.circleci/config.yml
version: 2
jobs:
  build:
    steps:

      # 中略

      - run:
          name: Setup Code Climate test-reporter
          command: |
            curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
            chmod +x ./cc-test-reporter

      - run:
          name: Run tests
          command: |
            ./cc-test-reporter before-build
            npm test
            ./cc-test-reporter after-build --coverage-input-type lcov --exit-code $?
```

[Code Climate 公式ドキュメント内の CircleCI 設定](https://docs.codeclimate.com/docs/circle-ci-test-coverage-example)では config.yml 内に `CC_TEST_REPORTER_ID` も記述するよう指示されますが、コード内には記載せずCircleCI 側にある環境変数の設定機能を使いましょう。

CircleCI の PROJECT SETTINGS から Environment Variables で設定できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/50391/4e002b12-9a15-97d5-714c-b2ffc2e2f9f4.png)


[Code Climate 公式ドキュメント内で「Test Reporter ID を秘匿する必要はあるか？」という問いに対し「このIDが何らかのデータへのアクセスに使われることはない」](https://docs.codeclimate.com/docs/finding-your-test-coverage-token#section-should-i-keep-my-test-reporter-id-secret)と回答されているので、たとえ雑に扱っても大きな問題は無さそうです。しかし再発行機能が備えられているIDなので、念のため丁寧に扱います。

## 参考
今回設定した結果が下記になります。
https://codeclimate.com/github/s2terminal/i-read-u
Google Cloud Platform (GCP) のアカウント作った

# はじめに

これから Google Kubernetes Engine を使って、Kubernetes の勉強をするために、Google Cloud Platform (GCP) のアカウントを作ってみましたので、その記録です。

# 作り方
早速作ってみます。

[gcp 無料アカウント] とググってみます。
以下の赤枠のサイトを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/0f7131bc-cb41-0e1a-6743-29679fede977.png)

[無料トライアル] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/66bf87e7-bbf4-2fa8-5b86-061eb53c7fcd.png)

以下の 2 箇所にチェックを入れて、[同意して続行] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/fd2c62c6-5910-551b-0052-91c3470bdb2b.png)

すでに Google アカウントでログインしているので、その情報が自動的に反映されました。
ですので、アカウントを分けたい！ということであれば別途 Google アカウントを作成する必要がありますね。
わたしは特に分ける意味もないので同じアカウントを使うことにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/8cc4d50d-8c49-e9a4-0eae-419d3ba7fe48.png)

下にスクロールし、[無料トライアルを開始] を選択します。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/36c9f993-5217-2bd9-93ec-aeedfed1229b.png)

これでアカウント作成完了です！とても簡単ですね。
[OK] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/1c4d8ead-af49-f00e-410d-98af77efc958.png)

ログイン後のダッシュボードは以下のような画面になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/f1f38ee0-d18d-75ed-6949-ae0da38cae03.png)

# おわりに
思ったより簡単でびっくりです。
GCP はまずプロジェクトを作成しないといけないようです。
デフォルトでは、[My First Project] が作成されています。
Azure でいうリソースグループみたいなものなのでしょうか。
これから少しずつ触っていきたいですね。
WhatsApp Clone using React (Hooks+Suspense), GraphQL, Apollo, TypeScript and PostgreSQL はまんま WhatsApp で Redux そこにはいなかった

[Fully functional WhatsApp Clone using React (Hooks+Suspense), GraphQL, Apollo, TypeScript and PostgreSQL](https://medium.com/the-guild/whatsapp-clone-using-react-hooks-suspense-graphql-apollo-typescript-and-postgresql-de1840c27d21) はタイトル通りに React、GraphQL、Apollo、PostgreSQL、TypeScript が使われて、次期の React で期待されています。 Hooks、Suspense も使われている。まだチュートルアルが準備中のようでしたが、この手順でセットアップができました。

WhatsApp-Clone は[GraphQL Module](https://github.com/Urigo/graphql-modules) で機能が分割されて、その中でスキーマやリゾルバが定義されているのは、ドメインの分離ができていてよさそうに思えた。  2019 年の [React](https://github.com/facebook/react) は [Redux](https://github.com/reduxjs/redux) を使わなくなりそうな感じですが、問題に対するアプローチをしていてしています。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/8369/3390bc1a-2563-8a2b-6bcd-9587c304e03a.png)![image.png](https://qiita-image-store.s3.amazonaws.com/0/8369/5ab10fc4-a0e0-41e6-59c8-d839128653df.png)

## Setup

- [WhatsApp-Clone-Server](https://github.com/Urigo/WhatsApp-Clone-server)
- [WhatsApp-Clone-Client](https://github.com/Urigo/WhatsApp-Clone-Client-React)

### Server

- PostgreSQL が必要なので Docker Compose を利用します。 (Docker は便利すぎるチュートリアルでも採用されるかな)

```bash
$ git clone https://github.com/Urigo/WhatsApp-Clone-server.git whatsapp-server-express
$ cd whatsapp-server-express
$ touch docker-compose.yml
$ docker-compose up -d
$ yarn install
$ yarn start --add-sample-data
```

#### Docker Compose のサンプル

- [ormconfig.json](https://github.com/Urigo/WhatsApp-Clone-server/blob/master/ormconfig.json) に PostgreSQL の接続情報が記載されてるので environment に指定します。

```yaml:docker-compose.yml
version: "3"
services:
  postgres:
    image: postgres
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=test
      - POSTGRES_DB=whatsapp
    volumes:
      - postgres:/var/lib/postgresql/data
volumes:
  postgres:
```

### Client

- クライアントは README の通りです。 `http://localhost:3000/` にアクセスするとサインインが表示されます。

```bash
$ git clone https://github.com/Urigo/WhatsApp-Clone-Client-React.git whatsapp-client-react
$ cd whatsapp-client-react
$ yarn install
$ yarn generate
$ yarn start
```

- ユーザネーム と パスワード は [db.ts](https://github.com/Urigo/WhatsApp-Clone-server/blob/master/db.ts) を参照してください。 パスワードはコメントに記載されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8369/effb8870-d806-a332-815f-ace1537813a7.png)

- サンプルデータが登録されているとリストが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8369/c755c882-c4ca-64c1-068e-95d41e2632fd.png)

- 2 種類のブラウザを利用すると一人でチャットが楽しめます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8369/5faf8a03-47a9-f0d7-03e1-0a458e6c4451.png)

## Tutorial TOC

- チュートリアルの目次です。 （これから GraphQL をされるかたも参考になりそうなところがあるかも）

1. Basic Apollo Server
- graphql-code-generator
- Mutations
- Authentication
- Subscriptions
- TypeORM with PostgreSQL
【Blender】レンダー時に綺麗に表示する（あかり）


<font color="Magenta">レンダーの表示で、暗く表示されるのを回避する。</font>
環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Blender v2.79.6
⭐️Mac Book

完成版↓↓↓↓↓
<img width="348" alt="スクリーンショット 2019-02-04 1.02.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/d6c48830-4322-5ece-fbc2-83d43c1f9447.png">


1.Worldのアンビエントオクル-ジョンをチェックONすると、
明るく表示される。

<img width="1277" alt="スクリーンショット 2019-02-04 1.09.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/5bf27dc9-b9ef-666e-626d-a1b469625c5b.png">



２.もっと明るくするには、底面に、放射を設置する
<img width="1199" alt="スクリーンショット 2019-02-04 1.08.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/e56b4055-51fc-41dd-5cdc-954cc124e050.png">
にわかswiftプログラマのなぐり書き

# 背景
iPhone/iPadアプリを開発するためにswiftを使うことになったので、休日を教養のために充てて基本文法から勉強してみた。
ちなみに、普段からメインで使っている言語はC/Java/C#/JavaScriptで、Ruby/Python/Goは触ったことがある程度にしか知らない。Objective-Cについては一切知らない。
今回は同じような状況にあって、即座になんとなくswiftを理解しなければならないような状態に陥ってしまっている人向けの記事を書く。
ガッツリ勉強する人向けの記事ではないのであしからず。

# 開発環境
SwiftはMacOSがなければ開発できないと思っていたが、どうやらそうではないらしい。
昔はC#もそうだった(Windowsという決まったOSでしか開発できなかった)が、今はswiftもオープンソース化してMac以外のOSでも開発できるので焦ってMacを買う必要はない。ただし**iPhone/iPadアプリを開発するには**Macが必要なのは間違いない。
つまり、iPhone/iPadアプリではないアプリをSwiftで開発したいだけならUbuntuでもいい。以下は公式サイトのリリース一覧だが、Linux用のパッケージとインストール手順が記載されている。
https://swift.org/download/#releases

今回は公式サイトの手順に従いUbuntu18.04にインストールした。

```
$ swift --version
Swift version 4.2.1 (swift-4.2.1-RELEASE)
Target: x86_64-unknown-linux-gnu
```

# サンプルコード
基本的な文法が理解できる程度の簡単なコード(定番のfizzbuzz)を書いておく。

```swift
func run(_ start:Int, end:Int)->Void{
    for val in start...end{
        var str : String = ""
        if(val%3==0){
            str += "Fizz"
        }
        if(val%5==0){
            str += "Buzz"
        }
        if str == "" {
            str = String(val)
        }
        print(str)
    }
}
run(1, end:100)
```

# これまでの言語と違うところ
これまで、というのはC/Java/C#/JavaScriptのことだ。自分目線で。とりあえず自分が感じたポイントを列挙しておく。

- ターミネータ `;` が不要
- 変数宣言は`var hoge:String`
- 定数宣言は`let PI = 3.14`
- インクリメント`i++`、デクリメント`i--`が使えない。`i+=1`はできる。
- なので`for`ループも書き方が独特(foreachとbashのブレース展開みたいな書き方を組み合わせる)
    - `for i in 1..<10 { }`
- 文字列の比較は`==`でいい
- ifの条件文の小括弧が不要（あってもいい）
- ifの処理ブロックに中括弧は必要
- `null`ではなく`nil`
- 関数は`func`で宣言する
    - 呼び出し時に実引数に仮引数名のラベルをつけないといけない
    - ラベルを省略するためには仮引数前に`_`をつける
    - 戻り値を２つ以上返すことができる

こんなところだろうか。なんとなくGo言語に近いのだろうか。そんな気がする。インクリメント`i++`ができないのは意外だった。
`class`やOptional型などはまだ使っていないので後報。
Substrateインストールの方法

# まえがき
こんにちは、[ステイク](https://staked.co.jp/)の渡辺創太です。Substrateを勉強し始めました。今回はインストール方法を書きます。

過去のブロックチェーンまとめは[こちら](https://scrapbox.io/StakedTechnologies/)を参照してください。

# Substrateとはなにか？
Substrateは簡単に言うと、ブロックチェーン版のワードプレスです。Ethereumの共同開発者であるGavin Wood率いるParity Technologiesによって開発されています。Gavin曰く、「現在のwebアプリケーションで、HTTPのプロトコル部分まで作る必要がないように、ブロックチェーンでも、ブロックチェーンの部分を０から作る必要がなくなります」とのことです。これは非常に大きなことで、コンセンサスルールやセキュリティの問題など複雑な処理（低レイヤー）を比較的考えることなくブロックチェーンが作れるようになります。Substrateの上にPolkadotも創られているので、チェーン間で相互運用性を持てるのも大きな特徴です。

Polkadotに関しては[こちら](https://speakerdeck.com/sotawatanabe/burotukutienbi-jiao-dex-stablecoin-securitytoken)を参考にしてください。

# Substrateインストール
さて、本題です。Substrateをインストールしましょう！

以下はMacを想定しています。

Macを想定。インストールは楽でこのコマンドで完了します。
`curl https://getsubstrate.io -sSf | bash`

Substrateを動かすためにはRustをいれなければいけなく
OSがOpenSSL 1.0, cmake, C/C++ コンパイラーがあるかどうかを確認しないといけないです！

1行だけだと楽勝なので、実際に上記のコードの処理を書きます。
[Rustのインストール](https://www.rust-lang.org/tools/install)
`curl https://sh.rustup.rs -sSf | sh`
Rustのインストールとマネジメントは`rustup`ツールによってされており以下がインストール方法です。

Rustup: Rust installerとversion management toolのインストール
`curl https://sh.rustup.rs -sSf | sh`
versionのアップデートは`rustup update`で行います。

Cargo: Rust build toolとpackage managerのインストール

仕様
1. build: `cargo build`
2. run: `cargo run` 
3. test: `cargo test`
4. build documentation: `cargo doc`
5. publish a library to [crates.io](https://crates.io/): `cargo publish`

上記の`curl https://sh.rustup.rs -sSf | sh`を実行した時点でcargoはインストールされているいますが、一応`cargo --version`で確認できます。

PATHの設定
全ツールはインストール時には`~/.cargo/bin`にインストールされています。

```
MacBook-Air-7:~ watanabesouta$ which cargo
/Users/watanabesouta/.cargo/bin/cargo
```
といった具合です。

最後に、Substrate command line applicationsのインストールをします。
`cargo install --git https://github.com/paritytech/substrate subkey;`
`cargo install --git https://github.com/paritytech/substrate substrate`

`git clone https://github.com/paritytech/substrate-up;`
`cp -a substrate-up/substrate-* ~/.cargo/bin;`
`rm -rf substrate-up`

バージョンはこちらで確認できます。
`$ substrate --version`


Source: https://www.rust-lang.org/tools/install
バックアップ元と先のテキストを比較するPowerShellスクリプト

毎回似たようなスクリプトを書いている気がするので、
暇なうちにいくつかWeb上に上げておこうと思いました。
今回はバックアップ元と先のテキストを比較するスクリプト。

``` バックアップ元と先のテキストを比較するスクリプト
# 比較結果の格納先
$ResultFile = "C:\temp\CompareResult.txt"

# 比較元ディレクトリー
$ReferenceTarget = "C:\temp\data"

# 比較先ディレクトリー(バックアップ)
$DifferenceTarget = "C:\temp\data_backup"

# 比較元ディレクトリーからファイルごとに処理実施
Get-ChildItem -Recurse -File $ReferenceTarget | ForEach-Object {
    # 比較元ファイル名取得(フルパス)
    $ReferenceFile = $_.FullName
    # 比較先ファイル名取得(フルパス)
    $DifferenceFile = $_.FullName.replace($ReferenceTarget , $DifferenceTarget)

    # 比較先ファイルの存在確認
    if(Test-Path $DifferenceFile) {
        
        # DifferenceFileが存在する場合、両方のデータサイズを取得
        # (後段処理でCompare-Objectを0バイトファイルに仕掛けると叱られるのでやった)
        $ReferenceFileSize = (Get-ChildItem $ReferenceFile).Length
        $DifferenceFileSize = (Get-ChildItem $DifferenceFile).Length

        $CompareResult = ""

        if($ReferenceFileSize -ne "0") {
            if($DifferenceFileSize -ne "0") {
                # 比較元先の両ファイルサイズが0ではない場合、Compare-Objectして結果を取得する
                $CompareResult = Compare-Object -ReferenceObject (Get-Content $ReferenceFile) `
                -DifferenceObject(Get-Content $DifferenceFile) | Format-Table * -AutoSize

                if($CompareResult) {
                    # Compare-Objectの結果に1行以上データがある場合
                    $ReferenceFile + " : " + $DifferenceFile + " : NG" >> $ResultFile
                    $CompareResult >> $ResultFile
                } else {
                    # Compare-Objectの結果に1行もデータが無い場合(ファイルが同一だった場合)
                    $ReferenceFile + " : " + $DifferenceFile + " : OK" >> $ResultFile
                }
            } else {
                # DifferenceFileが0バイトで、ReferenceFileが0バイトではない場合
                $ReferenceFile + " : " + $DifferenceFile + " : NG" >> $ResultFile
                $ReferenceFile + " = " >> $ResultFile
                Get-Content $ReferenceFile >> $ResultFile
            }
        } else {
            if($DifferenceFileSize -ne "0") {
                # ReferenceFileが0バイトで、DifferenceFileが0バイトではない場合
                $ReferenceFile + " : " + $DifferenceFile + " : NG" >> $ResultFile
                $DifferenceFile + " = " >> $ResultFile
                Get-Content $DifferenceFile >> $ResultFile
            } else {
                # 比較元先の両ファイルサイズが0の場合
                $ReferenceFile + " : " + $DifferenceFile + " : OK" >> $ResultFile
            }
        }
    } else {
        # DifferenceFileが存在しない場合
        $ReferenceFile + " : NG(新規ファイル)" >> $ResultFile
    }

}
```
golangでcsvファイルを読み込みたい時

備忘録として

os + encoding/csv モジュールを使う

```foo.go
package main

import (
	"encoding/csv"
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("csvpath")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	reader := csv.NewReader(file)
	var line []string

	for {
		line, err = reader.Read()
		if err != nil {
			break
		}
		fmt.Println(line)
	}
}
```

reader.Read()は呼び出す度に一行ずつ取り出し、列毎に区切られた文字列のスライスを返すメソッド
そして全てのデータを取り出した後に呼び出すとerrorを返す仕組みである。
ここではforを無限ループさせて、errorを返したらbreakしている。
ちなみにerrorを返した場合のもう片方の値は空の文字列スライスになる

追記
エゴサしてたら参考としてこの記事が張られてました。
返すエラーは2種類であり、列が足りてないと別のエラーを吐くので気を付けましょうというお話です。
https://infraya.work/posts/go_csv_read/
MySQLの集約クエリでは非集約カラムを抽出できる

[MySQLでのGROUPBYの処理](https://dev.mysql.com/doc/refman/5.6/ja/group-by-handling.html)

MySQLの場合、集約しているクエリで、非集約カラムをSELECTしても、エラーにならずちゃんとレコードが返ってくるの若干違和感が　あったのでしらべてみたら、MySQLの仕様だということらしい。

また、非集約カラムは検索対象内で同じ値であることが前提、とあるので仮に同じ値ではない場合は不定値になるのかもしれない。
Vscode使い始めた

Vscodeのキーボードショートカットとかいろいろ調べたことをまとめる

<!--more-->

### vscode
[vscode](https://code.visualstudio.com/)

### 画面にかんして

左側：サイドバー  
中央上：エディタ  
下：インテグレイテッドターミナル  
クイックオープン: ファイルを開ける時に使う  
コマンドパレット: vscodeのコマンドを実行する時に使う  

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/kyagyao/40005981443/in/dateposted/" title="vscode-view"><img src="https://farm5.staticflickr.com/4861/40005981443_6e2722183d.jpg" width="500" height="431" alt="vscode-view"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>


### キーボードショートカット一般

|内容|キー|
|:---|:---|
|ショートカット一覧の表示| ⌘K ⌘S|
|クイックオープンを開く(ファイルの検索)|⌘ P|
|コマンドパレットを開く|⌘+shift+P|

### ターミナル操作

|内容|キー|
|:---|:---|
|ターミナルにforcusする(開く,閉じるのtoggle)| ctrl + `|
|新規にターミナルを開き、編集中のファイルディレクトリに移動| ⌘ + shift + o|
|ターミナルのアプリを起動する(itermなど)|⌘+shift+c|


### ウインドウの移動

|内容|キー|
|:---|:---|
|side barへの移動| ⌘ + 0|
|side barを隠す| ⌘ + B|
|エディターへ移動| ⌘ + 1|
|sidebarへ移動し、explorerを開く| ⌘+shift+e |
|explolerのファイルを開く| ⌘ + K 押してから E|
|extensionを開く| ⌘ + shift +x|


### 入れたextension

|extension|内容|
|:---|:---|
|[File Util](https://github.com/sleistner/vscode-fileutils/)|fileのduplicateとかが使えるようになる|
|Numbered Bookmarks|ファイルの行数にマークを付けれて、コマンドパレットから検索できるようにする。|
|GitLens| Git操作 |
|vim| vimのエミュレートをする|
|Paste JSON as CODE| JSONを各言語で利用できる形式に自動変換してくれる。|
|snippets系| 言語、フレームワーク用のsnippetがたくさんあるので適宜入れる | 
|ssh fs | ssh越しにファイルを編集する|

  

### その他便利機能など
peek refarece, rename symbol  
変数を右クリック、peek refarenceをクリックでどこから参照されているのかを探してくれる(別ファイルも)
rename symbolで１つの変数名を変更すると同じ変数名を全て変更してくれる。
  

  
エディター、ターミナル、サイドバーの移動にショートカットキーが割り当ててあって、それを覚えてしまえば大体のところ事足りそう。
普段はvimをつかっているんですが、vimをつかってると設定周りがどんどん複雑になっていってしまってマシンの移動とかが面倒になってたんだけど、
vscodeだとextensionの管理が見えるようになっていてよさげ。 あと、Numbered Bookmarks、ssh fsとか強力なextensionがたくさんある。 [liveshare](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare) ライブでのコード共有(!?)とかもある。しばらく使っていこう。
SQLで任意の単位毎に集約したい

logテーブルなんかで、日付毎に件数出したい時等に。

```sql
SELECT 
DATE_FORMAT(集約対象Col, '%Y%m%d%H'), 
COUNT(*)
FROM 対象テーブル 
GROUP BY DATE_FORMAT(集約対象Col, '%Y%m%d%H');
```

集約単位を変更する場合は、DATE_FORMATのパラメータを変更すればOK。
MessagePackバイナリを自分でデコードして読む

# モチベーション
スマホゲームの通信を読んでいると、MessagePackをデコーダーなしで読めた方が効率が良いことがあるので、読んでいきたいと思います。


# 覚える仕様表
[MessagePackの仕様表は40行くらいあるのですが](https://github.com/msgpack/msgpack/blob/master/spec.md#formats)、一部の型を読むのを諦めると、以下の2つの表にまとめられます。



|最初の8bitが以下のとき|意味|読み方|例|
|:--|:--|:--|:--|
|0,1,2,3,4,5,6,7|0〜127の **正[^1]のInteger**|そのまま| `4F` → 79[^2]|
|8|15要素までの **Map**|9〜16bit目が要素数(n)、<br>それ以降n*2バイトがMapの各要素<br>(Key,Valueの繰り返し)|`81 01 02` → {1: 2}
|9|15要素までの **Array**|9〜16bit目が要素数(n)、<br>それ以降nバイトがArrayの各要素| `91  4F` → [79]|
|a,b|31文字までの **ASCII String**|8〜16bit目が文字列長(n)、<br>それ以降nバイトが文字列の中身| `A2 65 97` → "Aa"|
|e,f|-32〜-1の **負のInteger**|そのまま| `FE` → -2[^2]


[^1]: ここでの 正 は0を含むものとします
[^2]: バイナリは16進表記、デコード後の整数は10進表記をすることにします。

|16bitが以下のとき|意味|
|:--|:--|
|c0|NULL|
|c1|(never used)|
|c2|TRUE|
|c3|FALSE|

**最初がc4〜cf及びdで始まる場合** は、16要素以上のArray/Mapや、Float、バイナリ（⊃ASCII以外の文字列）など、上の表の範囲を超えるデータを表現するために使用します。
スマホゲームの通信を見ていると、上の表の範囲を覚えておけばだいたいのことは読めることが多いため、ここでは上の9行の表のみ覚えることにして、実際の通信を読んでみます。


# 実際に読んでみた

以下は、いま適当に考えた、スマホゲーム通信でよくありそうなダミーのMessagePackバイナリ列です。

```
00000000  83 a2 6f 6b c3 a6 6d 65  74 68 6f 64 a7 4c 65 76  |..ok..method.Lev|
00000010  65 6c 55 70 a6 73 74 61  74 75 73 97 23 37 28 32  |elUp.status.#7(2|
00000020  32 5a cd 01 40                                    |2Z..@|
```

頭から読んでいきます。読んだ途中経過はJSONとして表記していきます。

1. 最初のバイト `83` は3要素Mapであることがわかります。したがって、以降の要素6(=3*2)個分を読み、Map構造と解釈すればよいです。
  - `{?:?, ?:?, ?:?}` 
- 次のバイト `a2` は長さ2のStringです。先程読んだ3要素Mapの最初の要素のKeyはこの長さ2のStringとなります。
  - `{"(長さ2の文字列?)":?, ?:?, ?:?}` 
- 続く2バイト `6f 6b` はASCII文字として読めば良いので、 "ok" となります。これで3要素Mapの1要素目のKeyが確定したので、次のバイトからはその要素のValueとなります。
  - `{"ok":?, ?:?, ?:?}` 
- 次のバイト `c3` はTrueです。これで3要素MapのValueも確定したので、次のバイトからは3要素Mapの2要素目となります。
  - `{"ok":True, ?:?, ?:?}` 
- 以下、2要素目、3要素目のKeyも同様に読んでいきます。すべて文字列で、以下のようになります。
  - `{"ok":True, "method": "LevelUp", "status":?}` 
- 残りの `97 23 37 28 32 5a cd 01 40` のうち、最初の `97` は7要素Arrayです。
  - `{"ok":True, "method": "LevelUp", "status":[(7要素Array?)]}`
- その後の `23`, `37`, `28`, `32` `32` `5a` までは正の整数で、そのまま読めます。
  - `{"ok":True, "method": "LevelUp", "status":[35, 55, 40, 50, 50, 90, ?]}`
- 次の要素は `cd` から始まるため、表の範囲から外れており読めません。どうしても読みたい場合は[大きい方の仕様表](https://github.com/msgpack/msgpack/blob/master/spec.md#formats)を読んで内容を確認しましょう。
  - 確認すると、 `cd` はuint 16型で、後ろ2つのバイトをそのまま数値として読めばよいので、 `cd 01 40` は 320（0x140）となります。これを読むと、7要素Array、トップレベルの3要素Mapが全て読み終わり、以上でデコード終了となります。
  - `{"ok":True, "method": "LevelUp", "status":[35, 55, 40, 50, 50, 90, 320]}`[^4]

[^4]: この"status"は[ピカチュウの種族値](https://yakkun.com/sm/zukan/n25)から持ってきた値です。

# まとめ
スマホゲームの通信を見る目的の多くは、通信の種類（"BattleStart"とか、"GachaResult"とか）や整数値を見るためであることが多いので、案外上の表だけ覚えていれば実用に足ることが多いです[^3]。
また、まともな通信仕様であれば、MapのKey部分は32文字以下のASCII文字であることがほとんどだと思いますので*[要出典]*、知りたいデータの入ってそうなKeyを見つけ、そのValueを大きい方の仕様表を使って読めば、自力でデコードする量を最小限にしてMessagePackを読むことができるかと思います。

[^3]: 実際に読んでみた例のように、正の整数が127からはみ出ることがよくあるので、 128以上の大きな数字を扱うことが多いゲームの通信を見る場合は、 `cc`(uint 8), `cd` (uint16)を追加で覚えていても良いかもしれません。

# 参考

MessagePackの仕様表
https://github.com/msgpack/msgpack/blob/master/spec.md#formats
ダミーバイナリ列を作るのに使ったやつ：
https://github.com/ludocode/msgpack-tools
Adobe Acrobat Proをコマンドプロンプトから使う（Windows）

Acorobat 8.x系と64it対応のX系で使えるものと使い方が違う様子。

注意
Acrobatのコマンドプロンプトを使った利用は、Adobeのサポート対象外になります。
何かあったとしてもfixはされないということです。

## Acrobat 8.x系

PDFをファイル指定して印刷する。
例えばhoge.pdfをデフォルトプリンタでプリントアウトしたい場合は。 

```shell
Acrobat.exe /n /p /h hoge.pdf
```

第二引数にプリンタ名を指定すると。そのプリンタのデフォルト設定でプリントされます。

```shell
Acrobat.exe /n /p /h hoge.pdf printer1
```

引数の説明

| 引数 | 説明 |
|-----|------|
| /n | Acrobatのプロセスを起動する。Acrobatが開いていても、新たにプロセスを立ち上げる。|
| /p | 指定したファイルをプリントアウトする。|
| /h | Acrobatの画面を隠したままプリントアウトができる。らしいですが、僕の環境では、表示されました。|





## Acrobat X系

調査中
AndroidでRSSを楽にパースしたい

Androidアプリを起動したら、RSSを配信しているサイトから値を受け取って表示したい。
そんな時にいいライブラリはないものか、と思ってRSSライブラリを探してみた。
実装して試しつつ、随時追加していく。

# XmlPullParser
ライブラリではないが公式ドキュメントに紹介されている
https://developer.android.com/training/basics/network-ops/xml
RSSを扱うなかで一番の基本

# rss-perser
prof18/RSS-Parser
https://github.com/prof18/RSS-Parser

## star
125
やや少ない

## メモ

WordpressのRSS Feedに対応してる。
Kotlin化に対応していてイケてそうだが、atom feedには対応してない
つまりWorrdpressしか対応してない

## 自分の実装コード
https://github.com/ikemura23/Android-Kotlin-Lab/tree/rss/rss-prser

# android-rss

ahorn/android-rss
https://github.com/ahorn/android-rss

## star数
496
割と多い

## メモ
atom feedなどのRSS2.0feedsには対応している。

## 自分の実装コード
https://github.com/ikemura23/Android-Kotlin-Lab/tree/rss/android-rss
Linux基本のキ

Linuxの特徴から、ディレクトリ構造などの概念について、まとめます。
ページ最下部の参考資料から文章を抜粋し、まとめさせていただいています。

## Linuxの特徴
- オープンソース（※1）であり、誰でも自由に無償で利用できる。
- 品質の高い多くのソフトウェア（WebサーバのApache HTTP Serverや、
データベースシステムのMySQL等）が利用できる。
- 世界中でサーバ用途として広く利用されているため、信頼性が高い。
- 操作を自動化するための仕組みが用意されており、サーバの運用が行いやすい。

※1　オープンソース
オープンソースとは、ソースコードが公開されており、誰もがソースコードにアクセスできるだけでなく、開発に参加できるソフトウェアや、考え方のこと

## Linuxのディストリビューション
 
ディストリビューションとは？
> 流通・分布を意味する言葉で、Linuxの配布形態のこと。本来、Linuxはカーネルのみを指すため、そのままでは動作しない。そのため、ユーザーが手軽にLinuxを利用できるように、OSの動作に必要なライブラリーやソフトウェアなどをまとめたパッケージとして配布されている。また、これらのディストリビューション業者などをディストリビューターと呼ぶ。Linuxの主なディストリビューションとして、Turbolinux、Vine Linux、Red Hat Linux、Debian GNU/Linuxなどがある。（<a link href="https://kotobank.jp/word/%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-6086">コトバンク</a>より引用）

つまり、Linuxを動かすために必要なソフトウェアや、自分の欲しい機能などを自分で一からインストールしなくても、もとからユーザが使いやすいように、よく使うものをまとめてくれたもの（ディストリビューション）をインストールすれば、簡単にLinuxを動かすことができるのです。

### 主なディストリビューション
|ディストリビューション|説明|
|:-:|:-:|
|Ubuntu|無償で、デスクトップ版、サーバ版がある。|
|Red Hat Enterprise Linux|有償で、企業のサーバとして使われている。|
|CentOS|無償で、Red Hat Enterprise Linuxと高い互換性がある。|
|Debian GNU/Linux|無償で、自由なソフトウェアに価値を置く。Ubuntuの大元。|
|Raspbian|Debian GNU/LinuxをRaspberry Pi用に改変したもの。|
|Fedora|無償で先進的な機能を搭載。Red Hat Enter Prise Linuxの実験版的位置づけ。|

ちなみに私は、自宅学習用ではCentOS、会社ではRed Hat EnterPrise Linuxを使用しています。

## Linuxのディレクトリ構造
Linuxでは、ディレクトリがツリー上の階層構造になっています。
ディレクトリの頂点は「/(ルート)」ディレクトリで、
全てのディレクトリ、ファイルは/ディレクトリの中に収められています。

/ディレクトリ直下には、主要なディレクトリが収められており、それぞれのディレクトリには役割があります。
主要なディレクトリは、ディストリビューションごとに異なります。

|ディレクトリ|説明|
|:-:|:-:|
|bin|一般ユーザが実行できる基本コマンドが格納される|
|boot|システムの起動に必要なファイルが格納される|
|dev|各種デバイスを表す特殊ファイルが格納される|
|etc|システム設定ファイルが格納される|
|home|ユーザのホームディレクトリが格納される|
|lib|ライブラリファイルが格納される|
|lost+found|破損したファイルが格納される|
|media|DVDなどの外部メディアがマウントされる|
|proc|プロセス情報が格納される|
|root|rootユーザのホームディレクトリ|
|sbin|システム管理用の基本コマンドが格納される|
|tmp|一時的なファイル置き場|
|usr|各種コマンド、プログラム、ライブラリ、ドキュメントが格納される|
|var|ログファイルなど更新されるファイルが格納される|

## システム起動の流れ
`BIOS/UEFI` → `ブートローダ` → `カーネル` → `init/systemd`

### BIOS
最もハードウェアに近い部分をつかさどるシステムで、物理的なハードウェア（マザーボード）上に書き込まれています。
コンピュータの電源を入れると、まずこのBIOSが起動し、記憶装置（HDD)などに関して最低限の認識をして起動デバイスの優先順位を決定します。
その後、起動する順にデバイスの先頭セクタにあるMBR（ブート用の特殊領域。ブートローダが格納されている場所）を読み込み、得られたブートローダに制御を移します。ブートローダが得られない場合は次のデバイスのMBRを読み込みます。
最近のシステムでは、UEFIへの移行が進んでいます。

### ブートローダ
MBRには厳しいサイズ制限があるため、MBRに格納されている第一段階部分と、記憶装置内の別の場所に格納されている第二段階部分に分かれています。
ブートローダは記憶装置内のカーネルをロードし、カーネルに制御を映す役割を果たします。
第一段階のブートローダはMBRの先頭446バイトの領域にインストールされます。

### カーネル
カーネルは起動されると、高度にハードウェアを認識・制御し、ルートパーティションのマウントなど様々な初期化処理を行います。
その後、initという特別な最初のプロセスを起動します。

### init
最初に起動されるプロセスで、PID（プロセスID）は必ず1です。
「SysVinit」と呼ばれる従来のinitプログラムを採用しているシステムでは、
「/sbin/init」が起動されます。
initプロセスは設定ファイル「/etc/inittab」の記述に基づいて、自動起動するべきプロセスを立ち上げるなど、アプリケーションレベルの初期化を行います。
以降、initプロセスはすべてのプロセスの先祖（直接・間接的な呼び出し元）として存在し続けます。
なお、最近のシステムではinitプログラムとして、初期化処理を高速化したUpstartやsystemdを採用している場合があります。
その場合は基本的に「/etc/inittab」ファイルは使用されません。

##参考資料
・いちばんやさしいLinuxコマンド入門教室　中島能和　著　株式会社ソーテック社
・新しいLinuxの教科書　三宅英明、大角雄介　著　SB　クリエイティブ株式会社
・<a link href="https://ping-t.com/">Ping-t</a>
Laravelのサービスコンテナについて

## サービスコンテナとは？
- Laravelの中のDIコンテナ
- クラスのインスタンスを管理する
- サービスコンテナに登録することでそのクラスをアプリケーションのどこからでも使用することができる

## そもそもDIコンテナとは？
- インスタンスの生成を全て別の場所で一括で管理すること
- 単純なDIだけの場合、引数が鬼のような数になる可能性がある
- 上記を解決するのがDIコンテナ

### DIとDIコンテナは異なる
#### DIとは？
- Dependency Injectionの略
- 依存性の注入と言われるが、オブジェクト注入のこと
- `constructor`で引数を元に外部からオブジェクトを注入すること。普通は、newを使う
- `Interface`を使って外部注入したほうがより変更に強くなる
- `constructor`以外にも`setter`,` method`などから注入する方法も存在する
- DIとDIじゃない場合の比較をした際のDIのメリット
  - `new`しないので、引数のクラスが実装されていなくても動かすことが可能
  - 外部注入したクラスに変更があっても、呼び出し元だけを変更すればよい
- [参考記事](https://qiita.com/ritukiii/items/de30b2d944109521298f)

## サービスコンテナ詳細
### bind/binding（バインド）
- サービスコンテナに対してインスタンスの生成方法を登録すること
- バインドの定義場所はServiceProviderクラス
- バインドの方法種類
  - bind
      - 常に新しいインスタンスを生成
	  - 最も利用される
  - bindif
      - 引数で指定された文字列に対するバインドが存在しない場合のみインスタンスを生成
	  - 既に存在していれば何もしない
  - singleton
      - インスタンスを1つのみにする場合に利用する
	  - 最初インスタンスを生成して、次からはキャッシュされたインスタンスを返す
  - instance
      - 既に生成したインスタンスを返す
	  - `singleton`同様にサービスコンテナにキャッシュされ、生成では同じインスタンスを返す

### resolve/resolving（解決する）
- サービスコンテナが指定されたインスタンスを生成して返すこと
- 解決方法
  - makeメソッド
  - appヘルパ関数
    - 両方同じ挙動で、指定された文字列にバインドされた処理を実行してインスタンスを返す
元号改正時のテストケースについて考えてみたので突っ込みを入れて欲しい

どうも、はるにゃんです。初投稿です。

元号改正、ついに今年に迫ってきました。
わたくしも元号改正チームに
**「テストやって★」**と追加戦士として参戦させられまして、頭を抱える毎日でございます。

そんなわけでソフトウェアテストエンジニア（仮）として昨年12月から勉強を始めていますが、
**弊社にテストエンジニアが存在しない**ため、ここに書いて誰かが素敵な助言を下さることを期待しつつ、
元号改正の対応としてこういうテストをやればいいのかな？というのを考えてみました。

<font color="red">**※ ここに書いたテストケースはあくまでも一例です。網羅性だのなんだのは何も考えていません。
実業務でのご利用は計画的に。**</font>

# まずは想定している仕様
画面上で”元号頭文字+和暦/月/日”で入力をおこなう（例：平成31年2月10日→H31/02/10[^1]）。
[^1]: DB上2020/02/10の日付を画面で表示させると、H02/02/10となる不具合があったけれど、それはまた別のお話。
DB上は西暦で保持しているので、和暦→西暦変換でDBへの登録、西暦→和暦変換で照会をします。
~~和暦でDBに保存してるとかっていう変態システムは想定の範囲外すぎます~~

仮に、新元号を"J:神化[^2]"とします。
[^2]: コンクリート・レボルティオはいいぞ。

# 境界値分析
とりあえずテストの基本、境界値分析です。
平成と神化の境界は2019/04/30と2019/05/01ですので、
入力値としてH31/04/30とJ01/05/01をテストケースに入れるのは当然のお話です。みんなそうする、オレもそうする。

さて、平成の境界線と、神化の境界線を考えると、
平成：1989/01/08～2019/04/30
神化：2019/05/01～2999/12/31[^3]
[^3]: 便宜上こう書いてみました。
となりますので、H31/05/01とJ01/04/30も境界値分析的には必要になるのではないでしょうか。
コレかいてて気付いたんですが、J99/12/31ってどうなるんだろう。気になります！

では、平成と昭和の境界は…どうなんでしょう？
テストケースにくわえる必要ってあるのかしら？

とりあえずここまでで、大体こういうテストケースを作ってみました。

| テストデータ | 期待結果 |
|:-:|:-:|
| H01/01/08  | 1989/01/08 |
| H31/04/30  | 2019/04/30 |
| H31/05/01  |  × |
| J01/04/30  |  × |
| J01/05/01  | 2019/05/01 |
| J99/12/31  | 2117/12/31 |


# 組み合わせテスト
組み合わせテストです。
日付で考えられる組み合わせについては、FromToの検索くらいなのですが、もし他にあったら教えてくださいっ＞＜；

FromがNULLの場合は1900/01/01
ToがNULLの場合は2999/12/31
となる仕様の場合を考えます。

| From | To | 期待結果 |
|:-:|:-:|:-:|
| NULL |  NULL | 1900/01/01～2999/12/31  |
| NULL |  H31/04/30 | 1900/01/01～2019/04/30 |
| H31/04/30  |  NULL | 2019/04/30～2999/12/31  |
| NULL |  J01/05/01 | 1900/01/01～2019/05/01 |
| J01/05/01  |  NULL | 2019/05/01～2999/12/31  |
| H31/04/30 |  J01/05/01 | 2019/04/030～2019/05/01 |
| J01/05/01  |  H31/04/30 | ×  |
| J01/05/01  |  J99/12/31 | 2019/05/01～2177/12/31  |

大体こういう感じでしょうか汗

# やってみた感想
考えるとやってみたくなるものですが、「バグでそうだなこれ」という勘が私に足りてないなという感想。
この程度のテストケースで出てくるバグなら、苦労しなさそうだなって…。
【プログラミング初心者】Django tutorial  -- Part 1--

はじめに
-
個人用のメモ書きです。Djangoの公式ドキュメント「はじめてのDjangoアプリ作成」をもとに作成しています。
環境
-
* PC     ： MacBook Air (13-inch, Early 2014)
* OS     ： macOS Mojave Ver. 10.14.2
* python ： Ver. 3.7
* Django ： Ver. 2.1.5

前提条件
-
Python、Djangoは既にインストール済であることを前提としています。

 完成イメージ
-

ブラウザ上に「Hello, World!」を表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/353909/05078072-49d1-2817-3fcb-9eb3dc1b5ce4.png)

プロジェクトを作成する
-
デモ用にプロジェクトを新規作成します。プロジェクト名は 「sample_project」とします。

``` :コマンドライン
$ django-admin startproject sample_project
```

以下のファイルが生成されます。

```
sample_project/
    manage.py
    sample_project/
        __init__.py
        settings.py
        urls.py
        wsgi.py
```

外側のsample_project/ ルートディレクトリはDjangoに依存しないため、名前は好きなものに変更できます。既に存在するディレクトリにプロジェクトを作成する場合は、プロジェクト名に続いてディレクトリを入力して実行します。

```:コマンドライン
$ django-admin startproject sample_project (任意のディレクトリ)
```

なお、プロジェクト名に 「-（ハイフン）」は使用できません。また、プロジェクト名に限らず、予約語や組み込み関数名と衝突しないよう注意しましょう。

アプリケーションを作成する
-
プロジェクトを作成したら、次はアプリケーションを作成します。アプリケーション名を「app1」とします。

```:コマンドライン
$ python manage.py startapp app1
```

アプリケーションは実際に何らかの処理を行う個別のアプリーケーションを指します。プロジェクトはあるウェブサイト向けに設定とアプリケーションを集めたものです。例えば、販売管理システム（プロジェクト）に対し、売上管理アプリ、在庫管理アプリ、予算管理アプリ(アプリケーション）といった具合です。

ビューを作成する
-
views.pyを開き、以下のpythonコードを書きます。

``` python:app1/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world!")
```

URLconfを作成する
-
先ほど書いたビューを呼ぶために、URLを対応付けします。
まず、app1ディレクトリにurls.pyというファイルを作ります。アプリのディレクトリは以下のようになります。

```
app1/
    __init__.py
    admin.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py
```

作成した **app1/urls.py** に以下のコードを書きます。

```python:app1/urls.py
from django.urls import path

from . import views


urlpatterns = [
    path('', views.index, name='index'),
]
```

次に、作成したアプリのURLconfをプロジェクト側のURLconfに反映させます。
今度は **sample_project/urls.py** に以下を追加します。

```python:sample_project/urls.py
from django.contrib import admin
from django.urls import include, path


urlpatterns = [
    path('app1/', include('app1.urls')),
    path('admin/', admin.site.urls),
]
```

結果
-
コマンドラインで開発用サーバを動かします。

```:コマンドライン
$ python manage.py runserver
```
ブラウザで http://localhost:8000/app1/ にアクセスすると「Hello World!」が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/353909/922bae05-2409-c938-0fdd-44c31b0e778c.png)


おわりに
-
公式により丁寧な説明がありますので、基本はそちらを使って勉強するのがよいと思います。ただ動かすだけであれば、プログラミング未経験者でも迷うポイントはあまりないと思います。
個人的引っかかりポイントは、プロジェクトとアプリケーションの区別（どのような単位でアプリケーションを作ればよいか？）とそれぞれの名前の付け方でした。
jQuery.one()で同じDOMに複数イベント貼った場合の挙動

```js
(function (global, $) {

    $(function() {
        
        function _setEvent() {
            $('#one').one('click', function() {
               console.log('one!'); 
            });            
        }
         
        _setEvent();
        _setEvent();
    });
    
}(window, jQuery));
```

```html
<p id='one'>one</p>

<style>
    #one {
        width: 100px;
        background: #ddd;
        height: 100px;        
    }
</style>
```

ためしたところ、n回イベント貼ったら、n回イベント貼られるようです。
上の例だと、#oneには２回分のone()イベントが貼られていて、２回クリックすると２個コンソール出力され、それ以降はイベント発火しなくなる
という挙動になりました。

なんかてっきりoneでイベント貼れば一度しか発火しないと思ってました。
ロジック上、イベントを貼り直す必要がある場合、一度off()でイベント解除してからon()する必要があるようです。
D3.jsで棒グラフを描く


昔少し利用したが、すっかり使い方を忘れていたので復習がてらのメモ

## インタラクティブな横棒グラフの描画

![d3-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/215058/482a25c3-19d3-cd05-d128-af0121930d8d.gif)

HTML部分

```html
<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <title>グラフ</title>
        <!-- D3.jsの読み込み -->
        <script src="https://d3js.org/d3.v5.min.js"></script>        
    </head>
    <body>
        <!-- グラフ描画するエリア -->
        <svg id="graphArea"></svg>

        <!-- グラフ描画するjs -->
        <script src="js/myGraph.js"></script>
        
    </body>
</html>
```
Javascript部分

```javascript

// データセット
const dataSet = [100, 200, 20, 45, 300];
//グラフを描画
drawGraph(dataSet);

function drawGraph(dataSet) {
    const maxValue = Math.max(...dataSet);

    const OriginAttr = {
        fill: "rgba(255, 0, 0, 0)"
    };

    d3.select("#graphArea")
        .selectAll("rect")                                                    // 対象要素の設定
        .data(dataSet)                                                        // データセットを設定
        .enter()                                                              // データ数に応じて要素を追加
        .append("rect")                                                       // 四角形のSVGを作成
        .attr("x", 0)                                                         // X座標(始点)
        .attr("y", (d, i) => {return i * 25;})                                // Y座標(各データセットの描画位置)
        .attr("width", (d, i) => {return `${d}px`; })                         // 横棒グラフの横幅(X座標の終点)
        .attr("height", "20px")                                               // 横棒グラフの縦幅
        .attr("fill", (d, i) => {return `rgba(255, 0, 0, ${d/maxValue})`;})   // 棒グラフの色
        .on("mouseover", function() {
            OriginAttr.fill = this.attributes.fill.value;                     // 変更前の状態を記憶                  
            d3.select(this) 
                .attr("fill", "blue");                                        // クリックされたグラフの色を変更
        })
        .on("mouseout", function() {
            d3.select(this)
                .attr("fill", OriginAttr.fill);                              // 変更前の状態に戻す
        });
        
}

```
初心者がダメにならないアプリを作る道③ガンガン削る、そしてドッグフーディング

前回と前々回はこちら。
- [初心者が『だめにならないアプリ』を作る道①](https://qiita.com/interestor/items/1fc2387ab2f89c58c990)

- [初心者が『だめにならないアプリ』を作る道①] (https://qiita.com/interestor/items/8cdcb3bbaf7a7c07b378)

#現状
https://nomoredame.firebaseapp.com/home.html

# 使うことを優先してメイン機能をブラッシュアップし他を削る

まぁ当初想定していた機能には全然足りていないのですが、作っているうちに「やっぱり大事なのメインの機能とコンテンツでありその他はクリティカルではない」と思い始め、そして「メイン以外の部分データベースとかいって作るの難しい…」となったので、メインの部分をよくして、思い切って他の部分は削った。
今の時点で作り込むよりは、何が必要なのかを明らかにする方が筋が良さそう。

- 追加した部分
 - ボタンを押した後のUIをボタンの色が変わる→メッセージ付きのモーダルウィンドウに変更
 - コンテンツ（行動の種類）の追加
  - コンテンツのデータはデータベースにおくのが理想だが、ちょっと難しかったのでコード内にベタがきしている 
- 削った部分
 - コンテンツをユーザーが編集・追加する機能
 - 通知機能 
 - それに従ってナビゲーションバーも削った

どれも表側は作っていたのでもったいない気持ちはあったが、削ったことで全体としての完成度は上がった。

#今後
- JavaScriptの基礎文法進める
- しばらく実際に使う&使ってみた上で機能を考え直す
- 通知機能の実装方法について調査
QiitaにはてなブックマークとPocketボタンを設置するためのスクリプトを作成してみた

Qiitaの記事にもはてなブックマークとPocketのボタンが欲しいですよね。
そこで、それらのボタンと同じ機能を持つリンクを生成するためのJavaScriptスクリプトを書きました。
Qiitaの記事編集画面で開発者用ツールを開き、以下のJavaScriptをコピペして実行して下さい。
実行すると結果がクリップボードにコピーされます。

Chromeコンソールバージョン

```javascript:snippet.js
const userId = Qiita.user.url_name
const itemId = window.location.href.split('/').splice(-2,1)[0]
const hatebuURL = `//b.hatena.ne.jp/add?mode=confirm&url=https://qiita.com/${userId}/items/${itemId}`
const pocketURL = `//getpocket.com/edit?url=https://qiita.com/${userId}/items/${itemId}`
const  htmlToElement = (html)=> {
  var template = document.createElement('template');
  html = html.trim(); // Never return a text node of whitespace as the result
  template.innerHTML = html;
  return template.content.firstChild;
}
copy(`## はてなブックマーク・Pocketはこちらから
[はてなブックマークに追加](${hatebuURL})
[Pocketに追加](${pocketURL})`)
alert('コピーしました。')
```

全ブラウザ対応バージョン

```javascript:snippet.js
const userId = Qiita.user.url_name
const itemId = window.location.href.split('/').splice(-2,1)[0]
const hatebuURL = `//b.hatena.ne.jp/add?mode=confirm&url=https://qiita.com/${userId}/items/${itemId}`
const pocketURL = `//getpocket.com/edit?url=https://qiita.com/${userId}/items/${itemId}`
const  htmlToElement = (html)=> {
  var template = document.createElement('template');
  html = html.trim(); // Never return a text node of whitespace as the result
  template.innerHTML = html;
  return template.content.firstChild;
}
const copyToClipboard = str => {
    if(!str || typeof(str) != "string") {
      return "";
    }
    //elmはtextareaノード
    var elm =htmlToElement("<textarea id=\"tmp_copy\" style=\"position:fixed;right:100vw;font-size:16px;\" readonly=\"readonly\">" + str + "</textarea>")
    //strを含んだtextareaをbodyタグの末尾に設置
    document.body.appendChild(elm);
    //select()でtextarea内の文字を選択
    elm.select();
    //rangeでtextarea内の文字を選択
    var range = document.createRange();
    range.selectNodeContents(elm);
    var sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);
    elm.setSelectionRange(0, 999999);
    //execCommandを実施
    document.execCommand("copy");
    //textareaを削除
    document.body.removeChild(elm);
  };

copyToClipboard(`## はてなブックマーク・Pocketはこちらから
[はてなブックマークに追加](${hatebuURL})
[Pocketに追加](${pocketURL})`)
alert('コピーしました。')
```
コピーされた内容をQiitaのエディターの一番下に貼り付けて下さい。
このようになります。
## はてなブックマーク・Pocketはこちらから
[はてなブックマークに追加](//b.hatena.ne.jp/add?mode=confirm&url=https://qiita.com/ToshioAkaneya/items/44eb377f27f55e21e626)
[Pocketに追加](//getpocket.com/edit?url=https://qiita.com/ToshioAkaneya/items/44eb377f27f55e21e626)

##　最後に
いかがでしたか？
どなたかこのコードを元にしてChrome拡張を作って頂けると泣いて喜びます。
さて、今後はこのリンクを記事の一番下に掲載しておくことにします。ありがとうございました。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
PowerShellでプログラムの出力の末尾の改行の有無を目で判断できるようにする方法(誰得)

タイトルの語彙力からも察せるように誰得です。
ただ、少なくとも僕自身コレができないことでかなり困ったことがあったので、もしかすると世の1億2000万人のプログラマの内の誰かも僕と同じように困っているのかも...?ということで書きました。

**僕自身PowerShellの知識は全くなく、ほかにももっと合理的な方法はあると思うので、この記事はあくまで応急処置として使ってください。**

# 概要

例えばC++のこんなコードがあるとする(一部省略)。

```cpp
int main(){
    printf("Hello\n"); // 出力。 "\n"は改行
}
```

これをPowerShell上で(当記事ではコマンドプロンプトの要領で使うとする)コンパイル・実行すると

```console
PS C:\...\Codes> g++ -o  test.exe test.cpp ; ./test.exe
Hello
PS C:\...\Codes>
```
ここまでは自明。
一方、ここにまたコードがある。

```cpp
int main(){
    printf("Hello"); // "\n"　を抜いた
}
```

これをコンパイル・実行すると...

```console
PS C:\...\Codes> g++ -o  test.exe test.cpp ; ./test.exe
Hello
PS C:\...\Codes>
```

...あれ？改行されている。
文字列は違うはずなのに、出力は同じである。

困った！
というわけで

# 解決方法

この解決は、ひとまず「後者の改行を消す」よりも「前者の改行を増やす」をする。


**仕組みは簡単、コンパイル・実行と同時にもう一度(プログラムとは別に)改行をさせればOK。
というわけで、コマンドの末尾に`""`を追加してみる。**


前者のコードでは

```console
PS C:\...\Codes> g++ -o  test.exe test.cpp ; ./test.exe ; ""
Hello

PS C:\...\Codes>
```

案の定改行が増えている。一方後者だと

```console
PS C:\...\Codes> g++ -o  test.exe test.cpp ; ./test.exe ; ""
Hello
PS C:\...\Codes>
```

改行が増えていない！

これで2つを区別できるようになった。やったね！
AWS Solution Architect - Associate (SAA) を取得するまでにやったお勉強のお話

# はじめに
はじめまして、spinrockと申します。
AWS SAAを取得したので、そこまでにやった資格勉強と所感をまとめました。

# AWS Solution Architect - Associateとは
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
こちらを参照のこと。

# 事前知識
+ AWSの実務経験は皆無
+ AWSサービスは最低限触った程度(数ヶ月)
  + EC2/S3/Lambdaを少し触ったことがある、程度(それ以外は皆無)

# 勉強開始〜合格までの期間
約1ヶ月ほど
(2週間ほど勉強した後に1度受験して落ちています)

# 勉強資料
+ 参考書
  + 「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」
  +  ホワイトペーパー(PDF)「アマゾン　ウェブ　サービスの概要」
+ 問題集
  + 「AWS WEB問題集で学習しよう」(https://aws.koiwaclub.com/)  
  たくさん問題を解くために有料会員になった(4,000円/2ヶ月) 
+ 模擬試験
  + 2,000円/回

# 勉強の流れ
1. 参考書を1冊読みきりました。  
(試験でメインで出題される、コンピュート/ストレージ/NW系をざっくり網羅しました)
2. 問題集を解きました。  
(400/800問ほど解いたところで1度目の受験日となりました)
3. 模擬試験の受験  
結果：85%くらい取れたので調子にのる  
間違えた問題がわからないので全問復習した。
4. 受験(1度目)  
結果：不合格 (20点ほど足りませんでした。。。)  
敗因：AWSのサービス群をきちんと理解していなかった。。。  
　　　(1.の参考書で出てこなかったAWSサービスの用途が全くわからなかった)
5. 問題集の残りを解く。  
(800問解き終えて、2周目を解いていました)
6. ホワイトペーパーを読む。  
敗因の対策。  
AWSのサービスがどういった用途のサービスなのかざっくり把握する。
7. 受験(2度目)  
結果：合格！！

# 試験で感じたこと
1. (個人的には)模擬試験の結果はあまりあてになりませんでした。  
問題の雰囲気は近かったが、難易度は低めで出題範囲が限られていたため
2. ホワイトペーパーは早めに読んでおくべきだった。
Danger JS の Typetalk 通知プラグインを作った話

## 概要

Danger JS の Typetalk 通知プラグイン [danger-plugin-typetalk](https://www.npmjs.com/package/danger-plugin-typetalk) を作ったので紹介する記事です。

## 前提知識

Typetalk って何？という方は [こちら](https://www.typetalk.com)

## Danger JS とは？

https://danger.systems/js/
> Danger runs during your CI process, and gives teams the chance to automate common code review chores.

プルリクのコードレビューでよくある指摘 (console.log 残ってるよ！とか）を自動チェックするためのツールです。 `dangerfile.js` というチェック内容を定義したファイルを作成して使用します。今回は Typetalk へ通知を送るためのプラグインを作ったので基本的な使い方をご紹介します。

## 手順

1) Typetalk のボットを作成します。

<img width="1088" alt="Screen Shot 2019-02-03 at 22.56.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/27079/8e279057-ab81-3e72-8ede-b25e30e3974f.png">

*メッセージ投稿が必要なので、 `topic.post` にチェックをつけます。*

2) サンプル用のリポジトリをダウンロードします。

```shell
$ git clone git@github.com:is2ei/danger-plugin-typetalk-test.git
$ cd danger-plugin-typetalk-test
```

3) パッケージをインストールします。

```shell
$ npm install
```

4) ボットのトークンと、ボットを作成したトピックの ID を環境変数に設定します。

```shell
$ export TYPETALK_TOPIC_ID=xxxxx # トピックの ID を入力してください。
$ export TYPETALK_TOKEN=xxxxxxxxx # ボットのトークンを入力してください。
```

5) Danger JS を実行します。

```shell
$ npm run danger-local
```

6) Typetalk にメッセージが投稿されます。

<img width="1068" alt="Screen Shot 2019-02-03 at 23.02.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/27079/3260e295-6eb4-3fed-9256-165b666280f8.png">

手順は以上となります。いかがだったでしょうか。フィードバック歓迎です :pray:
Google colab で RubyからGPU を使って行列計算する

Google Colab に Cumo/NArray をインストールすることで、Google Colab上でRubyでGPUを用いた高速計算ができることがわかったのでメモを残します。

## Google Colaboratory とは
[Google Colaboratory](https://colab.research.google.com) はクラウドで実行できる無料のJupyter環境です。カスタムでインストールすることでJupyterカーネルがあるさまざまな言語を動かすことができると思われる。少なくともRubyは動く。

## [Cumo](https://github.com/sonots/cumo) とは
Pythonだと[Cupy](https://github.com/cupy/cupy)に相当するものです。Rubyには[Numo/NArray](https://github.com/ruby-numo/numo-narray)という、Numpyとほぼ同等の機能をもつ数値計算ライブラリがあります。CumoはこのNArray互換のインターフェースをCUDAで動かせるライブラリです。

## Google Colab のランタイムのGPUを有効にする
一番最初にGPUを有効にします。あとからGPUを有効にするとランタイムの環境がリセットされてしまうので、注意してください。GPUが有効でないランタイムにいくらRubyやライブラリを正常にインストールしても、GPU有効のランタイムでは動きませんし、その逆もしかりです。google colabはランタイム再起動や、時間切れで再起動した際に知らずに設定が切り替わってることがあり、ハマりやすいです。動かなくなったらまずこれを疑ってもいいかも知れません。

## Google ColabでRubyを動かす
[Google Colab で Rubyを動かしてみた](https://qiita.com/kojix2/items/64f14e3487e3d957d4e5) を参考にGoogle ColabでRubyを動かせるようにします。

## Cumo/NArray のインストール
Google Colab は2019年1月の時点で、CUDA9.2を使用しており、Cumo/NArray の公式READMEの指示通りでインストールされます。ただし、環境変数は1行ごとにクリアされているっぽいので、マジックコマンドは長々と続けて書く必要があるようです。もっといいやり方があったら教えてください。また、IRuby上ではマジックコマンドは動きませんのでRubyとは別にPythonノートブックを立ち上げて下記のコマンドは実行しています。コマンドが実行されたら、IRubyのランタイムを起動し直すとcumoがrequrieできるようになっているはずです。

（cumoのインストールには合計10分ぐらい時間がかかります）

```jupyter
!export CUDA_PATH="/usr/local/cuda" && export CPATH="$CUDA_PATH/include:$CPATH" && export LD_LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LD_LIBRARY_PATH" && export PATH="$CUDA_PATH/bin:$PATH" && export LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LIBRARY_PATH" && gem install cumo
```

上記でインストールされますが、ちゃんとCumoの機能が動くか確認したい場合、コンパイルに失敗してエラーが見たい場合は、下記のような感じにしてメッセージを表示させながらのコンパイルや、テストを実行することもできるようです。

```jupyter
!gem install bundler
!git clone https://github.com/sonots/cumo
!export CUDA_PATH="/usr/local/cuda" && export CPATH="$CUDA_PATH/include:$CPATH" && export LD_LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LD_LIBRARY_PATH" && export PATH="$CUDA_PATH/bin:$PATH" && export LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LIBRARY_PATH" && cd cumo && rake compile && rake test
```

## 補足
これでどこからでも無料でRubyからGPUで使うことができて個人的には満足です。ただし手元のコンピュータでは実行できたスクリプトもGoogle Colab上ではエラーが出る場合もあり、もう少し使ってみないと色々わからない面もあります。
olとULを使い分けましょう

#始めに
なぜ書こうと思ったのか。
それは、デザイナーさんやバックエンドチームのHTMLコード見たら、この要素の使い分けしていなかったというのがきっかけです。

この2つの要素は意味も異なります。
また、何よりコードだけで「どのようなリスト」なのかが一目で分かります。
なにより、「1,*** 2,*** 3,***」 のように、わざわざ数字を書く必要もなくなります。[^1]


#どう違う？
##ol
`ol`は、箇条書きと異なり**順番**が意味をもつリストです。
意図的に順番付けをしたいリストに使います。

個人的には、
・手順
・単純な順位に関する事（1位、2位、3位・・・）
・優先度で順位をつけたい事（優先度1、優先度2・・・）
等に使っています。

###例
```HTML
<h1>車の発進方法</h1>
<ol>
  <li>ブレーキを踏みます</li>
  <li>エンジンをかけます</li>
  <li>ギヤをドライブに入れます</li>
  <li>サイドブレーキを解除します</li>
  <li>ゆっくりブレーキをリリースします</li>
  <li>アクセルをゆっくり開けます</li>
</ol>
```
##ul
項目の順序なしのリストに使用します。
ごく普通の箇条書きに使用しています。

###例
```HTML
<h1>車の標準装備</h1>
<ul>
  <li>カーナビ</li>
  <li>オートエアコン</li>
  <li>遮熱/UVカットガラス</li>
  <li>レザーシート</li>
</ul>
```
---
その時表示させたいリストに、少しでも順番に意味があると思ったら`ol`を使用する、順番は不要な場合は「`ul`」としておくと大きな間違いはないかと思います。
その他、何かの定義（用語など）の場合は**説明リスト**（`dl`）を使ってください。


#参考
https://developer.mozilla.org/ja/docs/Web/HTML/Element/ol
https://developer.mozilla.org/ja/docs/Web/HTML/Element/ul


[^1]: 表示されない場合は、`list-style-type`等でstyleがあたっています）
ブラウザ上でオプション理論価格計算＆複合ポジのグラフ描画

#簡単な使い方
1. ブラウザで⇒アクセス　[Gooogle colabo のページ](https://colab.research.google.com/gist/zaq9/2fae2ab5a573f1b63fe3f6688db45c8a/example_portfolio.ipynb)
2. （パラメータ変更して）実行ボタンを押す

![bata.JPG](https://qiita-image-store.s3.amazonaws.com/0/351020/817baf12-5c1e-6313-0e6c-fa246a7db796.jpeg)

----------
##パラメータ変更例1：

```python

#　３月限ショートストラングル
p = Portfolio(
"""
	03/C21000[-1]
	03/P20000[-1]
""")

#マーケット情報設定書式
#setting(原資産価格, IV(％）, 日付【yyyymmdd】)   
setting(20250, 25, 20190204)    


```





##内部の概略
Quantlibからよく使われるブラックショールズ式を簡単に呼び出せるラッパークラスを作成。


##インストールする場合

```python

pip install simple_option

```

##主なクラス
Portfolio
Option
Payoff

###クラス利用例：

```py

Example1
---------
from simpleOption import *
#Simple Example
o = Option('02/P20500')
op_price = o.v(20625, 20.8, 20190124)
print(f"{o}@{op_price:.2f}  (nk=20625,IV=20.8%)  jan24 ")
OUTPUT 1
---------
02/P20500@285.49  (nk=20625,IV=20.8%)  jan24
Example2
---------
#underlying change: 20625 >>20500
op_price2 = o.v(20500)
print(f"{o}@{op_price2:.2f} (nk=20500,IV=20.8%)  jan24")
OUTPUT 2
---------
02/P20500@285.49  (nk=20625,IV=20.8%)  jan24
Example3
---------
#underlying & IV change: 20625>>20000 &IV=25%
op_price3 = o.v(20000, 25)
print(f"{o}@{op_price3:.2f} (nk=20000,IV=25%)  jan24")
OUTPUT 3
---------
02/P20500@703.62 (nk=20000,IV=25%)  jan24
Example4
---------
#use keyword
op = Option('02/P20500')
op_price4 = op(
    underlying=20250,
    iv=25,
    evaluationDate=20190122
)
"""


```
Unity+Firebase RealTimeDatabase Editor上で環境によっては突然接続できなくなる

#経緯
コワーキングスペース的な所でドヤリングしながら、Unity+FirebaseRealtimeDatabaseでゲーム作ろうとしたら

```
「[Error] WebSocket: ws_0 - could not connect」
「[Error] WebSocket: ws_0 - WebSocketException during handshake
Firebase.Database.Internal.TubeSock.WebSocketException: unknown host: ****.firebaseio.com ---> System.Net.Sockets.SocketException: No route to host」
```
みたいに怒られてなんで？となったので記録しときます

#結論
>Realtime Database connection is flakey on desktop
https://github.com/firebase/quickstart-unity/issues/106#issuecomment-426835393

desktop上(Unity Editor)だとネット環境によっては上手く接続できない事があるみたいです。

対策は以下
*利用している環境を変える(違うwifiやネット環境を利用する)
*「Firebase/Plugins/FirebaseDatabase.dll」をEditor上で有効にする(但し動作が不安定)

##再現環境
MacBook Pro (15-inch, 2017)
OS:10.13.6（17G5019) High Sierra
Unity: 2018.3.0f2
Scripting Runtime Version: .NET 4.x Equivalent

##まずそもそも読み書き権限つけ忘れてないか確認
RealtimeDatabaseはルールを設定して読み書きの権限を設定できます。
うっかり

```
{
  "rules": {
    ".read": false,
    ".write": "auth != null && auth.isAdmin == true"
  }
}
```
なんてしてたら当然読み込みできません。(自分はうっかりしてたけど・・・)
ちなみにその場合はこういう警告がEditorのコンソールに出力されます。

```
[Warn] SyncTree: Listen at /******* failed: DatabaseError: Permission denied
UnityEngine.Debug:LogWarning(Object)
```

##権限ちゃんとついてるのに何故かエラーになるんだけど・・・
で、うっかり権限を修正した後に冒頭のエラーに出くわして、なんでえええええっとなってたわけでした。
ネットの海を泳いで、結論のページにたどり着きました。

実際にやって見た所

1.ポケットwifiを持っていたので、コワーキングスペースのwifiからそちらを利用するように切り替えるとちゃんと応答返ってきてデータ取れました。
→お家に帰った後に有線、無線両方の環境で再度確認した所両方データ取れました。
　ピンポイントでハズレ引いたみたい・・・

2.コワーキングスペースのwifiに戻して、「Firebase/Plugins/FirebaseDatabase.dll」をEditor上で有効にしたら同様にデータ取れました
　→Import時に特に設定を変更していない場合「Assets/Firebase/Plugins/FirebaseDatabase.dll」に対象のファイルがいます。

<img width="1395" alt="スクリーンショット 2019-02-03 19.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/90558/134aac05-8daf-58a2-bc30-96b2a89dd452.png">

**但しissueに記載の通り動作は不安定で、時々UnityEditor毎落ちます**
>However, if you have to use it, you should expect the instability. This is why it is disabled for Editor by default.
>
↓↓↓Google 翻訳
しかし、あなたがそれを使わなければならないなら、あなたは不安定さを期待するべきです。エディターではデフォルトで無効になっているのはこのためです。

###感想
もし、制作する側の立場の場合、こういう環境に依存するようなやつが一番めんどくさいだろうなとは思います。
そもそもFirestore使えと言われたら、ハイ、スイマセンって感じですが・・・

###参考
https://stackoverflow.com/questions/50651865/unityfirebase-databaseerror-websocket-ws-0-could-not-connect
https://github.com/firebase/quickstart-unity/issues/106#issuecomment-426835393