OmniAICreator/Qiita-1.07M huggingface dataset:
MacとWindowsを両方使っている場合の注意点

# この記事の背景

私は基本的に家で仕事をすることが多いのですが、家では3年ほど前に買ったSurfacePro 4を使っています。
画面が狭いので別途23インチのモニタを付け、さらにキーボードは<a href="https://amzn.to/2NsJEjo" target="_blank">マイクロソフトの人間工学キーボード</a>です。

ですのでSurfacePro 4 は、実質的にはサブモニタみたいな位置づけです。

が、メモリを16GBにしているおかげか、パフォーマンスは非常に良いので満足しています。

これを使い続けるつもりでいたのですがバッテリーの持ちが悪くなり、交換しました。純正品ではないのですが、4万くらいしました。さらに充電器も壊れたので、こちらは純正品を買いました。1万くらいです。

でも結局その充電器もすぐ壊れました。バッテリーが純正品でなくなったからかな？とあきらめ、充電器は数千円の非純正品を使っています。

さて、それはそうとクライアント先に出向くときには、SurfacePro 4 だとどうしても不便なことがあります。充電器を常に一緒に持ち歩いても、電源自体がない場合に充電できず、外でバリバリ仕事が出来ないのです。

そこでSurfacePro 7 とSurfacePro X が先日出たので、買おうかなぁとも思いました。ただ、7に関してはSurfacePro 4 からの大きな進展もないですし、Xに関してはやはりまだ不安でした。

それと、私の求めるスペックとしては、メモリは16GB欲しいのですが、ハードは極力少ないもにしたかったのです。

SurfacePro 7 の場合、メモリを16GBの場合、ハードが256GBになってしまいます。正直今はクラウドでほとんど保存しますから、128GBもあれば十分なのでオーバースペックです。そのオーバースペック分で数万円を払っていると思うと嫌な気持ちになります。

SurfacePro X は、全体的にオーバースペックです。私の場合、コーディングとクラウドシステムでの作業がほとんどなので、スペックはたいして必要としておらず、現にSurfacePro 4 で少しも困っていません。

たまたまメルカリを見ていたら、MacbookAir(2019)が良い状態で、しかもハード128GBのメモリ16GBというベストな構成が出ていました。

過去にメルカリで売ったポイントがだいぶ残っていたこともあり、思わず買ってしまったのです。。。

# エンジニアが注意すべき点

さて、唐突にMacユーザーになったわけですが、もちろん家ではSurfacePro 4 を使い続けています。

プログラムに関しては、今まではAnacondaを使って仮想環境を構築していました。MacでもAnacondaがあるので仮想環境構築はできますが、これを機にDockerを使うことにしました。

仮想環境構築はこれで解決しそうです。

あとはプログラムファイルの共有です。

もちろんGithubにプッシュしてはいますが、これを毎回作業のたびにローカルにPullするのはちょっとまずいことがあります。

- 外出時に無料Wifiがない場合は、ポケットWifiを使う。そうすると通信容量を結構使ってしまう。
- .gitignoreに書かれたファイルを共有できない。

ある意味当たり前なのですが、実際やるまで気づきませんでした。

そこでプログラムファイルをDropboxかBoxで共有しようと思いました。

この二つ、似ていますが異なりますのでエンジニア的な差異を下記にまとめました。


|          |Dropbox       |Box       |
|:-----------------|:------------------|:------------------|
| ローカル容量     |ローカルの容量を使う。|提供されているデスクトップアプリBoxDriveはネットワークドライブの割り当てをされるだけなので、ローカル容量は使わない。|
|速度          |ローカルで同期済みなので開くのが早い。|エディタなどでファイルを開く場合、少し遅い。|
|注意点|容量が多い場合は同期すべきフォルダを選択して使うべし。|.gitignoreが何故か表示されない。|

ハードの容量を使うのが嫌だったのでBoxを最初は使っていました。

そしていざコーディングをしょうとしたら、なんと.gitignoreがないではないですか！

ブラウザで対象のフォルダを見るとちゃんと存在しているのですが、Boxdriveだと消えているのです。

フォルダの権限の問題かと思いましたがそうでもないようです。

また隠しファイルを表示する設定にしてみましたがこれでも解決しませんでした。


# 結論

プログラムファイルの共有はDropboxがおすすめ！
です。

# 追加
macだとピリオドで始まるファイルがデフォルトでは非表示になるようです。そうするとmacでは常に.gitignoreが非表示になります。もしかしたら、macからBoxdriveにアップロードしたからBoxdriveで.gitignoreがなかったのかもしれません。

macに関しては次のコマンドをターミナルから打ち込むことで、ピリオド始まるのファイルも表示されるようになります。

```
defaults write com.apple.finder AppleShowAllFiles true
killall Finder
```

意味はよくわかりませんが、迷わずこれを打ち込みましょう。
学習の生産性を高めるには

#生産性を高める行為
###日光を浴びる
→体が起きる

###暖かい格好
→寒さが生産性を下げる

###歩く
→一番かんたんな運動

###スタンディング学習
→長時間座ると脳に悪い。ついでに身体にもメンタルにも良くない

###電車は立つ
→上に同じ。運動の一環

###好きな音楽を聴く
→学習前に聴くといいらしい。学習中はNG

###夜の報酬を決める
→人間報酬があるから頑張れる

###こまめな休憩→ポモドーロ
→休憩めっちゃ大事

###散歩、仮眠、ぼーっとする
→休憩の仕方はそれぞれ

###水をたくさん飲む
→健康にもいいね

###切りの悪いところで切り上げる
→次やるモチベーションになる

###楽器を弾く
→頭めっちゃ使う

###報酬を受け取る
→頑張った自分にはちゃんとご褒美を

###自分のやり方、選択、努力を褒める
→自己肯定感UP！結果を褒めるのではなくやり方を褒める

###本を読む
→落ち着くよね

###他人に教える
→ラーニングピラミッドの頂点

###３０秒でも作業を始める
→作業興奮に入ろう

###運動する
→一番大事だと思う。健康・メンタル・脳全てに良い

###鼻呼吸
→口呼吸より良いらしい。

###暗算
→脳トレ。ナンバープレート見て10つくったりしてる

###スマホを近くに置かない
→視界に入れるだけで３０％生産性を下げる

<br>
>主にブレイクスルー佐々木のYouTubeから
[AWSエラー]アクセス権限が必要です


二段階の設定をするときのエラー。

QR読み取って登録するのはいいが、
２個入力する欄がある。

１個目は普通にアクセスコード入れて、
２個目は次に表示されたアクセスコードを入れれば良い。

<b>
二段階の設定途中でミスってログインできなることあるので落ち着いてやること。
</b>

ここに書いてる。
https://ameblo.jp/akenji/entry-12448936848.html
学んだ事(11/7)

##npm
・パッケージ管理ツール
・Node.jsのwebアプリケーション開発で利用できるMVCフレームワーク

##SDK
特定のソフトウェアを開発するのに必要な開発キット

##node(ノード)
点と線で構造図を書いた時の『点』の部分
繋いでいる線の部分は『エッジ』という

##bot-express
・Node.js用のBOT開発フレームワーク

##touchコマンド（Linuxコマンド）

まだ作成していないファイルを作成する

```
$ touch ファイル名
```
【Git】git pullしてYou are not currently on a branch.が出たときに、対処したことメモ

git pullしてYou are not currently on a branch.というメッセージが出てしまいました。
対処したことを覚え書きとして残しておきます。

## 対象ツール・環境
- Git
- OS：Windows10
- コマンドプロンプトを使用

## 前提条件
前提条件：複数の環境で、masterブランチに対し作業を行っていた

## 発生事象と解決までの流れ

1.git pullしたところ、以下のようなメッセージが出現

```terminal
> git pull
remote: Counting objects: XX, done.
Unpacking objects: 100% (XX/XX), done.
From https://XXXXX
   XXXXXX1..XXXXXX2  master     -> origin/master
You are not currently on a branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>
```

2.メッセージに従ってコマンドを実行したがうまくいかず・・

```terminal
> git pull origin/master master
fatal: 'origin/master' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

3.ブランチの一覧を確認したところ以下のような結果に

```terminal
> git branch -vv
* (no branch, rebasing master) XXXXXX1 2. aaaaa
  master                       XXXXXX2 [origin/master: behind 5] 1. bbbbb
