OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】データサイエンス100本ノック（構造化データ加工編） 019 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/lmXvBTeS0J0)もしています。

##問題
P-019: レシート明細データフレーム（df_receipt）に対し、1件あたりの売上金額（amount）が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID（customer_id）、売上金額（amount）、付与したランクを表示させること。なお、売上金額（amount）が等しい場合は同一順位を付与するものとする。

##解答
```:コード
df_amount_rank = pd.concat([df_receipt[['customer_id', 'amount']] \
,df_receipt['amount'].rank(method='min', ascending=False)], axis=1)

df_amount_rank.columns = ['customer_id', 'amount', 'amount_ranking']

df_amount_rank.sort_values('amount_ranking', ascending=True).head(10)
```

##出力
|  | customer_id | amount | amount_ranking |
|--:|:--|--:|--:|
| 1202 | CS011415000006 | 10925 | 1 |
| 62317 | ZZ000000000000 | 6800 | 2 |
| 54095 | CS028605000002 | 5780 | 3 |
| 4632 | CS015515000034 | 5480 | 4 |
| 72747 | ZZ000000000000 | 5480 | 4 |
| 10320 | ZZ000000000000 | 5480 | 4 |
| 97294 | CS021515000089 | 5440 | 7 |
| 28304 | ZZ000000000000 | 5440 | 7 |
| 92246 | CS009415000038 | 5280 | 9 |
| 68553 | CS040415000200 | 5280 | 9 |

##解説
・PandasのDataFrame/Seriesにて、ランク列を新たに作成し、列を連結して、データを順位付けする方法です。
・数字情報をランキング形式で見たい時に使用します。
・**'concat('<列名A>','<列名B>','<列名C>')'は、指定した列を連結する関数**です。concatenate(=連結する)という動詞が元です。
・**'rank(method(average/min/max/first),'ascending=True/False')'は、指定した列のランキングを表示する関数**です。
・今回の場合、amount のランキングを rank で表示し、指定された列と連結するために concat を使用しています。
・'columns('<列名A>','<列名B>','<列名C>')'は、列名を再指定する関数です。
・P-017,018で使用した sort_values を用いて、ランキング順に並び直して表示しています。  

※rankの参考記事は[こちら](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.rank.html)です
プログラミング未経験者にPython教えてみた

20200809時点 4回実施

# 心がけたこと
## 最初から
* 型とか変数とか宣言とか、お作法の話は後回し
* とにかくプログラムを実行してもらってエラーに遭遇してもらう
* 一度にたくさん詰め込まない(1回15分3行を解説)

## 途中から
(まだない)

# 前提
## 職場
* 製造業
* 色々あって僕も初心者も違う会社だけど同じチーム
* チームのミッションはデータサイエンスで企業内の意思決定を支援すること


## ぼく（ざっくり基盤を作る人）
* プログラミング経験は学生時代７年、業務で５年
* Python経験は学生時代２年、業務で１年
* 社内研修でプログラミング講師を２ヶ月経験済み

## 初心者（ざっくり分析をする人）
* プログラミング経験なし（その製造業に関してのノウハウは豊富）
* Pythonは自身では書かないが、業務で実行する機会はたまにある。
* 元会社からプログラミングを学ぶように言われているものの手も足も出ない。

# やってみてよかったこと
* 初心者は明るく気さくな方で、毎回何かしら質問してくれたし、嬉しそうにしてくれた。続けるモチベーションになる。

# 気づき
* PythonとRの区別がついていない様子。ファイルの拡張子とか意識させないと同じに見えるのかな。環境セットアップやらせてもないしな...



# 最後に
プログラミング未経験者に教えてみたい、教えてみた、という方いらっしゃいましたらコメントいただけると嬉しいです。
僕と一緒に勉強している初心者の為にもアドバイスや気づきをください！
HTMLで押したボタンの色を変える方法

#Aタグではできない(と思う)
まず前提としてAタグではできません(正確にはできないと言う訳でではなく探したらやり方があるのかもしれません)。そう言う訳なので、ラジオボタン要素を使います。

#ラジオボタン要素の書き方
ラジオボタン要素の書き方の紹介です。

