OmniAICreator/Qiita-1.07M huggingface dataset:
GLAMハッカソン参加記録

９月の連休に国会図書館が主催するＧＬＡＭ活用ハッカソンに参加してきました。

#はじめに

###ＧＬＡＭデータとは？
**美術館(GALLERIES)**・**図書館(LIBRARY)**・**アーカイブス（ARCHIVES）**・**博物館（MUSEUM）**の頭文字から名付けられた博物館・美術館・史料館などに帰属する収蔵品や収集している典籍、巻物、その他の電子データの集合体です。
最近発表された[ジャパンサーチ](https://jpsearch.go.jp/)に色々と載っているので興味があれば見てみてください。

###参加しようと思ったきっかけ
大学・大学院で史学を専攻し、学芸員資格も取得している自分が博物館や施設に貢献するために「歴史と文化財の保存や利活用に関係するウェブサービスかコンテンツ作成がしたい」という将来的なビジョンを持っています。いくつか作りたいものはあるので動き始めたらまた何らかの記事にしたいです。（今の仕事は歴史と文化財には関係ないです）

ウェブアーキビストの資格もとりたいけど日にちが合わなくてとれないまま数年経ち、そろそろアラウンドがあがる年齢なのでさすがに何か今年はやりたいなーという気持ちでいたときに知ったのが国会図書館が主催する[GLAMデータを使い尽くそうハッカソン](https://lab.ndl.go.jp/cms/hack2019)でした。まさにこれは私がしたいことなのでは？と一瞬で確信し、スケジュールを調整。
コーディングもできなくはないけど人がいるところで高速のコーディングができる凄腕コーダーじゃないので、知識と経験が活かせる企画担当として参加申し込みをしました。

###チームビルディング
最初はチームを作るところから。案内されたテーブルにいた人たちと会話をしながら、チームを作る作業をしました。
座ったテーブルにいたのは8人。年齢層も雰囲気もバラバラで一体どんなチームになるのか？と思いながらまずは自己紹介。人となりがなんとなく分かったところでどんなものを作っていくかの話し合いになりました。

- 地図を活用したい
- 能動的に情報を得られるものを作りたい
- Wikipediaなどを活用したい
- GLAMデータの可能性を知りたい

など、概ね方向性が似たアイデアが出た中、「バーチャル東海道五十三次」と言った私、だいぶ浮いてました。
後々聞いた話だと「地図でなんかしたいって人たちを最初に集めたテーブル」だったそうです。納得。

####バーチャル東海道五十三次
GLAMデータを色々見ているときに浮世絵データベースが連携していることを発見。地図と組み合わせることで東海道五十三次を歩く、みたいなアプリができたら面白いのでは？そうだ、古地図と組み合わせてまるで江戸時代の旅人みたいに歩いて東海道をたどれるアプリを作ろう！となり、参加要項にいそいそと記入しました。

###アイデア出し
ほぼ似たような意見だったので私の出した「バーチャル東海道五十三次」を軸に肉付け。

- 場所：東海道の宿場町の中のどこか。結果的に資料の集めやすさを考えて日本橋・品川に決定。
- コンセプト：ブラ●モリができるアプリ（やりたいことを突き詰めた結果あの番組だねって意見でまとまったので）

実際に使ったホワイトボード。
![DSC_0002_4_p.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238459/8524c819-b6b1-20cb-3e63-7d37852a7067.jpeg)

こんな形でアイデアがまとまり、制作開始。

###やること

- UIづくり　スマホとかタブレットで見られるようなウェブアプリ、という方針だったのでUI班にUIはお任せ。
- 地図のマッピング　古地図と現在の地図を照らし合わせて表示するためにめぼしい建物の座標を地図へと落とし込む作業。
- データ探し　地図に載せられる文物のデータ探し。資料や写真など様々なデータを検索して収集。
- シナリオ作り　マップを表示する際にシナリオに沿って表示しよう、となったためシナリオを作る。当時の文化や街の様子などからアバターを作り、シナリオを作成。

###制作
あとはひたすら黙々と2日間制作を続けました。ちなみに私はシナリオ班。
シナリオ作りは「どんな人の視点に立つか」「その街で何をするか」を考えながら作ったので、
だいぶ個性が出るものに。町娘に色々な設定を作ってしまい普段している趣味の片鱗が見えた気がします。ご容赦を。

###使った技術
[Map warper](https://mapwarper.h-gis.jp/)


###完成品
完成後の権利はフリーとしたので掲載します。
[ぶら広重](https://zerobase.github.io/burahiroshige/dist/#/)
名前の由来は東海道五十三次の作者から。まさか私が最初に言い出した東海道五十三次の名残が最後まで残るとは思いませんでした。
[NDLラボに掲載されたスライド](https://lab.ndl.go.jp/cms/sites/default/files/burahiroshige.pdf)

###感想
２日間という短い期間でしたが、プロトタイプまでできたのは嬉しかったです。チーム全員社会人で一丸となって進めた様子はまさにPJでした。楽しかった。
また今後このアイデアを活用したなにかを作れたらいいなーと思いつつ解散。これからは国会図書館やジャパンナレッジ関連の講座には積極的に関わりたいです。


同じチームの方が書かれた記事があったのでリンクしておきます。
[「GLAMデータを使い尽くそうハッカソン」に行ってきた]
(https://qiita.com/higa4/items/33213a50f359dd13c532)
dein.vim導入方法で少しハマったこと

vimを使い始めたばかりで、
パッケージマネージャのdein.vim導入にすこしハマったので、みなさんのヒントになればと思います。

いろいろなパッケージマネージャがあるらしいのですが、
私は、dein.vimを導入しました。あまり意味はありません。

# 導入
公式ページ　https://github.com/Shougo/dein.vim

上記公式ページのREADME.mdを参考に導入します。

### 事前準備 
- git bashで作業します。  
bashターミナルが利用できれば、何でもよいです。  
- ログインしているユーザ配下に、".cache/dein"フォルダを作成  
ぶっちゃけ、どこでもいいですが、今後のためにdein.vim用に作成してください。

```bash
mkdir -p ~/.cache/dein
```

### インストールスクリプトダウンロード
- dein.vimをインストールするためのシェルスクリプトをDL

```bash
cd ~/.cache/dein
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
```

- curlが実行できない場合、以下を参考にしてください。  
https://akamist.com/blog/archives/1273

### インストール
- インストールシェルスクリプトを実行

```bash
sh ./installer.sh ~/.cache/dein
```

インストールスクリプトで出力された
"dein Scripts-----------------------------
から
"End dein Scripts-------------------------  
までをコピーせずに、公式の "2.Edit your .vimrc like this." を.vimrcに貼り付けてください。

理由は、シェルスクリプトで作成された文字列は、
windowsPCであっても以下のように出力されてしまうので
/c/Users/は見つからず、vim起動時、dein.vimを読み込めず、"未知の関数です"と言われてしまいます。

```bash
set runtimepath+=/c/Users/2616e/.cache/dein/repos/github.com/Shougo/dein.vim
```

vimが読み込んでいる.vimrcはvimを起動し以下コマンドを実行すれば、わかります。

```bash
:echo $MYVIMRC
```

- 最後にvimを起動し、以下コマンドを入力

```bash
:call dein#install()
```

以上でインストールは、完了です。
いろいろなプラグインを入れて遊んでください。
わかりずらかったら、コメントで教えてください。修正します。

## 参考サイト
dein.vim公式：
https://github.com/Shougo/dein.vim
dein.vimのインストール自体にハマってしまったメモ：
https://qiita.com/Coolucky/items/0a96910f13586d635dc0
Windows+gVim+dein.vim環境導入時「未知の関数です」と言われた：
https://qiita.com/hadayan0/items/de9031d5e8ad43baba3d
MySQLでuseしたらエラーっぽいメッセージが出たので調べた

普通にテーブルをuseしようとしたら

```sql
mysql> use ｘｘｘ
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
```
って出たんだけど、問題なく使えてるっぽい。

調べてみたら
xxxをTabで補完しようとすると出るみたい。たしかに使ってやったわ。

で、メッセージの意味は、
テーブル名と項目名を補完=completionするために、テーブル情報を読んでます。
-Aコマンドでこの機能をオフにすると起動を早めることができます。

っていうことらしいね。

でも長い名前はTabキーで補完してくれないと大変だから、このままにするよ。

もしオフにしたいなら、MySQL起動時に `mysql -A -u root -p` ってやると良いみたいです。


参考：
[MySQL] “Reading table information for completion of table and column names”ってなにかを教えちゃいますの巻
https://blog.trippyboy.com/2013/mysql/mysql-reading-table-information-completion-table-column-names%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB%E3%81%8B%E3%82%92%E6%95%99%E3%81%88%E3%81%A1%E3%82%83%E3%81%84%E3%81%BE%E3%81%99/

【MySQL】コマンドラインツールでDBを指定したときに時間がかかる時の対処法
https://blog.tgr.wtf/%E3%80%90mysql%E3%80%91%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A7db%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB-417.html
LOD として設定することで、パフォーマンスを改善できる Amplify Impostors [BETA] を使ってみた

Unity Asset でパフォーマンス改善系のものはいくつかあると思いますが、そのうちの一つの候補である [Amplify Impostors [BETA]](https://assetstore.unity.com/packages/tools/utilities/amplify-impostors-beta-119877) を使ってみました。

# TL;DR
LOD の遠いところのオブジェクトに使用することで、劇的にパフォーマンスを改善できる可能性がある Asset です。

# Amplify Impostors[BETA] とはどういう Asset？
[この記事](http://www.asset-sale.net/entry/Amplify_Impostors_BETA) の説明がとてもわかりやすいです。
> 複雑な3Dモデルを、ワンクリックで簡単ビルボード！
> あらゆる角度からカメラで撮影してくれて、
> どの角度から見ても大丈夫になる「だまし絵」のような3Dビルボード化エディタです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/8d7e0e7d-c269-cd5b-1bce-f152e395b99e.png)

# 実際に使ってみた
## 遠くからの見た目
こんな感じになりました。
右が Amplify Impostors [BETA] を使用したものです。しっかり見るとぼやっとしているのがわかりますよね。
とは言えある程度ごまかせるレベルでもあると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/bd23f2ee-7e97-2f92-961a-4f96250f6927.png)

こんな感じでシーンは作っています。
真ん中の赤い立方体が、デフォルトの Cube を赤くしたものなので、鳥居のサイズ感と距離が離れているのがわかるかと思います。
（実際の距離は以下写真参照、鳥居のサイズは近くからの見た目のところにあります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/bead0959-d446-1e2a-0f59-3e0f7b56a3c8.png)

## 影
影も出ます。上と同じシーンで、カメラの位置を高さ50mにして撮った感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/1b635d40-e21b-a015-30f0-08004248e9f3.png)


## パフォーマンス
だまし絵という言葉通り、劇的な改善が見られます。

| 項目          | 使用前 | 使用後 | 比     |
|---------------|--------|--------|--------|
| Tris          | 3.6M   | 2.8k   | 0.08%  |
| Verts         | 2.1M   | 5.8k   | 0.27%  |
| SetPass calls | 34     | 16     | 47.06% |

## 補足（Statistics）
### 使用前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/e657e47d-0e15-e3bb-1d61-9bb81de8c574.png)

### 使用後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c46fd836-0293-f9fa-69c0-1e2f45212c9b.png)

## 近くからの見た目

こちらが使用前です。近いところの銅鑼の模様などがはっきり鮮明に見えていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/628bd746-0504-ee3c-c71e-e934e2efd0a5.png)

こちらが使用後です。近寄ってしまうとぼやぼやしているのがバレバレです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/b1777ea9-9ca6-2860-3f45-acd396900310.png)

シーンはこんな感じで作っています。cube の位置がそれぞれのカメラの位置です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/cff838f5-9520-bb96-3cee-5450b0220baf.png)

### 補足
鳥居は10m x 10m ぐらいのサイズです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/699cd6e6-b3e5-86ad-c35f-949356ef93f1.png)