```
→(no branch, rebasing master)に切り替わっている??

4.masterブランチをcheckoutして解決！

``` terminal
> git checkout master
```
5.ブランチ一覧を再度確認したところ、(no branch, rebasing master)は消えていました

```terminal
> git branch -vv
* master XXXXXX2 [origin/master: behind 5] 1. bbbbb
```

## 原因
おそらくですが、git rebase -iしたこと
画像処理メモ2

符号化よりの技術などのメモ
https://qiita.com/T_keigo_wwk/items/679316877dee98deb489
これの続き
なんか間違ってたらごめんなさい（メモなので）

# 画像データーサイズの計算

## BMP形式のときのサイズ計算
### 静止画の場合

 $W$(高さ)=100
 $h$(幅）=100　のBMP形式静止画がある場合のサイズ計算

BMPの場合BGRなので1画素あたり8bit×3なので

3*8*W*H=size$が成り立つので$size=2400000bit$ ,240kbitになる

### 動画の場合

動画の場合は時間軸が追加されるためにフレームレートに応じたデーターサイズになる
$30FPS$,$time=2s$,$W=300$,$h=200$の動画があったとする.
同じようにBGRの無圧縮動画であったとして計算した場合

```math
8*3*300*200*30*2=86400000
```

86.4Mbitになる

## 圧縮率の計算
### 静止画

圧縮前のサイズ$size_t$,圧縮後のサイズ$size_a$をおいたとき

$\frac{size_a}{size_t}$で圧縮度が計算できる、この場合単位はbit/pixelになる

　
# 可逆符号化技術
名前の通り復号可能な符号化のことである

## 算術符号化
手法としては出現シンボルに対して出現確率が与えられてそれに応じた二進数表記を行ってデーターを表現することで容量を削減する


$a,b,c$の出現確率が$0.5,0.3,0.2$で与えられる場合

Aの下限確率は0 
Bの下限確率は0.5
Cの下限確率は0.8

になる。下限確率の求め方は下限確率の列$S$、昇順ソート済みの出現確率の列$A$と置いたとき 

```math
S_{n} =1-\sum^{n-1}_{k}{A_{k}} 
```
となる、１から大きい出現確率の順に引いていけばよい、

Aの上限確率は0.5
Bの上限確率は0.8
Bの上限確率は1.0

上限確率列$U$を置くとき

```math
U_n= \sum^{n-1}_{k} A_{k}
```

大きい確率の順に足していけば良い

※変数の命名とかはオリジナルなのでメジャーではない。

##二進数表記にする

符号化する以上これを二進数で表現しないといけないのでする

下限確率に応じて下限を二進数表記にしてみる

A 0.0
B 0.10
C 0.111

このままだと整数ではないので重複してない上位桁をとっていく

A 0
B 01
C 11


例として文字列"ABC"を与える
二進数で表現すると$00111$となる、

次に二進数で与えて復号する "001011"→AABCと言った感じになる

###算術符号化におけるシンボルあたりの符号長計算
固定長の場合はこの場合2bitで表現できるがシンボル"A"の場合は1Bitなので確率的には1bit~2bitの長さを与えられることになる

昇順ソート済み上限確率列$U$,対応するシンボルのbit長列$B$を定義すると以下のような式が成り立つ

```math
size = \prod^{N}_{k} B_k*U_k
```

この場合0.5*1+0.3*2+0.5*2=1.5になるので1シンボルあたりの符号量は1.5bitになり固定長より確率的に短くなることがわかる



# 非可逆符号化に関するメモ
可逆符号化とは異なり一度符号化すると復号ができない

## 手法の大まかなメモ
これにはいくつか手法が存在する

### 空間的な冗長性の利用

空間的な冗長の利用、隣接画素値にはある程度相関があるのを利用し数学的処置を施す手法である

### 視覚特性を利用
画像処理において人間が見る分には劣化しても問題ない成分が存在するので（例えば高周波成分）それのみを削減する手法。

## YUV色空間への変換
無圧縮画像の多くがRGBだがYUV色空間への変換を行うことで符号化が可能である

RGB→YCbCr→相関除去→量子化→符号化→符号化データー
以上のような流れて行うことができる、この場合の符号化手法は可逆でも可能であるが相関除去をしている時点で不可逆であるので可逆符号化とは言えない。

YCが輝度信号、bCrが色差信号である

# 量子化手法について
Xが０に近いときYが０である範囲が存在せず、絶対値が０以上であるミッドライザ型と
Xが０に近いときYが０になり絶対値が０になるミッドトレッド型存在する

### 量子化によって発生するノイズ
・ブロックノイズ
・モスキートノイズ

http://www.pcsj-imps.org/archive/2013tutorial.pdf
参考
画像添付中はボタンの色が変わるjQuery input[type=file]

#すること
画像添付中の画像添付ボタンのスタイルを変える方法です。

##使うもの
- jquery
- css(scss)

##処理の流れ
1.添付中は特定のclassを付与
2.上記で付与されたclassのstyleがついて色が変わる
３.送信したら特定のclassを削除
４.classが削除されたことによってstyleも削除されて色が元に戻る

#書くコード

``` nantoka.js

// 画像を添付した時に着火するイベント
$('input[type=file]').change(function () {
  $('色を変えたい要素のセレクタ').addClass('active'); //class「active」をつける
}); 

// 送信で着火するイベント
$('送信ボタンのセレクタ').submit(function () {
.done(function () {
  // ~ 送信処理省略 ~//
$('色を変えたい要素のセレクタ').removeClass('active'); // ←.doneの最後でclass削除を処理
}).fail(function () {
});

});

```
上記のjQueryのclass付与でstyleが効くように、cssも定義します。

``` nantoka.css
.btn.active{
 background-color: #38aef0; 
/* span、divなどでボタン作った方はこれ */

 color: #38aef0;
/* FontAwesomeの色変更はこっち */
}
```

#実行結果
![0bcd077a208ec469e5ce1be9f47fc2e8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/48e6ce75-63f5-c769-243d-580c3a55766a.gif)

無事に添付ボタンの色を変更できました。
簡単にできるので、jQuery苦手なかたもチャレンジしてみてください。
小さなできたを楽しみましょう！

#参考サイト
ファイルアップロードの参照ボタンの変更設定
http://php.o0o0.jp/article/jquery-upload_button
npm fundとは何か

npmバージョン6.13から `npm fund` というコマンドが実装されました。
このコマンドがどういう動きをするのか解説します。
**2019/11/14更新**

## TL;DR
 * npm fundというコマンドが実装された
 * 資金提供を呼び掛けるためのURLなどが表示される（`npm install`の実行時などのタイミング）
 * 自分のパッケージにも `funding` フィールドを追加してURLを表示できる

細かい仕様は [npm/rfcsを参照して下さい](https://github.com/npm/rfcs/blob/latest/accepted/0017-add-funding-support.md)

## npm fundとは何か
上記で述べた通り、このコマンドは利用者が開発者に対して金銭的支援をするための情報を表示します。
開発者から資金援助してもらうための情報提供手段が1つ増えたことになります。
>This RFC identifies an initial means of tooling to describe & notify consumers of a package's monetary support information.

**initial means**（最初の手段）として提供されているので、もしかすると今後のアップデートでより開発者の支援を後押しする機能が入ってくる可能性もあるのかなと思います。

## fundingフィールドの設定と挙動
`npm fund` で情報を表示させるには、自身が公開しているnpmパッケージの `package.json` に以下のように追記します。
typeフィールドはオプションで、urlフィールドには資金提供ページのURLを設定します。
※2019/11/14 現在はgithubのsponsorsのURLのみを設定する方が多いようです。

```json
"funding": {
    "type": "patreon",
    "url": "https://www.patreon.com/yukisato"
}
```

上記を設定して `npm fund` コマンドを打つと、以下のように出力されます。

```bash

$ npm fund
npm-fund-test@.0.0
├── type: patreon
└── url: https://www.patreon.com/yukisato
```
また、`funding` フィールドが設定されたパッケージを `npm install` などで仕様した場合には以下のようなメッセージが出てくるようになっていて、 `npm fund` コマンドでの確認を促すようになっている。

```bash
3 packages are looking for funding.
Run "npm fund" to find out more.
```

これで誰でも「このパッケージめっちゃ使いやすいじゃん！支援したい！」というときに爆速で資金提供できるようになりました！

## おまけ
サンプルは[GitHub](https://github.com/yukisato/npm-fund-test)に置いていますので良ければ使って下さい。
npmにも置いているので以下のコマンドを使えばマッハで挙動を確認できます。そのまま資金提供もできます（俺に）

```bash

npm i npm-fund-test
npm fund
```

以上です！
zshからfishに引越し

zshはzplugとか入れてnvmも起動時に動くので割ともっさりしていました。
そこでfish人気あったので入れてみたけど結構いい感じ。

## メリット
- 軽い！
- テーマめちゃ入れやすい！

## デメリット
- 構文がbashなどとは変わるのでサポートされないシェルスクリプトのファイルが多い。
- 例えばnvmのインストールにシェルのファイル使うし公式でfishサポートしてないので使えなくなります。
（fish-nvmというnvm likeなものがあるのでそれでなんとかなりそうです。本家よりサクサクな印象。）

## fishの環境構築

```
$ brew install fish
```

### ログインシェルの変更
```
$ sudo vi /etc/shells
```

```shell:/etc/shells
...
#最後の行に以下を追加
/usr/local/bin/fish
```

```
$ chsh -s /usr/local/bin/fish
```

### Fishermanのインストール

```
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
```

### 設定ファイルの追加

```
$ vi ~/.config/fish/config.fish
```

```fish:~/.config/fish/config.fish
source ~/.fish_aliases

# 以下に~/.zshrcで必要なものを移動
```

~/.zsh_aliasesから~/.fish_aliasesに移動

```bash
$ cp ~/.zsh_aliases ~/.fish_aliases
```

### テーマのインストール

モダンでシンプルなテーマpureをインストール

```
$ fisher add rafaelrinaldi/pure
```

こんな感じになります。
<img width="708" alt="スクリーンショット 2019-11-08 3.12.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415529/0ed592eb-6aa9-f242-a837-ca6e3ec30f4d.png">

## fish-nvmの環境構築

```
$ fisher add jorgebucaran/fish-nvm
$ nvm use lts
$ echo lts > ~/.nvmrc
```

## 参考
- [【fish shellでモダンなターミナル環境を構築】＠2017年版](https://qiita.com/k-waragai/items/396acd783ed03511d57c)
- [github - fish-nvm](https://github.com/jorgebucaran/fish-nvm)
【初心者】JavaScript　クラスについて(E6から導入)【備忘録１２】

##11/06～11/07に勉強したこと
###オブジェクトに関数を用いる
-　以前学習したオブジェクトに関数を用いて、呼び出すことができる。
【例】

```js