```html:HTML
<input type="radio" name="yesorno" id="yes" value="yes">
<label for="yes" class="btn">yes</label>
<input type="radio" name="yesorno" id="no" value="no">
<label for="no" class="btn">no</label>
```
ラジオボタンだけを追加するならこのコードだけで大丈夫です。`label`の`for`のところには`input`の`id`に書いたものを入れてください。
(https://jsfiddle.net/ このページでコードのチェックができます)

#ラジオボタン要素の装飾
コレだけだとボタンっぽくないのでcssで装飾します。

```css:css
.btn {
  background-color: #f08400;
  color: white;
  font-size: 18px;
  padding: 10px 20px;
}

.btn:hover {
  background-color: chocolate;
}
```
普通にボタンを装飾するコードを書くだけです。

#クリックしたボタンの色を変える
クリックしたボタンの色を変えるには下のコードを打ち込みます。

```css:css
input[type="radio"]:checked + label {
  background-color: red;
}
```
こんな感じでおkです。`html`の`input`に書いたラジオボタン要素がチェックされた時に`background`を`red`にするって感じです。

#丸ポチを消す
最後に目障り(?)な丸ポチを消します。

```css:css
input[type="radio"] {
  display: none;
}
```
と言ってもコレを書くだけです。

#終わり
所詮僕のメモがわりなんで初歩的なとこしかかいてないですが　お役に立てば幸いです！

#コード全部

```html:HTML
<input type="radio" name="yesorno" id="yes" value="yes">
<label for="yes" class="btn">yes</label>
<input type="radio" name="yesorno" id="no" value="no">
<label for="no" class="btn">no</label>
```

```css:css
.btn {
  background-color: #f08400;
  color: white;
  font-size: 18px;
  padding: 10px 20px;
}

.btn:hover {
  background-color: chocolate;
}

input[type="radio"]:checked + label {
  background-color: red;
}

input[type="radio"] {
  display: none;
}
```
【javascript】テトリス作成に向けて

テトリス作成に向けて調べた関数などを書いていきます。

#配列内の値を一括で変更する
##Array.prototype.fill()
> メソッドは、配列中の開始位置から終了位置までの要素を固定値で設定します。その際、終了位置は含まれません。
出典：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

###構文
```javascript
arr.fill(value[, start[, end]])
```
|引数|説明|
|---|---|
|value|配列に設定する値|
|start|開始する位置。デフォルトは0|
|end|終了する位置。デフォルトはthis.length|

####例
```javascript
bord.forEach((item) => {
    bord[i].fill(0)
  });
```
これでbordの配列の値をすべて0にできる。
#2つの配列を比較する
##Array.prototype.filter()
###構文
```javascript
let newArray = arr.filter(callback(element[, index, [array]])[, thisArg])
```
|callback引数|説明|
|---|---|
|element|現在処理中の要素|
|index|現在処理中のインデックス|
|array|filterが実行されている配列|
|thisArg|callbackを使う時にthisとして使用する値|

##返り値
フィルターされた配列

#-0(マイナスゼロ)に遭遇
```javascript
console.log(-1*0)//-0
```

このような結果に遭遇した

これについてMDNではこう述べられている
>Number 型には、2 種類の表現を持つ数値がひとつだけあります。それは 0 であり、-0 および +0 で表します ("0" は +0 の別名です)。実用上、影響はほとんどありません。例えば、+0 === -0 は true です。ただし、ゼロ除算を行った場合は違いに気づくでしょう
出典：[JavaScript のデータ型とデータ構造](https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures#Numbers
)

```
+0 === -0//true
```
これがtrueになるなら問題ないかと思いスルー

#絶対値
```javascript
Math.abs()
```
#NodeListをforEachで使えるようにする
```javascript
Array.from(Nodelist).forEach()
```

#forEachではreturnは使えない
forEachでreturnで処理を終わらせようとしたところ最後まで処理をしていることがわかった。


#配列のディープコピー

```javascript
let arr=[[0,0],[0,1]]
let arr2=JSON.parse(JSON.stringify(arr));
```

#数字の四捨五入

```javascript
// 切り捨て
var a = Math.floor( 1.5 ) ;

// 切り上げ
var b = Math.ceil( 1.5 ) ;

// 四捨五入
var c = Math.round( 1.5 ) ;
```
#参考
- [小数を四捨五入、切り捨て、切り上げする方法](https://lab.syncer.jp/Web/JavaScript/Snippet/16/)
- - [forループとforEach内でreturnした時の挙動の違い
](https://qiita.com/growsic/items/008d0bd9e93174132ffc)
Dockerとイメージの作成からビルドまで

# はじめに
この記事は、インターネット上の百科事典や技術情報サイト、ライブ配信を基に、Dockerについて初学者が学習した内容をまとめた備忘録です。
技術的に誤っている点がございましたら、ご指摘いただけますと幸いです。

# Dockerとは？
[Docker社](https://www.docker.com/why-docker)が開発しているコンテナ型の仮想環境（MacやWindowsなどのホストOS）を作成、配布、実行するためのプラットフォームです。
アプリケーションのデプロイを簡単に行ってくれます。

# Dcckerの使い方
Dockerコンテナの操作手順は、Dockerインストール後、Dockerhubでイメージを作成し、コンテナへのビルド、という流れで行われます。

![docker_image_container.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423502/392a99a2-bf1c-1845-1475-89b0f08e19d9.jpeg)

出典: <[Docker入門（第二回）～Dockerセットアップ、コンテナ起動～](https://knowledge.sakura.ad.jp/13795/)>

## インストール
Docker公式サイトの「Get Started」からインストールできます。
https://www.docker.com

### 複数のコンテナを一元管理
Docker Composeを公式サイトからインストールし、利用すると、Apache、MySQL、PHPなど複数のコンテナを同時に立ち上げることができます（この記事では紹介のみ行わせていただきます）。
https://docs.docker.jp/compose/toc.html

## イメージ作成
Docker Hub公式サイトからDockerイメージを取得することで、Dockerコンテナを起動後、すぐに使用できます。
https://hub.docker.com

### Dockerコンテナの実行例
Dockerがインストールされた環境で、NginxのDockerイメージを使ってWebサーバーを立ち上げるために、以下を実行します。

```
docker run --name some-nginx -d -p 8080:80 nginx
```

### Dockerfileからイメージ作成
イメージはDockerfileにベースイメージを指定し、コードに環境構築の手順を記載して作成することができます。
実際に、Nginxのイメージを作成します。

- Nginxの設定ファイルを作成します。

```
mkdir nginx
cd nginx
touch default.conf
```

- `default.conf`を編集します。

```
server {
    listen       8080;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```

- Dockerfileを作成します。

```
touch Dockerfile
```

- `Dockerfile`を編集します。

```
FROM nginx:alpine
COPY ./default.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
```

- 作成したDockerfileをビルドします。

```
docker build . -t alpine_nginx
```

# 備考
アウトプットもかねて、個人的に要点をおさえた内容を記述させていただきました。
最近は、AWSやAzureどのクラウドサービスでDockerが簡単に使えるサービスがあるようですが、クラウド上にデプロイできると便利そうです。
ここまで拝読していただき、ありがとうございました。

## 参考文献
- A Memorandum
    - [Docker のインストールからイメージビルド・コンテナ起動・Composeまで](https://blog1.mammb.com/entry/2019/10/28/000000)
- Qiita
    - [10分でわかるDocker超入門](https://qiita.com/akinko/items/8fb50feb6d60eb975dba)
- YouTube
    - [【2020年最新】Docker環境構築入門｜14分でdocker-composeまで完全解説！【windows/mac対応】Dockerの使い方](https://www.youtube.com/watch?v=VIzLh4BgKck)
- さくらのナレッジ
    - [Docker入門（第一回）～Dockerとは何か、何が良いのか～](https://knowledge.sakura.ad.jp/13265/)
    - [Docker入門（第二回）～Dockerセットアップ、コンテナ起動～](https://knowledge.sakura.ad.jp/13795/)
- インフラ技術の「これまで」と「これから」を網羅！インフラ勉強会シリーズ第4弾
    - [Infra Study Meetup #4「インフラの面白い技術とこれから」](https://forkwell.connpass.com/event/179755/)
No such file or directory @ rb_sysopen - /Users/○○/Gemfile.lock (Errno::ENOENT)で苦しんだ

railsコマンドを打とうとすると

```
$ rails ○○
Traceback (most recent call last):
        4: from bin/rails:3:in `<main>`
        3: from bin/rails:3:in `load`
        2: from /Users/user/[プロジェクト名]/bin/spring:10:in `<top(required)>`
        1: from /Users/user/[プロジェクト名]/bin/spring:10:in `read`
/Users/user/[プロジェクト名]/bin/spring:10:in `read`: No such file or directory @ rb_sysopen - /Users/user/[プロジェクト名]/Gemfile.lock(Errno::ENOENT)
```
こんなエラーが出てしまい号泣。

## 原因
railsコマンドでは、gemのバージョンも確認工程に含まれるため`Gemfile.lock`の中身が参照される。
ただ今回、参照されるべき`Gemfile.lock`がない状態なのでエラーが出てしまっている状況。

## 対処法
`Gemfile.lock`は`gemfile`のバージョンを記録しておくもので、`bundle install`コマンドによって自動的に生成されるため、`bundle install`を実行する必要がある。

早速、アプリディレクトリ上にて`bundle install`を実行↓

```
$ pwd
/Users/○○/アプリ名

$ bundle install
```

その後、再度railsコマンドを入力してみる。
すると、無事にrailsコマンドが効く状態になってるはず！

## まとめ
かなり初歩的な内容かもですが、自分は過去にこのエラーで相当時間を取られました...
同じエラーで苦しむ人が減れば幸いです！
DockerでビルドしたQWidgetアプリをMacに表示

## MacにXサーバをインストール

[XQuartz](https://www.xquartz.org) からMacにXサーバをインストールする。

## Xサーバを起動してXサーバへのアクセスを許可

インストールしたXQuartzを実行してxtermを起動し、xhostにてXサーバへのアクセスを許可するように変更する。

```
xhost +
```

## DockerでQtのサンプルアプリをビルド

[Qtビルド環境のDockerの作成](https://qiita.com/MasaNa43/items/bb9754b31dfb8e3848e6) で作成したイメージからコンテナを作成する。

```
docker run -it --name test masana/ubuntu-qtenv:qt5.10.1 /bin/bash
```

## 実行に必要なモジュールをインストール

作成したコンテナにおいて、xcbクライアントの実行に必要なモジュールをインストールする。

```
apt-get install -y libxi6 libxrender1 
```

ビルドだけでなく実行を前提とするなら、ビルド環境を作成するDockerfileにて上記を追記しておく。

## サンプルアプリを実行

作成したコンテナにおいて、ビルドしたサンプルアプリケーションを実行する。

```
/tmp/sample/sample -display {ホストのMacのIPアドレス}:0.0
```

MacにQtのウィンドウが表示される。

- Qtのサンプルプログラム

```
#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLabel label;
    label.setText("TEST");
    label.setAlignment(Qt::AlignCenter);
    label.setGeometry(100,100,500,500);
    label.show();

    return a.exec();
}
```
dockerのイメージとコンテナの消去について

#目的
dockerを動かそうといろいろな検証をしているうちにいらないイメージができたので、その削除方法について調べる。

#コンテナの停止と削除
現在動いているコンテナは`docker ps`で確認することができる。
`exit`コマンドなどで抜け出したコンテナは停止中のため、ここには表示されない。
`docker ps -a`のコマンドで停止中のコンテナも確認することができる。

```
$ docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                       PORTS                                      NAMES
63c984412464        doctest                     "python3"                7 hours ago         Exited (137) 7 hours ago                                                doctest
```

今回はこのコンテナを削除してみる。
コマンドは`docker rm [コンテナID|Name]`
また、ここでIDを入力する場合、全てを打ち込まなくても、一意に判断できる文字列を入力することで削除できる。
今回は`docker rm 63c`と打つだけで削除が可能だ。

#イメージの削除
イメージを削除しても、そのイメージを含むコンテナは削除されない。**(ここ大切)**
なので、削除したいイメージがある場合は先にコンテナを削除しておくのが吉。

`docker images`でイメージの一覧を取得できる。

```
$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
python                               3.5.8               0688d5a54cf4        9 months ago        908MB
```
今回はこのpythonの3.5.8を削除する。

コマンドは`docker rmi [REPOSITORY NAME[:TAG]|Image ID]`でコンテナ同様、全てを打ち込む必要はない。

```
$ docker rmi 068
Error response from daemon: conflict: unable to delete 0688d5a54cf4 (cannot be forced) - image has dependent child images
```

子のimageがあると警告が出される。`-f (force)`のオプションをつけると強制的に消せる。
Obnizで動体検知センサー（HC-SR505）を利用して、動体検知したらスマホに通知。

# 「動体検知したらスマホに通知」をやりたい

こんなことをやってみよう。

<img width=80% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299557/9df73ca1-9cf9-a210-2ffc-9e457a1e4ebf.png">

使うのはこちら。

＜ハードウェア＞

- HC-SR505（赤外線人感センサー）：https://obniz.io/ja/sdk/parts/HC-SR505/README.md
- Obniz：https://obniz.io/ja/products/obnizboard/
- Raspberry Pi Zero W：https://www.switch-science.com/catalog/3200/

＜ソフトウェア＞

- Node.js
- IFTTT


## HC-SR505

Obnizに、HC-SR505を直刺しします。

<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299557/fe4f976e-3db1-8c27-9fc8-fa9e07984db6.jpeg">

<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299557/4d22147a-fcd2-24e8-55f5-aca357ba7523.jpeg">

## Node.js

Node.jsで用意したコードです。

```javascript
const ifttt_event = "obniz"; //イベント名
const ifttt_secret_key = "IFTTTのキーを入れます"; //キー
const Obniz = require("obniz"); // デバイスに接続
var obniz = new Obniz("番号を入れます"); //Obnizの番号を指定
var webclient = require("request");
obniz.onconnect = async function () {

  var sensor = obniz.wired("HC-SR505", {vcc:0, signal:1, gnd:2});

  //IFTTTのwebhooksのURLを指定。
  const IFTTT_URL = 'https://maker.ifttt.com/trigger/' + ifttt_event + '/with/key/' + ifttt_secret_key;

  sensor.onchange = async function(val){


    if (val) {
      //動きを検知したとき
      obniz.display.clear();
      obniz.display.print("Moving Something!");

      //IFTTTリクエスト
      webclient.post({url: IFTTT_URL}, function (error, response ,body){console.log(body);});
    }
    else{
      //検知しないとき
      obniz.display.clear();
      obniz.display.print("Nothing moving");
    }
  }
 }
```

## 検知したとき

動体検知すると、スマホに通知が届きます。
（”誰か来ました”については、IFTTTのメッセージで設定しています）

<img width=45% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299557/db041ace-956c-40b4-8e12-d5065d771e43.png">
AtCoder 生活　93日目

[前回](https://qiita.com/flandrescarlet237/items/4b67674903e87d46ae8f)

#92日目
今日はABC174に参加しました。

![スクリーンショット 2020-08-02 22.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/4c630391-6ab1-c59b-a1ba-d8b7d1b6760a.png)


##[ABC174](https://atcoder.jp/contests/abc174)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int x;
    cin >> x;
    if(x < 30) cout << "No" << endl;
    else cout << "Yes" << endl;
}

```

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    ll n,d;
    cin >> n >> d;
    d *= d;
    ll ans = 0;
    rep(i,n){
        ll x,y;
        cin >> x >> y;
        x *= x;
        y *= y;
        if((x+y) <= d)ans++;
    }
    cout << ans << endl;
}

```

###最後に
今回、C問題を解けなかったのが悔しい。
今度復習して素早く解けるようになりたい。
Symfonyの環境を爆速で構築する（PHP7.4, MySQL8.0, Nginx1.19）

## はじめに

symfony用のdocker-composeを作成したので、それを利用してsymfonyの環境を構築していこうと思います。

Github -> [wim-web/symfony_sandbox](https://github.com/wim-web/symfony_sandbox)

## 環境構築

まず任意の場所にプロジェクトに使うディレクトリを作成し、移動します。

```
mkdir sample
cd sample
```

リポジトリからクローンするためのディレクトリを作成し、移動します。

```
mkdir docker
cd docker
```

クローンします。

```
git clone git@github.com:wim-web/symfony_sandbox.git .
```

docker-compose用の.envを作成して、コピーした.envの内容を埋めます。

```
cp .env.sample .env
vim .env
```

`COMPOSE_PROJECT_NAME`はdocker-composeで立ち上げるコンテナのprefixになります。
任意の名前でよいですが他のプロジェクトの`COMPOSE_PROJECT_NAME`とかぶらないように注意してください。

次にsymfonyをインストールします。

```
docker-compose run --rm workspace composer create-project symfony/website-skeleton:"^4.4" .
```

※今回はバージョン4.4をインストールしていますが、PHP7.4なので5系のインストールも可能です。

docker-composeをupします

```
make up
```

http://localhost にアクセスして画面が出れば成功です。

Databaseの設定はsymfonyの`.env`を以下に書き換えればOKです。

```
DATABASE_URL=mysql://root:pass@mysql:3306/db1?serverVersion=8.0
```
Tips：background-image・ショートハンド・ディレクトリ構造

自分用
今日覚えたこと

##  background-image
どうしても出なくて困った。
階層も画像の名前も確認した、要素に高さも指定した。
それでも出ない・・・

下記の構文エラーが原因だったらしい。
```background-image: url(images/top.png) no-repeat;
```
*no-repeat*　はショートハンドでしか記述できないとのこと。
```background: url(images/top.png) no-repeat;
```


##  ショートハンドとは・・？
長文のコードを短く省略して1行で書くこと

▼ 参考
[CSSの一括指定（ショートハンド）のチートシート](https://webliker.info/css-short-hand/#:~:text=CSS%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AB%E3%81%AF,%E3%81%8C%E7%94%A8%E6%84%8F%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)



##  ディレクトリ構造
トップページは基本的に **index.html**
CSSは1つの場合　**style.css**
が推奨される

▼ 参考
[ディレクトリ構造とは？WEBサイトのファイルはどうなっている？](https://webliker.info/60828/)
Rails APIキーやDBのパスワードをcredential.ymlに記述する

※自分用メモです。

##1.credentials.yml.encに隠したい情報を記述する

まずcredentials.yml.encを編集します。

```:コマンド
docker-compose run -e EDITOR=vim web rails credentials:edit
```

Dockerを使用している場合
vimをインストールしていないとエラーが出るのでインストールしておきましょう。

```dockerfile:Dockerfile
RUN apt-get install -y vim
```

```yml:credentials.yml.enc
db:
  password: XXXXXXX

api_key:
  google: XXXXXX
```

##2.呼び出し方法

database.yml

```yml:database.yml
  password: <%= Rails.application.credentials.db[:password]%>
```


~.erb

```erb:~~html.erb
<script src="https://maps.googleapis.com/maps/api/js?key=<%= Rails.application.credentials.api_key[:google]%&callback=initMap" async defer></script>
```


##補足
.gitignoreでmaster.keyが記述されているか確認しておきましょう。

gitignoreにはgithubにpushしないファイルを設定するファイルになります。

master.keyはデフォルトで.gitignoreに記述されていますが、念のため確認します。
iPhoneでMacのlocalhostを開く方法【実機でテストする】

iPhoneでMacのlocalhostを開く方法になります。
コーディング等を実機で確認したい時に便利です。

## iPhoneとMacを接続する
まずは、iPhoneとMacをUSBで接続します。

## Macの共有を開く
Macで`システム環境開発 > 共有` を開く

## アドレスをコピー
![iphone.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/a8fbbff0-3bdd-5f77-177b-b4b30fe44efe.jpeg)
上記の画像のアドレス部分`~~~~.local`をコピーします。

## iPhoneでコピーしたアドレスにアクセスする
上記でコピーしたアドレスにポート番号を追加することで、iPhoneでMacのlocalhostにアクセスできます。

例
`https://~~~~~.local:3000`
`http://~~~~~.local:8000`
【JavaScript】レスポンシブな条件分岐にはwindow.matchMediaを使う

JavaScriptを書いていて良く使用するレスポンシブな条件分岐は下記2つのパターンだと思います。どちらもwindow.matchMediaを使えば簡単に実装することができます。

- **デバイス幅が〇〇px以上と以下で処理を分岐したい**
- **特定のデバイス幅を通過したときに処理を実行したい**

今回はこちらの2つの頻出パターンについて紹介します。

## デバイス幅が〇〇px以上と以下で処理を分岐したい
こちらの条件分岐は、PCとスマホで処理を分けたいときなどに重宝します。一番良く使いますね。

```ruby:JavaScript
const matchMedia = window.matchMedia('(max-width:1000px)');

if (matchMedia.matches) {
  // 1000px以下で行う処理
} else {
  // 1001px以上で行う処理
}
```

ちなみに**if (!matchMedia.matches)**とすることで、**条件にマッチしないとき**といった条件分岐を行うこともできます。

## 特定のデバイス幅を通過したときに処理を実行したい
特定のデバイス幅を通過したときに何か必ず実行したい処理があるときなんかに便利です。

```ruby:JavaScript
const matchMedia = window.matchMedia('(max-width:1000px)');

// 1000px通過時にmyFuncを実行する
matchMedia.addListener(myFunc);
```

## Twitterアカウント
Twitterも更新していますので、よかったらフォローお願いします！
[Twitterアカウントはこちら](https://twitter.com/flat_ito)
Xcodeのハイライトについて

# ある日の気づき
これまでいつもクラスのフィールドの前には`self`をつけて記述していましたが、今日の昼にやっと気づきました。

<img width="809" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/18f145bf-6a42-dc7a-2dcd-bcb34127d8e7.png">

<img width="815" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/b9004dd5-d8cb-9d05-4589-3d03570d542b.png">
※chatInfoListのところ

ローカル変数は白色で、クラスのフィールドやメソッドはちゃんと色が付くようになっていました...
もっと早く気付けばよかった。

なので、Xcodeのハイライトがそれぞれどういう意味をしているのかを調べてみようと思いました。

# Xcodeのハイライト
Preferencesのところを見ると、このように書いてありました。
<img width="782" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/b12eff14-e822-26c6-e946-2c8944b8de71.png">

**Plain Text**
その名の通り、普通の記述のことのようです。
**Comments**
コメントのことです。
**Documentation Markup**
スラッシュ3つの後ろに記述するドキュメンテーションコメントのことです。
**Documentation Markup Keywords**
ドキュメンテーションコメントの中のマークアップのキーワードのことです。
**Marks**
`MARK:`コメントのことです。
**Strings**
`String`のことです。
**Characters**
`Character`のことです。
**Numbers**
数値型のことです。
**Keywords**
`let`とかのようなキーワードのことです。
**Preprocessor Statements**
`#if DEBUG`のような記述のことです。(Preprocessor macrosとか呼ばれてる？)
**URLs**
URLのことです。
**Attributes**
`@escaping`のようなAttributesのことでしょうか。
僕のXcodeだとKeywordsと同じ色にハイライトされていました。
**Type Declerations**
`typealias`みたいな型の宣言のことです。
**Other Declarations**
メソッドとかの宣言のことです。
**Project Class Names**
自身のクラス名のことです。(Extenstionとかでこの色になる)
**Project Function and Method Names**
自身のメソッドとかフィールドを呼び出すときの色です。
**Project Constants**
自身のクラスの定数のことです。
**Project Type Names**
よくわからなかったです...
**Project Instance Variables and Globals**
自身のインスタンス変数やグローバル変数のことです。
**Project Preprocessor Macros**
自身のPreprocessor Macrosのことです。
**Other Class Names**
他のクラス名のことです。
**Other Function and Method Names**
他のクラスのメソッドとかフィールドを呼び出すときの色です。
**Other Constants**
他のクラスの定数のことです。
**Other Type Names**
よくわからなかったです...
**Other Instance Variables and Globals**
他のクラスのインスタンス変数やグローバル変数のことです。
**Other Preprocessor Macros**
他のクラスのPreprocessor Macrosのことです。
**Heading**
よくわからなかったです...

# さいごに
今まではぼんやりと色が変わるなーくらいにしか思っていなかったけど、ちゃんと見たほうがよさそうですね...
とりあえず不必要な`self`を取り除く作業をしてきます。
Dockerを使ったRails開発でブラウザテストが実行できない

##概要

以下の記事にdocker-compose.ymlにchromeをサービスの一つとして動かしてエラーを解消するやり方をまとめました。
[Docker開発環境でCapybaraを使ったブラウザテスト環境を構築する](https://qiita.com/na-tsune/items/91630257294aa0ea4fc8)

###・RSpecでCapybaraを使ったブラウザテストを実装する際にエラー

RSpecの学習をしている際にテストを実行すると下記のエラーが発生しました。
解決するのに結構時間がかかりました。

```
Selenium::WebDriver::Error::UnknownError:
            unknown error: Chrome failed to start: exited abnormally.
              (unknown error: DevToolsActivePort file doesn't exist)
              (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
```




```rb:spec-helper.rb
  Capybara.register_driver :selenium_chrome_headless do |app|
    browser_options = ::Selenium::WebDriver::Chrome::Options.new()
    browser_options.args << '--headless'
    browser_options.args << '--no-sandbox'
    browser_options.args << '--disable-gpu'
    Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
  end
```


##解決方法
Dockerfileにchrome driverをインストールする記述を追加したところ上手くテストが実行されました。

追記分

```dockerfile:Dockerfile

RUN CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/local/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable


```


動作確認済みDockerfile↓

```dockerfile:Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    node.js \
    yarn 
# Rspecで使うchormedriverをインストール
RUN CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/local/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable

# 作業ディレクトリに移動(無ければ自動で作成)
WORKDIR /app
#build context内のGemfileとGemfile.lockをコピー
COPY Gemfile Gemfile.lock /app/
#Gemをインストール
RUN bundle install

```

Dockerfileを編集しているので

```
$docker-compose build
```

再度コンテナを起動してテストを実行するとうまくテストが実行されました。
expo, react native ,typescript, firebaseでfacebook loginを実装してみる

## 対象者

・firebaseでプロジェクトの作成をした後

・facebook for developpersページで APP_IDとAPP_SECRETを取得

・APP_IDとAPP_SECRETをfirebaseに登録ずみ


## 手順 
expoの以下公式のドキュメントを参考にしています。
https://docs.expo.io/versions/latest/sdk/facebook/

まずはexpoから提供されているfacebookのAPIを取り込みます

```
expo install expo-facebook
```

そして実装を行います。ほぼExpo公式のものを変わりません。

```
async function logIn() {
  try {
    await Facebook.initializeAsync('<APP_ID>');
    const res = await Facebook.logInWithReadPermissionsAsync({
      permissions: ['public_profile'],
    });
    if (res.type === 'success') {
      const credential = firebase.auth.FacebookAuthProvider.credential(token);
      firebase.auth().signInWithCredential(credential).catch(error => console.log(error))
    } else {
      // type === 'cancel'
    }
  } catch ({ message }) {
    alert(`Facebook Login Error: ${message}`);
  }
}

```

基本的にはこちらの方法でログインまでできるかと思います。ただ一点注意があって、facebookログインは開発中はできない模様です。
開発中にfacebookログインを試すと、こんなエラーに遭遇します。

```
Possible Unhandled Promise Rejection (id: 0):
[Error: Unsuccessful debug_token response from Facebook: {"error":{"message":"(#100) The App_id in the input_token did not match the Viewing App","type":"OAuthException","code":100,"fbtrace_id":"********"}}]
```

一見APP_idが入力間違いかと思えますが、どっこい。仕様のようです。
https://github.com/expo/expo/issues/8226#issuecomment-639068957
こちらによると、開発中だと、デフォルトでFacobook独自のAPP_IDとして適用されてしまうのです。これを回避するには、スタンドアロンモードでビルドする必要があります。

しかし、ビルドの前にapp.jsonに記載事項があります。 https://developers.facebook.com/docs/facebook-login/ios （こちらのページで対象情報を取得できます）。以下3点です。


```app.json
{
    ~省略~
    "facebookAppId": "<APPID>",
    "facebookDisplayName": "<displayName>",
    "facebookScheme": "<Scheme>"
}
```


記載を終えたら、iosの場合、こちらのコマンドでビルドしましょう。(androidは公式で確認してみてください！)

```
expo buid:ios
```


あとはsimulatorで起動してみると、facebookでログインできるはず！！！
にしても、開発中にログインできないのはつらい。。。
JS 配列の最初以外を返す

##Lodashのtail関数を作成してみた
###メソッド使用せずに作成した場合
~~~javascript
const tail = (array) => {
  const tailNewArray = []
  for (let i = 1; i < array.length; i++) {
    tailNewArray.push(array[i])
  }
  return tailNewArray
}

console.log(tail([2, 4, 5]))
// => [4, 5]

console.log(tail([1]))
// => []
~~~


### filterメゾッドを使用した場合
~~~javascript
const tail = (numbers = []) => {
  return numbers.filter((value, index, array) => {
    return array.indexOf(value) !== 0
  })
}
console.log(tail([2, 4, 5]))
// => [4, 5]

console.log(tail([1]))
// => []
~~~
Amazon Personalize(AWS) と Recommendations AI(GCP) の機能の比較

# 概要
[Amazon Personalize](https://aws.amazon.com/jp/personalize/) と [Recommendations AI](https://cloud.google.com/recommendations?hl=ja) のどちらを利用するかを迷ったときに、二つをわかりやすく比較できたらどちらを利用するかの意思決定がしやすいと思ったので簡単ですがまとめてみました。


# アルゴリズム

||アルゴリズムのタイプ |具体的なアルゴリズム|
|:-----------------:|:------------------:|:------------------:|
| **[Amazon Personalize](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/working-with-predefined-recipes.html)**| USER_PERSONALIZATION<br><br>あなたにおすすめ    |       USER_PERSONALIZATION<br>Popularity-Count      |
|          |PERSONALIZED_RANKING<br><br>与えたリストをパーソナライズして並び替える |       Personalized-Ranking      |
|             |RELATED_ITEMS<br><br>関連アイテム |      SIMS        |
|**[Recommendations AI](https://cloud.google.com/recommendations-ai/docs/placements)**|    Others you may like<br><br>表示中のある商品の次に購入しそうな商品 | アルゴリズムの選択なし<br><br>下記のカスタマイズ可能<br>・最適化目標<br>・価格のランキング<br>・多様性<br>・パーソナライズの無効化|
| |"Frequently bought together"(shopping cart expansion)<br><br>一緒にカートに入る商品|アルゴリズムの選択なし<br><br>下記のカスタマイズ可能<br>・最適化目標|
| |Recommended for you<br><br>あなたにおすすめ |アルゴリズムの選択なし<br><br>下記のカスタマイズ可能<br>・最適化目標<br>・価格のランキング<br>・多様性|
|        | Recently viewed<br><br>最近閲覧したアイテム|アルゴリズムの選択なし|

# 必要なデータ

||必要なデータ|必須フィールド|
|:------------:|:------------------:|:------------------:|
|**[Amazon Personalize](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/how-it-works-dataset-schema.html)**|ユーザー|USER_ID<br>プラス最低1つの任意のフィールド|
||アイテム|ITEM_ID<br>プラス最低1つの任意のフィールド|
||インタラクション|USER_ID<br>ITEM_ID<br>TIMESTAMP|
|**Recommendations AI**|[カタログ](https://cloud.google.com/recommendations-ai/docs/catalog)|id<br>categoryHierarchies<br>title<br>productMetadata.currencyCode|
||[ユーザーイベント](https://cloud.google.com/recommendations-ai/docs/user-events?authuser=4)|eventType<br>userInfo<br>eventDetail<br>productEventDetail<br>eventTime<br>eventSource|
SwiftShader(Vulkan only) を clang-cl でビルドする

# 背景

SwiftShader(Vulkan) で CPU Vulkan レンダリングしたい.
Windows でも動かしたいが, Visual Studio でビルドめんどい.

clang-cl + WSL を使ってビルドします.

## 環境

Windows SDK, MSVC SDK など必要です.

Visual Studio C++ Build Tools + clang-cl + CMake + Ninja で C++ バッチビルドや VSCode 連携環境を整える
https://qiita.com/syoyo/items/bd4f81e7803afb5a3d19

を参考ください.

## repo

本家の repo では対応していないので, fork を clone ください.

https://github.com/lighttransport/swiftshader

clang-cl では, `/MP` のオプションが対応していないので削除します.

forked swiftshader 自体は対応しましたが, submodule の SPIRV-Tools で対応が必要です.

PR は出しましたが, たぶん取り込まれないでしょう.

https://github.com/KhronosGroup/SPIRV-Tools/pull/3633

## build

あとは `scripts/bootstrap-clang-cl-wsl.sh` を参考にしてパスなど通して cmake bootstrap するだけです!


```
rm -rf build-clang-cl-wsl
mkdir build-clang-cl-wsl

# Path containing space does not work well, so use symlink to MSVC_BASE and WINSDK_BASE.
# Assume LLVM_NATIVE_TOOLCHAIN points to linux version of clang+llvm
# 
cd build-clang-cl-wsl
cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE="cmake/clang-cl-msvc-wsl.cmake" \
  -DHOST_ARCH=x64 \
  -DLLVM_NATIVE_TOOLCHAIN="/home/syoyo/local/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04/" \
  -DMSVC_BASE:FILEPATH="/home/syoyo/msvc/VC/Tools/MSVC/14.26.28801/" \
  -DWINSDK_BASE="/home/syoyo/msvc/kits/10/" \
  -DWINSDK_VER="10.0.18362.0" \
  ..
```

cmake bootstrap がうまく行けばビルドできるはずです!

:tada:
Istioはいかにしてサービス間通信のセキュリティを担保しているのか？

## この記事について
この記事では、Istioがどのような考え方でサービス間通信のセキュリティを担保し、
どのように担保しているかを概観レベルで整理する。

## サービス間通信で担保したいものと従来のセキュリティモデル
サービス間通信として担保したいものとして、
通信するアクセス元を制御し、盗聴やなりすまし、改ざんといった攻撃から守ることが挙げられる。
つまり、

- man in the middle攻撃への防御
- アクセス制御

がセキュリティ要件として挙げられる。
従来のセキュリティモデルとしては、
プライベートネットワークを構築し、IPベースでアクセス元を制限することでこれらを担保してきた。
(AWSのPrivate VPCとSGがわかりやすい)

## Istioではどういうアプローチをとったのか？
昨今のコンテナベースで構築されるシステムでは、IPアドレスは高頻度で動的に変更されるためこのアプローチだと破綻する。
そこでIsitoは各ワークロードに対してIDを定義し、IDベースでアクセス制御を行うことととした。
具体的にはどういうアプローチなのか？

## コアコンセプト
ワークロードに割り振られたIDをベースとしてTLS通信することで認証と暗号化通信をし、
認証されたIDに対する認可制御を行うことでアクセス制御を実現している。
そのために下記の仕組みを実装している。

1. ワークロードに一意のIDを割り振る
2. IDを認証するための証明書の発行、配布、ローテーション

これらは、[SPIFFE(Secure Production Identity Framework For Everyone)](https://spiffe.io/)と呼ばれる標準仕様で定義されており、IstioはCitadelコンポーネントがこれを踏襲した実装にあたる。
具体的なSPIFEEの仕様、フローは[SPIFFEとその実装であるSPIREについて](https://qiita.com/hiyosi/items/8eec00f396af2050db61#registration-api)でわかりやすく言及されている。

![IstioによるSPIFEE実装](https://istio.io/latest/docs/concepts/security/id-prov.svg)

## ポイント
つまり、ワークロードのためのID、証明書を発行し、登録しておくための認証局としての役割を担ったisdiod(Citadel)が存在し、各ノードに存在するistio-agentが、このCitadelとistio proxyの間のやり取りを仲介し、証明書配布などを行っている。
(istio proxyのSDSはこのagentが担当している)
これによって、Podが大量に存在するような大規模クラスタでも、Pod自体はistio agentによって分割統治されているので、istiodに対しての負荷をかなり抑えることができる。

また、通常想定されるTLSと違い、この証明書の期限は非常に短く設定されていて、頻繁にローテーションされている。
これによって攻撃者は攻撃を継続していくためにはこの証明書をローテーションされるたびに逐一盗み出さなくてはならず、攻撃の難易度を上げている。

## まとめ
このようにIstioはワークロードレベルで認証し、それぞれにアクセス制御を設けている。
これによって動いているプラットフォームに左右されず、どのような環境においても安全な通信を実現することができる。
[メモ]PCAとt-SNE

importする

```
import scipy as sp
import sklearn.base
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import pandas as pd
```

dataの読み込み

```
data = 'table_rdf.csv'
df = pd.read_csv(data,index_col=0).dropna(axis=1)
```

t-SNEの実行

```
X_reduced = TSNE(n_components=2, random_state=0).fit_transform(df)
```

色分けの設定
dataの読み込み

```
data_2 = 'y_rdf.csv'
df_2 = pd.read_csv(data_2,index_col=0).dropna(axis=1)
```

列方向（縦方向）にソート

```
df2_s = df_2.sort_index()
df2_s.head()
```

mergeする

```
df_merge = pd.merge(df, df_2, how='left',right_index=True,left_index=True)
df_merge.head()
```

プリントする

```
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=df_merge['target'])
plt.colorbar()
```

PCAをする

```
from sklearn.decomposition import PCA
pca = PCA(n_components=2).fit(df)
values = pca.transform(df)
fig = plt.figure()
plt.scatter(values[:,0], values[:,1], c=df_merge['target'])
plt.xlabel("value1")
plt.ylabel("value2")
plt.colorbar()
plt.show()
```
DeepLearningを用いた株価予測（データ取得編）

#DeepLearningを用いた株価予測（データ取得編）

結構前から流行っているDeepLearning
これ使って何かしたいなぁという思いから出来るか分からないけど，とりあえず実益をかねて株価の予測をしてみようと思う．

ただDeepLearningをするうえで，まずは大量のデータが必要になる．
そのためにまず株価の情報を取得するためのプログラムを組むことにした.

###使用ツール
- Python3.7
- selenium
- googleDriver

###seleniumを使うための環境作成
[このページ](https://qiita.com/memakura/items/20a02161fa7e18d8a693)を参考にさせていただきました．


###データ取得
今回データを取得するために[こちらのサイト](https://kabuoji3.com/)を使わせていただくことにしました．
まずは[robots.txt](https://kabuoji3.com/robots.txt)の確認

    User-Agent: *
    Allow:/
    Sitemap:http://kabuoji3.com/sitemap/sitemap-index.xml

2020/08/02現在，スクレイピング等は禁止されていないようなので，ありがたく使わせていただくことに．
早速，データ取得用のソースを作成

```python
import time
from selenium import webdriver

start_code = 4004
end_code = 4500
start_year = 2015
end_year = 2020
base_url = "https://kabuoji3.com/stock/"

driver = webdriver.Chrome()

for code in range(start_code, end_code + 1):
	for j in range(start_year, end_year + 1):
		#コードがない場合は次の証券コードをチェック
		try:
			url = base_url + str(code) + "/" + str(j) + "/"
			print(url)
			driver.get(url)
			#サーバーに負荷をかけないために少しおく
			time.sleep(10)
			driver.find_element_by_name("csv").click()
			driver.find_element_by_name("csv").click()
			time.sleep(10)
		except Exception:
			break
driver.quit()
```

ぱっと証券コードを見た感じ4000超えたあたりが多そうだったので，この辺のCSVデータを中心にいただくことに
あまり古いデータを使っても売買ルール等がもし変わっていたら，正しく学習してくれなさそうなので時系列はここ5年分に．

コロナショックのデータを学習すると変になる可能性も否定できないが，一応ダウンロードすることに．
もし使ってみてダメそうなら，どのデータを使うか取捨選択も必要かも．

取り合えず，データは取得したので[次回はデータの加工の仕方](https://qiita.com/hiro0219/items/6dccf56b30f4b2edc62b)について考えていこうと思う．
Python のNumPyで多次元配列スカラー値を計算してみる


##Numpyを使ってみる
NumPyは外部ライブラリです.まだインストールしていない人は[この記事](http://hiho-developer.hatenablog.com/entry/20131221/1387564021)を参考にしてください。

- Pythonインタプリタを起動

```py
$python
>>> 
```
- NumPyのインポート

```py
>>>import numpy as np
```
「import numpy as np」と書くことでこれ以降はNumPyに関するメソッドは「np」として参照することが出来ます.

###NumPy配列の生成
```py
>>> x = np.array([1,2,3])
>>> print(x)
[1 2 3]
>>> type(x)
<class 'numpy.ndarray'>
```
- 「np.array（）」これだけで配列が作れる
- np.array()の型は`numpy.ndarray`

###NumPyの計算
```py
>>> x = np.array([1,2,3])
>>> y = np.array([4,5,6])
>>> x + y
array([5, 7, 9])
>>> x -y
array([-3, -3, -3])
>>> x * y
array([ 4, 10, 18])
>>> x / y
array([0.25, 0.4 , 0.5 ])
>>> 
```
配列の計算をする上で気をつけることは配列のｘとｙの要素が同じであることですｘ、ｙは要素数が３の１次元配列
もし`yの要素数を４つに変更`すると、

```py
>>> y = np.array([4,5,6,7])
>>> x + y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3,) (4,) 
>>> 
```
**オペランドは(3,) と(4,)の型を一緒にブロードキャストすることが出来ません:weary:**

x,yの型を確認してみる`□.shape`で確認できる

```py
>>> x.shape
(3,)
>>> y.shape
(4,)
```
１次元配列は（□,）、２次元配列は（□,□）、三次元配列（...）と表示される.

###NumPy配列とスカラー値を計算

```py
>>> x * 5
array([ 5, 10, 15])
```
###なぜ計算できるのか？
Numpyには[ブロードキャスト](https://qiita.com/capybara/items/2d5f387996a5bd275fbf)と呼ばれる機能が備わっている.

###NumPyのN次元配列の計算（行列）
```py
>>> A = np.array([[1,2],[3,4]])
>>> B = np.array([[5,6],[7,8]])
>>> A + B
array([[ 6,  8],
       [10, 12]])
>>> A * B
array([[ 5, 12],
       [21, 32]])
>>> 

```
行列の算術計算も同じ形状の行列同士であれば、要素ごとに計算が行われます.
行列にもスカラー値でブロードキャストを行うことが出来ます.
A server is already running(rails sのプロセスが切れない)をさっさと解決する

**サーバーを起動しようとすると以下がでるときの対処法**を数種類まとめました！
どれかで解決できる(はず)。

```
❯ rails s
=> Booting Puma
=> Rails 5.0.7.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
A server is already running. Check プロジェクト名/tmp/pids/server.pid.
Exiting
```

何種類もあるため、上手くいかないときは順番に試してみるコトをおすすめします。

## まず確認すること
たまに`Mac標準のターミナルでサーバー起動状態` & `VSCodeなどのテキストエディタ上のターミナルでサーバー起動しようとしている`方がいるので、
まずは**別のターミナルで既にサーバーを動かしていないか**を確認しましょう！

## パターン①
`railsのプロセス`を削除する

```

$ ps aux | grep rails
user   28321 s001  S+     0:00.00 grep rails

$ kill -9 28321

$ rails s
→ 解決
```

## パターン②
`ポート番号3000番のプロセス`を削除する

```
$ lsof -wni tcp:3000
COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    28295  user   21u  IPv4 0x77d8a30cabb79cc9      0t0  TCP 127.0.0.1:hbci (LISTEN)
ruby    28295  user   22u  IPv6 0x77d8a30cac93f9f9      0t0  TCP [::1]:hbci (LISTEN)

# 「COMMAND」に「ruby」と書いてある行のPIDをコピーして処理を停止(今回は28295)
$ kill -9 28295

$ rails s
→ 解決
```

## パターン③
`サーバー起動の際に使用するID`を削除する

```
$ rm /tmp/pids/server.pid

$ rails s
→ 解決

```
このファイルの場所は`[アプリ名]/tmp/pids/server.pid`に入っているので、パスを指定して削除します。
本来、サーバーを終了するとこのファイルは削除されますが、残ったままでエラーになっている可能性があるみたいです。
※ `server.pid`はサーバー起動や終了で勝手に作られたり削除されたりするので、普段は気にしなくて良いです。


## まとめ
頻繁に出てきた`kill -9 ○○`は`Linuxコマンド`の一つで、プロセスを終了するためのものです。
個人的には、**パターン②**ですんなりプロセスを終了出来ることが多い気がします。

サーバーの立ち上げで足止めをくらうと萎えるので、さくっと解決してください！
React hooks + Django REST Frameworkで欲しいものリストを作成

#制作物について
ReactとDjango REST Frameworkの勉強のアウトプットとして非常に簡単なSPAを作成しました。


**ソースコード**
バックエンド　
https://github.com/s-amano/wishlist2
フロントエンド
https://github.com/s-amano/wishlist-frontend

**アプリのURL**
http://dbs94qexekbu1.cloudfront.net/
サンプルユーザーとして
>アドレス：sample@gmail.com
>パスワード:sample

でログインできます。
#現在無料枠を超えてしまったためインスタンスを止めております。



# 制作物の構成とその構成にした理由
実際に作ったアプリの全体的な構成となぜそのような構成にしたのかを述べていきたいと思います。
## 構成
バックエンドとフロントエンドは開発環境は独立させています。Route53での名前解決は行っておりません。

- バックエンドはDjango REST FrameworkでAPIを作成
 - こちらでCORSの設定
 - ログインなどの認証はトークン認証を使用
- フロントはcreate-react-appコマンドで開発
 - axiosでAPIを叩く

- バックエンドとフロントエンドで別々にデプロイ
 - バックエンドはAWS EC2にnginx環境を構築
 - フロントはS3をCloudFront経由でインターネット上へ公開
 - フロントはさらに、Githubのmasterブランチにプッシュすると自動でソースコードがデプロイ

## 構成の理由
インターンの業務でAWS lambdaでAPIを作成することがあり、その時に使用していた言語がpythonだったので、pythonで何か作るということにしました。さらに上記のAPI作成の業務によりAPIの知識もほんの少しだけあったのでこちらのアウトプットとして、Django REST Frameworkを使おうということになりました。

最初はバックエンドのみでAPIを作ってローカルで試していただけでしたが、フロントも実装してwebアプリケーションにしようと思い、ネットで調べるとreact+DjangoRestFrameworkの構成を見つけたので[その記事](https://qiita.com/sand/items/80a67da0a44b042f0bc3)を参考にreact側も実装してみました。その際にUdemyの「[基礎編]React Hooks + Django REST Framework API でフルスタックWeb開発」という動画も参考にさせていただきました。

インフラについては、スタックオーバーフローなどで別々にデプロイするのがよいみたいなことが書いてあったので、別々にググりました。Reactのデプロイに参考にした記事は[こちら](https://s8a.jp/react-github-aws-s3-auto-deploy)になります。ほとんどこの通りにやりました。Djangoのデプロイは[こちら](https://qiita.com/tachibanayu24/items/b8d73cdfd4cbd42c5b1d)の記事を参考にしました。


#一通り作ってみての感想
今回作成したアプリは非常に簡単なアプリだとは思いますが、非常に時間がかかってしまいました。もちろん自分が初心者だということもあるのですが、自分が思っている以上にアプリの作成は大変なんだなと痛感しました。

ただ今回一通り作ってみて、なにか技術的な知識がついたというよりも、むしろエラーでつまづいた時にどのように解決したらいいか、どのように調べたらいいか、というようなことを多く学んだ気がします。
「エラーが起きて動かなかったときどうすればよいかの勉強」は自分で何かを作るのが一番いいんだなと思いました。

今回作ったアプリ自体にもまだまだ課題があります。例えばログインフォームのバリデーションだったり、セキュリティだったり欲しいものリストにおいて想定外の操作をされるとバグが起こったりということがあります。こちらは随時解消して行こうかと思っています。

次は、上記で述べたバグを解消したりさらに言えば、もう少し大きめの機能がたくさんあるWebアプリケーションを作ったり、チーム開発についても学んでいきたいです。
Audio/Video DOM のcurrentTime1とは

#Audio/Video DOMとは

bodyブロックに書く音声や映像の情報。
例）
`<audio data-key="76" src="sounds/tink.wav"></audio>`

#current Timeの使い方

```
    window.addEventListener('keydown', function (e){
      const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
//再生時間を取得
      var time =audio.currentTime; 
    });
```

例えば

```
audio.currentTime=0;
```
とすると
再生時間が最初に戻る
rails sコマンド実行時にBlocked host:~、To allow requests to~ のメッセージ



##　ruby on rail チュートリアル

・cloud9
・rails 6.0.3.2
・ruby 2.6.3p62

## エラー内容

<img width="203" alt="スクリーンショット 2020-08-02 20.03.00.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680350/314b3fc2-a999-79a9-6304-5da14086adec.jpeg">


##対処方法

以下追記する

```config¥application.rb
config.hosts << 'To Allow requests to からのアドレスをコピペする'

起動コマンド実行
$ rails s
```

<img width="657" alt="スクリーンショット 2020-08-02 20.00.23.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680350/02e35788-7d80-fda9-f0f0-6071169897f9.jpeg">
adoptopenjdkをソースからビルドする（未解決）

adoptopenjdkをビルドしてインストールする(CentOS7)

## 事前準備

https://adoptopenjdk.net/releases.html

ここから必要なboot jdkを落としておく。この手順があっているかは不明

12を入れたいから11を落としてくる

```
cd $HOME/local/src
wget https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.8%2B10/OpenJDK11U-jdk_x64_linux_hotspot_11.0.8_10.tar.gz
tar xvzf OpenJDK11U-jdk_x64_linux_hotspot_11.0.8_10.tar.gz
```

## エラー1: gpgでエラー

```
この署名が所有者のものかどうかの検証手段がありません

Failed to verify signature of freetype.tar.gz
```

LANG=C でlocaleを変えれば直る（gpgの標準出力をechoしてパイプでgrepに渡していたからlocaleが日本語だとだめだったみたい）

```
LANG=C JAVA_HOME=$HOME/local/src/jdk-11.0.8+10 ./makejdk-any-platform.sh jdk12u
```

## エラー2: gitでエラー

```
***省略***/openjdk-build/sbin/prepareWorkspace.sh: line 523: .git/info/sparse-checkout: No such file or directory
```

下記diffで直る（原因調べるのが面倒だったので無理やり）

```diff
diff --git a/sbin/prepareWorkspace.sh b/sbin/prepareWorkspace.sh
index f57838b..ba0d9eb 100644
--- a/sbin/prepareWorkspace.sh
+++ b/sbin/prepareWorkspace.sh
@@ -520,6 +520,8 @@ checkingAndDownloadCaCerts() {
     git init
     git remote add origin -f "${BUILD_CONFIG[OPENJDK_BUILD_REPO_URI]}"
     git config core.sparsecheckout true
+    mkdir .git/info
+    touch .git/info/sparse-checkout
     echo "security/*" >>.git/info/sparse-checkout
     git pull origin "${BUILD_CONFIG[OPENJDK_BUILD_REPO_BRANCH]}"
   fi
```

## エラー3: boot jdkが見つからないエラー

```
configure: Found potential Boot JDK using configure arguments
configure: Potential Boot JDK found at . did not contain bin/java; ignoring
configure: error: The path given by --with-boot-jdk does not contain a valid Boot JDK
configure exiting with result code 1
Error: No configurations found for /****省略****/openjdk-build/workspace/build/src.
Please run 'bash configure' to create a configuration.
```

これこそちゃんとドキュメント読めば解決できそう

`-J`オプションでboot jdkのディレクトリを指定しなければいけなかったみたい

```
LANG=C JAVA_HOME=$HOME/local/src/jdk-11.0.8+10 bash ./makejdk-any-platform.sh -J $HOME/local/src/jdk-11.0.8+10 jdk12u
```


## エラー4: cupsがない

```
checking cups/cups.h usability... no
checking cups/cups.h presence... no
checking for cups/cups.h... no
checking cups/ppd.h usability... no
checking cups/ppd.h presence... no
checking for cups/ppd.h... no
configure: error: Could not find cups! You might be able to fix this by running 'sudo yum install cups-devel'.
```

これはインストールすれば良いだけ

```
cd $HOME/local/src
wget https://github.com/apple/cups/releases/download/v2.3.3/cups-2.3.3-source.tar.gz
tar xvzf cups-2.3.3-source.tar.gz
cd cups-2.3.3
./configure --prefix=$HOME/local
make
sudo make install #/etcの中にsymlinkを貼っていたのでやむを得ず
```

## エラー5: ALSAがない

```
checking for ALSA... no
checking alsa/asoundlib.h usability... no
checking alsa/asoundlib.h presence... no
configure: error: Could not find alsa! You might be able to fix this by running 'sudo yum install alsa-lib-devel'.
checking for alsa/asoundlib.h... no
configure exiting with result code 1
```

これもインストールすれば良いだけ
javascriptで回帰直線を求める

# 回帰直線とは
組となるデータの、中心的な分布傾向を表す直線。
最小二乗法( least squares method )によって求められます。

# 最小二乗法の式
![wiki_lsm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/7c3ffbda-3874-25e0-b0d9-cca5cbad67bf.png)


📖[最小二乗法(wikipedia)](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95)より引用

これを、javascript( ES6 )で関数化します。
`Σ`を`reduce`で表現しています。

```Javascript
// 回帰直線を求める（最小二乗法）
const lsm = coordinates => {
  const n = coordinates.length;
  const sigX = coordinates.reduce((acc, c) => acc + c.x, 0);
  const sigY = coordinates.reduce((acc, c) => acc + c.y, 0);
  const sigXX = coordinates.reduce((acc, c) => acc + c.x * c.x, 0);
  const sigXY = coordinates.reduce((acc, c) => acc + c.x * c.y, 0);
  // a(傾き)を求める
  const a = (n * sigXY - sigX * sigY) / (n * sigXX - Math.pow(sigX, 2));
  // b(切片)を求める
  const b = (sigXX * sigY - sigXY * sigX) / (n * sigXX - Math.pow(sigX, 2));
  return { a, b };
}
```

# 👀動作確認
ドライバを作成して呼び出してみます。

```Javascript
  const coordinates = [
    { x: 200, y: 100 },
    { x: 250, y: 150 },
    { x: 300, y: 150 },
    { x: 312, y: 200 },
    { x: 330, y: 210 },
    { x: 100, y: 80 },
    { x: 110, y: 40 },
  ]

  const { a, b } = lsm(coordinates)
  console.log(a, b)
```

結果

```
0.6227602344112315 -9.665985075256124
```

### 📈グラフを書いて確認
canvasにグラフを描画して確認してみました。
青のドットがサンプルデータ、赤が回帰直線です。
![result_lsm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/9acc6333-5d08-f058-ce36-093450ea4d34.png)

確認に使ったソースコードは以下です。
### html

```html
<html>
  <head></head>
  <body>
    <canvas id="graph" width="500" height="500"></canvas>
    <script type="text/javascript" src="main.js"></script>
  </body>
</html>
```

### javascript

```javascript:main.js
// 回帰直線を求める（最小二乗法）
const lsm = coordinates => {
  const n = coordinates.length
  const sigX = coordinates.reduce((acc, c) => acc + c.x, 0)
  const sigY = coordinates.reduce((acc, c) => acc + c.y, 0)
  const sigXX = coordinates.reduce((acc, c) => acc + c.x * c.x, 0)
  const sigXY = coordinates.reduce((acc, c) => acc + c.x * c.y, 0)
  // a(傾き)を求める
  const a = (n * sigXY - sigX * sigY) / (n * sigXX - Math.pow(sigX, 2));
  // b(切片)を求める
  const b = (sigXX * sigY - sigXY * sigX) / (n * sigXX - Math.pow(sigX, 2));
  return { a, b }
}

const canvas = document.getElementById('graph');
if (canvas.getContext) {
  const ctx = canvas.getContext('2d');

  // ｘ軸の描画
  ctx.beginPath();
  ctx.moveTo(100, 0);
  ctx.lineTo(100, 500);
  ctx.stroke();
  // ｙ軸の描画
  ctx.beginPath();
  ctx.moveTo(0, 400);
  ctx.lineTo(500, 400);
  ctx.stroke();

  const coordinates = [
    { x: 200, y: 100 },
    { x: 250, y: 150 },
    { x: 300, y: 150 },
    { x: 312, y: 200 },
    { x: 330, y: 210 },
    { x: 100, y: 80 },
    { x: 110, y: 40 },
  ]
  // サンプルデータの点を描画
  ctx.fillStyle = "rgb(0, 0, 255)"
  coordinates.forEach(c => {
    ctx.fillRect(c.x + 100, -c.y + 400, 3, 3)
  })

  // 回帰直線の描画  
  const { a, b } = lsm(coordinates)
  ctx.strokeStyle = "rgb(255, 0, 0)";
  ctx.beginPath();
  ctx.moveTo(-100 + 100, -(-100 * a + b) + 400);
  ctx.lineTo(400 + 100, -(400 * a + b) + 400);
  ctx.stroke();
}
```


コードのダウンロードは[ここ](https://github.com/quzq/function_lsm)。

以上。
Linuxのメモリ保護に関するあるハードウェア支援の対応について思ったこと

先週LWNにメモリ保護に関するハードウェア支援の対応に関する記事があった。OSのSupervisor権限とは何なのか。解消されない疑問を持ったまま週末が終わろうとしているので、Qiitaに記憶しようと思う。

X86にはユーザスペースの使用しているページにアクセス制限を付与するハードウェア支援が存在する。この機能を使用したユーザスペースのプロセスに対して、カーネルはWriteまたはRead＋Writeアクセスが許可されない。

一つは、MPK (Memory Protection Key)。
1つのプロセスが16個のページ領域をアクセス制限ができる機能（16という数値が何から来ているのかは不明）。
“Write disable”または“Access disable (= Write disable + Read disable)”の制限ができる。
アクセス変更のオーバヘッドが大きいらしく、プロセスのパフォーマンスが悪くなる。
2016年にLinux4.6でサポートされている。

もう一つはPKS (Protection Key Supervision)。
MPKと同様の機能を持つ。パフォーマンス問題を軽減したハードウェア支援らしい。
2020年7月14日にパッチが公開されている。

カーネルの致命的なバグによってユーザスペースプロセスが動かなくなったり、セキュリティホールを回避できないということはある。だから、この機能は必要なのかもしれない。
でも、この機能を使うことはOSの根本設計から外れているようにも思える。

私は保守的なのだろう。私の世界が狭いのだろう。

参考資料
https://lwn.net/Articles/643797/
https://lwn.net/Articles/826091/
【講演メモ】ネットワークデザインパターンDeep Dive


AWS professional勉強のため講演をまとめたメモです。
ご参考まで。

資料　https://pages.awscloud.com/rs/112-TZM-766/images/B1-04.pdf
動画　https://www.youtube.com/watch?v=6I7jQOLOiWY

#ネットワーク設計に重要なサービスのおさらい
- VPCリリース
- 共有サービス提供VPCパターン
    - VPCピアリング
- 海外のリージョンに接続 Inter-RegionPeering
    - AzureのグローバルVNETピアリング相当
- Direct Connect
    - 1つのPrivate VIFに対してVGW
- Direct Connect Gateway 2017-11
    - 1つのPrivate VIFで複数VPCに接続可能
    - マルチアカウントに非対応だった
- Direct Connect Gatewayマルチアカウント対応
    - 海外リージョンにおいてもクロスアカウント可能に
- Direct Connect Gateway + 海外リージョン
- Transit Gateway 2018-11
    - 各VPCにENIを一つ。
    - 折返し通信可能。
    - この時点では、Direct Connect未対応
- Transit GatewayがDirect Connect対応 2019-5
    - Transit Gateway用にTransit VIFを作成
    - 東京リージョン未対応（2020年時点では対応）
    - https://aws.amazon.com/jp/transit-gateway/faqs/

#ネットワーク関連でよくある相談
##1. オンプレミス/VPN内からVPC外サービスへアクセスしたい
- VPN Endpoint GW型
    - DynamoDB, S3（当時も2020年8月時点も2サービスのみ）
    - https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html
    - オンプレミスから直接Proxy on EC2が必要。
- VPC Endpoint Interface型
    - DynamoDB, S3以外のサービス
    - VPCエンドポイント未対応サービスへの接続方法は？
        - Endpoint Interfaceを使用しないでDirect Connect Public VIF経由で接続する方法もある。（ハードル高いな。）
- NAT GW経由
    - 共有サービスVPC 
    - PrivateLink（クライアントVPC内）→Proxy on EC2→ NAT GW→Cognito
- Public Interfaceによるアクセス
    - Public IPを使う場合はだめ。（AzureのMSFTピアリング相当）
##2. オンプレミス/AWS間のシームレスなDNS設計がしたい
- DNS解決の流れについておさらい
    - Route53のIPアドレス VPC CIDR+2のアドレスが提供される
    - オンプレミスから繋ぐ場合にはどうなる？
    - AWSのリソースからオンプレミスのDNS
    - オンプレミスから見て意識させないようにしたい。
    - Route53はAWSリソースからしか名前解決しない。
- 解決策　Route53 Resolver Endpoint
    - Inbound Endpoint（オンプレ→AWSを名前解決）
        - オンプレのDNS Resolverで、aws.example.comについてはInbound Endpointへ転送するように設定しておく
    - Outbound Endpoint（AWS→オンプレミスを名前解決）
        - Outbound転送ルールにオンプレミスのDNSレコードを登録しておく。
    - Transit GatewayにおけるDNSクエリ
        - 同一アカウント同一Transit GatewayのVPC接続 
            - Route53 Resolver Endpointは不要
        - クロスアカウント
            - Route53 Resolver Endpointが必要
            -（公開資料に記載）

##3. オンプレミス/AWS間接続を高信頼にしたい
- 解決したい課題

オンプレミス/AWS間の冗長化・高信頼設計
よくある要求仕様
　TCPセッションは障害時に即座にバックアップ回線に引き継がれること。
　Design for failureの考え方・・・絶対に

落ちないシステムはない。
費用対効果の観点で冗長化する箇所を優先付け（優先度は1が高、5が低）
- 1 デュアルDirect Connectロケーション
    - 東京リージョン（Equinix TY2), 東京@CC1にそれぞれ置く
    - ロケーションというのがあるんですね。
    アット東京 CC1 中央データセンター、東京、日本	 	アジアパシフィック (東京)
　　Chief Telecom LY、台北、台湾	 	アジアパシフィック (東京)
　　Chunghwa Telecom、台北、台湾	 	アジアパシフィック (東京)
　　Equinix OS1、大阪、日本	 	アジアパシフィック (東京)
　　Equinix TY2、東京、日本	Equinix TY2、TY6 – TY8、東京アジアパシフィック (東京)
　https://aws.amazon.com/jp/directconnect/features/
- 2 同一キャリアで別経路を用意する
- 3 異なる通信キャリアを利用 
- 4 大阪ローカルリージョンの利用
    - Direct Connect GatewayはAWS側で冗長されているので、SPOF(single point of failure)にならない。
- 参考　障害時のみInternet VPNを利用
- 5 海外リージョンの利用

#移行
　こちらは割愛。