OmniAICreator/Qiita-1.07M huggingface dataset:
ReactアプリをFirebaseにデプロイしたらBlankページしか表示されない

##はじめに
Reactでポートフォリオを作成して[Heroku](https://jp.heroku.com/)で公開していました。しかしHerokuには無料枠があり、常時起こし続けているわけにもいきません。
そこで[Firebase](https://firebase.google.com/)にデプロイをしてHostingをしてもらおうと企みました。


デプロイまでは順調だったのですが、指定されたURL開いてもなぜかBlankページしか表示されませんでした。

|<img width="802" alt="スクリーンショット 2019-11-13 21.08.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516709/db301501-f0ff-fb7b-fb1c-0e4a8fa47d0b.png"　border="1">|
|:-:|


##環境
- Mac OS X EL Capitan 10.14.5
- react＠16.11.0
- react-dom＠16.11.0

FirebaseでHostingする方法はQiitaの以下の記事を参考にしました。
[（初心者向け）Firebase HostingへReactプロジェクトを公開する手順](https://qiita.com/junara/items/74801923ca108b328b26)


##課題
デプロイしたアプリのコンソールを確認すると、以下のようなエラーが出ていました。

|<img width="248" alt="スクリーンショット 2019-11-13 21.08.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516709/a2665aad-9faf-8b4f-32fa-6c847d08a529.png">|
|:-:|

`SyntaxError: Unexpected token '<' `
しかしエラー内で指定されているファイルはReactでビルドを行なった煩雑なものであり、読んでも全くわかりません。

##解決策
どうやら直前にGitHub Pagesにデプロイしようとして中断したのが悪さをしていそうです。

```JSON:package.json
{
  "homepage": "https://[username].github.io/[work]/",
}
```

この部分をFirebaseのデプロイ時に取得したURLに書き換えて再度ビルドしました。

```JSON:package.json
{
  "homepage": "https://[プロジェクトID].firebaseapp.com/",
}
```

ビルドが終わったら再度デプロイしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516709/9dae5691-e448-51bf-d7b5-5dbebd7022fc.png)

うまくサイトが表示された！

##終わりに
ポートフォリオサイトはFirebaseで公開中です。
[ポートフォリオ](https://clever-spirit-225313.firebaseapp.com/)

あれ？ デプロイできたのに真っ白で何も表示されないぞ？ と困ったら1度pacage.jsonの中身を覗いて見ると謎が解けるかもしれません。

##参考記事

Stack Overflow
[Create-React-App build - “Uncaught SyntaxError: Unexpected token <”](https://stackoverflow.com/questions/54340240/create-react-app-build-uncaught-syntaxerror-unexpected-token)
CSSだけでアコーディオンメニューをつくる。 ❏CSS❏

#アコーディオンメニューとは

こんな感じのやつ。ドロップダウンとも言うのかな。

![912cffc4f8233a40de97fff072232a33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/d497d43b-52fc-2e96-75f5-65bca2245886.png)

#やってみよう！

inputタグのcheckboxを利用します。

```html:xxx.html.erb
<div class="accbox">
   <label for="label1">クリックして表示1</label>
   <input type="checkbox" id="label1" class="cssacc" />
   <div class="accshow">
      <!--ここに隠す中身-->
      <p>
        こんにちは1
      </p>
   </div>
</div>
```

```css:xxx.scss
.accbox input {
  display: none;/*チェックボックスを隠す*/
}

.accbox .accshow {
    height: 0;/*高さを0に*/
    padding: 0;/*余白を0に*/
    overflow: hidden;/*非表示に*/
    opacity: 0;/*中身を透明に*/
    transition: 0.8s;/*クリック時の動きを滑らかに*/
}

.cssacc:checked + .accshow {
    height: auto;/*クリックで高さを加えて中身を表示*/
    padding: 5px;
    background: #eaeaea;
    opacity: 1;
}

```

基本の流れは、
①チェックボックスを隠す
②中身を隠す
③クリックしたら中身を表示させる
この3つです。

.cssacc:checked + .accshowは見慣れないと思います。
○ ＋ △とすると
○のすぐ後の要素△のみにCSSをあてるというものです。
この場合、チェックが入ったinputタグのすぐ後のdivタグを表示します。

<br>
<br>
ではまた！
【Terraform-01】keypairを使ってパスワードレスでSSH

#はじめに
タイトルそのまま、公開鍵と秘密鍵を使ってパスワードレスでEC2にSSHします。
ただそれだけなのですが、Terraformを使って構築したのが原因でハマりました。。
戒めの備忘録です。環境はmac。

#先に結論
Terraformの[aws_key_pair](https://www.terraform.io/docs/providers/aws/r/key_pair.html)はimportしかサポートしていないので、パスワード無しで生成した公開鍵を使ってコード化する必要がある。

#参考にしたサイト
下記サイトを参考にさせて頂きました、この場を借りてお礼申し上げます:pray:
Terraformを使わない場合の手順は下記サイトをご参考頂ければと思います！

[sshの鍵をTerraformで扱う
](https://gside.org/blog/2016/11/06/lazyblorg-entry/)[SSH公開鍵認証で接続するまで
](https://qiita.com/kazokmr/items/754169cfa996b24fcbf5)[ssh-copy-idで公開鍵を渡す
](https://qiita.com/kentarosasaki/items/aa319e735a0b9660f1f0)[sshで公開鍵認証を使ってアクセスする
](https://qiita.com/mountcedar/items/43157ff1225c56500655)

#作業開始
##公開鍵と秘密鍵の生成

```
$ pwd
/Users/okome/.ssh
$ ssh-keygen -t rsa -f okome_id_rsa
$ ls -l
-rw-------  1 okome  okome  1843 Nov 15 20:30 okomne_id_rsa
-rw-r--r--  1 okome  okome   412 Nov 15 20:30 okomne_id_rsa.pub
$ cat okome_id_rsa.pub
ssh-rsa #ハッシュ値は省略します
```

秘密鍵(okomne_id_rsa)のパーミッションは600が必須です。

##コード化
今回はkeypair.tf（拡張子が.tfであればファイル名は任意）に、先ほど作成した公開鍵を指定します。
コードはgithubにupしておきました。

リソース名の"this"とkey_nameの"this-key"は任意の値でOKです。

```
$ cat keypair.tf 
# okome_id_rsa.pub(password less)
resource "aws_key_pair" "this" {
  key_name = "this-key"
  public_key = "[okome_id_rsa.pub]の値をコピペする"
}
```

コード化の後はterraform applyでEC2インスタンス（とVPCとかのNW）を構築します。

##.ssh/configの作成

SSHを楽にすべく、以下のファイルを作成します。

```
$ /Users/okome/.ssh
$ vi /Users/okome/.ssh/config
Host okome01
  HostName     [EC2インスタンスに付与したパブリックIP]
  Port         22
  User         ec2-user #AmazonLinux2の場合
  IdentityFile ~/.ssh/okomne_id_rsa
```

##EC2インスタンスにSSH

```
$ ssh okome01

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
40 package(s) needed for security, out of 72 available
Run "sudo yum update" to apply all updates.
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[ec2-user@ip-xx-xx-xx-xx ~]$
```

パスワード聞かれなかった！成功！

#おわりに
SGでアクセスを制限してるのでパスワードレスでも良いと思いますが、強固にしたい場合はパスワードあったほうが間違いないと思います。
その場合は鍵を生成する際にパスワードを入力すれば、それがそのままSSH実行時のパスワードになります。

```
$ ssh-keygen -t rsa -f okome_id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

ハマった原因は以前作成したパスワード付きの鍵をコード化してそれをすっかり忘れてた、ですね。。
一旦コメントに書くことで応急処置しましたが、できれば技術で解決したい！
ただしやり方はわからないw

簡単ですが以上です:innocent:
Ruby合宿2019夏に参加してきました

この度，8月19日～23日に島根県で開催された[Ruby合宿](https://www.rubycamp.jp/)2019夏に参加してきました．
本記事では，[Ruby合宿](https://www.rubycamp.jp/)の魅力を伝え，読者の皆さんに興味を持ってもらうことを目的としています．

#こんな人に読んでほしい
+ プログラミングのイベントに参加してみたい
+ 共同開発をしてみたい
+ Rubyが好き
+ Ruby合宿に興味はあるけど不安が大きい
+ 参加したいけどプログラミングに自信がない

###心配しなくて大丈夫
**私自身も合宿に参加するまで不安でいっぱいでした．**でも，**全然大丈夫！**
プログラミングの経験が少ない人もたくさん参加します．
さらに，合宿中は講師の方々から非常に手厚いサポートを受けられます．

---

#Ruby合宿とは
**Ruby合宿では、数名のチームでテーマに沿ったプログラムを協力して作成します．**

([公式サイトより](https://www.rubycamp.jp/))

##対象
**学生(大学・高専・専門学校・高校等)または25歳未満の求職中**の人で、以下の条件を満たす人

- チーム開発に興味のある人
- 将来，ソフト系IT産業で働きたいと考えている人
- 主催者が行うメール等でのアンケートにご協力いただける人

([公式サイトより](https://www.rubycamp.jp/))


##費用
**7,000円**

---

私が参加したRuby合宿2019夏のテーマは，「**島根県の名所をテーマとしたインタラクティブアニメーションアプリ**」でした．~~なんじゃそりゃ~~
要するにゲームです．(笑)

**みんなでゲーム開発！！楽しみ！！！**

# どんな感じでゲームを作るの？
**合宿の参加者には，ゲームのみならず，何かを開発した経験のある人はほとんどいません．**
私たちのグループも，”バリバリゲーム作れます！”なんて人はいませんでした．

##作るゲームを決める
**グループで作りたいゲームについての意見を出し合って，おおまかなゲームの内容を決めます．**
私たちのグループは「宝探しアクションゲーム」にしました．

##ゲームを作る
**グループで役割分担してゲームを作っていきます．**
プログラムを書く人，画像や音声を探す人，画像を編集する人などなど

##発表会
**合宿最終日にはグループで作った作品の発表会を行います．**
発表会には，島根の企業の方々もたくさんいらっしゃいました．

---
#その他良かったこと
- まつもとゆきひろ氏の生講演会
- Ruby合宿Tシャツがもらえる
- IT企業の方と交流できる
- IT企業を訪問できる
- ~~正しい生活習慣が身につく~~

合宿とは関係ないですが，帰りに松江駅で食べた出雲そばがとてもおいしかったです．（オススメ）

#さいごに
この記事を最後まで読んでくださりありがとうございました．
あなたが少しでもRuby合宿に興味を持ってくださると幸いです．

Ruby合宿への参加申し込みは[Ruby合宿公式サイト](https://www.rubycamp.jp/)でお願いします．
【AWS/RDS】今夜勝ちたいスロークエリログ出力

AWSにapi作ったんだけど（非公開）、相当数の同時接続時に速さが足りないと言われたんで、
とりま原因究明のためにRDS（MariaDB）からスロークエリログを吐き出してCloudWatchで眺めてみた。
その軌跡です。

深奥まで知る必要はないけどとりあえず**今夜勝ちたい**人向けです。
#環境
本記事は**AWS RDS（MariaDB10.2）**で試しています。
以降はこの前提で進めますがバージョン違いやMysqlでも基本同じな模様。
Auroraは若干微妙に違うので他の記事をご参照下さい。
# 作業工程
やることは大きく2つ。

- パラメータグループの設定（DBエンジンのパラメータ設定）
- ログエクスポートの設定（CloudWatchへの出力設定）

### tips
RDSでは新しくデータベースを作成する際に、エンジン毎にデフォルトで用意されているパラメータ＆オプショングループを選択できます。

できますが下記理由からオリジナルを作ることをお勧めします。（特にパラメータ）

- デフォルトグループは設定値が変更不可
- グループの付け替えは再起動が必要
 
## パラメータグループの設定
**「RDS > パラメータグループ > パラメータグループの作成」**より

1. パラメータグループを作成
2. 作成したパラメータグループを選択
3. パラメータの編集で以下の値を設定
    - slow_query_log = 1　（スロークエリ出力の有無）
    - long_query_time = 1 （スロークエリと判定する秒数。お好みで）
    - log_output = FILE　 (ログの出力方法)
  
グループ作成時のパラメータグループファミリーには使用するDBエンジンを指定。
他は適当でおｋ。（嘘、あとでわかりやすい名前を設定して）

デフォルトではslow_query_log=0（false）なのでスロークエリは出力されません。
また、log_output = TABLEの場合、DB接続して下記でログは参照可能です。

```
select * from mysql.slow_log
```
ちなみにここで設定した値は適用タイプが**dynamic**なので**即時適用**されます。
ここが**static**のパラメータは**DBの再起動**が必要です。
## ログエクスポートの設定
新規DB作成：**「RDS > データベース > データベースの作成」**より
既存DB変更：**「RDS > データベース > {当該DB} > 変更」**より

どちらの場合も下記を設定します。

- DBパラメータグループ = 作成したパラメータグループ
- ログのエクスポート > スロークエリログ = ON

新規作成の場合、**追加設定**というところに折り畳まれてるんで見逃してそのまま作成しないように気をつけてください。
俺はやった。

# 結果
これで**「CloudWatch > ログ」**に**/aws/rds/instance/{DB名}/slowquery**
というログが出力されるようになるはずです。

あとはスロークエリから遅延の原因を探すだけです！やったね！
僕は**クエリが原因ではなさそうと判定された**ので来週も戦い続けます。
シェルスクリプト 実行方法

以下のようなスクリプトがあった場合

```shell:hello-world.sh
#!/bin/bash
echo 'Hello World!'
```

##### スクリプトファイルとして実行
```shell
./hello-world.sh
```
- シェバング行（#!/bin/bash）が必要
- 実行属性が必要
- 新しいシェル上で実行される

##### シェルの引数として実行
```shell
sh hello-world.sh
```
- シェバング行（#!/bin/bash）が不要
- 実行属性が不要
- 新しいシェル上で実行される

##### 標準入力として実行
```shell
sh -s < hello-world.sh
```
- シェバング行（#!/bin/bash）が不要
- 実行属性が不要
- 新しいシェル上で実行される

##### . コマンドとして実行
```shell
. hello-world.sh
```
- シェバング行（#!/bin/bash）が不要
- 実行属性が不要
- 現在のシェル上で実行される
gem 'devise'に苦戦　プログラミング　37日目

##gem'devise'使う上で考慮すべきこと
**1.URLかぶり**

例えばdeviseをuserモデルに紐づけてinstallしたりすると以下のような(一部)routesが自動的にできます。



**URLかぶりとは？？**
userのアカウント情報を表示させるusers/showを作ろうと、get "users/:id" => "users#show"をroutesの設定しました。そうするとそれまでできていたlogoutがうまくいかなくなりました。その原因として考えた結論が、users/:idとdeviseで設定した他のusers/~~~が被ってしまっているということです。(あっているかは定か)

**usersはやめpages/:idにすることで解決しました。**

```
                   new_user_session GET    /users/sign_in(.:format)                                                                 devise/sessions#new
                         user_session POST   /users/sign_in(.:format)                                                                 devise/sessions#create
                 destroy_user_session DELETE /users/sign_out(.:format)                                                                devise/sessions#destroy
                    new_user_password GET    /users/password/new(.:format)                                                            devise/passwords#new
                   edit_user_password GET    /users/password/edit(.:format)                                                           devise/passwords#edit
                        user_password PATCH  /users/password(.:format)                                                                devise/passwords#update
                                      PUT    /users/password(.:format)                                                                devise/passwords#update
                                      POST   /users/password(.:format)                                                                devise/passwords#create
             cancel_user_registration GET    /users/cancel(.:format)                                                                  devise/registrations#cancel
                new_user_registration GET    /users/sign_up(.:format)                                                                 devise/registrations#new
               edit_user_registration GET    /users/edit(.:format)                                                                    devise/registrations#edit
                    user_registration PATCH  /users(.:format)                                                                         devise/registrations#update
                                      PUT    /users(.:format)                                                                         devise/registrations#update
                                      DELETE /users(.:format)                                                                         devise/registrations#destroy
                                      POST   /users(.:format)                                                                         devise/registrations#create
                                 root GET    /   
```
**2.いちいち編集ページなどは作らず既存のやつを使う方がいい**

そしてviewも手順どうりに進めるとdeviseフォルダができます。deviseのフォルダにはメールアドレス情報やパスワードを変更するページもあるためいちいち編集ページを作る必要はありません。ただ名前を登録するところがないのが不便です。
コマンドライン基本・早見表

#コマンドラインのコード早見表
Progateを参考に、自分用としても使えるように作成しました。
#ファイル作成
```
touch ファイル名
```
#ファイルの中身を表示
```
cat ファイル名
```
#ディレクトリ（フォルダ）を作成
```
mkdir ディレクトリ名
```
#ディレクトリを移動
```
cd ディレクトリ名
```
#現在作業しているディレクトリを表示
```
pwd
```
#現在作業しているディレクトリの中身を表示
```
ls
```
#ひとつ親のディレクトリに移動する
```
//ひとつ親のディレクトリに戻るには今までの様にcd　親のディレクトリ名　では戻ることはできません
cd ..
```
#ホームディレクトリに戻る
```
cd
```
#ファイルを移動させる
```
mv 移動させるファイル名　移動先のディレクトリ名
```
#ディレクトリごと移動させる
```
mv 移動させるファイル名　移動先のディレクトリ名
```
#ファイル名を変更する
```
mv 現在のファイル名　新しいファイル名
mv 現在のディレクトリ名　新しいディレクトリ名
```
#ファイルをコピーする
```
cp コピーするファイル名　新しいファイル名
```
#ディレクトリごとコピーする
```
\\-rが必要なのに注意しましょう
cp -r コピーするディレクトリ名　新しいディレクトリ名
```
#ファイルを削除する
```
rm 削除するファイル名
```
#ディレクトリを削除する
```
rm -r 削除するファイル名
```
AngularUniversalでクライアントのみ（サーバのみ）実行させる方法

AngularUniversalを利用している際に、クライアントのみもしくはサーバのみ実行する方法についてです。

## どういう状況で利用するか

例えば、Windowオブジェクトを利用した処理などでよく利用します。
以下のようにalertをする処理を入れたとします。

```javascript

export class PlatformComponent implements OnInit {

  msg: String;
  constructor() {}

  ngOnInit() {
    this.msg = 'platform';
    alert('Hello!!')
  }

}
```

すると、サーバサイドレンダリングをする際にwindow関数がないというエラーが発生してしまいます。

```console:
ERROR ReferenceError: alert is not defined
    at PlatformComponent.ngOnInit (/app/angular-universal/dist/server/main.js:526:9)
以下省略
```

このような時に、今回ご紹介するような方法でクライアント側でだけ処理をするように指定します。

## 修正方法

#### component.tsファイルでの指定
まずはcomponent.tsファイルでの分岐方法です。
`@angular/core` のPLATFORM_IDを利用することで、実行されている環境がクライアントかサーバかを判定することが可能です。

以下のように利用します。

```javascript:platform.component.ts
import { Component, OnInit, PLATFORM_ID, Inject } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';

@Component({
  selector: 'app-platform',
  templateUrl: './platform.component.html',
  styleUrls: ['./platform.component.css']
})
export class PlatformComponent implements OnInit {

  msg: String;
  isBrowser: boolean;
  constructor(@Inject(PLATFORM_ID) private platformId) {
    this.isBrowser = isPlatformBrowser(platformId);
  }

  ngOnInit() {
    console.log('this is ' + ((this.isBrowser)? 'Browser': 'Server'))
    this.msg = 'platform';
    if (this.isBrowser) {
      alert('Hello!!')
    }
  }

}
```

あとは、isBrowserメンバーを用意しておいて、ブラウザ・サーバで処理をわけることが可能です。

```console:サーバ側のログ
this is Server
```

```console:クライアント側のログ
this is Browser
```

#### component.htmlファイルでの指定
component.htmlファイルでも出し分けをさせることが可能です。
以下のように利用します。

```html:platform.component.html
<ng-container *ngIf="isBrowser">
    <p>{{msg}}</p>
</ng-container>
```

実行結果です。
ブラウザの実行結果

|![ブラウザ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406169/915744a0-7f5c-cbdf-1eda-7fe370af630f.png)|
|:-:|

サーバ側の実行結果
`view-source:http://localhost:4200/platform` で確認します。

```html:サーバから返却されたHTML
(省略)
  <app-root _nghost-sc0="" ng-version="8.2.13"><span _ngcontent-sc0="">This action returns all cats app is running!</span><p _ngcontent-sc0="">This is Body</p><router-outlet _ngcontent-sc0=""></router-outlet><app-platform _nghost-sc1=""><!----></app-platform></app-root>
(省略)
```

このように`<p>platform</p>`が出力されていないことが確認できます。

以上です。
【Kotlin】Sequence から最大値と最小値を同時に求める

記事「[Javaにおける入力した5個の数字の内、最大値と最小値を求める](https://qiita.com/GARA41679531/items/c81b57a56bfcb28f84a0)」を読んで
Java の Stream でやってみようと思ったが、
[reduce](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html#reduce-U-java.util.function.BiFunction-java.util.function.BinaryOperator-) の使い方が分からなさすぎて挫折。

Kotlin で復讐することにした。

```Kotlin
/**
 * シーケンスの最小値と最大値を返す。
 *
 * @param T シーケンスの要素の型。
 * @return シーケンスの最小値と最大値。シーケンスが空の場合は `null`。
 */
fun <T : Comparable<T>> Sequence<T>.minAndMax(): MinAndMax<T>? {
    // 拡張関数 `fold` 関数を使ってシーケンスの要素を1つの `MinAndMax` オブジェクトにまとめる。
    return fold(
        // 初期値は `null` とする。要素が1つもなければ結果は初期値のまま `null` となる。
        null as MinAndMax<T>?
    ) { minAndMax, element ->
        minAndMax
            // 最小値と最大値を更新する。
            ?.let {
                MinAndMax(
                    minOf(minAndMax.min, element),
                    maxOf(minAndMax.max, element)
                )
            }
        // `minAndMax` が `null` の場合、
        // 現在処理中の要素が1つめの要素ということになるため、
        // その値が最小値で有り最大値となる。
            ?: MinAndMax(element, element)
    }
}

/**
 * 最小値と最大値を保持するオブジェクト。
 */
data class MinAndMax<T : Comparable<T>>(
    val min: T,
    val max: T
)
```

使用例。

```Kotlin
import kotlin.random.Random

fun main() {
    // 0以上100未満のランダムな整数を要素として持つシーケンスを生成する。
    generateSequence {
        // 0以上100未満のランダムな整数を生成する。
        Random.nextInt(100)
    }
        // 10要素だけを持つシーケンスにする。
        .take(10)
        // シーケンスの要素を標準出力する。
        .onEach { println("$it") }
        // シーケンスの要素の最小値と最大値を求める。
        .minAndMax()
        // 最小値と最大値が求まった（`minAndMax()` の返値が `null` でなかった、シーケンスが空でなかった）場合、
        // シーケンスの要素の最小値と最大値を標準出力する。
        ?.also { println("min: ${it.min}, max: ${it.max}") }
    // 求まらなかった場合、シーケンスが空であった旨を標準出力する。
        ?: println("Empty sequence.")
}
```

出力例。

```
34
99
24
73
7
82
98
58
19
87
min: 7, max: 99
```

なお、分解宣言は意図的に使わなかった。
慣れない人には分かりにくいため。
Model名とController名が異なっていてもデータ移動はできるらしい　学習37日目

##〇〇モデルのデータは□□コントローラー上でも使える##

UserモデルのデータはUsersコントローラーで,Pageモデルのデータはpagesコントローラーでという**大きな思い込み**をしていた。(冷静に考えれば、application.html.erbはいろんなモデルからデータを取ってきている)

#勘違いしていたこと#

**1.モデルとコントローラーのデータのやり取りは、同じ名前同士で行う。←そんなことない！**

UserモデルのデータはUsersコントローラーで,Pageモデルのデータはpagesコントローラーでという**大きな思い込み**をしていた。(冷静に考えれば、application.html.erbはいろんなモデルからデータを取ってきている)

**2.controllerの内容を継承したければコピペする←それだけではない！**

確かにuserscontrollerの内容をそのままpagescontrollerでも使いたければ、コピペも１つの手段になる。しかしめんどくさいのでclassを継承をすれば良い(pagescontroller<userscontroller)

下記の例はpagesと名付けたshowのviewである。ここには@userを用いている。そしてその下はpagesコントローラーである。

```show.html.erb(pages)
<div class="container">
<div class="profile-card">
  <div class="profile-card__inner">
  <div class="profile-thumb">
    <img src="<%="/user_images/#{@user.image_name}" %>" class="user-image" alt="アイコン">  
    
    </div>
    <div class="profile-content">
    <span class="profile-name"><%=@user.name%></span>
    <span class="profile-job"><%=@user.email %></span>
    <span class="profile-intro"><%=@user.intro %></span>
    <%=link_to("編集する",edit_user_registration_path, method: :get) %>
    </div>
    </div>
    
</div>
</div>
```
```
class PagesController < UsersController
def index
    @users = User.all
end

def show 
    @user = User.find_by(id: params[:id])
end


def update 
    @user = User.find_by(id: params[:id])
    @user.name = params[:name]
    @user.intro = params[:intro]

    if params[:image]
        @user.image_name = "#{@user.id}.jpg"
        image = params[:image]
        File.binwrite("public/user_images/#{@user.image_name}", image.read)
      end
      
      if @user.save
        flash[:notice] = "ユーザー情報を編集しました"
        redirect_to("/pages/#{@user.id}")
      else
        render("users/edit")
      end
    

end

def edit
    @user = User.find_by(id: params[:id])
  end
  
end

```
↑↑Pagescontroller<Userscontrollerしてるからコピペしなくていい(しちゃってる悪い例)
@user = User.allは別にpagescontrollerでも使える
Githubに関する備忘録

#初めに
ローカルリポジトリからリモートリポジトリにpushする方法を備忘録として残します。

##初回編
```
$ git init
$ git add -A
$ git commit -m "自由にコメント"
$ git remote add origin リモートリポジトリのsshのURL
$ git push -u origin master
```

###解説
各コマンドを意味を記します。
####git init
現在いるディレクトリにgitに必要なファイルを生成させる
####git add -A
ファイルをインデックスに追加する
####git commit -m "自由にコメント"
追加時のメッセージを書く。
"○○○”に分かりやすいメッセージを書く。
####git remote add origin リモートリポジトリのsshのURL
originの後にスペースを入れてから、作成してあるリモートリポジトリのsshのURLをコピペする。
####git push -u origin master
ローカルリポジトリからリモートリポジトリにpushする。
###エラー
####error: src refspec master does not match any.
<img width="554" alt="スクリーンショット 2019-11-15 21.24.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453605/eb95bb02-c8cb-a1f8-8181-abc5c1c4e88b.png">
**```git commit -m "自由にコメント"```**を忘れている可能性があります。

####error: failed to push some refs to
<img width="549" alt="スクリーンショット 2019-11-15 21.29.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453605/113253c8-bfac-3056-a3ba-0e65364083c1.png">
私の場合はリモートリポジトリを作成時に、READMEを作成していたのでダブりが原因でした。
**```git push -f origin master```**を実行する事で、強制的にpushすることが出来ます。
**-fはフォース、強制力を持つ**


##2回目以降
```
$ git add -A
$ git commit -m "自由にコメント"
$ git push origin ブランチ名
```

##ブランチ系
```
git branch (ブランチを一覧)
git checkout ブランチ名 (ブランチを新規作成)
git checkout -b ブランチ名 (作成済のブランチに切り替える)
```
##ログ系
```
$ git log (コミット履歴を確認)
$ git status (ファイルの状態[追加/変更/削除]を確認)
```


##その他コマンド
###git clone
```
git clone リモートリポジトリのURL (リモートリポジトリのコピー)
git pull origin mater (ローカル側のmasterを最新状態にする)
```
クソコードあるあるを詰め込んだ「ひどいFizzBuzz」を書きました。

タイトルの通りです。
コードレビューの練習などにお使いください。

```ruby:hidoi_fizzbuzz.rb
print "数字を入力してください："
# 入力された数字をnに代入する。
n = gets.chomp.to_i

result = ""
number = 0

# ３の倍数かどうかを判定する。余りが０ならtrue、そうでなければfalse。
def fizz?(number)
  result = true
  if number % 3 == 0 then
    result = true
  else
    result = false
  end

  return result
end

# ３の倍数かどうかを判定する。余りが０ならtrue、そうでなければfalse。
def judge_buzz?(n)
  result = true
  if n % 5 == 0 then
    result = true
  else
    result = false
  end

  return result
end

# def fizzbuzz?(n)
#   result = true
#   if n % 15 == 0 then
#     result = true
#   else
#     result = false
#   end
#   return result
# end

# fizzbuzzを表示
if fizz?(n) == true then
  if judge_buzz?(n) == true then
      result = "fizzbuzz"
      puts result
    else
      result = "fizz"
      puts result
    end

elsif judge_buzz?(n) == true then

  result = "buzz"
  puts result
else
  puts n
end
```

（ちなみに僕はエンジニア歴１年程度のクソエンジニアです。こんなクソコードを実務で書いてしまわないように日々勉強しております・・・）
docker-composeでpostgresの設定を変更する方法

## 結論
docker-entrypoint-initdb.dディレクトリに`*.sql`, `*.sql.gz`, or `*.sh`ファイルを置くと、databaseを作成時に実行してくれます

## やりたいこと
開発時docker postgresとAWS RDSの設定が異なるので一致させたい
as is


```
 SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
        name     |  setting   |  context
    -------------+------------+-----------
     lc_collate  | en_US.utf8 | internal
     lc_ctype    | en_US.utf8 | internal
     lc_messages | en_US.utf8 | superuser
     lc_monetary | en_US.utf8 | user
     lc_numeric  | en_US.utf8 | user
     lc_time     | en_US.utf8 | user
(6 rows)
``` 

to be

```
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
    name     |  setting   |  context
-------------+------------+-----------
 lc_collate  | en_US.utf8 | internal
 lc_ctype    | en_US.utf8 | internal
 lc_messages |            | superuser
 lc_monetary | C          | user
 lc_numeric  | C          | user
 lc_time     | C          | user
(6 rows)
```


## スクリプトとdocker-compose.ymlの修正

今回は`init_db`ディレクトリ以下に`init_db.sh`ファイルを作成しました。
やっていることはコンテナ内の`/var/lib/postgresql/data/postgresql.conf`ファイルの中身を`sed`コマンドで書き換えています。
ディレクトリ名は`docker-compose.yml`のvolumesと一致していればなんでもよいです。

```sh:init_db/init_db.sh
#!/bin/bash

# 開発環境用のDocker postgresqlの起動設定を変更する
# 本番DBにあわせた設定にする

set -e

sed -i -e"s/^lc_messages = 'en_US.utf8'.*$//" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^lc_monetary = 'en_US.utf8'.*$/lc_monetary = 'C'/" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^lc_numeric = 'en_US.utf8'.*$/lc_numeric = 'C'/" /var/lib/postgresql/data/postgresql.conf
sed -i -e"s/^lc_time = 'en_US.utf8'.*$/lc_time = 'C'/" /var/lib/postgresql/data/postgresql.conf
```

volumesでホストの`init_db`ディレクトリをコンテナの`docker-entrypoint-initdb.d`ディレクトリにマウントします。
これでpostgresイニシアライズ時に↑で作成したスクリプトが実行されます。

```yml:docker-compose.yml
  postgres:
    image: postgres:9.5.15
    restart: always
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
      - ./init_db:/docker-entrypoint-initdb.d
```

## データベースを作り直す

どうやら作成し直さないと設定が変更にならない項目もあるようなので、データベースを作成しなおします

```bash
sudo rm -rf tmp/db

or

# railsなら
docker-compose run --rm web bin/rails db:drop
```

それでもうまくいかない場合はいったんimageなども削除したほうがよいかもしれません。
※以下はdockerのimagesを全削除するコマンドです。

```bash
docker rmi $(docker images -q) -f
```

## before
```sql
 SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
        name     |  setting   |  context
    -------------+------------+-----------
     lc_collate  | en_US.utf8 | internal
     lc_ctype    | en_US.utf8 | internal
     lc_messages | en_US.utf8 | superuser
     lc_monetary | en_US.utf8 | user
     lc_numeric  | en_US.utf8 | user
     lc_time     | en_US.utf8 | user
(6 rows)
``` 

## after

```sql
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
    name     |  setting   |  context
-------------+------------+-----------
 lc_collate  | en_US.utf8 | internal
 lc_ctype    | en_US.utf8 | internal
 lc_messages |            | superuser
 lc_monetary | C          | user
 lc_numeric  | C          | user
 lc_time     | C          | user
(6 rows)
```
成功です！
Go (Golang) リリース・サポート期限

# リリース・サポート期限

メジャーリリースは、2つ後のメジャーリリースが出るまでサポートされます。

| Version | Release    | Support |
|:--------|:----------:|:-------:|
| 1.14    | 2020/02/25 | Yes     |
| 1.13    | 2019/09/03 | Yes     |
| 1.12    | 2019/02/25 | No      |
| 1.11    | 2018/08/24 | No      |
| 1.10    | 2018/02/16 | No      |
| 1.9     | 2017/08/24 | No      |
| 1.8     | 2017/02/16 | No      |

# リリースノート

### 1.14
https://golang.org/doc/go1.14

### 1.13
Go 1.13 Release Notes - The Go Programming Language
https://golang.org/doc/go1.13

- Go Module Proxy

### 1.12
Go 1.12 Release Notes - The Go Programming Language
https://golang.org/doc/go1.12

### 1.11
Go 1.11 Release Notes - The Go Programming Language
https://golang.org/doc/go1.11

- Go Modules
【AWS EC2】bundler -v -bash: bundler: コマンドが見つかりません

#エラー文はこんな感じですか？

```
[ec2-user@ip-XXX-XX-XX-XX chat-space2]$ bundler -v
-bash: bundler: コマンドが見つかりません
```

#bundlerが入ってない場合
まずはbundlerをいれましょう。

```
$ gem install bundler -v 2.0.1
$ bundle install
```
バージョンはご自身のものに合わせて。

#rbenvが入ってない場合
```
$ rbenv install 2.5.1
$ rbenv global 2.5.1
$ rbenv rehash  #rehashを行う
$ ruby -v # バージョンを確認
```
こちらも、バージョンはご自身のものに合わせて。

#なぜこんな初歩的なミスの記事を書いたか
単純なことなのですが、初めてのことで
「EC2は失敗すると１から作り直すんだぞ！変なことすると重課金になるんだぞ！」
みたいな脅しも色々聞いてきたので、焦って難しく考えすぎてエラーの解決ができませんでした。

スクールに通う身で、この解決に取り組んでいただいたメンターさんにも「ちゃんとカリキュラム読もうね！（げんなり）」というようなありがたいお言葉（涙）

こんな簡単なことでも、解決策が検索で引っかかれば、
凡ミスはもっと早く解決できると思うんです。
なので私は恥をさらす。絶対にだ！
RaspberrypiをChromebookだけでSSHログイン

#RaspberrypiをChromebookだけでSSHログイン
##はじめに
RaspberryPiにキーボードとディスプレイをつないでセットアップするの面倒だよね。
特にRaspberrypi zeroは端子が少なく、映像出力もminiHDMIなのでディスプレイに投影しようとすると変換コネクタ購入することになったり。せっかく安く手に入れたからなるべくお金をかけずセットアップしたいな。
MacもWindowsも最近調子悪いしセットアップと簡単なコーディングならChromebookで行けるよね？ということでChromebook（とLAN）でまずはSSHログインするよ。

##準備するもの
Chromebook（私のaSUS Chromebook C100PA）
[ChromeOS Recovery Utility](https://chrome.google.com/webstore/detail/chromebook-recovery-utili/jndclpdbaamdhonoechobihbbiimdgai)
[ChromeOS Secure Shell App](https://chrome.google.com/webstore/detail/secure-shell-app/pnhechapfaindjhompbnflcldabbghjo)
Wi-Fiネットワーク
RaspberryPi（私はRaspberryPi zero w）
SDcard

##ゴール
ChormebookからRaspberrypiへSSH接続成功

##設定
###イメージダウンロード
https://www.raspberrypi.org/downloads/raspbian/
からイメージをダウンロードするよ。CUIなのでliteバージョンで十分だよ。
![Screenshot 2019-11-15 at 20.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/cc01c1a5-c8a5-3f24-af84-9c7a2e183703.png)
※Myhomecameraフォルダは気にしないでね

###メディアの作成
SDカードを差し込むよ。
Chromebookリカバリーユーティリティを起動して、ギアマークの中にあるローカルイメージを使用を選ぶよ。
![Screenshot 2019-11-15 at 20.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532736/b7e9ae0e-0f4c-20d7-c6d3-653244612579.png)
先程ダウンロードしたzipのイメージを選択して、リカバリーイメージを作成するよ。5-10分くらいかかるから待ってね。

作成が完了すると、SDカードの中にbootフォルダとrootfs（ファイルシステム）フォルダができていればOK。

###ssh、Wi-Fi設定ファイル追加
このままRaspberryPiにSDカードを差し込むと起動はできるけど、ディスプレイもキーボードもないので操作ができないよ。
リモートでSSH接続できるようにするために、初回起動時にsshとWi-Fiの接続を有効にしよう。

bootフォルダ直下にsshという空のファイルを作るよ。
これをおいておくとRaspberryPiが起動時にsshを有効にしてくれるよ。

```Bash:ssh
```

同じくboot直下にwpa_supplicant.confというファイルを作るよ。WI-Fi設定ファイルだよ。

```bash:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="My Wifi"
    psk="Password"
}
```

ssidにはWi-FiのSSID、pskにはパスワードを記入しよう。
パスワード平文が気になる場合は暗号化しておこう。その場合は""（ダブルクオート）を消して記述してね。

###RaspberryPiのIP確認
arpコマンドや、ルータのネットワークに接続して、macアドレスからRaspberryPiのIPを探すよ。Macアドレスは「b8:27:e1」で終わるよ。

```bash
$ arp -a | grep "b8:27:e1" 
raspberrypi (192.168.1.8) at b8:27:eb:e1:a3:1 on en0 ifscope [ethernet]
```

###起動
SDカードと電源をRaspberryPiに差し込んで起動するよ。
1分程度待ったらSecure ShellからSSHで接続するよ。

```bash
$ ssh pu@192.168.1.8
```
初回パスワードはraspberryだよ。

以上で接続完了だね。

このままだと使い勝手やセキュリティ面に不安があるので、IP固定、piユーザ削除、公開鍵認証などの初期セットアップを行ってね。

##参考
https://willhaley.com/blog/setup-raspberry-pi-chromebook/
データサイエンス、kaggle関連のtips(更新中)

★dateカラムがあったとき、祝日フラグは付き物ですが、こんな便利なものがありました！
https://www.kaggle.com/c/ashrae-energy-prediction/discussion/115256#latest-671174


★辞書ツール
https://qiita.com/wtetsu/items/c43232c6c44918e977c9

★検索エンジンを追加するのは非常に便利
https://note.mu/__shinji__/n/n528fafe9a8da

★label Encoderは、欠損を何かで埋めないといけない

```
le = LabelEncoder()
train["leed"].fillna("missing", inplace=True)
train["leed"] = le.fit_transform(train["leed"])
```
Android Dev Summit 2019 Extended Tokyoの登壇資料まとめときました。


# Android Dev Summit 2019 Extended Tokyoに参加しました。
GDGさん主催のAndroid Dev Summit 2019 Extended Tokyoに行ってきたので、
発表してくださったみなさまの資料をまとめておきます。

# Android Developer Summit 2019 Overview
@mhidaka さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151973/2b8580eb-a5a7-4bd8-9dfb-c610e8fc32d5.png)
資料：https://speakerdeck.com/mhidaka/android-dev-summit-2019-conference-overview-and-keynote-session

# Android Studio ４．０について
@wasabeef_jp さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151973/5c1f7cfa-3300-0ade-243e-e63913cf71ff.png)
資料：https://speakerdeck.com/wasabeef/whats-new-android-studio-4-dot-0-ja

# Motion Editorについて
@mochico さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151973/ad008646-efbc-db67-d083-e372f2f748f8.png)

資料：https://speakerdeck.com/mochico/how-to-motion-editor-report-from-android-dev-summit-2019

# CameraXについて
takasy さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151973/7f329096-2d03-2df7-b5a6-486892007991.png)
資料：https://docs.google.com/presentation/d/19v5_MrMQvtlrQrE7PXy8dZi7h_iFV0kFwQaJaXt5wEg/edit#slide=id.p

# Jetpack Composeどうなの？
@yanzm さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151973/dc3b2606-dd36-c9e3-c85c-0c3f2a2911be.png)
資料：https://speakerdeck.com/yanzm/jetpack-compose-dounafalse-android-dev-summit-2019bao-gao-hui

# RoomとCoroutines
@yuichi_araki さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151973/0858dbdb-730f-9739-d5fe-5152ba83aaed.png)
資料：https://docs.google.com/presentation/d/1AYKOriaW0MhScn6ODBvxaQpbY8k9jTw8ENLudz1f6Tw/edit#slide=id.p

# 最後に
LINEのオフィスとってもきれいでした！
会場準備等ありがとうございました。

ただのまとめですいません。@リンクはQiitaのものです。Twitterリンクではないです。
octave .* ←この演算子は要素単位の積です！ what's the meaning of operator?

# 参考

[MATLABとOctaveについて良くわかります！](https://amzn.to/36KcxzD)


# 解決

カンマをつけると、内積ではなく要素同士の積になります。(内積は(n☓m)==(m☓n)が成り立つ時だけです)

A = [1,2,3,4];
1 2 3 4

B = [5,6,7,8];
5 6 7 8


A .* B = 
  5 12 21 32
Android Dev Summit 2019 Extended Tokyo メモ

## Android Dev Summit
GoogleのAndroid "開発者向け" のカンファレンス
[Android Dev Summit 2019](https://developer.android.com/dev-summit?gclid=Cj0KCQiAtrnuBRDXARIsABiN-7C0X5kxhNZVCFWazTCrhFaO_QxWIOAy0mJ5FdPcC0g-o6hM2oA-NbcaAt2JEALw_wcB&authuser=1)

700参加者

- Modern Development
 - Android Studo
 - Jetpack
- Modern Distribution Channek
- Moderan OS

## Conference Overview & Keynote Session

### Keynote

Androidは開発者とユーザーをつなぐプラットフォーム
増えるプラットフォーム : Foldable Chromebook
APEX (Android Pony Express)

Google Associate Android Developer Certification - Kotlin

Play Store 
App Bundle Testing

API Feedback
SDK Target N - 1

17.8MのPopUp Block
Google Play Protectの

## Android Studio 4.0 最新アップデート

Support for Jetpack Compose
Motion Editor
Desugarring in D8 & R8
- Java 8のバックポート
Multi Preview
Multi Display
Build Speed
- ビルドのボトルネックがわかる
Google Map Emulator Integration
Proguard Editing
Live Layout Inspector

## かんたんべんりなMotionEditorの使い方講座

MotionLayoutのtransitionをvisualize→Editorで動かせる/デバッグできる

## What's new in CameraX

Camera2 APIのラッパー
使いやすさを重視

Usecase
- プレビュー
- 画像解析
- 画像キャプチャ
- (ビデオキャプチャ)

CameraView(ImagesAnalysis以外)

## Jetpack Compose実際どうなの？

- UIツールキット
- Kotlin
- minSdkVersion=21
- 既存のコードと混ぜでいける...?
- privateなAPIに依存しない
- Material + animationsなUIにしたい
- 再利用性の向上
- 使うな危険

- Composable Function
- `@Composableアノテーション`
- `@Model`

## Jetpack Roomの最新情報が届きます！

- Room2.2
- N:Nのリレーション(Junction) 
- カラムのデフォルト値
- インクリメンタルAPTに対応
- Expand Projection
- Kotlinコルーチン
 - 2.1.0~ suspendサポート
- liveDataAll() , flowAll().asLiveData()
Google Apps ScriptからHangouts Chatに投稿する

# Google Apps ScriptからHangouts Chatに投稿する

定期的なりマインドなどをHangouts ChatのチャットルームにつぶやくScriptを作成します。
Webhookを使って投稿する方法です。

# Hangouts ChatにWebhookを設定する
Scriptを書く前の準備として、WebhookのURLを取得します。

投稿したいチャットルームの「◯人のメンバー」のところのドロップダウンを開き、「Webhookを設定」をクリックする。
![webhook_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/2ed304b0-aa46-d78f-82cf-62bbfc56f404.png)

次にWebhookに名前を入力して、「保存」をクリックします。（アイコン画像であるアバターのURLは省略します）
![webhook_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/c14a831b-a21b-cee7-a82a-cbe12654b5b6.png)

URLが表示されるので、コピーしてメモしておきます。
![webhook_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/ea6a1a29-10da-c4ca-f893-cb8b794d0cd1.png)

# Scriptファイルの作成
Googleドライブの適当なフォルダで、右クリック「Google Apps Script」でファイルを追加します。
![createscript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/b489718e-31e5-a7c3-1d26-1760c0a2a157.png)

Scriptファイルが作成されます。プロジェクト名やファイル名、そして関数名は、適宜変更します。
今回は、このまま続けます。myFunctionの中にコードを記述します。
![code_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/42bc1078-6d52-2955-93ab-9d95ff6051f7.png)

# つぶやく
つぶやくスクリプトを記述します。
chatRoomUrlには、メモしておいたWebhookのURLを記述します。

![code_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/4f868932-2578-176f-9d3b-33c93ec84382.png)

```
function myFunction() {
  var chatRoomUrl = 'メモしておいたWebhookのURL';
  var messageBody = 'てすとめっせーじ';
  
  var chatMessage = { 'text' : messageBody}
  var options = {
    'method': 'POST',
    'headers' : {
      'Content-Type': 'application/json; charset=UTF-8'
    },
    'payload':JSON.stringify(chatMessage)
  }
  var result = UrlFetchApp.fetch(chatRoomUrl, options);
}
```

# 実行してみる
「実行」ボタンをクリックで実行できます。初回の実行では、許可が求められるので、それぞれ許可します。

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/ab6a5464-3cee-d4f9-9930-d4747ef25dd1.png)

定期的に実行したい場合は、「現在のプロジェクトのトリガー」からトリガーを追加して、お好みのトリガーを設定します。今回はトリガーの説明は割愛します。
unity初心者です。　unityのインストールの方法を教えてください。

unity初心者です。2019年度版のMacbook proを使っています。 ひよこのUnity2019入門のp17のインストールでつまずいています。
unity hubをapplicationsにドラッグ&ドロップでファイルを開こうとすると、 “Unity Hub”が悪質なソフトウェアかどうかをAppleでは確認できないため、このソフトウェアは開けません。 このソフトウェアはアップデートが必要です。詳しくは開発元にお問い合わせください。 と出てきて、止まっています。 具体的な解決策を教えてください。 よろしくお願います。
初心者によるプログラミング学習ログ 161日目

# 100日チャレンジ161日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

161日目は



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>161日目<br><br>メンターさんのwebサイトコーディング課題<br><br>フッターとか中途半端作成です<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1195071203876040704?ref_src=twsrc%5Etfw">November 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【pandas】文字列をDataFrameに展開

かゆいところに手が届くpandasレシピ集No.1

# かゆいこと
「カテゴリ名(index)」と「値(value)」が文字列として1つの要素となってしまっている配列・DataFrameをなんとかしたい。
各カテゴリ(index)をcolumn名とする列に値を割り振ろう。

|ID|クソデカ文字列|
|:--|:--|
|0|A 0, B 1, C 2|
|1|B 3, D 4|
|2|A 5, C 6|
|3|C 7, D 8|

↑この↑クソデカ文字列を↓こう↓したい。

|ID|A|B|C|D|
|:--|:--|:--|:--|:--|
|0|0|1|2|0|
|1|0|3|0|4|
|2|5|0|6|0|
|3|0|0|7|8|

# レシピ
各カテゴリは既知とします。
未知の場合、カテゴリのリストを作成してください。

```python:str_to_dataframe.py
import numpy as np
import pandas as pd

def str_to_dict(x):
    dic = {'A' : 0, 'B' : 0, 'C' : 0, 'D' : 0}
    for xx in x.split(","):
        xxs = xx.split(" ")
        dic[xxs[-2]] = int(xxs[-1])
    return dic

temp = df["クソデカ文字列"].apply(lambda x : pd.Series(str_to_dataframe(x)))
df = pd.concat((df, temp), axis=1)
```

これは早い！
Laravel でSeeder実行時に指定できるオプション

LaravelでSeeder実行するときにオプションをつけれるのですが、他にどのようなのがあるのか
見てみたので纏めてみました。
既出だと思いますが、温かい目でよろしくおねがいします。

#指定のSeederを実行する

```
db:seed --class=SampleSeeder
```

#データベースを指定する
```
db:seed --database=testing
```

なおここの`--database='のあとに指定するものは、`app/config/database.php`に記載している`connections`を指定します。

#運用中に実行する

```
db:seed --force
```

実行していないのですが、`env`が`production`になっているものに対しても、実行するときに使用するものです。
コードを見ると警告がでるようです。

#db:seedのコード
以下興味ある人用

```php:vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php
<?php

namespace Illuminate\Database\Console\Seeds;

use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Console\ConfirmableTrait;
use Symfony\Component\Console\Input\InputOption;
use Illuminate\Database\ConnectionResolverInterface as Resolver;

class SeedCommand extends Command
{
    use ConfirmableTrait;

    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'db:seed';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Seed the database with records';

    /**
     * The connection resolver instance.
     *
     * @var \Illuminate\Database\ConnectionResolverInterface
     */
    protected $resolver;

    /**
     * Create a new database seed command instance.
     *
     * @param  \Illuminate\Database\ConnectionResolverInterface  $resolver
     * @return void
     */
    public function __construct(Resolver $resolver)
    {
        parent::__construct();

        $this->resolver = $resolver;
    }

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        if (! $this->confirmToProceed()) {
            return;
        }

        $this->resolver->setDefaultConnection($this->getDatabase());

        Model::unguarded(function () {
            $this->getSeeder()->__invoke();
        });

        $this->info('Database seeding completed successfully.');
    }

    /**
     * Get a seeder instance from the container.
     *
     * @return \Illuminate\Database\Seeder
     */
    protected function getSeeder()
    {
        $class = $this->laravel->make($this->input->getOption('class'));

        return $class->setContainer($this->laravel)->setCommand($this);
    }

    /**
     * Get the name of the database connection to use.
     *
     * @return string
     */
    protected function getDatabase()
    {
        $database = $this->input->getOption('database');

        return $database ?: $this->laravel['config']['database.default'];
    }

    /**
     * Get the console command options.
     *
     * @return array
     */
    protected function getOptions()
    {
        return [
            ['class', null, InputOption::VALUE_OPTIONAL, 'The class name of the root seeder', 'DatabaseSeeder'],

            ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to seed'],

            ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production'],
        ];
    }
}


```
CIでXcode11の$(MARKETING_VERSION)からリリースバージョン番号を取得する

## 前提
Xcode11からリリースバージョン番号を管理するInfo.plistの値 `CFBundleShortVersionString` が静的な値ではなく、Build Settingsの `$(MARKETING_VERSION)` を参照するようになっている。
(XcodeのGeneralタブから値を変更しても `$(MARKETING_VERSION)` が変更される)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30423/acd0e29d-ba3a-49db-4082-98b8ff8165f1.png)


## 問題点
CIで今までどおり、Info.plistから値を取得すると、 `$(MARKETING_VERSION)` という文字列で返ってきてしまう
例えばバージョン番号でタグ打ちするときなど参照するケースは結構あると思う。

## 対処法(shell script)
Build Settingsから取得する必要がある。
下記のワンライナーで取得できる(stack overflowの回答より:pray:)

```shell
version=$(sed -n '/MARKETING_VERSION/{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' {プロジェクト名}.xcodeproj/project.pbxproj)
```

参考：
https://stackoverflow.com/questions/56722677/how-to-read-current-app-version-in-xcode-11-with-script/58769925#58769925

### Bitriseで利用する場合
Scriptのステップを使って利用すると良さそう。
(下記にあるfastlaneのプラグインを使ってlaneを実行しても可)

例) リリースバージョン番号をGIT_TAGという環境変数にセット

``` shell
#!/usr/bin/env bash
# fail if any commands fails
set -e

# get release number from Xcode build settings
version=$(sed -n '/MARKETING_VERSION/{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' {プロジェクト名}.xcodeproj/project.pbxproj)

if [ -z "${version}" ]; then
  echo "[ERROR] failed to get MARKETING_VERSION"
  exit 1
fi

envman add --key GIT_TAG --value "${version}(${BITRISE_BUILD_NUMBER})"
```

## 対処法(fastlane)
versioningというfastlaneのプラグインではすでに対応が済んでいる

https://github.com/SiarheiFedartsou/fastlane-plugin-versioning/issues/37
https://github.com/SiarheiFedartsou/fastlane-plugin-versioning#about-versioning
Python から Azure CosmosDB を操作する (クイックスタート深掘り)

今回は Python から Azure Cosmos DB を操作する方法をクイックスタートを参考に見ていきます。

#準備
まずは、
最新の Python のインストール -> https://www.python.org/
Visual Studio Code にて Python のインストールを実行します。VS Code での Python インストールは任意ですが、VS Code で直接 Python をいじれたり、色々なショートカットがあるので大変便利です。
https://marketplace.visualstudio.com/items?itemName=ms-python.python#overview
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/25810163-8507-ec08-f048-a6eb85e6e5a3.png)

#Python アプリの Clone
Microsoft が公開している GitHub からコードをクローンします。
`git clone https://github.com/Azure-Samples/azure-cosmos-db-python-getting-started.git`

Visual Studio の Terminal を開き、Clone したローカルディレクトリまで移動しておきましょう。

#Cosmos DB のデプロイ
Azure Cosmos DB をデプロイします。今回はシンプルな Cosmos DB を作成するので、Azure CLI からデプロイします。

```
az cosmosdb create --name <account-name> --resource-group <resource-group-name>
```

作成できたら、以下コマンドを Azure CLI から実行し、Endpoint と Key を取得します。

```
az cosmosdb keys list --name <account-name> --resource-group <resource-group-name>
az cosmosdb show --name <account-name> --resource-group <resource-group-name>
```

#Visual Studio の Terminal からデプロイ
該当ディレクトリまで進んだ Visual Studio のターミナルから、以下コードを実行します。

```
python cosmos_get_started.py
```

すると以下が出力されます。

```
Read item with id Smith_d457f895-3756-49cd-a629-e7708d7ed252. Operation consumed 1 request units
Read item with id Johnson_3bd2aa16-742f-4aed-9a95-3adc548a94e3. Operation consumed 1 request units
Read item with id Wakefield_c73aa98d-7104-4b01-a3da-4946081575ff. Operation consumed 1 request units
Query returned 2 items. Operation consumed 3.09 request units
```

Portal ページを確認すると、Cosmos DB を操作できていることが確認できました。

#深掘り
今回少しハマったのが、以下エラーが発生したときです。

```
Traceback (most recent call last):
File "cosmos_get_started.py", line 1, in <module>
    from azure.cosmos import exceptions, CosmosClient, PartitionKey
ImportError: cannot import name 'exceptions' from 'azure.cosmos' (...\lib\site-packages\azure\cosmos\__init__.py)
```

このエラーは、Azure Cosmos DB の SDK が正しくインストールされていないことで発生するエラーです。-perp のバージョンのAzure Cosmos SDK をインストールしている場合、このエラーにぶち当たります。
解決策ですが、以下の Python ドキュメントに記載の方法で回避ができます。

https://pypi.org/project/azure-cosmosdb-table/
(参照元)https://docs.microsoft.com/ja-jp/azure/cosmos-db/table-sdk-python

また、以下ページに Python SDK の正しいインストール方法が記載されているので、みてみると参考になります！

https://github.com/Azure/azure-cosmos-table-python/tree/master/azure-cosmosdb-table
読書メモ 『アウトプット大全』

# 読書メモ 『アウトプット大全』

* 学びを結果に変えるアウトプット大全
* Sanctuary books
* 2018/8/3
* 樺沢紫苑
* <https://www.amazon.co.jp/dp/4801400558/>


# メモ

* 2019/11


## アウトプット基本法則

* 自己成長の量
	* アウトプットの量 ： ○
	* インプットの量 ： ✕
* アウトプット ＝ 運動
	* 書く
	* 声に出す
	* 小脳、海馬、大脳連合野が働く
* 2週間に3回アウトプット
	* 長期定着する
* インプット 3 ： アウトプット 7
	* コロンビア大学 心理学研究
		* イン、アウト時間を段階的に変えて覚える実験
* フィードバックを得る
	* アウトプットの効果を向上する
	* 長所伸展
	* 拡大と深堀り
	* 疑問と気付き
	* 教わる
* アウトプットの6つのメリット
	* 記憶
	* 行動変化
	* 現実変化
	* 成長
	* 楽しさ
	* 結果


## 話す

* 「話す」も立派なアウトプットの一つ
* 意見、気付きを盛り込む
* ポジティブ
* 話し方も大切


## 書く

* 脳幹網様体賦活系 への刺激
	* 脳幹網様体賦活系 RAS （Reticular Activating System）
	* 記憶力、学習能力向上
* タイピング ✕ ＜＜＜ 手書き
	* 脳の言語処理部位の活性化
		* 手書き ： ○
		* タイピング ： ✕
* 読書中も書き込む
	* アンダーライン
	* メモ
	* 落書き（ですら効果あり）
* 脳はシングルタスク
	* ストックできるトレイは3つ
	* アウトプット → トレイを空ける → 次のタスクへ
* 上達方法
	* 多読多書
	* 公開
* 速度アップ方法
	* 時間を決める
		* 1記事30分
		* 1Tweet5分
		* など
	* 構成を決めてから書く
	* [Google日本語入力](https://www.google.co.jp/ime/) 利用
		* 入力候補を選択して入力
	* 単語を辞書登録
		* よく使う文章


### 「書く」のポイント

* ToDoリスト
	* 毎日
	* 手書き、紙出力
	* 常に見える場所に置く
	* スマホは厳禁
		* 脱線のリスク
	* 完了タスクを斜線や✕で豪快に消す
		* 達成感
		* ドーパミン
* 気付きメモ
	* 30秒以内
		* 1分以後忘却開始

### ひらめく方法

ボーッとしているとき、リラックスしているとき

* 4B
	* Bathroom ： 風呂、トイレ
	* Bus ： 移動中
	* Bed ： 睡眠中と前後
	* Bar ： 酒
* NHK番組においてピース又吉で実証
* 脳にとっては休みではない
	* 脳はスタンバイ状態
	* デフォルト・モード・ネットワーク が活発に稼働している
* ひらめきの機会損失
	* スマホ、ゲーム、テレビなど．．．
* インプット・アウトプット → 放置 → ひらめき → 検証

### ノート術

* リアルのノートを使う
* 2週間に3回復習する
* 見開き2ページ内でまとめる
* 細かくなり過ぎないように
* 気付きを3つ、ToDoを3つ書く

### 構想

* ツール選択
* アナログ
	* 脳活性
	* アイディア
	* 視覚、感覚、直感
* デジタル
	* 言語、論理
	* 修正しやすい
	* 保存できる
	* 閲覧、シェア、検索が容易
* パワポなどスライドは構想フィックス後に利用する

### 引用

* 引用元検索ツール
* [Google Scholor スカラー](https://scholar.google.co.jp/) ： 論文、学術誌検索
* [Google Books ブックス](https://books.google.co.jp/) ： 書籍内検索

### 要約力、思考力

* Twitter でトレーニング


## 行動する

* 成長 ＝ 昨日と今日の行動に変化があること

### 成長するためには

* 続ける
* 教える
	* セミナーでは、講師が最も成長する
* ひとつのことに集中する
* 楽しむ
	* 楽しい
		* 脳内物質 ドーパミン
			* 学習能力向上
	* 嫌々
		* ストレスホルモン コルチゾール
			* 忘れさせる
			* 海馬縮小
	* 苦しさは悪
* 選択、判断
	* 5秒以内に直感で選択した方を選択
	* ワクワクする方を選択
* ビジョン
	* 人にはビジョンを伝える
		* 周りの共感を得やすい
* 眠る
	* 7時間眠る
* 運動する
	* 1時間の有酸素運動を週2回
* スマホ
	* アウトプットツールとして利用
		* メモ、記録、公開


## アウトプットの7つのトレーニング

### 1.日記

* 毎日書く
* 効果
	* 書く能力
	* 洞察力
	* 内省力
	* レジリエンス
		* ストレス耐性
		* 心のしなやかさ
	* 楽しさ発見力
	* ストレス発散
	* 幸福
* ポイント
	* ポジティブに書く
	* 毎日書く
	* 制限時間を設ける
		* 5分
		* 10分
	* ネガはポジ変換して書く
	* 公開する

### 2.体重、気分、睡眠時間記録

* 体重
* 気分
	* 10段階 ： -5 〜 +5
* 睡眠時間

### 3.読書感想

* 10分テンプレ
	* ビフォア
	* アフター
		* 気付き
		* ToDo

### 4.情報発信

* 緊張感
* 情報と人が集まる
* 評価向上
* 仕事が集まる
* 楽しさ

### 5.SNS

* 個人情報は自身で注意
* 実名、顔出し
* 交流
* 毎日

### 6.ブログ

* 独自ドメイン
* 毎日
* 記事数 100-300-1000 の法則
	* 100記事 ： 固定ファン
	* 300記事 ： 検索結果に載る
	* 1000記事 ： 人気認定、数万〜10万PV

### 7.情報発信

* 得意分野
* マニアック
* 感想、意見、気付き
* 読者の感情、行動に訴える


# 気付き

* 成長 ＝ アウトプット量
* スマホはアウトプットツールに適する反面、ノイズも多く注意
* 書く、公開する、楽しむ、ボーッとする、眠る、などが大切


# ToDo

* 7時間睡眠と、 1h ✕ 2 / w の有酸素運動の実践
* 専門分野発信、読書メモ、日記、記録、趣味発信など「書く」頻度を上げる
* ノートを活用し効果を実感する


# 感想

* 実践すべき具体的なアクションが多く紹介されている
* 自分に必要なものを選択して早速実践してみたいと思える
Chrome「net::ERR_HTTP2_PROTOCOL_ERROR」 Safari 「kCFErrorDomainCFNetwork」 エラー

Nginxでリバプロしているプロダクトにて、APIへのアクセスで以下エラーに遭遇しデータ取得に失敗していた。

・Chromeで `Chrome net::ERR_HTTP2_PROTOCOL_ERROR` エラー
・Safariで `kCFErrorDomainCFNetwork` エラー

レスポンスデータのサイズが一定以上になる時に発生しており、
ブラウザのコンソールで確認できるエラー発生時には、
Nginxのエラーログにも以下のようなエラーが確認できた。

```
2019/11/15 18:05:31 [crit] 7507#7507: *951 open() "/var/lib/nginx/proxy/3/01/0000000013" failed (13: Permission denied) while reading upstream, client: 130.211.2.229, server: xxx.com, request: "GET /api/xxx HTTP/1.1", upstream: "http://unix:xxx.sock:/api/xxx", host: "xxx.com"
```


## 原因

以下記事にたどり着いて原因が判明。
[大容量ファイルをsend_file / send_dataできない](https://threetreeslight.com/posts/2014/03/09/ngix%E5%A4%A7%E5%AE%B9%E9%87%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92send_file-/-send_data%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84/)

以下 Nginxドキュメントより
 
>[Nginx-proxy_temp_file_write_size](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size)
>Limits the size of data written to a temporary file at a time, when buffering of responses from the proxied server to temporary files is enabled. By default, size is limited by two buffers set by the proxy_buffer_size and proxy_buffers directives. The maximum size of a temporary file is set by the proxy_max_temp_file_size directive.


Nginxでは一定以上のデータサイズを超えるProxyをする場合は、ローカルファイルにバッファする仕様があり、Nginx実行ユーザがバッファファイル作成領域 `/var/lib/nginx/proxy/` に対する書き込み権限がないことが原因で冒頭のエラーが発生していた。

## 対策

Nginx実行ユーザがバッファファイル作成領域に対して書き込み権限を付与した。

```
$ ls -l /var/lib/nginx/
total 28
drwxr-xr-x  7 root     root 4096 Sep 19 18:25 ./
drwxr-xr-x 42 root     root 4096 Sep 22 16:52 ../
drwx------  2 nginx root 4096 Nov 12 15:58 body/
drwx------  2 nginx root 4096 Sep 19 18:25 fastcgi/
drwx------ 12 nginx root 4096 Sep 20 01:57 proxy/
drwx------  2 nginx root 4096 Sep 19 18:25 scgi/
drwx------  2 nginx root 4096 Sep 19 18:25 uwsgi/

$ sudo chown -R nginx:nginx /var/lib/nginx
```
メモ：minitest-reporters導入方法

書くことが無いので、rails testの結果が見やすくなるgem、「minitest-reporters」の導入方法をメモしておこうと思う。

#導入方法
Gemfileの「group :test do」の中に以下のように導入。

```
group :test do
  gem 'minitest'
  gem 'minitest-reporters'
end
```

加えて、test_helper.rbに以下の二行を追加。

```ruby:test_helper.rb
require 'rails/test_help'
require "minitest/reporters"　#1行目
Minitest::Reporters.use!     #2行目
```
gem 'minitest'にどういう役割があるのか、調べてもイマイチよくわからなかったが...
どうやらRailsのテストの方法はいくつかあるようで、minitestというのはそのうちの一つらしい。
今のところはminitest-reportersの前提modならぬ前提gem的な存在だと思っておくことにする(適当)。