const animal={
 name="ココ",
 age=3,
 greet:()=>{
  console.log("こんにちは");
 }
}

console.log(animal.name);
animal.greet();

```
-　出力⇒　ココ　　こんにちは
-　上記のようなものを使ってユーザーデータを作成していくのだが、多数の場合
わざわざユーザーごとに書いていくのは、かなり手のかかることなので
下記の章で、【クラス】を使用した書き方を使って出力していく。

###クラス　（E6からの導入）⇒クラス名とインスタンス生成
-　クラス名は基本的に　class Animal{...　などと初めの一文字を大文字にする。
-　クラスを書き終えた{}の後でインスタンスを生成する。
-　定義したのち= new クラス名();で呼び出せる。()にはクラスの中で作る
　コンストラクタに引き渡す値を入力する。

【例】

```js

class Animal{
}

const animal=new Animal();

```

###コンストラクタ／プロパティと値の追加
-　インスタンスを生成するときに、実行したい処理や設定を追加するためのもの。
-　基本クラスの{}の中で書く。
-　コンストラクタの中で、プロパティを書く際はthis.が直前に必要。

【例】

```js

class Animal{
 constructor(){
  this.name="ココ";
}

const animal = new Animal();
console.log(animal.name);

```

###インスタンスごとに値を変える場合
【例】

```js

class Animal {
 constructor(name,age){
  this.name=name;
  this.age=age;
 }
}

const animal= new Animal("ココ",3);
console.log(`ペットの名前は${animal.name}です`);

```
-　console.log(animal);にしてしまうと、出力が
Animal {name:‘ココ‘, age:3}になってしまうので注意！

###メソッド
名前・年齢はプロパティで追加したのに対して
メソッドは「挨拶をする」や「値を計算する」などの処理のまとまりを表す。

【例】

```js

class Animal{
 constructor(name,age){
  this.name=name;
  this.age=age;
 }
//↓メソッド名
 greet(){
  console.log("こんにちは");
 }
//↓メソッド内でインスタンスの値を使用する場合
 info(){
  console.log(`私の名前は${this.name}です`);
 }
}

const animal=new Animal("ココ",3);
animal.greet();
animal.info();
//↑メソッドの呼び出し 

```
-　上記の場合は「こんにちは　　私の名前はココです」と出力される。

###継承
-　親クラスから子クラスに継承をすると、すべての機能が引き継がれる。
-　今まで使ってきたAnimalクラスからDogクラスに継承する際は下記のように書く。

```js

class Dog extends Animal{.....}

```

【例】犬を人の年齢に！⇒戻り値を使う

```js

class Animal{
  constructor(name,age){
  this.name=name;
  this.age=age;
  }
}

 greet(){
   console.log("こんにちは");
 }

 info(){
   this.greet();
   console.log(`名前は${this.name}です`);
   console.log(`${this.age}歳です`);
 }
 
 class Dog extends Animal{
   getHumanAge(){
     return this.age * 7;
   }
 }
 
const dog = new Dog("ココ",3);
dog.info();

const humanAge=dog.getHumanAge();
//↑ここのdog.を忘れやすいので気を付ける！

console.log(`人間年齢で${humanAge}歳です`);

```

###オーバーライド
親クラスと子クラスで同名のメソッドを作った場合(info()...が両方にある場合)
子クラスのメソッドが優先される！(上書きされるため！)これをオーバーライドという。

例えば子クラスにプロパティを追加したい場合は・・・
【例】

```js

....
class Dog extends Animal{
 constructor(name,age,breed){
  super(name,age); //親クラスでもともと書いていたコンストラクタ。
  this.breed = breed;
 }
}

```

##気を付けること
-　オブジェクトの復習になるが、各項目の間は「;」ではなく「,」！
-　インスタンス生成時にnewが抜けないように気を付ける！
-　メソッド内で、他のメソッドを呼び出す場合　this.メソッド名();
-　戻り値が関数の時から苦手なので、再度復習が必要。
-　戻り値の代入の際、();を忘れやすいので癖づけなければいけない。
-　super(name,age);の後、再度　this.breed=breed;と
　追加された分を書かなくてはいけないのを注意する。
作成中）脱出ゲームの作り方　１０ パスワード入力

###作成したUIを操作するスクリプトを作成する（概要）

◇手順
正解のパスワードを設定しておく
テンキーを使って、パスワードを入力する
入力されたパスワードを取得する
入力されたパスワードが正解かどうかを判定する


◇スクリプトPasswordManagerを作成し、PCPanelにアタッチする

```csharp
using UnityEngine.UI;
```

を追加する

プログラムの大枠

```csharp
    // ユーザが入力したパスワード
    string userInputPassword = "";

    //　正解のパスワード
    string correctPassword = "3333";

    // パスワードの入力
    public void InputKey(int number)
    {
    }