# 制限
2019/10/22 時点では、以下制限あります。そのためカスタムシェーダーの場合、そもそも使えない可能性もあります。
> Technical Considerations
Currently, standard baking is only supported if the shader exposes a Deferred path, such as Unity Standard shaders. However, the Impostors created can be used in both Forward and Deferred modes.

# まとめ
使用箇所を考えて使えばとても有用な Asset だと思います。

* 使用すると劇的にパフォーマンスを改善できる可能性がある
* 遠くのオブジェクトに使う分には有用なので、LOD で設定すると良い
* 影もちゃんと出る
* shader に制限がある
import from typings folder

毎回忘れてしまうので、一応書き残します。

## Goal
下記のようにimportできる

```typescript
import { Configurations } from 'typings/types';
```

## Tasks

### Folders status
```
- src
  |- index.ts
- typings
  |- type.d.ts
- package.json
```

### Create **tsconfig.json**

```sh
$ tsc --init
$ message TS6071: Successfully created a tsconfig.json file.
```

```json:コメント削除された状態
{
  "compilerOptions": {
    "target": "es5",      
    "module": "commonjs",    
    "strict": true,         
    "esModuleInterop": true 
  }
}
```

### Modified
```json:修正後
{
  "compilerOptions": {
    "target": "es5",      
    "module": "commonjs",    
    "strict": true,
    "baseUrl": "./",
    "esModuleInterop": true 
  },
  "include": ["src/**/*"]
}
```
INSERT実行によるエラーメモ（PostgreSQL）

#はじめに
　SQLを実行中に様々なエラーが発生したのでメモを書きます。私のような初心者の方に少しでも役に立てばよいなと思います。

#invalid input syntax for type integer
　int型で定義してい列に、他の型（varchar型など）の値をINSERTすると発生します。

#malformed array literal
　意味は「不正な形式の配列リテラル」です。
　私の場合は、配列を入れると誤って定義した列に、通常の値をINSERTしようとした際に発生しました。CREATE TABLE文でvarchar(20)と書くべきところをvarchar[20]と書いていました。

##Array value must start with "{" or dimension information.
　意味は「配列の値は必ず"{"または次元情報から始めなければならない。」という意味です。上記の「malformed array literal」の詳細情報として表示されていました。

#column "apple" does not exist
　意味は「"apple"列はありません」です。
　ただし私の場合は以下のINSERT文を入力したときに発生しました。これでエラーが発生したのは'apple'書かなければならないところを"apple"と書いていたためでした。文字列は必ずシングルクウォーテーション「'」で囲うようにします。

```
postgres=# insert into fruits values ("apple");
```

#おわりに
また何かエラーが発生した場合にはここに追記していこうと思います。
Terraformを勉強するために、CI/CD環境を整えた

AWSのインフラ環境を構築するためにTerraformを勉強しようと思いました。
プロジェクトで使うことも想定し、折角なのでCI/CDも整えたメモです。

今回は、Github上でPull- Requestを出した際にバリデーションチェックをして、masterブランチにマージした時に
AWSへデプロイするようにしてみます。

# 環境構築に使ったもの

## Github

ブランチ戦略は　Github Flowを用いることにしてmasterブランチを保護しておきます。
(Settings -> Branches)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341731/d50c6709-7601-f067-a37c-615d7b06d44e.png)

# S3

Terraformの状態を管理する`terraform.tfstate`を永続化する必要がある。
デプロイにはCircleCIを使うのでS3に保存しておくといいです。

幸いにもTerraformには`terraform.tfstate`をS3で管理する設定があるのでそれを使います。

```go:main.tf
terraform {
  backend "s3" {
    bucket = "studyed-terraform-state1" # 作ったバケット名
    region = "ap-northeast-1"
    key = "terraform.tfstate"
    encrypt = true
  }
}
```


## tflint