    // 正解を確認する
    void CheckPass()
    {
        if (correctPassword == userInputPassword)
        {
            // 正解！
        }
        else
        {
            // 不正解
        }
    }
```

###テンキーで入力した数字を、PCのPASSWORDボックスに表示させる

◇PasswordPanelのImageにテキストを作成
UI - Text
複製して４つにする（テキストのないimageは削除）
※９パスワード画面の作成の「◇ボタンに数字をつける」を参照

◇PasswordPanelに表示されたテキストの取得

　表示テキストの配列viewPasswordTextsを宣言

```
    [SerializeField] Text[] viewPasswordTexts;
```

この配列に4つのテキストを設定
InspectorでPasswordManagerのviewPasswordTextsのsizeを4にして
Element0
Element1
Element2
Element3
にそれぞれのテキストを設定する
![PassTxt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144922/d61230d7-dd73-3a62-1d60-f43c78364f92.png)

◇PasswordManagerでテキストを取得することができるようになったので、変更することが可能

テスト

```csharp
    private void Start()
    {
        InputKey();
    }
    public void InputKey()
    {
        viewPasswordTexts[0].text = "3";
    }
```

※実行すると、0番目に３が表示される

##教材
**Unityゲームスタジオ スタジオしまづ**
「Unity  eラーニングサイト」教材
https://fromalgorithm.jimdo.com/e-learning-unity/
yarnでnode-gypeのエラー

nvmでleatest（v13）をインストールしていつも通りNuxtの環境をyarnでインストールすると以下のようなエラーが大量放出された。

```
gyp: No Xcode or CLT version detected!
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
...
```

なんだかXcodeの何かのツールをインストールしないといけないような感じになっているらしい。npmで完結して欲しいんだけど...。
これだとWindowsとかLinuxで環境代わりそうですよね。

とりあえずXcodeのインストールするツールはわからなかったですがlts(v12.13.0)で問題なくインストールできました。

```
node --version                                   
v12.13.0
```
Rails Tutorial 9章の最後のテストでrememberが見つからない

# はじめに
個人的に[Rails Tutorial](https://railstutorial.jp)の第9章で書かれている通りにしてもうまく動かなかったので、つまづいた点を備忘録の意味も兼ねて書いておく。初めての記事なので、ミス等ある場合は教えていただけると大変ありがたいです。

<strong>開発環境</strong> 
OS&nbsp;&nbsp;&nbsp;&nbsp;: &nbsp;Ubuntu 18.04
Ruby  :&nbsp;&nbsp;2.6.5
Rails &nbsp;:&nbsp; 6.0.0

## 永続的セッションのテストでrememberが見つからない
[9.3.2](https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-testing_the_remember_branch)の永続的セッションのテストを行うと、次のようなエラーが出た。

```ruby
DRb::DRbRemoteError: undefined method `remember' for #<SesseionsHelperTest:0x00005612e5bd30c8> (NoMethodError)
```

app/helpers/sessions_helperにある'remember method'が見つからないとのことなので、そのmethodを含む'Sessionshelper Module'をincludeして対応。

```ruby:test/helpers/sessions_helper_test.rb
require 'test_helper'
require './app/helpers/sessions_helper'   # 追記

class SesseionsHelperTest < ActionView::TestCase

  include SessionsHelper                  # 追記

  def setup
    @user = users(:michael)
    remember(@user)
  end

  test "current_user returns right user when session is nil" do
    assert_equal @user, current_user
    assert is_logged_in?
  end

  test "incurrent user returns nil when remember digest is wrong" do
    @user.update_attribute(:remember_digest, User.digest(User.new_token))
    assert_nil current_user
  end
end
```
勝手にテスト時はhelperは全て読み込むものだと思いこんでいたので、設定が悪いのかと思い、的はずれな方向へ行ってしまった。

# 参考
[Ruby on rails チュートリアル] (https://railstutorial.jp/chapters/advanced_login?version=5.1#cha-advanced_login)
JavaScriptでBibTeXを連想配列に分解

BibTeXを連想配列に分解するスクリプトを書きました。

## BibTeXとは？
$\TeX$で文献を引用する際に利用するツールです。
GoogleScholarからデータをコピペで持ってくる事ができるなど、便利な点が色々あります。
BibTeXについては以下がとても参考になります。
- [BiBTeXとは](https://qiita.com/SUZUKI_Masaya/items/14f9727845e020f8e7e9)
- [Texで書く論文の引用にはbibtexがオススメな４つの理由](https://qiita.com/cheerfularge/items/2674d6180eed4af199da)

## 背景
Google Spread Sheetで論文を整理しようとした際、**「BibTeXの項目で分解できれば表の管理ラクじゃないか？」**と思ったことがキッカケです。
ということで、BibTeX形式を分解することにしました。

## スクリプト
元々はGAS(Google App Script)のために書いたものですが、互換性があるJavaScriptとして記載します。

```javascript:resoluteBibtex.js

function resoluteBibtex(bibtex_source){
  // BibTeXソースを要素ごとの連想配列に分解
  var bibtex_source_tailcut = bibtex_source.replace(/}[ \n]*}/,''); //　末尾の'} }'を削除
  var bibtex_splited = bibtex_source_tailcut.split(/},[ \n]*/);
  
  var bibtex_contents = {};
  var value, value_splited;
  
  for (var index in bibtex_splited){
    value = bibtex_splited[index];
    
    // @xxxxx{label, となっている部分の対応
    if( value.charAt(0) == '@' ){
      value_splited = value.split('{');
      bibtex_contents['@'] = value_splited[0];
      bibtex_contents['label'] = value_splited[1].substring(0,value_splited[1].indexOf(','));
      var next_content_by_label = value_splited[1].replace(/[ \w]*, */,'');
      bibtex_contents[next_content_by_label.replace('=','')] = value_splited[2];
    } else {
      value_splited = value.split('={');
      bibtex_contents[value_splited[0]] = value_splited[1];
    }
  }
  
  return bibtex_contents;
}
```

## 使用例
入力：BibTeX形式のデータ
出力：連想配列

```javascript

// BibTeX形式のデータ
var bibtex_source = "@inproceedings{shvachko2010hadoop,
  title={The hadoop distributed file system.},
  author={Shvachko, Konstantin and Kuang, Hairong and Radia, Sanjay and Chansler, Robert and others},
  booktitle={MSST},
  volume={10},
  pages={1--10},
  year={2010}
}";

var bibtex_contents = resoluteBibtex(bibtex_source);
```

### 実行結果
変数`bibtex_contents`の中身は以下のようになっています。

```javascript

// キー：値 で表示
"@"        :"inproceedings",
"label"    :"shvachko2010hadoop",
"title"    :"The hadoop distributed file system.",
"author"   :"Shvachko, Konstantin and Kuang, Hairong and Radia, Sanjay and Chansler, Robert and others",
"booktitle":"MSST",
"volume"   :"10",
"pages"    :"1--10",
"year"     :"2010"
```
`title`や`author`といった項目名は上記の例以外でも対応しています。

## まとめ
BibTeX形式を連想配列に分解するスクリプトを書きました。
JavaScriptやGoogle App ScriptでBibTeXを扱う場合にご利用ください。
QiitaでGoogleアナリティクスを利用するために登録してみた件

# はじめに
アカウントのプロフィール設定見てたら
ふと「[QiitaでGoogleアナリティクスを利用する手順](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11)」
を見つけた。
前々からGoogleアナリティクスは何者かよくわかってなかったので気になってたのと
せっかくQiitaで親切な説明があるのでこの機会に登録してみることにした。
それにどうやら無料らしいし。

# 手順
1. googleアカウントを用意する
2. googleアナリティクスに登録する
3. アナリティクスIDを取得する
4. QiitaにアナリティクスIDを埋め込む
5. アナリティクス具合を確認する

# 1. googleアカウントを用意する
すでに取得していたので割愛。

# 2. googleアナリティクスに登録する
基本的には流れに身を任せてＯＫＯＫ言ってたらイケる。

以下ＵＲＬへアクセス。
　https://www.google.com/analytics/web/?hl=ja

[無料で登録する]クリック
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/5094af4e-4a19-5706-6247-8d11248a7394.png)

[測定を開始する]クリック
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/96217490-797b-cfa8-81c3-e5dad4ccdb8a.png)

アカウント名決めて[次へ]クリック
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/6298039c-b5b7-3996-4514-7915870f5ae4.png)

# 3. アナリティクスIDを取得する
[ウェブ]を選択して[次へ]クリック
※画面では[アプリとウェブ]を選んでるけどうまくいかなかったのでやめた
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/969b8ab8-aa1f-d9f8-ca6d-253d887441ac.png)

プロパティの作成。
ウェブサイトの名前を決める（Qiitaにした）
ウェブサイトのURLを決める。これは[QiitaでGoogleアナリティクスを利用する手順](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11)を参考に「https://qiita.com」にした。

業種を決める（今回はQiita用に使うから「オンラインコミュニティかな？」なんて思ったのでそれにした）
レポートのタイムゾーンは、日本。
![キャプチャ12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/6ceed4e1-437b-6dd4-5151-7f065c92f8c7.png)

これで登録完了。
プロパティの作成とともにアナリティクスIDが発番される。

確認方法は
管理＞プロパティ＞Qiitaで詳細画面へ移動するとわかる。

# 4. QiitaにアナリティクスIDを埋め込む
で、ここでようやくQiitaに戻ってマイページからアカウント設定画面へ移動する
![キャプチャ14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/bcacfd01-59e2-e445-3203-f3ea64620292.png)

[Googleアナリティクス設定]クリック
![キャプチャ15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/456db599-4728-abbe-23bb-7935f404fdff.png)

先ほど手に入れたアナリティクスIDを入力して[更新する]クリック。
![キャプチャ16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/71e904c4-c9ef-66b6-5d2b-d7bbf87cc11f.png)

# 5. アナリティクス具合を確認する
うまくキマったかどうか見てみよう！
早速自分で自分のQiita記事を閲覧してから…アナリティクスのホームへ移動してみたら…
![キャプチャ13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/63597083-f255-d71f-6fab-3a69dbb5bca7.png)

アクティブユーザのところが一人ふえてるーー！大成功。

# おわりに
この手の埋め込み式って都度都度うめこむのが苦痛なんだけど
さすがQiita。IDだけ渡したらいい感じにしてくれるあたりナイスですね。
しかも説明も記事になっているとは…ありがたや。
おかげさまでGoogleアナリティクスへの抵抗もそれほど強くなく
ツルっと始めることができました。

～おしまい～
LIFF v2 APIを使ってみた

# 概要

先日、LIFFのAPIのv2がリリースされました。
早速試してみようと思ったのですが、私の持っているAndroid端末は対応しておらず（Android：5.0以降対応）
ちゃんと検証できなきゃ記事も書けないと試行錯誤の結果、何とか動作したのでその成果を残しておきます。

# はじめに

### LIFFとは

「LINE Front-end Framework」の略で、LINE社が提供するWEBアプリのプラットフォームの一種です。
LINEのトーク上にWEBアプリを表示することができ、ユーザー情報も連携することができます。
さらに、v2ではLIFFアプリ以外でもLIFF SDKを利用してユーザー情報を取得できるようになりました。