[tflint](https://github.com/wata727/tflint)は構文チェックするためのツールです。
0.12にも対応しています。
基本的に、ローカルの環境でつかうと思いますが、CIでもチェックするようにします。

今回は [tflint の Docker イメージ](https://hub.docker.com/r/wata727/tflint/)を使いました。

## Circle CI

### 環境変数

AWSに接続するため、以下の環境変数にを設定します。

- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY


### config.yml

tflintでバリデーションをして、masterブランチにマージしたときに
`terraform apply`コマンドでデプロイするようにします。

```yaml
version: 2.1
executors:
  validater:
    docker:
      - image: wata727/tflint
  deployer:
    docker:
      - image: hashicorp/terraform:light
jobs:
  validate:
    executor:
      name: validater
    steps:
      - checkout
      - run:
          name: Validation check by tflint
          command : tflint
  deploy:
    executor:
      name: deployer
    steps:
      - checkout
      - run:
          name: Inittialize
          command: terraform init
      - run:
          name: Deploy
          command: terraform apply -auto-approve # デプロイ確認不要になる

workflows:
  test:
    jobs:
      - validate
      - deploy:
          requires:
            - validate
          filters:
            branches:
              only: master
```

# どうなったか

## バリデーションチェック
たとえば、`modlue`を`modue`と間違えて書いて、リポジトリにPush
![image](https://user-images.githubusercontent.com/46171497/67256560-b6402280-f4c2-11e9-93e6-0b92b605e45b.png)

Pull Request作ると、Circle CIに怒られていました
![image](https://user-images.githubusercontent.com/46171497/67256579-da036880-f4c2-11e9-8934-5240fbce6555.png)

## デプロイ

マージ後のワークフローでデプロイできています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341731/893c1e6b-3606-00a9-2a03-2951b9a69bf7.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341731/ca27d12b-89aa-0eb3-7348-fd81f32a6fc9.png)


# 終わりに

今回は、TerraformのCI/CD環境を整えてみました。
もう少し詰めるところもありそうですが（デプロイ前に人がApploveするとか）
最低限、勉強用としてはいいのかなと。

# 参考

[TerraformでtfstateファイルをS3で管理する](https://qiita.com/tsukakei/items/2751e245e38c814225f1)
AWS IAMについて

# AWS IAMについて

今後の開発のために、AWS関連で学習してきたことを備忘録的に記載していきます。
第一弾はIAM。AWSにおける権限管理のサービスで、AWSを触る上で避けては通れないものかと思います。また、一番重要であるとも言えます。


※ 以下AWS公式より抜粋
> AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスを安全にコンソールするためのウェブサービスです。IAM を使用して、リソースを使用するために認証 (サインイン) され、許可された (アクセス許可を持つ) ユーザーを制御します。


IAMの主な構成要素はPolicy,Role,User,Groupからなる。

- **Policy**は各サービスに対するアクセス許可、不許可の設定を行うもので、AWSが最初から提供しているPolocyもあれば、自分でカスタマイズして作成することも可能。Policyの記述はどのサービスに、どういった条件で、どのような許可/不許可を与えるかなどをGUIで設定も可能だし、JSONでそれらの記述をすることも可能。

- **Role**は複数のPolicyを一つにまとめたもの。日本語にすると「役割」だが、まさにそういった用途で利用できる。例えば、「Admin」というRoleを作成し、そのRoleに対して、Adminに該当するようなPolicyをアタッチしていく。また、各サービスに対して直接アタッチする場合もある。特にEC2などは、作成時にそのEC2用のRoleを作成してアタッチしておいた方が良い。（後からアタッチ出来ないので。。。これがないと、詳細なVMのログをCloudWatchに送れない）

- **User**はその名の通り、UserのObject。AWSではアカウント作成時にRootアカウントが出来るが、このRootアカウントは権限が強すぎるため、出来るだけ使わない方が良い。AWSも公式にそう宣言している。たとえ自分が管理しているAWSであっても、このUserを作成し、Adminに該当するような権限をつけた方が良い。このUserには「AWS CLIなどでプログラムからアクセスする」ものと、「マネジメントコンソールからアクセスする」ものの二種類ある。もちろん両方の権限をつけたUserを作成することも可能。また、人につけるだけでなく、プログラム実行用のUserとしても利用可能。

- **Group**は、複数のUserを一つにまとめたもの。このGroupに対してRoleやPolicyをアタッチすると、そのGroupに属するUserにそれらの権限がアタッチされる。

私もそうだが、一般的な使い方としては下記になると思います。
　1. 必要な権限をもつ**Policy**を作成する
　2. それらの**Policy**を役割ごとにまとめて**Role**を作成する
　3. **User**を所属させる「Admin」や「Developer」、プログラムに付与する「AdminProgram」、「XXXProgram」などの**Role**を作成
　4. 人やプログラムに該当する各**User**を作成
　5. **User**をそれぞれの役割に応じた**Role**に含める
　6. **Role**では定義できない例外的な権限を各**User**に**Policy**でアタッチする（例えば、開発者ではあるが、経理系も兼ねているので、Billingも見せたい等）


Cognitoを使う場合や、異なるAWSアカウント間の連携をする場合などは別の設定も必要になりますが、基本的には上記で問題ないかと思います。
私もAWSでプロジェクトを始める時は、まずは上記を行います。
上記以外で私が最初にやるのは
　1. パスワードポリシーの設定（何文字以上、英数混合必須、何日ごとに更新など）
　2. 人につけるUserには[MFA（二要素認証）の必須化](https://qiita.com/THacker/items/ba355edc0a5ba8b5f542)
です。

参考になれば幸いです。
パスを通すとは Linux　

## メモ

パスを通す事の理解が難しい理由として、若干コンピューターの深いところに触れるので、情報処理などを学んでいないと取っ付きにくい

## 全体像


- install
- パスを通す
- コマンドの実行

## パスの通し方


- 現在のpathの確認

```ruby
echo $PATH 

# 縦に並べたい場合はこれ
echo $PATH | tr ':' '\n'
```

- 実行したいコマンドのパスの確認

```ruby:whichコマンド

➜  bin which postgres
/usr/local/opt/postgresql@9.6/bin/postgres
```

- パスを通す

```:exportコマンド

export PATH="$PATH:/opt/local/bin"

環境変数$PATHの最後に「:/opt/local/bin」という記述する

「/opt/local/bin」というパスを追加したことになる
```

この記事参考
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015

## 検証

- postgres

```:postgresのコマンドを確認して見る
➜  bin which postgres
/usr/local/opt/postgresql@9.6/bin/postgres
```

```:実行したいコマンド【pg_ctl】

pg_ctl -D /usr/local/var/postgresql@9.6 start
```

```
➜  bin pwd
/usr/local/opt/postgresql@9.6/bin
```

```:pg_ctlがはいっている
➜  bin ls
clusterdb         pg_controldata    pg_upgrade
createdb          pg_ctl            pg_xlogdump
createlang        pg_dump           pgbench
createuser        pg_dumpall        pltcl_delmod
dropdb            pg_isready        pltcl_listmod
droplang          pg_receivexlog    pltcl_loadmod
dropuser          pg_recvlogical    postgres
ecpg              pg_resetxlog      postmaster
initdb            pg_restore        psql
oid2name          pg_rewind         reindexdb
pg_archivecleanup pg_standby        vacuumdb
pg_basebackup     pg_test_fsync     vacuumlo
pg_config         pg_test_timing
```

```:binまでパスがとおっている
➜  bin  echo $PATH | tr ':' '\n'
/usr/local/opt/openssl/bin
/usr/local/opt/postgresql@9.6/bin
```

## 実践

現在elasticsearchのパスが通っていない。
バージョンが混在しているので、、、、


```:パスを確認してみる
echo $PATH | tr ':' '\n'


# 結果

 /usr/local/Cellar/elasticsearch/2.3.1/bin

# 実際は
/usr/local/Cellar/elasticsearch/6.2.4/bin
```

```:現状
➜  ~ elasticsearch
zsh: permission denied: elasticsearch

これなんか想定してたのと違うけど。。permission?笑
```

```:パスを通す

export PATH="$PATH:/opt/local/bin"

export PATH="$PATH:/usr/local/Cellar/elasticsearch/6.2.4/bin"


```

```:結果
➜  ~ elasticsearch
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file logs/gc.log due to No such file or directory

[2019-10-22T12:38:58,984][INFO ][o.e.n.Node               ] [] initializing ...
[2019-10-22T12:38:59,059][INFO ][o.e.e.NodeEnvironment    ] [Ans3M-O] using [1] data paths, mounts [[/ (/dev/disk1s1)]], net usable_space [70.6gb], net total_space [233.4gb], types [apfs]
[2019-10-22T12:38:59,060][INFO ][o.e.e.NodeEnvironment    ] [Ans3M-O] heap size [989.8mb], compressed ordinary object pointers [true]
[2019-10-22T12:38:59,061][INFO ][o.e.n.Node               ] node name [Ans3M-O] derived from node ID [Ans3M-OBRb2WHf0belsS5A]; set [node.name] to override
[2
```

とおた
yayの導入

#yayとは
- AURヘルパー(というもの)
- ArchLinux向けのコマンド
- AURパッケージの管理が1億倍楽になる
- たまに(オプションとか)pacmanと違うところがあるので、わからなければggりましょう

#基本的な使い方
- コマンドの`pacman`の部分を`yay`に置き換えるだけ(例:`pacman -Syu`→`yay -Syu`)
- ただし、**AURパッケージをインストールするときに最初からroot権限をつけるとエラーになる**ことがあります。
- 一般ユーザで実行しましょう(`sudo`もNG)

```shell:常用コマンド集
$ yay -Syu
# 全部更新(AURパッケージも更新してくれる)
$ yay -Sy
# パッケージリストのみ更新
$ yay -Syy
# パッケージリストを強制的に更新
$ yay -S hogehoge
# パッケージをインストール
$ yay -R hogehoge
# パッケージを削除
$ yay -Rs hogehoge
# hogehogeのみが依存しているパッケージもまとめて削除
$ yay -Yc
# 要らなくなったパッケージを削除(aptでいうところのautoremove)
```

#導入方法

- 予めpacmanで`base-devel`パッケージ(正確にはパッケージグループですが)をインストールしておいてください。
- あとは下記を実行するだけ。簡単。

```shell:yay導入
$ git clone https://aur.archlinux.org/yay-bin.git yay-bin
$ cd yay-bin
$ makepkg -si --noconfirm
$ cd ..
$ rm -rf yay-bin #任意
```

はいこれでyayが使えるようになった

#まとめ

- Archを使う上で(便利なので)ほぼ必須レベルじゃないかなと思っています
- 自分がビルドしたバイナリしか信用できない方は、クローンするリポジトリをyay-binではなくyayまたはyay-gitにするとよいでしょう。
応用情報技術者試験対策

# 目次
1.[はじめに](#anchor1)
2.[自己紹介](#anchor2)
3.[動機](#anchor3)
4.[取り組んだこと](#anchor3)
5.[当日](#anchor5)
6.[結果](#anchor6)

<a id="anchor1"></a>
## 1.はじめに
6月下旬から勉強を始めて、10/20にある令和元年度秋季応用情報技術者試験に合格することを目標にします。

<a id="anchor2"></a>
##2.自己紹介
+ 非情報系の学生で通信ネットワークやシステム最適化などについて講義で軽く知識はある
+ パソコンのハードに関する知識やマネジメント系の知識はほとんどゼロ

1日1~3時間の勉強を継続して合格を目指しました。

<a id="anchor3"></a>
##3.動機
+ 研究テーマが通信・ネットワークに関する分野なので[IPA](https://www.ipa.go.jp)のネットワークスペシャリストの資格取得を目指す上で必要な資格だったから

<a id="anchor4"></a>
##4.取り組んだこと
+ [16 やさしい応用情報技術者講座 ("やさしい講座"シリーズ)](https://www.amazon.co.jp/16-やさしい応用情報技術者講座-やさしい講座-シリーズ-高橋/dp/479738610X/ref=cm_cr_arp_d_product_sims?ie=UTF8)1周
+ [応用情報技術者試験ドットコム](https://www.ap-siken.com)の午前問題過去問(27年度春~31年度春季)と午後問題の過去問
+ [2016 応用情報技術者 午後問題の重点対策 (午後対策シリーズ)](https://www.amazon.co.jp/2016-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E5%8D%88%E5%BE%8C%E5%AF%BE%E7%AD%96%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E5%8F%A3%E9%81%94%E5%A4%AB/dp/4865750452)

使った書籍は少し古い年度ですが(安かったので...)気にせず取り組みました。古すぎるのはよくないとは思いますが...

###少し詳しく

+ 始めてから1か月は [16 やさしい応用情報技術者講座 ("やさしい講座"シリーズ)](https://www.amazon.co.jp/16-やさしい応用情報技術者講座-やさしい講座-シリーズ-高橋/dp/479738610X/ref=cm_cr_arp_d_product_sims?ie=UTF8)を読むのに時間を費やしました。


章ごとに午前問題や午後問題の過去問がついているのでそれを解きながら理解を深めました。終わったのは7月末でした。

***
+ 次に取り組んだのは午前問題の過去問です。

[応用情報技術者試験ドットコム](https://www.ap-siken.com)にある午前問題の過去問を印刷して時間を計って取り組みましたが時間内に解けるのを確認してからは計ってません。

解き終わって丸付けした後は<b>すべての問題の解説+すべての選択肢で知らなかった単語を理解しながら印刷した問題に書き写しました。</b>

<b>もう一度書いた内容を復習してから</b>次の過去問に取り組みました。この書き込んだ過去問は定期的に見直しました。過去問を解いていく中で繰り返し問われている暗記系の問題は見直しすることで解ける率は上がっていきました。

計算問題などは理系学生であれば難なく解答できると思いますが、よくわからない問題は丁寧に時間をかけて理解するまで確認しましょう。参考までに8/25までに解いた午前問題は27年度の春秋と28年度春の3回分で、3回目に解いた28年春問題で55/80でした。

+ 8/25から午前問題の過去問と並行して [2016 応用情報技術者 午後問題の重点対策 (午後対策シリーズ)](https://www.amazon.co.jp/2016-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E5%8D%88%E5%BE%8C%E5%AF%BE%E7%AD%96%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E5%8F%A3%E9%81%94%E5%A4%AB/dp/4865750452)を進めていきました。こちらは午後問題なので選択する予定のセキュリティ、アルゴリズム、システムアーキテクチャ、ネットワーク、データベース、組込みシステムの6個に取り組んでいきました。使い方は参考書の前書きに述べられているように例題で知識を確認しつつ演習問題に時間を計って取り組みました。

+ ここで想像以上にデータベースの問題が解けず諦めました。代わりにプログラミングの問題を解いてみるとすんなり解けました。なので本番もプログラミングを選択しました。大学でC言語やC++などのプログラミングに関して多少の知識があれば解けるのでお勧めです。具体的には、if文 for文 while文 (配列 構造体)などが理解できていると有利です。

***
<a id="anchor5"></a>
##5.当日
午前/午後共にいつも通りのパフォーマンスが出せたと思います。まとめとして以下1点これから受験予定の人に参考にしてもらえたらと思います。

+ 過去問からの繰り返しの出題がいくつかあったので、8月からは午前は過去問ベースで勉強を進め、午後は9月から1か月以上かけて過去問演習を積むべきだと思いました。なので知識がついたら(午前問題で6~7割とれる)過去問やるべきかなと思います。

***
<a id="anchor6"></a>
##6.結果(合格)
自己採点と(結果)載せておきます。

+ <b>自己採点

午前59/80 (59/80)
午後　
1.情報セキュリティ20/20
3.プログラミング17/20
4.システムアーキテクチャ12/20
5.ネットワーク12/20
7.組込みシステム6/20
合計67/100  (70/100)

組込みシステム解けなかったけど受かっててよかったです
firestoreへのドキュメント追加で自動生成されたIDを受け取る

# 概要

Cloud Firestoreにドキュメントを追加したときに自動生成されるIDを受け取る方法

# 困ったこと

公式ドキュメントのサンプルでは、ドキュメントを追加したあとにidをconsoleに出力するだけで、そのidをその後の処理に使う感じがなかった。

https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja#add_a_document

```js
// Add a new document with a generated id.
db.collection("cities").add({
    name: "Tokyo",
    country: "Japan"
})
.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
    console.error("Error adding document: ", error);
});
```

自分のes6の理解が薄いためか無理くり外部変数に突っ込もうとしたが動かない(vuejsのdataに入れたかった)

```js
.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
    this.docId = docRef.id
})
```

エラーになる

```
firestore Error adding document: TypeError: Cannot set property 'docId' of undefined
```

# やり方

メソッドをasyncで定義して、awaitで待ち構えるとできたっ.

```js
async add() {
  let docRef = await db.collection("cities").add({
      name: "Tokyo",
      country: "Japan"
  })
  this.docId = docRef.id
}
```
[ネタ]HUAWEI Mate 30 Pro に Google アプリをインストール

HUAWEI Mate 30 Pro に Google アプリをインストール必要があるとお思いか？そんなものは必要ない。だってインストール済みの端末が売っているんだもの。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/c7c5522f-3661-c8d3-a14e-25ae09069461.jpeg)

購入してみました。普通にGoogleアプリが使えてます。めでたしめでたし。

![IMG_20191111_155855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/f8cdf3a6-8ce9-a72b-7201-159741daeeac.jpeg)
Raspberry Pi 3 model b+ のインストール手順(MAC)

RaspberryPi 3 model b+ へ　MacからOSをインストールする手順のメモ

# 対象読者
MacUSER

# (1)SDカードのフォーマット
コマンドラインからやる方法だとたまに上手くいかないので。

SDメモリカードフォーマッターを使います。
https://www.sdcard.org/jp/downloads/formatter/eula_mac/index.html

# (2)NOOBSのダウンロード
NOOBS（OSインストールマネージャー）をダウンロード
https://www.raspberrypi.org/downloads/noobs/
ダウンロードしたzipを解凍して、フォルダの中身を全てSDカードへドラッグ&ドロップ


# (3)RaspberryPiの起動
SDカードを差し込んで起動するとインストーラーが起動します。


# 次やること(推奨）

SSHの設定/ローカルIPアドレス固定/
https://qiita.com/3no3_tw/items/4b5975a9f3087edf4e20
pgadmin4でユーザのPasswordを変更したときのメモ

PostgreSQLでユーザパスワードを変更したときの覚書です。

pgAdmin4を使いました。
1. pgAdminにログインする。
2. 対象のデータベースを右クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274119/28acfca9-12b7-305b-d630-e7cdd3c89acd.png)
3. 「Query Tool...」を選択
4. 以下のクエリを実行する

```
alter role [ユーザ名] with password '*******';
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274119/74953d6e-fdfc-726d-c944-3530f6ed9d4a.png)

キャプチャの場合
ユーザ名: postgres
password: postgres

5.「Execute/Reflesh(F5)」ボタンをクリック
(令和元年度秋期)応用情報技術者試験 問4 AIの機械学習

#令和元年度秋期　応用情報技術者試験 問4
IAの機械学習における**教師なし学習**で用いられる手法として、最も適切なものはどれか。
答えはウ　



「教師なし学習」というワードがポイントだった。
ちなみにほかの回答は
ア・・・教師あり学習
イ・・・強化学習
エ・・・教師あり学習
かな？違ってたらごめんなさい

## 教師なし学習とは？？
AIの機械学習には「教師あり学習」、「教師なし学習」、「強化学習」3つの方法があるみたい。
各学習法には回帰や、クラスタリングなどの手法が使われている。


![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421414/6e6c7893-9e22-4658-103c-c6407e9b39a6.png)


## 結局何がちがうの？
機械学習の手法と目的が異なる。
- 教師あり学習・・・人の手を使って正解を紐づけて学習していく
- 教師なし学習・・・人の手を使わず正解を導きだして学習していく
- 強化学習・・・正解を与えてより効率的、最大のリターンを返す事を目的として学習していく

分析手法についてはgoogeleで「機械学習 教師あり なし」と調べれば
非常に細かくわかりやすく記載しているサイトがあるので割愛

## まとめ
今回の問題は、機械学習の学習方法と分析手法が紐づいて覚えてないと解けなかったかな・・・
ざっくりとした認証と認可のイメージ

# 認証と認可の違い
システム的には認証と認可って組み合わせることが多いですが、2つの違いを説明する時のイメージ

# 認証（Authentication）
あなたは誰か確認する。
方法はいろいろあるけど運転免許証とかパスポートとかで本人と認証するイメージするとわかりやすいかも。指紋認証とか顔認証とかも

# 認可（Authorization）
～していいぞ。
認可は権限を与える（～することを許可する）イメージ
認証は含まれない。
たとえば電車乗る時にきっぷ買うけど（最近はほとんどSuicaか）
改札で切符の確認はするけど本人確認はしないのと同じイメージ
切符を買うことで乗車区間内の電車に乗ることが認可される
SQLで条件分岐をさせる（CASE式）

#CASE式とは
　SQLの中で条件分岐をさせたい場合に使うものがCASE式です。プログラミングのif文やswitch文のようなことができます。ただし、CASE式は「式」なので結果は必ず単純な「値」になります。例えば、「1」や「'A'」のようになります。

#CASE式の使い方
　CASE式には単純CASE式と検索CASE式の2種類あります。いずれも似たようなことができます。
　以下に簡単な例を示します。
##単純CASE式
　単純CASE式の書式は以下のようになります。以下の場合は、式1が式2と等しいならば式3となり、式1が式4と等しいならば式5となり、式1が式2と式4のいずれとも等しくない場合式10となるという意味です。

・書き方

```
CASE 式1
     WHEN 式2 THEN 式3
     WHEN 式4 THEN 式5
     ELSE 式10
END
```

・具体例
　もしnameが'apple'ならば'A'となり、nameが'orange'ならば'B'となり、nameが他のものなら'C'となるCASE式は以下のようになります。

```
CASE name
     WHEN 'apple' THEN 'A'
     WHEN 'orange THEN 'B'
     ELSE 'C'
END
```

##検索CASE式
　検索CASE式の書式は以下のようになります。以下の場合は、条件式1が真（true）ならば式1となり、条件式2が真ならば式2となり、いずれも偽（false）の場合式10となるという意味です。

・書き方

```
CASE
     WHEN 条件式1 THEN 式1
     WHEN 条件式2 THEN 式2
     ELSE 式10
END
```

・具体例
　もしnameが'apple'ならば'A'となり、nameが'orange'ならば'B'となり、nameが他のものなら'C'となるCASE式は以下のようになります。

```
CASE 
     WHEN name = 'apple' THEN 'A'
     WHEN name = 'orange THEN 'B'
     ELSE 'C'
END
```

#実行例（検索CASE式）
　次のfruitsテーブルを使用します。

```
postgres=# SELECT * FROM fruits;
  name
--------
 apple
 orange
 banana
(3 rows)
```
　CASE式を使用します。

```
postgres=# SELECT name,
postgres-# CASE
postgres-#      WHEN name = 'apple'  THEN 'A'
postgres-#      WHEN name = 'orange' THEN 'B'
postgres-#      ELSE 'C'
postgres-# END AS class
postgres-# FROM fruits;
  name  | class
--------+-------
 apple  | A
 orange | B
 banana | C
(3 rows)
```

#まとめ
　CASE式を使うことによって条件に応じて値を変えることができます。
　読んでくださりありがとうございました！！
Mac OSをアップデートしたらinvalid active developer path なエラーが発生した件

# 概要
Mac のOSをアップデートし、gitコマンド叩いたら標題のようなエラーが発生するようになりました。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```
CommandLineToolsがないだと・・・なんでや工藤

## 対処法
ターミナル上で下記コマンドを実行する

```
$ xcode-select --install
```

コマンドを実行すると

```
xcode-select: note: install requested for command line developer tools
```
と出るのでcommand line developer toolsをインストールしたら治りました。
アップデートで動いてたものが動かなくなると冷や汗かきますね(^_^;)
忘れないようにメモメモ...
rails s -b 0.0.0.0 のオプション-bの意味

仮想環境内でRailsを立ち上げる時に、意味がわからず、オプションとして-b 0.0.0.0をつけていませんか？
-bオプションの意味を説明したいと思います。今回はvagrantという仮想環境マネージャーを用いて、仮想環境内でRailsアプリケーションを作成している場合について書きます。

##はじめに
多くの人は、railsサーバを**rails s**コマンドで立ち上げて、webブラウザを開き、http://localhost:3000 などのurlにアクセスして、　Railsアプリケーションを作成していると思います。まず、この意味としては当たり前ですが、localhostのポート3000番で立ち上がっているRailsアプリケーションにブラウザからアクセスするという意味です。

## ポートフォワーディングとは
仮想環境内で立ち上がっているRailsアプリケーションを仮想環境の外のブラウザで見るためにはポートをフォーワーディングする必要があります。vagrant upというコマンドを打っているディレクトリにある、vagrantfileに以下のような記述があるのではないでしょうか？

```ruby:Vagrantfile
# Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  config.vm.network "forwarded_port", guest: 3000, host: 3000
```

これは、guestマシン(物理的なパソコン）のポートをhostマシン（仮想マシン）のポートにフォーワーディングしているという意味です。この記述があるからこそ、仮想マシンで立ち上がっているRailsアプリケーションに仮想マシンの外にあるブラウザからアクセスできるのです。

##バインディングアドレスとは
Railsのプロセスは、外部からのリクエストを受け付けるためにRailsプロセスが動いているホストが持っているipアドレスに結び付けられています。その結び付けられているアドレスをバインディングアドレスといいます。
以前は、デフォルトで、ipアドレス0.0.0.0に結び付けられていましたが、一時期から開発環境では、127.0.0.1(localhost）に結び付けられるようになりました。

##ループバックアドレスとは
ループバックアドレスとは、使っているPCそのものを表すipアドレスであり、127.0.0.1というipアドレスが一般的には割り当てられています。そして、このipアドレスのホスト名として、localhostという名前が割り当てられています。
そのため、http://localhost:3000 として、ブラウザで開いていたところを http127.0.0.1:3000として開いてみても同じように開くことができると思います。

そして、このループバックアドレスというのは、外部から（今回の場合は仮想環境の外から）はアクセスすることができません。内部からのみアクセスすることができます。

その例を示したいと思います。
仮想マシン内で、localhost(127.0.0.1)にipアドレスをバインディングさせ、簡単なwebサーバを立ち上げてみます。
下のコマンドを打ってみてください。

```sh
ruby -run -e httpd . -p 3000 -b 127.0.0.1
```
そして、仮想マシン内と、仮想マシン外から、curlコマンドを使って、アクセスできるか調べてみます。

```sh
curl localhost:3000
```

上のコマンドを仮想マシン内から叩いた時には、レスポンスが帰ってきたと思いますが、仮想マシンの外から叩いた時は、レスポンスが帰って来ず、接続できません。という文字が返ってきたと思います。

このように、localhostで立ち上がっている、プロセスは、外部からはアクセスできません。

##ipアドレス0.0.0.0の意味
最後にipアドレス0.0.0.0の意味を説明したいと思います。
前提として、マシンというのは複数のネットワークインターフェースを持っています。つまりは複数のipアドレスを持っているということです。
ifconfigコマンドでネットワークインターフェースの一覧表示をすることができます。

また、grepで値を絞ることにより、ipアドレスを持っているネットワークインターフェースのipアドレス部のみを見ることができます。

```sh
ifconfig | grep "inet "
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256060/a3d9828e-42fa-6422-7860-dd48740afcca.png)

そして、ipアドレス0.0.0.0は、表示されたipアドレス全てを表しています。
そして、-bオプションというのは、Railsのプロセスをどのipアドレスにバインドするかというものです。
つまりは、rails s -b 0.0.0.0というコマンドはRailsのプロセスをipアドレス0.0.0.0だけではなく、仮想マシンが持っている全てのipアドレスにバインディングしているという意味です。
そのため、外部からアクセスできない、127.0.0.1だけではなく、外部からアクセスできる他のipアドレス（192.168.??.??）などにもバインディングされているため、仮想マシン内からだけではなく仮想マシンの外からもアクセスできます。

##まとめ
・ipアドレス127.0.0.1(localhost)は仮想環境外部からはアクセスできない。
・仮想マシンは複数のネットワークインターフェースを持っており、ipアドレス127.0.0.1以外は外部からアクセスできる。
・開発環境では、rails sとすると、railsプロセスはlocalhost(127.0.0.1)にバインディングされる。
・-b 0.0.0.0というオプションをつけると、仮想マシンが持っている全てのネットワークインターフェースにバインディングされるため、仮想環境外部からアクセスできる。
Nuxt + Firebase + Elasticsearch 勉強用Qiita まとめ

NuxtでFirestoreとElasticsearchを使いたかったのでその際に勉強になったサイトをまとめておきます。

##シンプルにFirestoreを導入したい場合
storeで使えるのは`index.js`のみ
[Nuxt.js + Firebase Authentication + FireStoreでwebアプリケーションハンズオン](https://qiita.com/ririli/items/d0d3a6ae78c1b6e827fc)

## VuexFileでFirestoreを導入したい場合
storeのファイル名を`index.js`以外の名前にする場合`VuexFile`が必要になります。
storeを分けて使いたい場合はこちらがおすすめ
#### [VuexFireでNuxt.jsアプリに一瞬でFirestoreを導入する](https://qiita.com/wataruoguchi/items/8fdda8e9754658be06be)


2019/10時点で`VuexFile`の仕様が変わってるため下記のサイトを参考に

#### [Nuxt×vuexfireでちょっとハマった](https://qiita.com/TsukasaGR/items/e8a47889f65c53751309)
#### [VuexFireを使おうと過去のサンプルをコピペしたらはまった話](https://qiita.com/souko2525/items/872d37d9f2ec9915d4ee)

`index.js`にmutationを書くところ、`firebase`ではなく`firestore`と書くところあたりです。

### *FirebaseとElasticserchを使いたい場合
[天網恢恢疎にして漏らさず全文検索 ~firestore + Elasticsearch + react native~](https://qiita.com/t-Asai/items/7b86f116226d6a66f6b8)

[onSnapshot()の機能](https://firebase.google.com/docs/firestore/query-data/listen?hl=ja)

## Elasticserch

### Elasticsearchの基本
これらのサイトを見れば基本的な使い方、機能は理解できます。
[初心者のためのElasticsearchその１](https://dev.classmethod.jp/etc/es-01/)
[初心者のためのElasticsearchその２](https://dev.classmethod.jp/etc/es-02/)
[初心者のためのElasticsearchその3 -node.jsからアクセスする-](https://dev.classmethod.jp/beginners/es-03-2/)

*Homebrewでのインストール
[Elasticsearchのインストール](https://www.elastic.co/downloads/elasticsearch)

```
/// 起動コマンド
$ cd /usr/local/var/homebrew/linked/elasticsearch-full
$ bin/elasticsearch
```

[kibanaのインストール](https://www.elastic.co/jp/downloads/kibana)
```
/// 起動コマンド
$ cd /usr/local/var/homebrew/linked/kibana-full
$ bin/kibana
```

[日本語検索用kuromojiのインストール](https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji.html)

| Elasticserch |意味 |RDBMSで例えると|
|:-----------:|:------------:|:------------:|
| Index | データの保管場所 | Database | 
| type | |table |
| field |　データ型　| カラム |
| document | データの本体 | レコード |


#### インデックスの作り方

```
$ curl -X PUT http://localhost:9200/firebase_user?pretty
```

#### query

こちらの記事が参考になります

[Querying ElasticSearch - A Tutorial and Guide](http://okfnlabs.org/blog/2013/07/01/elasticsearch-query-tutorial.html)
Python で protobuf スキーマを直接読み込む

Jupyter から自作の gRPC サーバにリクエストを投げたいが、そのためには protobuf スキーマを protoc でコンパイルして生成された Python コードを import しなければならない。

例えばこんな感じで。

``` console
$ pip install grpcio grpcio-tools
$ python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. foo.proto
    → foo_pb2.py と foo_pb2_grpc.py が生成される
```

``` python
import grpc
import foo_pb2
import foo_pb2_grpc
```

普通の Jupyter サーバでの作業なら一度コンパイルしたものを使いまわせばいいが、Google Colab で作業をしていると時間が経つとランタイムがリセットされて消えてしまって毎回コンパイルし直す必要があり面倒臭い。

これを自動化できないかと考えた。

## 実装
grpc-tools が必要なので `pip install grpcio-tools` などしてインストールしておく。

``` python
import sys, os
from tempfile import TemporaryDirectory
from io import IOBase
from importlib.machinery import SourceFileLoader
from grpc_tools import _protoc_compiler

def load_proto(proto, name='tmp'):
    with TemporaryDirectory(dir='.') as dname:
        fname = name + '.proto'
        fpath = os.path.join(dname, fname)
        with open(fpath, 'w') as f:
            if isinstance(proto, IOBase):
                f.write(proto.read())
            else:
                f.write(proto)

        args = [
            '--proto_path=' + dname,
            '--python_out=.',
            '--grpc_python_out=.',
            fpath,
        ]
        res = _protoc_compiler.run_main([arg.encode() for arg in args])

        pb2 = SourceFileLoader(name + '_pb2', os.path.join(dname, name + '_pb2.py')).load_module()
        pb2_grpc = SourceFileLoader(name + '_pb2_grpc', os.path.join(dname, name + '_pb2_grpc.py')).load_module()

    return pb2, pb2_grpc
```

一時ディレクトリを作成して、そこに proto ファイルを置いてコンパイルして、生成された Python コードを import して返す `load_proto` という関数を作った。

## 使う
### ファイルを読み込む場合
``` python
with open('foo.proto') as f:
    foo_pb2, foo_pb2_grpc = load_proto(f)
```

### 文字列を読み込む場合
``` python
proto = """
    syntax = "proto3";

    package foo;

    service Foo {
        ...
    }
    """
foo_pb2, foo_pb2_grpc = load_proto(proto)
```

proto ファイルを明示的にコンパイルしなくても Python で扱えるようになった。

## 注意点
これ普通に動くけど、あまりやってはいけないことをやっている気がするので真似する際は注意して欲しい。
【Visual C++】致命的なエラー：C1083 (xxxx.cpp)ファイルを開けません について

（ここに記載するのはあくまで一例であり、その他原因は多数に上るため当記事は）
備忘録とする。

__発生原因：__
ソリューションをVisual Studio IDEで開かずに、Windowsエクスプローラなどからファイルの構成変更、またはファイルを削除する。その後、Visual Studioで再ビルドをすると変更前のファイルがない(表題のエラーメッセージ)とIDEに言われる。

__解決策：__
作成したプロジェクトソリューションのvcxprojファイルに古いファイルパス、ファイル名が含まれている場合は削除して保存(編集はメモ帳など可)。vcxprojファイルはslnファイルと同ディレクトリに（通常）存在している。

__実施後：__
表題エラーメッセージの解消。

__その他注意事項：__
vcxprojファイルはXML形式。
編集前にソリューション全体のバックアップを取得する事が推奨される。（ソリューション破壊の懸念あり）


(2019/10/22 エントリータイトル名を訂正)
選択方法：CWDM、DWDM、CCWDM？

WDMはどのように機能しますか？
波長分割多重化（WDM）は、単一のファイバー上で異なる波長の複数の信号を同時に送信することを指します。通常、合成波と部分波があります。コンバイナMUXの主な機能は、送信側で1本のファイバで複数の信号波長を結合することです。スプリッターDEMUXの主な機能は、受信側で1本のファイバーで送信される複数の波長信号を分離することです。波長分割多重化の主な目的は、ファイバの利用可能な帯域幅を増やすことです。したがって、WDMシステムは、より多くのファイバを敷設することなくWDMを介して拡張するために、電気通信会社によって広く使用されています。
![30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/0f47773b-1e9a-9d26-a1d9-2f042ee867b3.jpeg)


選択方法：CWDM、DWDM？
CWDM（Coarse Wavelength Division Multiplexer）は、疎波長分割マルチプレクサーであり、粗波長分割マルチプレクサーとも呼ばれます。 DWDM（高密度波長分割マルチプレクサ）は、高密度波長分割マルチプレクサです。
![76.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/10e5bd3b-b4a6-abe1-9a72-0088c5bccb73.jpeg)


CWDMとDWDMでは、2つの間のチャネル間隔に大きな違いがあります。チャネル間隔は、2つの隣接するチャネルの公称搬送周波数の差を指し、チャネル間干渉を防ぐために使用できます。 CWDMチャネル間の波長間隔は20 nmですが、DWDMのチャネル間隔は1.6 / 0.8 / 0.4 nm（200 GHz / 100 GHz / 50 GHz）であり、CWDMよりもはるかに小さくなっています。チャネル間隔の違いは、CWDMとDWDMで伝送できる帯域幅と容量の違いでもあります。 DWDMモジュールは、同じファイバでより多くの信号を伝送するために、より間隔の狭い波長を使用することにより、システムの帯域幅と容量をさらに増やします。
![71.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/84a9177c-7288-ee4c-bdc4-c6daa523010e.jpeg)
![72.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/b7590e21-894d-418d-ab91-8d66dcc3c66c.jpeg)


CWDMシステムの最大の利点は低コストであり、デバイスのコストは主にフィルターとレーザーに反映されます。また、20 nmの広い波長間隔により、CWDMはレーザーの仕様が低く、光マルチプレクサ/デマルチプレクサの構造が簡素化されるという利点があります。構造が簡素化され、歩留まりが向上し、コストが削減されます。 DWDMのコスト増加は、主にレーザーダイオードの高コストと波長安定性を維持するために使用される冷却レーザー技術によるものです。

CCWDMとは何ですか？
CCWDMは、ミニ波長分割マルチプレクサーであり、CWDMのミニバージョンです。 TWDM（Thin Film Filter）に基づく波長分割多重化技術。CWDMと同じように動作します。違いは、CCWDMがフリースペース技術を使用し、パッケージサイズがCWDMモジュールに比べて大幅に縮小され、挿入損失が発生することです。より低く、より一貫しています。電気通信、エンタープライズネットワーク、PONネットワーク、ケーブルテレビなどの分野のCWDM製品を置き換えることができます。
![77.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/9e7a13f7-f6de-5a15-fc1f-b169fd72ff5d.jpeg)


CWDM / DWDM / CCWDMソリューションの選択方法は、それぞれの特性と違いに基づいて、最適なソリューションを作成するために、アプリケーションシナリオのニーズと予算を総合的に考慮する必要があります。

HYC は、光通信用の受動基本コンポーネントの研究開発で19年の経験があり、CWDM、DWDM、CCWDM、FWDMなどのさまざまな仕様のWDM波長分割多重製品を提供しています。 HYC Co., Ltd.（HYC）は、光通信用の受動部品の研究開発、製造、販売、およびサービスに特化した国家的ハイテク企業です。同社の主な製品は、光ファイバーコネクタ（データセンターの高密度光コネクタ）、WDM波長分割マルチプレクサー、PLC光スプリッター、MEMS光スイッチ、およびその他のコア光パッシブ基本コンポーネントです。 4G / 5Gモバイル通信、インターネットデータセンター、防衛通信などの分野。
AWS INNOVATE SAP メモ


2019/10月開催のAWS INNOVATEのAWSSAPに関する講義の自分用まとめ。

## AWS INNOVATE とは

AWS クラウドを活用してビジネス革新を目指しているすべての IT リーダー及び IT プロフェッショナルを対象とした、最新のクラウド情報をお届けするためのオンラインカンファレンスです・・とのこと。
詳しくはこちらドゾ ->  
[https://aws.amazon.com/jp/about-aws/events/aws-innovate/](https://aws.amazon.com/jp/about-aws/events/aws-innovate/)

## 講義

### part 1

- ユーザフェデレーション
  - Active Directory　LDAP
  - SSO
  - 技術
    - SAML2.0
    - OpenID Connect
  - AD/LDAP application
    - AWS Managed Microsoft AD
    - AD Connecter
      - オンプレユーザがADを介してAWSサービスにアクセス
    - Simple AD
      - 低スケール、低コスト
  - STSを用いたクロスアカウントアクセス
  - リソースと請求の分離
    - マルチアカウント
    - AWS Organization
      - アカウント全体のポリシー管理
      - 一括請求　consolidated billing

### part 2

- 静的なコンテンツの配信
  - Croudfront->S3
  - ec2->ebs
- OAI origin access identity
  - S3に対するアクセス制限
    - 公開読み取りアクションの削除など
- Amazon Inspector
  - ec2上で動く インスタンスの中の設定
- ベストプラクティス
  - S3に保存
  - CloudTrailのログファイルの整合性
  - CloudTrail->CloudWatchLogsメトリクスフィルタ->CloudWatchアラーム->SNS通知

### part 3

- trouble shooting
  - S3サーバアクセスログ
  - ELBアクセスログ
    - IP、レイテンシ　latency、サーバ応答
  - CroudTrail
    - APIコール
  - VPC flow log
    - network access
  - CloudWatch Logs
    - OS,アプリケーション
  - AWS Config
    - 構成管理
  - CloudWatch Events
- イベント
  - SQS SNS lambda function

### part 4

- コスト管理
- IAM identity and Access management
  - プロビジョニング制限
    - 不要な権限はつけない
  - アクセス許可
  - ロール
- タグの設定
  - キーバリュー
  - No tag No instance
  - 種類
    - リソースタグ
    - コスト配分タグ
      - 経理上の目的でAWS料金を組織の属性にマップする
- CloudWatch
  - しきい値を超えたら通知
- Budget
  - 予測をして、しきい値を超えそうなタイミングで通知
  - コスト配分タグごとの予測

### 資格受験(part 4)

- クラスルームトレーニング
- 模擬試験
  - 問題文の長さ、サービス、観点
- qwiklabs
  - 実際に構築する
- ホワイトペーパー
  - whyにフォーカス。なぜこのようになっているのか
  - サービスごとのドキュメントはwhatを紹介
  - 他の業界、職種の情報を入手可能
- aws answer
  - テンプレート配布など

## 所感

イントロの内容でしたが、SAPの教材は日本では少ないため、参考なる部分はあると思います。

## idle talk

AWS SAAを2019/5に取得して、ベンダー資格よりも基礎力かなと思い2019/10にネスぺ受験。
一昨日試験終わったので、次何しようかなーと思ってた最中、そういえばAWS INNOVATEやってたなーと思い受講に至りました。
(動画講義の1.25倍速再生機能欲しいと思うのは自分だけでしょうか・・)
GitOps playground

# GitOps playground

```
下記のURLで、対話式に体験できます。
k8sの設定は不要です。
```

https://katacoda.com/ptux/scenarios/gitops-playground

![gitops-overview](https://raw.githubusercontent.com/ptux/katacoda-scenarios/master/gitops-playground/gitops-overview.png)

This tutorial shows how to create a CI/CD pipeline using the GitOps methodology.
A key point of GitOps is the idea of "environments-as-code".

## Prerequisites

This tutorial could be done in the free tier of each service.

- `GitHub` for hosting 2 public repo
- `Circle CI` for building and pushing the docker image
- `Docker Hub` for hosting 1 public image repo
- `Katacoda` for using configured k8s
AWSを学ぶ

このページでは、AWSを構成する要素をビデオなどで学んだ記録です。

#ALB(Application Load Balancer)
- ELBとの違い
    - ELBの要素はほぼ全て受け継ぐ
    - サポートするプロトコルが増える(HTTP/2、Websocket)
    - メトリクス、アクセスログの強化
    - ヘルスチェックが的確に？？？
    - パスベース、ホストベースのルーティングなど、新しいルーティングメカニズムサポート
    - その他いろいろ
- 使用場面
    - まあ、プロトコルがHTTP/2なら必須。
    - F5などのロードバランサは使ったことないので、通常のLB製品でもできることなのかは、よくわかりませんが、ALBには、ターゲットグループという概念があり、この単位で振り分けが可能となっている。 要するに、ターゲットグループをベースに設定しておけば、後はそこに追加したいインスタンスを追加すればよいだけ。
- お試し
  Elastic Beanstalkにてアプリケーションサーバを2インスタンス作成して、それに振り分けさせてみた。一応お試しはうまくいったのだが、後処理としてEC2コンソールでインスタンス停止させても、違うインスタンスがまた上がってきてしまう、、
  これはElastic Beanstalkの方の問題か？無料枠が減るのがいやなので、Beanstalkの環境丸ごと削除、、、、、
シェルプログラミングでの条件式の記述

シェルスクリプトでコンソールから受け取った値によって表示するメッセージを分けたい時にエラーが出てしまいました。

```quiz.sh
#!bin/bash
read -p "日本で二番目に高いヤ山は槍ヶ岳でしょうか?[y/n]" yn
if [$yn = "n"]; then
    echo 正解です。日本で二番目に高い山は北岳です。
else
    echo 不正解です。日本で二番目に高い山は北岳です。
fi
```

ynという変数に質問に対する答えを記述してnなら正解yなら不正解を出します。

しかしこれを実行すると以下のエラーが出ます。
<img width="595" alt="スクリーンショット 2019-10-22 10.53.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450301/9c18f947-fdf9-78f6-3c8a-24cb58ef15fd.png">


条件式に半角スペースを入れると解決します。

```quiz.sh
#!bin/bash
read -p "日本で二番目に高いヤ山は槍ヶ岳でしょうか?[y/n]" yn
if [ $yn = "n" ]; then
    echo 正解です。日本で二番目に高い山は北岳です。
else
    echo 不正解です。日本で二番目に高い山は北岳です。
fi
```

![UNADJUSTEDNONRAW_mini_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450301/e4e731f8-928d-3713-9fbb-73712f65308e.jpeg)
ユニケージ開発手法のデメリットについて

## はじめに
Googleでユニケージ開発手法について軽く調べると、メリットについてはすぐに情報が出てくるのですがデメリットについてはなかなか出てこない現象に遭遇します。
デメリットまで理解したうえで技術は使うべきだと思っているので、自分がデメリットだと思っていることを書くことにしました。（こういうデメリットもあるよ！その認識は間違ってるよ！などのご意見大歓迎です！コメントください）
ちなみに、自分はメリット・デメリットを比較した結果、仕事で「使いましょう！」と進言したことはありません。

## そもそもユニケージ開発手法とは
簡単に言うと「ソフトウェア自体をシェルスクリプトで構築してしまおう！」という開発手法です。
これによって、「ある程度の品質の担保」、「（特定環境への）移植性の高いソフトウェアの開発」、「開発速度の向上」などの恩恵を受けることができます。[^1]

[^1]: 長寿命も加えろ！などの声が出てくるかもしれませんが、実際にユニケージ開発を謳って開発している会社ではbash依存度が高い気がします。現在はデフォルトシェルはbashが主流ですが、シェルショックのようなことがいつまた起こるかわからないので長寿命とは言えず、それを謳うためには「POSIX原理主義」を更に取り入れなければいけないと思います。

## デメリット
ここからが本題です。

### シェルスクリプトのデメリットを全面的に引き継いでしまう。
シェルスクリプトを使用するので当たり前っちゃ当たり前なのですが。。。多少はユニケージ開発の「お作法」によって改善？されてるとはいえ、やはりデメリットとして出てきてしまいます。

シェルスクリプトの代表的なデメリットとしては

- 可読性が低い
- （標準的な環境では）実行するまでエラーかわからない
- デバッグがやりにくい

などがあげられると思います。

### ユニケージ開発手法を経験したことのある会社が少ない
開発を行っている会社が少ない為、発注先を変えることが難しくなってしまいます。
付き合いなどもあるので現実ではなかなか発注先を変えるということは無いかもしれませんが、様々な可能性を考慮していくとこれはリスクとしてあげられると思います。

自社のみで完結（自社システムを社内で作っている）している場合でも、様々な理由で途中から外部の会社に任せる可能性があります。その場合はユニケージ開発手法を経験したことのある会社に頼めばいいと思うかもしれませんが、実はここは一筋縄では行かない可能性があります。例えば特定のプロダクトを一緒に使用していた場合（BigQueryやRedShiftなど）、どうすればいいのでしょうか。そのプロダクトが得意な会社に任せますか？ただ、そういう会社はほとんどユニケージ開発はやったことがないはずです（APIなどがコマンドから叩く形で整備されていないことが多い。整備されていても機能が制限されているので、結局モダンな言語を使用することが多い）。では、ユニケージ開発手法を行っている会社に頼むとどうでしょうか？まともにユニケージ開発手法を行っている会社であればユニケージ開発手法で何かプロダクトを使用してビッグデータを扱おうとは思わない為、（ビッグデータもファイルで処理する）なかなか渋いことになると思います。

また、根本的な問題として経験している会社が少ないということは、経験している人材も少ないのです。集団離職などが起きた場合、最悪詰みます。

### 様々なユニケージ開発の「お作法」を知らないといけない
これに関しては後半に軽く触れます。

### うさんくさい会社がユニケージ開発を名乗っているときがある
これはユニケージ開発の直接的な問題ではないのですが、ユニケージ開発を行っている会社が少なく、そんな会社に当たる確率が高いと思ったのでデメリットとしてあげておきます。
うさんくさいかどうかの確認方法ですが、以下の質問をするといいんじゃないかと思います。即答できなければその時点でアウトです。（即答できても胡散臭い場合もあるので、可能であれば親戚に一人はいるシェルスクリプト大好きおじさんに聞いてみてください[^2]）

[^2]: もしそんな親戚がいなければUSP友の会に潜り込んでこっそり聞いてみるといいかも

- シェルショックについて
- バージョン管理はどうやって行っているか
- コマンドセットは何を使用しているか
- 改行コードは何を使用しているか
- インデント幅は何文字か、また、インデントはなにで行っているか
- シバンには何を記載しているか
- コマンドをパイプで繋ぐ際の注意点は何か

最初にユニケージの直接的な問題ではないと書いたのですが、正直これが一番問題な気がします。
少しフェイクを混ぜて書くのですが、以下のようなことを平気でします。

- 1から10000までの数をカウントする処理で1の桁が9から10になる際に0にし、2桁目の数字を1足す。それを繰り返し10000を目指す。なお、処理にバグが存在し、300から400の間はカウントされることはない。
- bashの機能を使用しているのにも関わらず、シバンはsh
 - そもそもシバンを書かないこともある
- その時その時使いたい共通処理スクリプトを作成する。（そもそもユニケージ開発では全有の考えがあるので、共通ルーチンは本来呼び出さない）
- ユニケージ開発のワンプログラムワンフローの原則を平気な顔で破る（関数の使用も原則禁止。他の言語と同じように書きたいなら他の言語で書くべき）
- そもそもソフトウェア開発に従事するのであれば知ってて当然のバージョン管理を知らない、もしくはソースコードにコメントで日付、変更start -> 変更endみたいな前時代的なことをやっているところもある。
- テストのことを全く考えていない書き方。固有情報がベタ書きで書かれているのでテスト時にソースコードを書き換えないといけない。

などなどです。

こんなもん、あとからどこの会社に保守をお願いしてもうまく行くわけがないです。

## 終わりに
書きなぐる感じで書いたので後で細かく修正するかも？
個人的には結構好きなんですが、（仕事で使うとは言ってない）如何せん流行らないですね。
メリットとデメリット、正しく知った上で技術は使いましょう！
MacでRuby on Rails の開発環境の構築

# はじめに
Webエンジニアになるために、Macbook Proを初購入
Rubyの開発環境を整備したので、備忘録として記載

※ 2019年10月時点の情報のため、コマンドやバージョンは都度更新してください。

# Macのスペック
・MacBook Pro 13インチ(2019)
・メモリ 16GB
・デフォルトでインストールされているRuby　
　ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

# 開発環境の構築手順
・以下の手順で実施する

## 1.OSのアップデート
・アップルメニュー から「システム環境設定」を選択
　「ソフトウェア・アップデート」をクリック

※ MacOSを最新版にアップデート
（2019年10月ではmacOS Cetalina Ver10.15）

## 2.Xcodeのインストール
・Appstoreから「Xcode」と検索
・Xcodeをインストール（容量が多いので少し時間がかかります。）

## 3.command line tools for xcodeのインストール
```
$ xcode-select --install
```

・インストールできたか以下のコマンドで確認

```
$ xcode-select --version
Xcode 11.1
Build version 11A1027
```

## 4.Homebrewのインストール
・公式　HP（https://brew.sh/index_ja）に記載のあるコマンドを使用
・パスワードを求められるので、自身のMacに設定したパスワードを入力

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
・・・
[Password : （入力）
```

・インストールできたか以下のコマンドで確認

```
$ brew -v
Homebrew 2.1.15
Homebrew/homebrew-core (git revision 93b0; last commit 2019-10-17)

$ brew doctor
Your system is ready to brew.
```

## 5.rbenvのインストール
・Homebrew を利用して rbenv をインストール

```
$ brew install rbenv ruby-build
```

```.bash_profileの設定
$ echo 'export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

・インストールできたか以下のコマンドで確認

```
$ rbenv -v
rbenv 1.1.2
```

## 6. Rubyのインストール
```
$ rbenv install --list # Rubyのバージョンを確認
$ rbenv install 2.6.5
$ rbenv global 2.6.5
```
・インストールできたか以下のコマンドで確認

```
$ ruby -v
rbenv 1.1.2
$ which ruby
/Users/[ユーザ名]/.rbenv/shims/ruby
```

## 7.Bundlerのインストール
```
$ gem install bundler
```
・インストールできたか以下のコマンドで確認

```
$ bundle -v
Bundler version 2.0.2
```

・gemのアップデート

```
$ gem update --system
Latest version already installed. Done.
$ gem list
```

## 8.railsのインストール
```
$ gem install rails
$ brew install node # node.jsも導入
```
・インストールできたか以下のコマンドで確認

```
$ rails -v
Rails 6.0.0
```

## 9.トラブルシューティング
### 1.railsアプリケーション作成時にエラーになる
```
$ rails new sample
・・・
Errno::EACCES: Permission denied @ dir_s_mkdir -
/Users/[ユーザ名]/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0-static/bindex-0.8.1

```

対処法としては、以下のコマンドを実施

```
$ sudo chown -R [ユーザ名]:staff /Users/[ユーザ名]/.rbenv
```
参考：http://infinity108.com/114/

### 2.使用するrailsのバージョンを変えたい
```
$ gem uninstall railties -v 'X.X.X'
$ gem install -v 'X.X.X'
```
CCDF(相補累積分布関数)をecdf()とggplot2でかんたんに書く

# CCDFとは

**CCDF** (Complementary Cumulative Distribution Function)。[Wiki(En)](https://en.wikipedia.org/wiki/Cumulative_distribution_function#Complementary_cumulative_distribution_function_(tail_distribution))もしくは[Wiki(Jp)](https://ja.wikipedia.org/wiki/%E7%B4%AF%E7%A9%8D%E5%88%86%E5%B8%83%E9%96%A2%E6%95%B0)を読む。



次のようなポアソン分布に従う頻度データ（カウントデータ）のCCDFを両対数グラフ上にggplot2で書きたい。

```{r}
data <- tibble(count = rpois(n = 1000, lambda = 20))
> data
# A tibble: 1,000 x 1
   count
   <int>
 1    12
 2    19
 3    15
 4    14
 5    17
 6    18
 7    13
 8    22
 9    14
10    19
# … with 990 more rows
```

## 1: `stat_ecdf()`でプロットし、生成されたdata.frameをもう一回プロットする

"CCDF ggplot"でググると、まず`ggplot2`にデフォルトで用意されている`stat_ecdf()`で経験的累積分布関数ECDFをかき、そこから`ggplot_build()`を使って値を取り出してこい、という方法がまず[出てくる](https://stackoverflow.com/questions/42599846/how-to-plot-a-complementary-cumulative-distribution-function-ccdf-in-r-prefer)。

### ECDFがどういう見た目になるか
```{r:stat_ecdf plot}
data %>% 
  ggplot(
    aes(
      x = count
    )
  ) +
  stat_ecdf(pad = FALSE)
```
![ecdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152050/e8fb6ac6-e043-364a-9284-79bad1eea05a.png)

このプロットからデータフレームを抽出する。

```{r:extract data.frame from stat_ecdf.r}
data_ecdf <- 
  ggplot_build(
    data %>% 
      ggplot(
        aes(
          x = count
        )
      ) +
      stat_ecdf(pad = FALSE)
  )$data[[1]]
```
読みにくいったらありゃしない。さらにここから両対数グラフにプロットするには

```{r:stat_ecdf.r}
data_ecdf %>% 
  ggplot(aes(x = count, y = 1 - y)) +
  geom_point() +
  scale_x_continuous(trans = "log10", breaks = 10^(0:10))+
  scale_y_continuous(trans = "log10", breaks = 10^(0:-10)) 
```
とする必要がある。
![ccdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152050/1aedf70d-533e-6c02-641e-8fe39fe17125.png)


これらをいっぺんに行うには`ecdf()`を使う。

## 2: `ecdf()`で値を取り出す

先述の[stackoverflow](https://stackoverflow.com/questions/42599846/how-to-plot-a-complementary-cumulative-distribution-function-ccdf-in-r-prefer)の２つ目の回答を改良する。{stats}にはいっている`ecdf()`を用いて、

```{r:ecdf.r}
data %>%
  ggplot(aes(x = count, y = 1 - ecdf(count)(count))) +
  geom_point() +
  scale_x_continuous(trans = "log10", breaks = 10^(0:10))+
  scale_y_continuous(trans = "log10", breaks = 10^(0:-10)) 
```
これだけでよい。ラクチン！
WagtailのSubBlockを使ってみました

http://docs.wagtail.io/en/v2.0/topics/streamfield.html#structblock

In addition to the basic block types above, it is possible to define new block types made up of sub-blocks: for example, a ‘person’ block consisting of sub-blocks for first name, surname and image, or a ‘carousel’ block consisting of an unlimited number of image blocks. These structures can be nested to any depth, making it possible to have a structure containing a list, or a list of structures.

> ...サブブロックを使えば新しいブロックタイプをつくることが可能です。例えば「姓」ブロック、「名」ブロック、「画像」ブロックから「人物」ブロックを作れます。無数の画像から「カルーセル」ブロックをつくることもできます。これらの構造はどんな深さにもネスト（入れ子に）でき、リストや子構造のリストを持つこともできます。

私はbootstrapの[jumbotron](https://getbootstrap.com/docs/4.0/components/jumbotron/)を作りたかったので、paragraphとimageを持つJumbotronBlockをつくりました

```py:blog/models.py
...
class JumbotronBlock(blocks.StructBlock):
    paragraph = blocks.RichTextBlock()
    image = ImageChooserBlock()

    class Meta:
        template = 'blog/blocks/jumbotron.html'
...
```

```py:blog/templates/blog/blocks/jumbotron.html
{% load wagtailcore_tags wagtailimages_tags %}

{% image value.image original as img %}
<div class="jumbotron jumbotron-fluid" style="background-image: url('{{ img.url }}');">
  <div class="container">
    {% include_block value.paragraph %}
  </div>
</div>
```

```py:blog/models.py
...
class JumbotronPage(Page):
    body = StreamField([
        ('jumbotron', JumbotronBlock()),
    ])

    content_panels = Page.content_panels + [
        StreamFieldPanel('body'),
    ]
...
```
![wagtail_jumbotron.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79562/08d646cb-ce0b-0bcb-fd0b-2d2364b199d1.png)