詳しくは[こちら](https://developers.line.biz/ja/docs/liff/overview/)をご覧ください。

# スターターアプリを試してみよう

公式からv2の新機能を盛り込んだスターターアプリが[GitHub](https://github.com/line/line-liff-v2-starter)で公開されています。
早速利用してみようと思ったのですが[README](https://github.com/line/line-liff-v2-starter/blob/master/README.md)を読むと「Herokuが前提」で「Node.jsが必要」！？

ソースを見てみるとNode.jsはインストールしなくても大丈夫のようですし、WEBサーバーでファイルを公開すれば利用できるようでした。
そこで、手ごろなWEBサーバーに設置し、LIFFアプリの設定もしてアクセスしてみましたが、必要な情報が表示されませんでした。
LIFFアプリとしての画面は表示されますし、最初から表示されている静的な記述は表示されます。
しかし、LIFF SDKで取得されるSDKのバージョンやOSの情報などは表示されませんでした。

# 検証

前述したようにv2はLINEアプリ外のブラウザでも動作させることができます。
そこで設置したLIFFアプリにブラウザでアクセスしたところちゃんとSDKのバージョンやOSの情報が表示されました。

外部ブラウザからLIFFアプリにアクセスする場合、SDKが用意したログイン処理を施せばユーザー情報も利用できます。
その機能もちゃんと確認することができました。

ここまで来てやっと気が付きました。
私の検証しているAndroidが古いからなんだと・・・。

# スターターアプリの罠

どうにかして古い端末ではv1のSDKを読み込んで動作させられないかと思案したのですが、どうやらSDKの読み込みは正常に終了しているようでした。
LIFFアプリとして表示させている状況をデベロッパーツールで確認することはできないので、コメントアウトをしながら処理を追いかけたところ最初の初期化の処理で異常終了していたことがわかりました。

``` javascript
/**
* Initialize LIFF
* @param {string} myLiffId The LIFF ID of the selected element
*/
function initializeLiff(myLiffId) {
    liff
        .init({
            liffId: myLiffId
        })
        .then(() => {
            // start to use LIFF's api
            initializeApp();
        })
        .catch((err) => {
            document.getElementById("liffAppContent").classList.add('hidden');
            document.getElementById("liffInitErrorMessage").classList.remove('hidden');
        });
}
```

どうやらAndroid 4のLINEアプリ上のLIFFはES6で追加されたアロー関数```=>```に対応していなかったようです。
Promise オブジェクトの then メソッドや catch メソッドにおけるを従来のようなコールバック関数に変更したところ、Android 4の端末でも動作することが確認できました

### デモ用アカウント

デモ用のLINEアカウントを準備しましたので、登録して試してみてください。

<a href="http://nav.cx/2vJx9mD"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>

# まとめ

今回のはスターターアプリで使われていた内容を修正して動作するようになりました。
しかし、あくまで暫定対応で、今後はSDK自体が古いAndroid端末のLINEアプリでは解析できない可能性もあります。
もしそういった場合もフォローしようと思ったら別の対策が必要になってきますね。
Kaggle【HousePrices】に挑戦

# 概要

敷地面積、築年数などの特徴量から家の価格を予測するコンペに挑んでみた。

## ライブラリ定義

```python
import pandas as pd
```

# 学習データ、テストデータの読み込み
```python
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
```

# 学習データ、テストデータの分割 
目的変数「SalePrice」とそれ以外の従属変数に分離する。

```python
train_x = train.drop(['Id', 'SalePrice'], axis=1)
train_y = train['SalePrice']
test_x = test.drop(['Id'], axis=1)
```

# カテゴリカル変数を数値に置き換える

```python
for column in train_x.columns:
    labels, uniques = pd.factorize(train_x[column])
    train_x[column] = labels
for column in test_x.columns:
    labels, uniques = pd.factorize(test_x[column])
    test_x[column] = labels
```

# 線形回帰でフィッティング

```python
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(train_x, train_y)
```

# 予測

```python
pred_y = regressor.predict(test_x)
```

# CSV作成

```python
submission = pd.DataFrame({'Id':test['Id'], 'SalePrice':pred_y})
submission.to_csv('submission.csv', index=False)
```
Nuxt クエリパラメータによってlayoutを切り替える

クエリパラメータによって使用するlayoutファイルを切り替えなければならない場面に遭遇したので備忘録。
[公式ドキュメント](https://ja.nuxtjs.org/api/pages-layout/)にある通りです。

# layoutの使い方
ページコンポーネントでlayoutプロパティを指定することでカスタムレイアウトが使用できます。
指定がない場合は`default`のlayoutファイルが使われます。

```js
// 公式より
export default {
  layout: 'blog',
  // または
  layout (context) {
    return 'blog'
  }
}
```

# クエリパラメータでlayoutファイルを切り替える
layoutメソッドの引数に[コンテキスト](https://ja.nuxtjs.org/api/context)を渡すことができます。
`localhost:3000/hoge?type=special`にリクエストがきた時に`special`レイアウトを使用する場合

```js:hoge/index.vue
export default {
  layout({ query }) {
     if (query.type === 'special') {
        return 'special'
     }
     return 'default'
   }
}
```
EC2にSSHでログインできなくなった時の対処

個人学習用のEC2インスタンスに接続ができなくなり
はまってしまったのでメモしておきます。

# 事象
teratermでWin10からEC2インスタンスへSSHでのログインを行ったところ、
`Authentication failed`のメッセージが表示されログインに失敗した。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486141/2826dc4d-7ec7-6bcb-8a93-9db460e1940a.png">

## 補足  
前日までは対象のインスタンスに対し、ユーザ：ec2-userにより
同一秘密鍵にて接続できていた。  

前日作業の完了後、インスタンスを停止した。
(当日の起動後、初の接続)

#　実施した内容
## 1.PowerShellからssh実行  


`ssh -i .\[xxxx].pem ec2-user@[X.X.X.X]`

結果

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for '.\\[xxxx].pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key ".\\[xxxx].pem": bad permissions
ec2-user@[X.X.X.X]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

## 2.秘密鍵ファイルの権限変更
上記の~.pemファイルの権限が広すぎる警告を受け、秘密鍵ファイルの権限変更を実施。
WindowsOSであるため、ファイルのプロパティより、以下を実施。

- 操作中ユーザのみをフルコントロール、
- その他のユーザ、グループの権限を削除
- 権限の継承も無効化。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486141/830d3706-4f8a-65c8-bba8-57da619bc1be.png">


## 3.権限変更後、PowerShellからssh再実行  
`ssh -i .\[xxxx].pem ec2-user@[X.X.X.X]`

結果

```
ec2-user@[X.X.X.X]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
・・・権限の警告は抑止されたが接続はされず。

## 4.ssh -v オプションにて詳細確認

`ssh -i .\[xxxx].pem ec2-user@[X.X.X.X] -v`

デバッグログ中に`key_load_public: No such file or directory'を確認。

[パーミッションを変えてしまって ssh でログインできなくなった時@nanasess](https://qiita.com/nanasess/items/c40978d504a3b1b4b4cd)を参考にさせて頂き、
EC2インスタンスのec2-userの.ssh関連の権限を見直し。

インスタンスへのログインはAWSの「EC2 Instance Connect (ブラウザベースの SSH 接続)」から実施。

<font color=green>
\#Chromeからだと入力できなかった
\#(ログイン直後のコンソール内容は表示されるもののEdgeから繋がないと操作できなかった。。。)
</font>

ec2-userにて下記のコマンドを実行。

```
$ chmod 700 ~/
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/*
```

(作業時のログが取れなかった。。。ホームディレクトリの権限がおかしくなっていた・・はず・・・)

## 5.再度、PowerShellのsshで接続

ec2-userにて無事にログイン完了。
teratermでも同様に接続を確認。


# 結論

<font size=1>前回作業時にホームディレクトリのパーミッションを変えてしまう何かを実行していたのかも。
ということで消えてしまいたくなりました。</font>

<font color=green>
\# ToDo:前回作業時ログを確認。(java-1.8.0-openjdk-develの導入とか実施してた)
\# ToDo:TeraTermでログを自動で取得する設定、自宅環境でも実施しておく。
</font>
SQLと英文法は似ている

SQLを昨日から勉強しているのですが、英文法の知識でかなり解けることに気が付きました。
また、英語の語順で考えるとSQLをアルゴリズム的に書けることにも気が付きました。

英語の語順とは雑に言えば、「まず文を完成させて、補足していく」というプロセスです。
キング牧師の、

"I have a dream that ~"

とかまさにそうですよね。
"I have a dream"の時点で文は完成しています。それに補足する形でthat節が続きます。

SQLもまずはselect文で絶対に必要な要素を宣言して、あとはそれに合わせるようにFROMとかJOINとかしていけばいいわけですね。

他にも英語っぽいところがあります。

- HAVINGは現在分詞形容詞用法で前置詞BYのあとの名詞（カラム名）を修飾している
- サブクエリは関係代名詞

英語ではないけどSQL以外の知識も使えますね。

- ASはPythonと同じ
- 「テーブル名.カラム名」は「インスタンス.インスタンス変数」と同じ

SQLの難しいところはSQL以外にありそうだ。というのが勉強2日目の今の僕の雑感です。
Blockchainのメモ書き

#Blockchainについて
バーっとメモ的に自分の見解をまとめてみます

#Bitcoinとは
ブロックチェーンという技術を元に作られた電子通貨

#普通の電子通貨とBitcoinの違い
ブロックチェーンという技術を用いている事。
ブロックチェーン技術により、データが複製されたり改竄されない事を保証している。

#LINEポイントとかあるけど、普通の電子通貨じゃダメなの？
実は過去にいくつもの企業が電子通貨の発行を試みている。
現代で言うユニコーン企業のような企業も登場しているが、ハッキングや国家の訴訟などによって度々潰され、数十ビリオンドルが消えている。

今話題のFacebookのリブラも、国家との争いで潰されている。
今通常に運営されている各社ポイント会社がハッキングされたりしない保証はない。
クレカも普通に危険。
日本があまりにも信用力高いから見えにくいけど、信用を保つために隠れたコストがかなりかかっている。(モラル、仕組み、監査、法律、警察 etc)

#ブロックチェーンを抑えるポイント
・本来電子データは簡単に複製可能なので価値がない。
・ブロックチェーン暗号技術でゴニョゴニョするとデータの複製や改ざんが不可能になる。
・マイニングという暗号計算ロジックを組み込み、コストをかける事でしかデータを作成できなくなる。

1. コスト書ける事でしか作れない = 希少性
2. 改竄できない = 信頼性がある

```
希少性 + 信頼性 + ビットコインという新技術への期待感 => 値段
```

後発で真似したシステムを作っても、期待感がともわないので値段がつかない。
希少性と信頼性だけではだめ。
0から信用を創造するシステムではない。

通貨の条件と言われる「価格が安定していること」という点は満たさないので、通貨よりも価値の保存に適していると考えるのは妥当な見方だと思う。

#パブリックチェーンと許可制ブロックチェーンの違いは？

解決する課題が全く違う。
ここで一旦、ブロックチェーンという技術について言葉を整理する。

1. ハッシュによりデータを連結させる構造(いわゆるBlockchain)はGitで使われているのとほぼ同じような構造で前からあった。
2. プルーフ・オブ・ワークと言って、暗号的な仕組みで電子データにコストを付与する仕組みもずっと前からあった。
3. 1 + 2を組み合わせる事でできたビットコインが革命だった。

以降、単なるハッシュ構造で連なったデータをいわゆるBlockchainを**ハッシュDB**と呼ぶ。
ビットコインのBlockchainを**ブロックチェーン**と呼ぶ。

#**ハッシュDB**と**ブロックチェーン**

**ハッシュDB**は、AとBのデータが同じかどうかを効率的に検証する仕組み。
**ブロックチェーン**は、全く信頼できない不特定多数のネットワーク間でも、信頼できる情報交換ができるのか？という問題,ビザンチン将軍問題を解決する。
つまり、信用に依存しないシステム運用技術を発明した。

#パブリックチェーンとは
**ブロックチェーン**を用いた信用に依存しない通貨運用システム。
スマートコントラクトを組み込むと、システムのロジックも信用に依存せず、客観的に明らかなシステムの執行が可能となる。
ただし、保証されるのはシステムのコードが適切に動く事だけなので、現実での契約執行が保証されるわけではない。ブロックチェーン上の通貨の移動は確実に保証される。

#許可制ブロックチェーンとは
不特定多数ではなく、A,B,Cといった特定の人の間で合意を取りながら運用するシステム。
解決する課題は「相手が信用できないからシステムの運用を一緒に合意を取りながら進めたい」。
**ハッシュDB**を使う事で、A,B,CのDBが同じ値だよねって確認する。
**ハッシュDB**は単なるDBの比較の効率化ツール。また、合意を取る手法は別にアルゴリズムを使わなくても、多数決システムでも課題は解決できるので、なんらイノベーティブではない。

#じゃあ、許可制ブロックチェーンに意味ないの？
多くの誤解と誇大広告にまみれているもののそんなことはないと思っている。
ビットコインの革命に触発された「分散型が素晴らしいはず！」という思想の革命がブロックチェーンブームの本質。

決して課題解決から出発したテクノロジーではないものの、分散的な仕組みで物事を作り直そうちう思想的なチャレンジ。

また、Raftなどの分散DBの仕組みが存在していたのはここ最近のこと。

それに加えて散型の思想で考え直した結果、何か新しいものが生まれる可能性はなきにしもあらずではなかろうか。
【知らずに損した】ActiveSupportの期間指定メソッドall_day, all_week, all_month, all_year

## はじめに
**期間を絞って**データをいじくりたいあなたに。

Railsアプリケーション作成時、**「もっと早く知っていれば！」**と後悔したメソッドたちの紹介です。

## この記事が役に立つ方
- ActiveSupportの存在をあまり認識せずに
- Ruby on Railsアプリケーションを作成している
- Rails初心者

## この記事のメリット
- 「きっと誰かがこの操作のメソッド作ってるよね！先に用意されていないか探そう。」という思考になることが出来る。
- 期間指定で工数の削減が出来るようになる。

## 環境
-  OS： macOS Mojave version 10.14.6
* シェル： zsh
* Ruby 2.6.3
* Rails 6.0.1

## 背景
**投稿の背景**は以下の通りです。

自作の**学習時間記録アプリ**にて日、週、月それぞれで範囲指定をして計算したいシーンに遭遇。
↓
DBに専用のカラムを設けたり、変数を沢山作ったりして実装。ムダが多い気がしてリファクタリング方法を探す。
↓
実装後、**ActiveSupport**に超便利メソッドがあることが発覚。工数のムダに超ショックを受ける。
↓
反省してQiita投稿することにしました。

## 各メソッドの紹介
### 前提
- `rails console`で実行
- gem`pry-rails`を使用

```ruby
$ rails c
Running via Spring preloader in process 8066
Loading development environment (Rails 6.0.1)
```

基準となる変数`now`は以下のようにして、予め用意します。

```ruby
now = Time.current
```
↓

```ruby
Thu, 07 Nov 2019 14:15:57 UTC +00:00
```

### `all_day`
【出力】今日の日付で、00:00:00から23:59:59まで

```ruby
now.all_day
```
↓

```ruby
Thu, 07 Nov 2019 00:00:00 UTC +00:00..Thu, 07 Nov 2019 23:59:59 UTC +00:00
```



### `all_week`
【出力】月曜始まりで、その日を含む週の全範囲。

```ruby
now.all_week
```
↓

```ruby
Mon, 04 Nov 2019 00:00:00 UTC +00:00..Sun, 10 Nov 2019 23:59:59 UTC +00:00
```


### `all_month`
【出力】その日を含む月の全範囲。2月など、日数が少なくても、うるう年でも自動で算出してくれる。

```ruby
now.all_month
```
↓

```ruby
Fri, 01 Nov 2019 00:00:00 UTC +00:00..Sat, 30 Nov 2019 23:59:59 UTC +00:00
```


### `all_year`
【出力】その日を含む年の全範囲。

```ruby
now.all_year
```
↓

```ruby
Tue, 01 Jan 2019 00:00:00 UTC +00:00..Tue, 31 Dec 2019 23:59:59 UTC +00:00
```


## 活用例
### その週の累計学習時間を算出したい
冗長すぎてお恥ずかしい限りですが、比較対象として元の自分のコードを掲載します。

####【Before】11行

```ruby
  @today = Date.today # 今日の日付を変数に代入
  @daily_records = DailyRecord.all # 日別の記録テーブルを全て変数に代入
  
	@day_of_week = @today.cweek # 今日の日付の曜日を変数に代入
  case @day_of_week
  when 0 # デフォルトでは日曜が"0"で土曜が"6"
    @day_of_week = 6  # 月曜はじまりにしたいので、日曜を"6"とする
  else
    @day_of_week - 1 # それ以外の曜日は月曜はじまりにするために１つずらす
  end 

  @weekly_records = @daily_records.limit(7).order('id DESC') # 直近の日別記録を最新のものから7日分抽出し、変数に代入
	@weekly_min = @weekly_records.where(days_of_week: 0..@thisweek).sum(:daily_total) # 月曜から今日までの学習時間(daily_totalが日別の学習時間を表すのカラム）を合計する
```

これを、先程の`all_week`を活用して書き換えたのが以下コードです。

なんということでしょう！たったの3行！**7行も削減**！
しかも何をやっているのか**分かりやすい**。

####【After】3行

```ruby
@today = Date.today
@daily_records = DailyRecord.all
@weekly_min = @daily_records.where(date: @today.all_week).sum(:daily_total)
```


## おわりに
工数の無駄に超ショックを受けつつも、またひとつ勉強になりました！

自分が考えること
||
先人が既に考えている
||
**「メソッドとして用意されている」**

今後はまず、「これ、解決出来るメソッドあるんじゃないか？」と考えてムダを省くクセをつけていきます。

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Rails開発をもっと楽しくする便利メソッド集 - 動かざることバグの如し](https://thr3a.hatenablog.com/entry/20181206/1544099172)
[Active Support コア拡張機能 - Rails ガイド](https://railsguides.jp/active_support_core_extensions.html)
rails 発展その1　ルートパス　ページネーション 　データの並び替え　部分テンプレート

## ルートパス
今までは、local:host3000/コントローラ名
又はlocal:host3000/コントローラ名/アクション名でページに遷移していたが
local:host3000だけで初期ページに移動するようにできるようにする。

```ruby:routes.rb
  Rails.application.routes.draw do
    root  'コントローラ名#アクション名'
  end

 # 例 root 'home#index'
```

## データの並び替え
コントローラーで取得したデータの並び替え
```ruby:コントローラー 
  def アクション
    @テーブル名 = モデルクラス名.all.order("id DESC")
  end

 # 例 @items = Item.all.order("id DESC")
```

## ページネーションの実装
データが一定以上になると複数のページ化する処理です。

```ruby:gemfile
  gem 'kaminari' 
　#これをgemgileに書き込み
```
```ターミナル:ターミナル
  $ bundle install 
　#　pwdで当該ファイルを確認し実行
```

```ruby:controller
  変数名 = クラスを利用して取得したレコードのインスタンス.page(params[:page]).per(ここに1ページで表示したい件数を入力)

#例 @tweets = Tweet.order("created_at DESC").page(params[:page]).per(5)
```

## 部分テンプレート
ビューの中に他のビューファイルの内容を持ってくる方法
headerやfooderなど他ページでも多様するのに便利な方法です。

**その1、_を頭につける**
_header.html.erb
_fooder.html.erb
_bubun.html.erb

**その2、html.erbに書く**

```html:hmtl.erb
　<%= render partial: "部分テンプレート名(_無し)", locals: { 変数: 代入値 } =>
　<!--作成例-->
  <%= render partial: "header", locals: { home: room } %>
```

```html:hmtl.erb
　<!--繰り返し構文の場合-->
　<% @homes.each do |home| %>
    　　<%= render partial: "部分テンプレート名'(_無し)", locals: { 部分テンプレート内での変数: 繰り返し構文の変数 } %>
  <% end %>

　<!--作成例-->
　<% @homes.each do |home| %>
    　　<%= render partial: "bubun", locals: { tweet: tweet } %>
  <% end %>
```
SQLをやればかなりビジネスが理解できそうだと思った

SQLは無秩序で無価値なデータの集合を、秩序をもたせて意味のあるデータに変換するツールだと思います。

では、「意味のあるデータ」とは？という話になるかと思いますが、これはまさにビジネスを考えるということだなーと思った次第です。
年末まで毎日webサイトを作り続ける大学生 〜20日目 CSSの5つのpositionとfloatを勉強する〜

##はじめに
こんにちは！最近週末は温泉に通っている@70days_jsです！
webサイト制作でお金を稼ぐために年末まで毎日webサイトを作っております。
はや20日、、、もっとテンポアップせねば。。。だが基礎をおろそかにはできない。。。というジレンマの中にいます。
今日はサイトデザインをする上で欠かせないpositionとfloatを学びました！
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は20日目。(2019/11/7)
よろしくお願いします。

##サイトURL
- https://sin2cos21.github.io/day20.html

##やったこと

MDNのcssページでpositionとfloatを学びました。
先にpositionから説明します。

###position ~覚えるべき5つの位置~
まず前提としてpositionは要素の位置を変更できるプロパティですが、覚えるべき位置が5つあります。

【覚えるべき5つの位置】
1. 静的位置指定**（Static positioning）** ・・・デフォルト、通常フローの位置
2. 相対位置指定**（Relative positioning）**・・・通常フローから相対的な位置を指定できる
3. 絶対位置指定**（Absolute Positioning）**・・・通常フローから完全に外れて位置を指定できる
4. 固定位置指定**（Fixed ppsitioning）**・・・ブラウザのビューポートを基準にして位置を指定できる（つまり固定）
5.粘着位置指定**（Sticky positioning）**・・・振る舞いが位置によって変わる。置かれた場所を過ぎるまではstaticで、過ぎればfixedのように振る舞う


全体として性質的には相対位置 or 絶対位置の2つに分けられますね。
staticは普通通りの動きでこれはすべての要素のデフォルトなので置いといて、
**相対位置　→　relative
絶対位置　→　absolute, fixed
相対位置 + 絶対位置 →　sticky**

絶対位置はabsoluteとfixedの2つがありますね。何が違うのでしょうか？

【Absolute と Fixedの違い】
1. スクロールした時（absoluteは位置は固定にならない、fixedは固定）ナビバーならfixed
2. 基準位置が違う（absoluteは親要素またはview port、fixedは常にview port )

これも実際に見てみるとわかりやすいのでgifをご覧ください。（今日作ったのはこれです）↓
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/bd364679-5d35-6e34-05f5-3800cb4efb94.gif)

Absoluteは位置の指定は絶対ですが、固定ではありませんね。逆にfixedは固定です。
つまりナビバーに使うなら絶対位置でもfixedの方ですね。

positionの指定もとても簡単です。

```css
.fixed_positioning {
    position: fixed;
    top: 0;
    left: 0;
    ...
```
例えば上のはfixedですが、固定させたい要素のセレクタを指定し、positionプロパティにfixedの値を与えるだけでその要素は固定になります。

stickyも簡単です。

```css
.sticky_positioning {
    position: sticky;
    top: 0px;
    left: 0px;
```
positionプロパティにstickyの値を与え、要素がもともと設置されている場所がtopとleftで指定している位置までくるとそのまま固定になります。

###float ~あまり使われない~
というわけで次はfloatですが、flex boxやgridレイアウトが登場したおかげでfloatはあまり使われ無くなっています。唯一使うかなという場面は、画像の周囲にテキストを回り込ませたい時ぐらいだと思います。（雑誌風に）

floatは指定した要素を通常フローから外すことができます。ただ、スペースは確保するので、他の要素はそれを避けるようになるべく通常フロー通りに配置されるようになっています。

指定はとても簡単で、floatプロパティにどっちに浮かせるか値を与えるだけです。

```css
.float_group {
    float: left;
   ...
```

この場合だとleftを与えているので要素は通常フローから外れて左側に浮きます。

##感想
今日はとりあえずpositionとfloatの基礎ができたのでよかったです。ただ細かい部分はまだ分かっていないので、これから先問題に当たった時に都度解決する方針でいこうと思います。とりあえず今はwebサイト制作スキルを身につけて仕事を取りたい！ということで頑張っております。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。

##参考
1. CSS レイアウト入門 - Web 開発を学ぶ | MDN (https://developer.mozilla.org/ja/docs/Learn/CSS/CSS_layout/Introduction)

MDNさんありがとうございます！JS・CSSチュートリアルをマスターしてwebサイト制作の仕事を受注してみせます！
Teamsにプライベートチャネルが実装されました！

# Teamsにプライベートチャネルが実装されました！

　嬉しかったのでまとめ。

## 作り方

　普通にチャネルを作るのと同じく、「チャネルを追加」を選択し「プライバシー」項目で「プライベート」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/15df957e-315e-9b40-88a5-7a8d6077b850.png)


　出来上がったプライベートチャネルには、このように南京錠アイコンがつくのですぐわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/4cf70e44-d8a1-5621-9011-1c345c50c8fb.png)

　メンバーの追加は、チームのメンバー追加と同じようにできます。複数プライベートチャネルを作ると、それぞれに対して権限の割り当てが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/69684180-cbed-e1dc-4058-178502bd172f.png)

　なお、プライベートチャネルにはWikiタブはないようです。（使わなくて毎回消しているからむしろ助かりますが…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/d4e5e01d-61fd-bd35-eeca-ffaab459b4a2.png)

　プライベートチャネルの権限がない側は、以下のように全く存在に気づけません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/d8b26161-18c7-b07d-9846-5d3e0a3bb317.png)



## 注意点など

- すでにあるチャネルはプライベートチャネル化できない
- 逆にプライベートチャネルを普通のチャネルにできない
- そのチームに参加していないメンバーはプライベートチャネルに呼べない
- Plannerが表示されない
- プライベートチャネルへのリンクは取得できない
    - メンバーを呼ぶときに工夫が必要そう
SQLを勉強して思ったこと

SQLを勉強することになり、昨日からProgateで勉強している程度のエンジニアです。

SQLを勉強して思ったことがいくつかあったので、そのメモです。

- 文法自体はシンプルであることがわかった
- 難しいとすれば、SQLに書き起こす前段階の設計
- いまは教材で学んでいる段階なので実行結果の正誤判定ができるが、実務ではできないので、「この値は果たして妥当だろうか？」と問うクセをつけておいた方がよさそう
- 実務の観点で想像するとあと大事なのは、SQLの前段階の設計のそのさらに前段階の、「意味のあるデータとは？」を問う力だと思う
- そう考えると、SQLはできて当然で、脳内で組めるくらいになる必要がある

SQLはスポーツに似ている気がします。知識ではなく、経験がものをいいそうだとなんとなく思っています。
頑張ります。
spacemacsでenv: node: No such file or directoryみたいな環境変数の問題が起きた時

要は、spacemacsを使っていて `環境変数系のエラー`が起きた場合。

`.spacemacs.env` ( `Space f e e`)に原因があるかも。

# spacemacsにおける環境変数の扱い
spacemacsは初回起動時の環境変数を `.spacemacs.env`にコピーし、以降はそちらを読み込むらしい。
参考 [ayato-p - Spacemacsで環境変数が読まれなくて困った](https://scrapbox.io/ayato-p/Spacemacs%E3%81%A7%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%8C%E8%AA%AD%E3%81%BE%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%A6%E5%9B%B0%E3%81%A3%E3%81%9F)

つまり「spacemacsを初回起動した後に `nvm`とか `node`とかをインストールして使っている」場合、 **PC本体にnvmやnodeの環境変数があるのに `.spacemacs.env`にはその環境変数が無いのでspacemacsでは読み込めない** …が発生する。

たとえば `nvm`で `node`を使い `es-lint`をかけてもらおうとした時、spacemacsではこういうエラーが出た。

```
prettier errors:
env: node: No such file or directory
```

そして `.spacemacs.env`では `nvm`に関する環境変数 `VMDIR`や、 `node`に関する `Path`が無かった😇





# 対処
`.spacemacs.env`冒頭の説明を参考にする。

> 
 # You can safely edit this file and tweak the values or remove the duplicates,
 # Spacemacs won't overwrite it unless you call the function
 # `spacemacs/force-init-spacemacs-env'.

つまり関数 `spacemacs/force-init-spacemacs-env`を呼び出せば上書きできる。

たとえば `.spacemacs`で以下のように追記すると、設定ファイルを読み込む度に環境変数も読み直してくれる（はず）。

```
(defun dotspacemacs/user-config ()
  ;; 環境変数を更新（.spacemacs.envを書き換える）
  (spacemacs/force-init-spacemacs-env)
  
  )
```

基本的にはこれで完了。





# 余談
Windowsの場合はなおも読み込まなかったり手強いので、もう `.spacemacs.env`のPATHに直接追記して上書き保存してしまう手もある（実際そうした）

**なぜかprettierが効かなかった**ので、もしやnodeのPATHではと疑い `.spacemacs.env`のPATHに `使用しているnodeバージョンへのパス`を追記したらﾁｮｯﾄ動いた。

たとえばユーザ `v2okimochi`がnvm-windowsを使っていてnode v10.14.0のとき、 `C:\Users\v2okimochi\AppData\Roaming\nvm\v10.14.0`をPATHに加えればﾁｮｯﾄ動く。

なぜﾁｮｯﾄかというと、フォーマット違反の検出はしてくれるのに **自動整形はしてくれない**から。 `typescript-fmt-on-save t`があるのにどうして😇

ちなみに`typescript-linter 'eslint`を明示しないとなんと検出すらしてくれなかった。ひどい。。。。。
Python初心者が「Python文法詳解」を読んだメモ #3

# バックナンバー
- [Python初心者が「Python文法詳解」を読んだメモ #1](https://qiita.com/usayomo/items/7024c619c5f72462cb10) 
- [Python初心者が「Python文法詳解」を読んだメモ #2](https://qiita.com/usayomo/items/9c1537678bdde813a273)

今日は短めですが、少しずつでもやっていこうと思います。
写経メインでサクッと。

```py:累積代入文
>>> spam = 10
>>> spam += 100
>>> spam
110
>>> spam -= 60
>>> spam
50
>>> spam *= 10
>>> spam
500
>>> spam /= 2
>>> spam
250.0
>>> spam //= 3
>>> spam
83.0
>>> spam %= 10
>>> spam
3.0
>>> spam **=4
>>> spam
81.0

# ビット演算
>>> spam = 1024
>>> spam >>= 2
>>> spam
256
>>> spam <<= 2
>>> spam
1024

>>> spam = 0b11110000
>>> spam
240
>>> spam &= 0b00001111  # ビット論理積
>>> spam
0

>>> spam = 0b11110000
>>> spam ^= 0b00111100  # ビット排他的論理和
>>> spam
204   # 0b11001100

>>> spam = 0b11110000
>>> spam |= 0b00001111  # ビット論理和
>>> spam
255  # 0b11111111
```

```py:変数名はかなり自由度が高い
# こんなこともできるし（別にやりたくないけど）
>>> スパム = 10
>>> def ハム(卵):
...     return 卵 * 3
... 
>>> ハム(スパム)
30

# これもあり
>>> π = 3.14
>>> V = A * Ω

# 大文字と小文字は区別される
>>> spam = 10
>>> Spam = 20
>>> spam
10
>>> Spam
20

# 以下の変数名は全て有効
>>> _spam = 1
>>> スパム = 1
>>> 卵 = 1
>>> Ｓｐａｍ = 1

# 以下の変数名は全て無効
>>> $pam = 1    # 記号始まり
>>> 1スパム = 1  # 数値始まり
>>> １spam = 1  # 全角数値始まり
>>> スパム。 = 1 # 句読点はNG

# 変数名として使えるか判定することもできる
>>> 'Ｓｐａｍ'.isidentifier()
True
>>> '♪'.isidentifier()
False

# ただし、名前はUnicode標準の正規化形式KCに正規化されるのでこうなる 関数名も同様
# 要するにやらないほうがいい
>>> ｽﾊﾟﾑ = '半角'
>>> スパム = '全角'
>>> print(ｽﾊﾟﾑ)
全角
>>> print(スパム)
全角
```

```py:or
# orは「真」の値が返ってくる
>>> 1 or 0
1
>>> 0 or 2
2

>>> 0 or 0.0
0.0  # どちらも「偽」の場合は右辺の値が返ってくる

>>> 1 or 2
1  # どちらも「真」の場合は左辺の値が返ってくる
   # この時、「2」は評価すらされていない（この評価省略を「ショートサーキット」と呼ぶ）


# 実用例
>>> if x:      # このif文は
>>>     z = x
>>> else:
>>>     z = y

>>> z = x or y # こう書ける
```

```py:and
>>> 1 and 2
2    # 両方「真」なら右辺の値が返ってくる
>>> 0 and 1
0    # どちらかが「偽」なら「偽」の値を返す（ここでも1はショートサーキットされている）
>>> 1 and 0.0
0.0  # どちらかが「偽」なら「偽」の値を返す
```

```py:not
# notはbool型の値を返す
>>> not 1
False
>>> not 0
True
```
amazon forecastやってみた - 4. 学習結果の確認（最終回）

# はじめに
今日イベントでAmazon forecastで時系列予測の事例紹介を見たところ
とてもお手軽にできそうな感じがつかめたのでその日のうちにやってみた。
参考：https://dev.classmethod.jp/cloud/aws/amazon-forecast-getting-start/

大きな流れはコチラ。
　1. 学習データを取得する
　2. 学習データのインポート
　3. amazon forecastの設定
　4. 学習結果の確認　←今回はココ！

# 4. 学習結果の確認

いよいよ最終回。学習結果の確認。
Forecast generate [start]クリック
![キャプチャ31.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d743eb66-2c62-129d-62ec-0d2c4d824d47.png)

予測結果の生成画面
適当に名前を決めて[Create a forecast]クリック。
![キャプチャ32.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/3fa28327-2ed6-eeca-0f34-3a67b83d8fb3.png)

出力結果の設定画面。
親切なことに、過去データ（＝実データ）を含む期間表示を指定できる。範囲は先の学習時の画面で設定した"forecast horizon"の値によるけど、今回は2019/9/1～2019/11/30で範囲指定できた。
※実際は範囲指定悩まなくても無理な範囲を指定したら日付指定エラーで止めてくれて且ついつまでの日付ならＯＫなのか支持してくれるので難しく考えずにスパッときめたらいい。
![キャプチャ33.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/95277c17-75d9-9ed2-fe14-13f65a926b51.png)

で、結果がコチラ。地元民だから当然わかってることだけど季節は秋なので、上がったり下がったりを繰り返しながら徐々に寒くなります。みたいなグラフなった。さすがamazon forecast。
![キャプチャ34.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/cbe00fdb-5e79-d96e-9c74-7d57279c5aec.png)

ちなみに3本線があるのが詳しい説明は省くけど
真ん中が平均的な予測で、上が上位１０％の予測（要するに上振れのＭＡＸ）で下が下位１０％の予測（下振れのＭＡＸ）になる。

これでわかるのは12月に入ると15度を下回りそうだから
あったかくして外に出ようね。
と極めて普通の予測が立つわけですね。
以上がamazon forecastの設定から学習結果の確認までの流れです。

# おわりに
amazon forecastのおかげで、本当にプログラムを知らない人でも時系列予測ができてしまうようになるなと思った。
もちろんデータを加工する必要があるのは変わりないけど、
それって一般の事務職の人でもやれるので
自分が小売りの自営業やるなら、売り上げデータの予測を
amazon forecastに与えて、在庫の発注とかやると思う。
それくらい楽。

あとパッと思いつくインフラのリソース予測をこれで立てて
スケールアウトの予測を立てるのも面白いかもしれない。

会社の予算作成もこれ使ったら簡単にできるんじゃないの？
なんて思ったりする。いっそこれを使ってみてほしい。
ほんとに提言したら叱られそうだけど。。。




～おしまい～
rails-erdで指定したテーブルのみでER図を描く方法

# 概要
* railsアプリでER図を自動生成する際に利用するrails-erd
* 一部のテーブルのみだけでER図を作りたい場合の解決方法を記載する

# 背景
* サービスが拡大してテーブル構成がかなり複雑になってしまい、ER図をそのまま出力すると何が何やらの状態になってしまった
* 一部のテーブルの関係性のみを可視化してわかりやすい形で出力したかったため、調査

# 方法
## .erdconfigを使う
   
* [Rails ERD - Configuration](https://github.com/voormedia/rails-erd#configuration)
* 抜粋
  > Rails ERD has the ability to be configured via the command line or through the use of a YAML file with configuration options set. It will look for this file first at ~/.erdconfig and then ./.erdconfig (which will override any settings in ~/.erdconfig). The format of the file is as follows (shown here with the default settings used if no .erdconfig is found). More information on customization options can be found in Rails ERD's project documentation.

* railsアプリのリポジトリルートに.erdconfigを配置(~/.erdconfigでもいいけど、こんな使い方する人はいなそう）
* 以下のような内容を記述

  ```yaml
  only:
    - Product
    - Order
    - Customer
  ```
* あとは`bin/bundle exec erd`などど通常のコマンドを打てばよい

## コマンドラインオプションで指定
* [Rails ERD – Customisation options](https://voormedia.github.io/rails-erd/customise.html)
* 以下のようにコマンドを実行

    ```shell
    bin/bundle exec erd --only="Product,Order,Customer"
    ```
* 少数のテーブルで軽く確認してみたい程度ならこちらの方が使い勝手がよさそう
11月8日資料

Unity PlayGroundのサンプル「Defender」を改造して、オリジナルのシューティングゲームを作ってください

<b>Defender</b>
![20181215000943.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/7dfc17ac-f8e9-6156-9bf0-4661f36f7ebf.jpeg)

<b>改造例</b>
![スクリーンショット (304).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/30cbb523-e8ed-24cc-9c08-a1be4ec6e4c5.png)

動画　https://youtu.be/0MeOkgu8UgU

コンポーネントシート（日本語）https://drive.google.com/file/d/13oxhzeWh9mLOdFVS-ZEuqXXqtlOaEAdP/view?usp=sharing

コンポーネント一覧（日本語）https://docs.google.com/document/d/1xiWggQ5sdn8NRQxH-oiv3bR9rRJxgTmMioG5wEl74ls/edit?usp=sharing

コンポーネント一覧（英語）https://learn.unity.com/tutorial/playground-reference-guide?projectId=5c5147e8edbc2a002069444e#

ヒント
・「Meteor」prefabの「Sprite Renderer」にある「Sprite」のイメージを変えると、隕石のビジュアルが変わります

参考URL　http://www.asset-sale.net/entry/Unity_Playground