OmniAICreator/Qiita-1.07M huggingface dataset:
ArchLinuxでRemminaのセッションを削除する

Linuxでリモートデスクトップを利用するときに重宝するReminnaですが、インストール時にGnomeのセッションを作成します。
このセッションを使う場合はいいのですが、Gnomeが入っていない純粋なXfceやLxdeだけの場合は、このセッションは使用できません。
なのでこのセッションを自動で削除するスクリプトを作成します。

## 原因
Remminaが作成するセッションは`/usr/share/xsessions/remmina-gnome.desktop`を作成するからです。
なのでこれを削除するか拡張子を変更すればディスプレイマネージャには認識されなくなります。
しかし、このままではRemminaを更新すると復活してしまうため自動で削除する`pacman`のフックを作成します。
pacmanフックはパッケージに変化が起きたときに自動でスクリプトを実行してくれる便利なものです。

## フック

`/usr/share/libalpm/hooks/remove-remmina-session.hook`を以下の内容で作成します。

```properties
[Trigger]
Type = Path
Operation = Install
Operation = Upgrade
Operation = Remove
Target = usr/share/xsessions/remmina-gnome.desktop

[Action]
Description = Removing Remmina session ...
When = PostTransaction
Exec = /bin/bash -c 'rm -f /usr/share/xsessions/remmina-gnome.desktop'
NeedsTargets
```
そうするとRemminaが更新、削除、追加などをされた時点でセッションを自動で削除してくれます。

## 参考
[ArchWiki Pacman フック](https://wiki.archlinux.jp/index.php/Pacman#.E3.83.95.E3.83.83.E3.82.AF)
[Man alpm-hook](https://man.kusakata.com/man/alpm-hooks.5.html)
Kaggle の Titanic: Machine Learning from Disaster で score 0.81339 を出すシンプルなコード

これを動かしたらそれなりの予測精度にはなるはず。
もうちょっとブラッシュアップしてみようと思う。

```
from sklearn.ensemble import RandomForestClassifier

# データの取り込みと中身の確認
train_data = pd.read_csv("../input/titanic/train.csv")
test_data = pd.read_csv("../input/titanic/test.csv")

# 欠損値の処理
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)
train_data['Embarked'].fillna(train_data['Embarked'].mode(), inplace=True)
test_data['Age'].fillna(test_data['Age'].median(), inplace=True)
test_data['Fare'].fillna(test_data.groupby('Pclass')['Fare'].median()[3], inplace=True)

# データの準備
y_train = train_data["Survived"]
features = ["Pclass", "Sex", "SibSp", "Parch", 'Embarked']
X_train = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])

# 訓練用データの特徴量エンジニアリング
X_train['Young'] = np.where(train_data['Age'] < 15, 1, 0)
X_train['Old'] = np.where(train_data['Age'] >= 65, 1, 0)
X_train['Family'] = train_data['SibSp'] + train_data['Parch']
X_train['Alone'] = np.where(X_train['Family'] == 0, 1, 0)
X_train['Fare'] = (train_data['Fare'] - train_data['Fare'].min()) / (train_data['Fare'].max() - train_data['Fare'].min())

# テスト用データの特徴量エンジニアリング
X_test['Young'] = np.where(test_data['Age'] < 15, 1, 0)
X_test['Old'] = np.where(test_data['Age'] >= 65, 1, 0)
X_test['Family'] = test_data['SibSp'] + test_data['Parch']
X_test['Alone'] = np.where(X_test['Family'] == 0, 1, 0)
X_test['Fare'] = (test_data['Fare'] - test_data['Fare'].min()) / (test_data['Fare'].max() - test_data['Fare'].min())

# モデルの作成と当てはめ
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X_train, y_train)
predictions = model.predict(X_test)

# 提出用データの保存
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")
```
pyenvでバージョン一覧表示されたバージョンをインストールする

## 実現したいこと

pyenv で pyenv install -lした際に表示されたバージョンを全てインストールする
ただし、*-devやa5などは、除外する

## 実行コマンド

```
pyenv install -l | grep -E "\s3.[0-9.]+$" | sort -nr | xargs -I{} pyenv install {}
```

## 補足

すべてのバージョンではなく、要件に応じて一つ一つ必要なバージョンのpythonをインストールするのが良いと思います。
pyenvでバージョン一覧表示したときに上から10個のバージョンのみをインストールする

## 実現したいこと

pyenv で ```pyenv install -l```した際に上位10個のバージョンのみをインストールする
ただし、*-devやa5などは、除外する

```
% pyenv install -l | grep -E "\s3." | sort -nr | head -15
  3.9.0a5
  3.9-dev
  3.8.2
  3.8.1
  3.8.0
  3.8-dev
  3.7.7
  3.7.6
  3.7.5
  3.7.4
  3.7.3
  3.7.2
  3.7.1
  3.7.0
  3.7-dev
% 
```

## 実行コマンド

```
pyenv install -l | grep -E "\s3.[0-9.]+$" | sort -nr | head -10 | xargs -I{} pyenv install {}
```

## 補足

```
% pyenv install -l | grep -E "\s3.[0-9.]+$" | sort -nr | head -10
  3.8.2
  3.8.1
  3.8.0
  3.7.7
  3.7.6
  3.7.5
  3.7.4
  3.7.3
  3.7.2
  3.7.1
%
```

```
% pyenv install -l | grep -E "\s3." | sort -nr | head -50
  3.9.0a5
  3.9-dev
  3.8.2
  3.8.1
  3.8.0
  3.8-dev
  3.7.7
  3.7.6
  3.7.5
  3.7.4
  3.7.3
  3.7.2
  3.7.1
  3.7.0
  3.7-dev
  3.6.9
  3.6.8
  3.6.7
  3.6.6
  3.6.5
  3.6.4
  3.6.3
  3.6.2
  3.6.10
  3.6.1
  3.6.0
  3.6-dev
  3.5.9
  3.5.8
  3.5.7
  3.5.6
  3.5.5
  3.5.4
  3.5.3
  3.5.2
  3.5.1
  3.5.0
  3.5-dev
  3.4.9
  3.4.8
  3.4.7
  3.4.6
  3.4.5
  3.4.4
  3.4.3
  3.4.2
  3.4.10
  3.4.1
  3.4.0
  3.4-dev
% 
```

上位10個ではなく、要件に応じて一つ一つ必要なバージョンのpythonをインストールするのが良いと思います。
OS再起動時にWSL2 for Docker Desktopでcannot find cgroup mount が出る

この記事では基本的なWSL導入までの流れは汲みません｡

# 進化中のWSL
`WSL2`から連携可能になった`Docker Desktop`
これでwindows上でもlinuxサーバ開発ができるヤッター！ 
面倒臭いデュアルブートの設定しなくて済むし、Aviutl使いながらdockerビルドとかもできるワーイ！
[Microsoft Build 2020イベント](https://mybuild.microsoft.com/)でGPUサポートの話まで出た！nvidia dockerまで使えるようになったら最高や！

しかしながら、お披露目からそんなに経って無いということもあり動作に直結する細かいバグがちらほら見られる。

個人的にメンドくさいと思ってるのがタイトルの事象。

## 初回起動時
WSL構築当初はそもそもマウント先を指定する必要があるので[git hub issue](https://github.com/microsoft/WSL/issues/4189#issuecomment-518277265)に則った方法は必須となる。

```
cgroups: cannot find cgroup mount destination: unknown 
```

上記エラーがでるので下記コマンドで対処

```
sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
```

これでdockerは難なく動くようになる。


## OS再起動すると認識されなくなる
問題はここからでOS再起動時にdockerも立ち上がるように設定しておりdocker自体も問題なく起動しているようだが、
`docker build`なりをWSL上で使おうとすると同じエラーが出て動かない。

```
sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
```
もう一度同じコマンドを打つと（当たり前だが）ディレクトリが存在しているエラーを吐き、
マウント解除してから同じコマンドぶつけても症状は変わらず。

調べてみると、どうもOS終了前の状態を記憶しているようで再起動時に同期が取れないことが原因のようである。
(リフレッシュ前にwindows側のdockerを操作するとWSL側のdockerの状態が一致していないことが確認できる)

## 対処法
同期取れててないなら再起動だ。もしくはWSLとdockerを連携したときの手順を思い返そう。
docker ->「setting」にある「resource」->「WSL Integration」をUbuntuを使おうとした場合、これをonにしたはずだ。
一旦offでリスタートしてからonに戻してリスタートするエラーが回避できた。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614012/d4a6cda4-a206-9bff-cc16-755665c14215.png)


### バージョン2.3.0.2の場合
![コメント 2020-05-15 122035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614012/1757a9cb-1650-1e9f-68ce-a8651ac7ac2f.png)

五月頭にリリースされたバージョン2.3.0.2から画面が変わりました。
「Refresh」ボタンが追加されたようですが現状機能してないみたいです。今後のアップデートで実装されるのかな？

![コメント 2020-05-15 121712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614012/c658608b-bf69-0729-50ba-7ae4c6e57736.png)

この場合「WSL Integration」の項目を全てオフにして「apply & restart」で適用させてから、もう一度項目すべてをonにして「apply & restart」すると
無事WSL上でdockerが使えるようになります。

自分の環境だと再起動するたびに必須なのですが、他の環境だとこの限りではないのかもしれません。

## 参考文献
https://github.com/microsoft/WSL/issues/4189#issuecomment-518277265
【学習メモ】JavaScript（プリミティブ型とオブジェクト型）


基礎構文については
[【学習メモ】JavaScriptの基礎まとめ](https://qiita.com/kota_sho/items/f32ea4df015976557a07)

プリミティブ型とは、メソッドを持たないデータで、文字列、数値、Bigint、真偽値、undefined、シンボルがある。
プリミティブ型は、オブジェクト型と異なり値を変更することができない値として定義される。
[Primitive(プリミティブ)](https://developer.mozilla.org/ja/docs/Glossary/Primitive)
[JavaScriptのデータ型と参照](https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures)



####◾️値を変更した時の影響をまとめてみました。

####１、プリミティブ型は、一方が変更されてもその影響を受けない。

例：
aに35を代入し、aをbに代入してみる。この時点ではa,b共に35となる。
次にaに47を改めて代入し、値を更新する。
しかし、bは依然として47のままとなる。

```js
var a = 35;
var b = a;
a = 47;
console.log(a); //47
console.log(b); //35
```
####２、オブジェクト型は、一方が変更されるともう一方も影響を受ける。

２つのオブジェクト、obj1とobj2を作ってみる。
obj1をobj2に代入後、obj1の値を更新すると,
obj2の値も更新される。

```js
//オブジェクト型
var obj1 = {  
  name: 'Sho',
  age: 28
};

//obj1をobj2に代入
var obj2 = obj1;
//obj1の値を更新
obj1.age = 32;
//obj2の値も更新される
console.log(obj1.age); //32
console.log(obj2.age); //32
```

####３、プリミティブ型とオブジェクト型の比較
```js
//プリミティブ型
var age = 28;
//オブジェクト型
var obj = {
  name: 'Sho',
  job: 'salesMan'
};

function change(a, b){
  a = 30;
  b.job = 'enginner';
}

//changeの引数にプリミティブ型とオブジェクト型を渡す
change(age, obj);

//プリミティブ型であるageは28のまま
//オブジェクト型であるobjは変更される。
console.log(age); // 28
console.log(obj.job); //enginner
```
MariaDB で、root のパスワードを再設定

MariaDB 10.4.13 でのルートのパスワードを忘れた時に、再設定する方法です。
次のページを参考にしました。
[How To Reset Your MySQL or MariaDB Root Password](https://www.digitalocean.com/community/tutorials/how-to-reset-your-mysql-or-mari
adb-root-password)

1) mariadb の停止

```bash
sudo systemctl stop mysqld
```

2) セーフモードで mariadb を立ち上げる

```bash
sudo mysqld_safe --skip-grant-tables --skip-networking &
```

3) root でアクセス

```text
$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.13-MariaDB Arch Linux

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

4) グラントテーブルのロード

```text
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.003 sec)
```

5) root パスワードの変更

```text
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'tiger123';
```

6) 結果を反映して、接続の遮断

```text
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit;
Bye
```

7) セーフモードで動いている　mariadb の停止

```text
$ ps ax | grep mysql
   5284 pts/1    S      0:00 sudo mysqld_safe --skip-grant-tables --skip-networking
   5285 pts/1    S      0:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables --skip-networking
   5370 pts/1    Sl     0:00 /usr/bin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=/var/lib/mysql/iwata.err --pid-file=iwata.pid
   5479 pts/1    S+     0:00 grep mysql
$ sudo kill -9 5284 5285 5370
[1]+  Killed                  sudo mysqld_safe --skip-grant-tables --skip-networking
```

8) mariadb を起動

```bash
sudo systemctl start mysqld
```

9) root で接続

```text
$ mysql -uroot -ptiger123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.4.13-MariaDB Arch Linux

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
```
EC2・EIP・RDSなどそれぞれの役割【AWS】

#はじめに
【この記事を書いたきっかけ】
AWSでデプロイを行ったが用語の理解が甘かったので、自分でまとめていつでも振り返ることができるようにする為。あくまでメモ代わりに書いているので、詳しい方法については書いていません。


#EC2
`EC2(Amazon Elastic Compute Cloud)`はAWSが提供する仮想サーバ。
EC2で起動したサーバは、「EC2サーバ」「EC2インスタンス」「インスタンス」などと呼ばれている。

`EC2でWebサーバを作って試すまでの流れ`
<b>1. EC2インスタンスを作成する
2. EC2にログインする
3. サーバに「Nginx」をインストールする
4. ブラウザからWebサーバにアクセスする
5. Nginx用のHTMLを作成する</b>




###EC2にログインする
####①SSH内にキーペアファイルを保存する

EC2インスタンス作成時にダウンロードしたキーペア(something.pem)をユーザのホームディレクトリのSSH内に保存する。
実行時には、ログインしているMacユーザのパスワードを求められる。

```
$ sudo mv ~/Downloads/something.pem ~/.ssh
```

<b>「sudo」</b>は、管理者権限でコマンドを実行するコマンド。
<b>「mv」</b>は、ファイルを移動するコマンド。


####②キーペアファイルの権限を変更する

```
$ sudo chmod 600 ~/.ssh/practice-aws.pem
```

<b>「chmod」</b>は、権限を変更するコマンド。

####③SSHでサーバにアクセス
キーペア、アクセス先サーバのユーザ名、パブリックIPアドレスを指定
パブリックIPアドレスはインスタンス画面で確認する。

```
$ ssh -i /Users/ユーザ名/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx
```


##サーバにNginxをインストール
##Nginx
NginxはサーバをWebサーバにするためのミドルウェア。

```
$ sudo yum install -y nginx
```
「完了しました!」が表示されれば、インストール完了。
<b>「yum」</b>は、アプリケーションをインストールするコマンド。


#####Nginxの自動起動を設定する

```
$ sudo chkconfig nginx on
```
ここではコマンドを実行しても何も表示されない。

#####Nginxを起動する

```
$ sudo service nginx start
Starting nginx:                   [  OK  ]
```



Nginxを起動すると、インターネットにWebサービスが公開される。
(EC2インスタンスに割り当てたパブリックIPアドレスにWebブラウザからアクセス)

下記のような画像が表示されればOK。

![nginx-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607423/41da09de-c5c7-bb01-e85d-85d58a4e4868.png)

####Webサーバ上で表示するHTMLファイルを作成し、「Hello World」を表示させる。

```
$ sudo sh -c  "echo 'Hello World' > /usr/share/nginx/html/index.html"
```

####サーバを停止
「インスタンス」一覧画面で停止したいインスタンスを選択し、「アクション」メニューの「インスタンスの状態」で「停止」を選択。
「インスタンスの状態」が「stopped」になっていれば停止状態。



###サーバを停止後、再度起動してssh接続すると、エラーが出る。

```
$ ssh -i /Users/ユーザ名/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx
```

EC2インスタンスではサーバを停止するとパブリックIPアドレスが変わるから以前のパブリックIPアドレスでは接続できない。。
EC2コンソールから新しいパブリックIPアドレスを確認して書き換える必要がある。
→後にEIPで解決できる。

##SSH
「SSH(Secure Shell」は、他のコンピュータと通信する為のプロトコルの一つ。
「プロトコル（Protocol）」は、コンピュータ同士が通信する際に決められている手順や規約。

コンピュータ同士は、さまざまな手段で通信をしている。
コンテンツを送受信するHTTP、メールを送受信するSMTP、ファイルを転送するFTPなど。

#EIP
`EIP(Elastic IP)`はEC2インスタンスにパブリックIPアドレスを付与するサービス。
EC2インスタンスではサービス停止後に再起動するとパブリックIPアドレスが変わってしまう。
毎回パブリックIPアドレスが変わるのは面倒なので、EIPを使って固定のIPアドレスにする。

EIPの設定はEC2ダッシュボードから設定できる。

また、EIPに関連づけられているサーバは変更も可能。
あるサーバで不具合が起きて使えなくなった場合、別のサーバにEIPを付け替えることでサービスを継続できる。

<参考>EIPの割り当て
https://qiita.com/tseno/items/1c6303d778f9089f6f89


#AMI
`AMI(Amazon Machine Image)`はEC2インスタンスをバックアップする方法。
AMIはEC2インスタンスの構成を取得し、テンプレートを作成するサービス。
AMIによって、EC2インスタンスディスク内の全内容（たとえば、OSやミドルウェア、アプリケーションなど）をバックアップできる。

<参考>AMIの設定方法
http://blog.serverworks.co.jp/tech/2015/05/18/ami_gettodaze/

#RDS
`RDS(Relational Database Service)`はAWSが提供するクラウド型のデータサービス。
データベース管理システム自体はソフトウエアなので、EC2サーバにインストールすれば、データベースサーバを構築できる。

代表的なデータベース管理システムには、`MySQL、PostgreSQL、Oracle Database`などがある。

<参考>RDSを使うメリット
https://aws.amazon.com/jp/rds/
【Chalice】multipart/form-data でアップロードされたファイルを扱う

### Chaliceで作ったAPIへファイルをアップロードして処理をする
```
import chalice
import io
import cgi
import tempfile
import pandas as pd


app = Chalice(app_name='app-name-dayo')


@app.route('/upload', methods=['POST'], content_types=['multipart/form-data'])
def upload():
    # bodyへのストリームを取得
    body_stream = io.BytesIO(app.current_request.raw_body)

    # パースするための各種設定
    environ = {'REQUEST_METHOD': 'POST'}
    headers = {'content-type': app.current_request.headers['content-type'], 
               'content-length': app.current_request.headers['content-length']}

    # FieldStorageでmultipart/form-dataを各情報毎に分離
    field_storage = cgi.FieldStorage(fp=body_stream, environ=environ, headers=headers)

    # ファイルのバイナリを取得
    file_binary = field_storage.getvalue('uploadFile')


    #----- 以下、File-likeで扱いたい人用 -------#


    # 一時ファイルを作成
    temp_file = tempfile.TemporaryFile()

    # binaryの内容を一時ファイルへ書き込み
    temp_file.write(file_binary)

    # シークポイントの初期化
    temp_file.seek(0)

    # pandasなどのfile-likeで読み込む必要があるライブラリを使う場合
    # file-likeなので、そのまま投げるだけで扱えます
    df = pd.read_csv(temp_file)

    # 紳士の嗜み
    temp_file.close()
    return 'OWARI'
```
```
    <form action="lambdaURL/upload" enctype="multipart/form-data" method="POST">
      <input type="file" name="uploadFile" />
      <input type="submit" />
    </form>
```

###### インターネットを探し回っても、アップロードから一時ファイル化までを一貫したサンプルがなかった。。。
###### 誰かの助けになれば幸いです。
QuickSightのReaderユーザー作成

## Readerユーザーとは

QuickSightのユーザーの種類で閲覧用のユーザーです。ダッシュボードの閲覧ができますが、それだけでなく、データのドリルダウン, フィルタ設定の変更と適用, CSVでデータのダウンロードなどの操作ができます。QuickSightの管理や分析の作成は管理者でなければできません。

## QuickSightでReaderユーザーを作成

ユーザー定義JSONファイルを作り、そのファイルを指定してregisterUserのAPIを使いユーザーを作成します

### ユーザー定義JSON作成

register-prod-reader1.jsonというファイルを作成します。これはQuickSightユーザーの種類, メールアドレス, ユーザー名などを定義しています。
 ※メールアドレスは任意のものに置き換えます。

```json:register-prod-reader1.json

{
    "IdentityType": "QUICKSIGHT",
    "Email": "prod-reader1@test.com",
    "UserRole": "READER",
    "AwsAccountId": "<your aws account>",
    "Namespace":"default",
    "UserName": "prod-reader1"
}
```

### Readerユーザー作成

次のコマンドを実行し、Readerユーザーを作成します。

```bash
$ aws quicksight register-user --cli-input-json file://register-prod-reader1.json
```

以下のような出力があれば成功です。
各ユーザーのUserInvitationUrl値を書き留めます。この後のユーザー登録のために使います。

```json:
{
    {
    "Status": 201,
    "RequestId": "57431e4f-1c23-4026-9fe5-e3609388d007",
    "User": {
        "UserName": "prod-reader1",
        "PrincipalId": "user/d-906706bd27/b003efc4-ff2e-4c47-97a7-255a1f16fb13",
        "Role": "READER",
        "Active": false,
        "Email": "prod-reader1@test.com",
        "Arn": "arn:aws:quicksight:us-east-1:<your aws account>:user/default/prod-reader1"
         },
    "UserInvitationUrl": "https://signin.aws.amazon.com/inviteuser?token=11yC6lblMtp17A5Izt3XQA0VeHGgtvu1mvaFnEZvwsuPFi-k1rWf5g9dqzZu0W0Ugx6nmuXaIk4SQub0gB09XO8RuGPn-MomVJtYOngNU54VMJiO5C4sOxo-RaTlj5R3w63BnWB0z_WV6b--A849K1irTm1GgBms5wm8_ZwjXUHLg1fqbakuU_Z71CYwx8ZfYTwzfywqJ9gkD6pw"
    }
}
```

### Readerユーザーの登録完了処理

先程書き留めたprod-reader1のUserInvitationUrlの値(URL)をブラウザで開きます。表示される画面でパスワードを設定しサインインします。このURLは、ユーザーの登録の完了とパスワード設定を提供します(※UserInvitationUrlはIAMユーザーでもActive DirectoryユーザーでもないQuickSightユーザーを作成した場合に提供され、そのユーザーはサインインしてパスワードを入力するまで非アクティブになっています) 。 

## Readerグループ作成

Readerグループを作成します。

```bash

$ aws quicksight create-group --aws-account-id <your aws account> --namespace 'default' --group-name 'dashboard-readers'
```

ReaderグループにReaderユーザーを割り当てます。

```bash
$ aws quicksight create-group-membership --aws-account-id <your aws account> --namespace 'default' --group-name 'dashboard-readers' --member-name 'prod-reader1'
```
unity1weekに参加してみて

# unity1weekに参加してみて公開するまで

#unity1weekとは

Unityを使って1週間でゲームを作るイベントです。
以下、本家サイト
[Unity1週間ゲームジャム](https://unityroom.com/unity1weeks)

## ゲームのテーマを確認
[密](https://unityroom.com/unity1weeks/16)が今回のテーマになります。

# ゲームの内容と目的を考える

今回の個人的大目標は "unity1roomで何か最低限の状態をだす"でした。

密は、ほとんど思いつかなかったのでサーバーとクライアントが密につながっている
クイズゲームということにしています。


# 作ったゲーム

タイトルは[カメＱ](https://unityroom.com/games/turtle_quiz)です

タイトル画面
<img width="779" alt="f3333ba636910b808cc787ac05117173.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/f56c8b56-a757-9f09-303f-38e3be53a00a.png">

クイズ解答画面
<img width="863" alt="54449c9994d6fe83dac84d97ec1561fe.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/2a8a7d98-4583-1ac0-ba25-3e3ad6bed393.png">

４択のクイズで正解を選んだらスコアが増えるゲームとして作りました
＊クイズの中身は現在作成中になります

# 公開手続き

今回は、躓いたこともいくつかあったので作業手順も一緒に残していきます。

## WebGlでビルド

unity1weekでは、unityroomに投稿する必要があるので、WebGlでビルドをしていました。
＊実際のビルドには、30分前後もかかったりしたので注意が必要です

## ファイルのアップロードを選択

### ゲームの概要を入力

<img width="929" alt="067c94a70c62f96c6659f166dc56f635.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/f7fea438-0862-80a3-74f6-486a4c473de9.png">

### WebGlの設定を入力

<img width="629" alt="WebGl_Config.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/31aae67a-32e0-89c5-4abf-72fa301c1af9.png">

### WebGlのアップロード作業

画面に出てくる拡張子とあっているものを選択してアップロードしていくだけ


## ここで設定完了なので確認をしてみる

動かない....,,,,

エラーとしては、サーバー側がUnityroom側からのリクエストを受け付けないようになっていた

## azure側のcsrfにunityroomを追加してみる

<img width="922" alt="設定変更.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/f0dcbd1e-8dc9-5631-d35a-41fda8937d40.png">


### 通信イメージ
unityroomの場合、外部にリクエストを送信するサーバーは別になっているので以下のような図形になります(2020年5月現在)
![quizSystemDocument.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/a2661103-07d2-05d5-7fb0-556cc4f7da37.png)

## 最後に

今回は、unityroomへのアップロード以外に、通信処理を入れた場合の設定値等についても知見を得られることが多くあり良かったです。

今回は参加できてよかったです。
数値の入った pd.Series を入力すると、最大で小数点以下何桁まであるか調べるメソッド

# 注意

本記事の方法では、表現誤差のある数値（``0.30000000000000004``といったもの）が含まれている場合、その数値に引きずられて桁数が大きくなってしまいます。

使用する際は、表現誤差のある数値があるかを確認すると良いでしょう。（もしくは、得られた桁数が異常に大きくない事を確認すると良いでしょう。）

# 経緯

pandas.Series の interpolate メソッドで補間した際に、小数点以下の桁数が増えてしまいました。

例：

```python:python
import pandas as pd

# 小数点以下 1桁 のデータ
series = pd.Series([0.2, np.nan, 0.5])

# 補間すると 2桁 になってしまう
series.interpolate() # => [0.20, 0.35, 0.50]
```

そこで、補間前に小数点以下桁数を記録しておき、補間後にその桁数に丸める事にしました。

この過程で、「数値の入った pd.Series を入力すると、最大で小数点以下何桁まであるか調べるメソッド」を作成したので、この記事で共有したいと思います。

# 作成したメソッド

```python:python
# 最大で小数点以下何桁まであるか調べる
def calc_n_digit_after_the_decimal_point(series):
    
    # 文字列に変換
    str_series = series.map(lambda x: str(x))
    
    # 少数以下があるものを抜き出す
    # 「 x[-2:] != '.0' 」では、「1.0」の様に float型だけど値は整数である様なものかを判定している
    mask = str_series.map(lambda x: ('.' in x) & (x[-2:] != '.0'))
    only_decimal_str_series = str_series[mask]

    # 少数がある場合
    if only_decimal_str_series.size > 0:
        
        # 少数以下の桁数の最大値を取得
        # この桁に四捨五入する
        n_digit = only_decimal_str_series.map(lambda x: len(x.split('.')[1])).value_counts().sort_index().index.max()

    # 少数がない場合
    else:
        n_digit = 0

    return n_digit
```

# 使用例

```python:python
# 小数点以下 1桁 のデータ
series = pd.Series([0.2, np.nan, 0.5])

# 桁数を記録
n_digit = calc_n_digit_after_the_decimal_point(series)

# 補間
series = series.interpolate()

# 記録しておいた桁数に丸める
series.round(n_digit) # => [0.2, 0.4, 0.5]
```
JavaScriptⅣ 

#プログラミング勉強日記
　2020年5月23日

#####オブジェクト関数
　オブジェクトの値には関数を用いることもできる。プロパティの値として関数を記述する。その関数を呼び出すには「定数名.プロパティ値()」とする。

```javascript
const user={
  name:"田中",
  greet:()=>{
    console.log("Hello");
  }
};
user.greet(); //コンソール：Hello
```
#####クラス
　効率よくオブジェクトを作成するための方法として最初に用意するもの。「class クラス名」で新しくクラスを用意することができる。<font color=blue>クラス名は基本的に大文字から始める。</font>

#####インスタンスの生成
　クラスからオブジェクトを生成するためには「new クラス名()」とする。クラスから生成したオブジェクトを特別にインスタンスという。あるクラスのインスタンスをクラス名インスタンスという。

#####コンストラクタ
　クラスにある機能。インストラクタを生成するときに実行したい処理や設定を追加するための機能。

```javascript
class Animal{
  constructor(){
    console.log("Hello");
  }
}
const animal1=new Animal(); //コンソール結果：Hello
const animal2=new Animal(); //コンソール結果：Hello
```

コンストラクタの中で生成したインスタンスに関する情報を追加するために「this.プロパティ=値」とすることができる。
インスタンスはオブジェクトがあるので、コンストラクタの中で追加した値は「インスタンス.プロパティ」とすることでクラスの外で使える。

```javascript
class Animal{
  constructor(){
    this.name="レオ";
  }
}
const animal=new Animal();
console.log(animal.name);  //コンソール結果：レオ
```

#####コンストラクタの引数
　コンストラクタでも関数と同様に引数を受け取ることが可能である。コンストラクタに引数として値を渡す場合には、「new クラス名」の（）内に値を引き渡す。

```javascript
class Animal{
  constructor(name,age){
    this.name=name;
    this.age=age;
  }
}
const animal=new Animal("レオ",3); 
```
この例では、レオという値が引数として渡されて、コンストラクタの中ではnameとして扱われている。

#####メゾット
　インスタンスの動作のようなもの。メゾットはクラスの中で「メゾット名(){}」で定義する。メゾットは関数と似ていて、中括弧の中にそのメゾットで行いたい処理をする。

```javascript
class Animal{
  ...
  greet(){
    console.log("Hello");
  }
}
animal.greet(); //メゾットの呼び出し
```
↓メゾット内で値を使う場合↓

```javascript
class Animal{
  ...
  info(){
    console.log(`名前は${this.name}です`);  //インスタンスのnameプロパティの値になる
  }
}
const animal=new Animal("レオ",3);
animal.info(); //コンソール結果：名前はレオです
```

↓同じクラスのメゾットを実行↓

```javascript
class Animal{
  greet(){
    console.log("Hello");
  }
  info(){
    this.greet();
 ...
```

#####クラスの継承
　すでにあるクラスをもとに新しくクラスを作成する方法。継承を用いてクラスを作成するためには`extend`を用いる。継承では元となるクラスを親クラスといい、新しく作成するクラスを子クラスという。

```javascript
class Animal{
  info(){
    this.greet();
    console.log(`名前は${this.name}です`);
    console.log(`${this.age}歳です`);
  }
}
class Dog extends Animal{
}
const dog=new Dog("レオ",4);
dog.info();  //Animalクラスに定義されているメゾットを使用できる
```

#####メゾットの追加
　継承して作成したクラスにもこれまでと同じようにメゾットを追加することができる。<font color=blue>子クラスで定義した独自のメゾットは親クラスから飛び出すことはできない。</font>

```javascript
class Dog extends Animal{
  getHumanAge(){
    return this.age*7;  //関数と同じようにメゾットでも戻り値が使える
  }
}
const dog=new Dog("レオ",4);
const humanAge=dog.getHumanAge();
```

#####オーバーライド
　親クラスと同じ名前のメゾットを子クラスに定義すると、子クラスのメゾットが親クラスのメゾットを上書きすること。メゾットと同じようにコンストラクタでもオーバーライドできるが、その場合1行目に「super()」とかく。
libarchiveが古くてarchlinux-keyringの更新に失敗する時の対処法

# 概要
古いArchLinuxでarchlinux-keyringの更新に失敗しました。
エラーメッセージは下記の通りです。

```
error: could not open file /var/cache/pacman/pkg/archlinux-keyring-20200422-1-any.pkg.tar.zst: Unrecognized archive format
```

# 原因
パッケージの圧縮形式が変わったらしいです。

# 対応
pacman-staticのバイナリビルドをダウンロードしてlibarchiveを更新します。
更新後は普通のpacmanを使えるようになります。

```
curl https://pkgbuild.com/~eschwartz/repo/x86_64-extracted/pacman-static -o pacman-static
chmod +x pacman-static
sudo ./pacman-static -S archlinux-keyring
sudo ./pacman-static -Syu
```



# 参考
https://www.archlinux.org/news/now-using-zstandard-instead-of-xz-for-package-compression/
https://siuncyclone.hatenablog.com/entry/2020/04/17/013215
Nginxでアップロード可能なファイルの最大サイズを指定

/etc/nginx/nginx.conf のhttpセクションにclient_max_body_size xxx;を書き込む

つまり、こんな感じ
>http {
      　　　（省略）
　　　　client_max_body_size 50M;
}

上の例では50MのファイルまでOK
Laravel 勉強中のAPIについて超基礎部分を簡単にまとめる

# 目的

- APIについて勉強中であるが、知識として溜まってきて整理が必要なのでまとめる
- ※APIは難しいものではないので気楽に読んでいただけたら幸いである

# 実施環境

- ハードウェア環境(下記の二つの環境で確認)

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# そもそもLaravelAPI(APIサーバ)って？？

- 指定のURLなどのリクエストをAPIサーバに送るとURLに紐づけられた情報がレスポンスとして得られるサーバの事である。
- 主に自分の様な初学者のみなさんの勉強しているLaravelはそのLaravelアプリ内でブラウザ表示まで完結しているものがほとんどである。
- 初学者のみなさんが勉強するLaravelアプリはリクエストに対してビューなどの「綺麗に見せるためのデータ」も含めてレスポンスとして返却している。
- APIとはリクエストに対してその「綺麗に見せるためのデータ」を省き、DBに格納された文字列や数値、ステータスコードのみを返却するものである。
- 「リクエストをもらう」 → 「Laravelフレームワーク内で処理する」 → 「レスポンスを返す」という流れはAPIも一緒である。(この記事で最悪これさえ理解できていればOK!)
- 下記にLaravelアプリ(初学者のみなさんが最初に勉強するもの)の処理の簡易図を記載する。

    <img width="518" alt="スクリーンショット 2020-05-22 14.36.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/72ec2612-534b-9509-deaa-c328664fa8ba.png">
- 下記にLaravelAPIの処理の簡易図を記載する。

    <img width="575" alt="スクリーンショット 2020-05-22 14.37.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cb30f64d-486b-0e82-b037-f5f64267f497.png">

# LaravelをAPIとして使用した際のレスポンスのデータ

- レスポンスとして得られるデータはJSONというデータフォーマットを用いる。
- ビューなどのデータが含まれないデータだけがLaravelのAPIから返却される。
- 下記に今の段階での情報でのLaravelAPIの処理の簡易図を記載する。

    <img width="597" alt="スクリーンショット 2020-05-22 14.59.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/32a2a8bf-b5d9-c75b-e9c7-aa61b9286e9e.png">

# APIのレスポンスを確認できるアプリ

- 「スマホアプリなどがないとLaravelAPIの勉強できないんじゃない？」と感じたと思う。
- 「スマホアプリなど」の役割をしてくれるPC用アプリケーションがある。
- 下記のPostmanというアプリを使用することにより、LaravelAPIにリクエストを送ることができる。
    - [https://www.postman.com/](https://www.postman.com/)
Django+NginxでDebug=Falseを設定すると、Mediaファイルが404エラーを返してくる

Django側に問題があるかと思っていたが、実はNginx側の問題であった。

/etc/nginx/sites-available/xxxxxx のserver設定にlocationでメディアファイルのディレクトリを指定することで解決。

つまり、
 location /media {　
 root /home/xxxxx/xxxxxxx;
 }
を追記して、以下のようにする。

>server {
 server_name xxxxxx.com;
 location = /favicon.ico { access_log off; log_not_found off; }
 location /static/ {
 root /home/xxxxx/xxxxxxx;
 }
 location /media {　
 root /home/xxxxx/xxxxxxx;
 }
 location / {
 include proxy_params;
 proxy_pass http://unix:/run/gunicorn.sock;
 }
Djangoのメール送信にgmailを利用する際に必要な二段階認証

https://stackoverflow.com/questions/28421887/django-email-with-smtp-gmail-smtpauthenticationerror-534-application-specific-pa/28421995
ここを参考にした。

settings.pyへの記載は以下の通り
>EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'xxxxxxx@gmail.com'
EMAIL_HOST_PASSWORD = '<二段階認証のパスワード>'
EMAIL_USE_TLS = True
LaravelにおけるServiceProviderについて、可能な限り簡潔に説明する

# 背景
最近、「ServiceProviderとは？使い方や使い道など」に関する質問を頂いた。
これに対して説明されているページを紹介して終了、がベストなのだが、Laravel初心者にも使い方が伝わるような簡潔な説明が見当たらないため、ここに私が出来る可能な限り簡潔な説明を記しておく。

# 説明
### これがあると何が出来るか
あるサービスインスタンスに予め初期設定パラメータをセットしておき、アプリケーションのどの処理でもセット済のサービスインスタンスを使用することができる。
### 例
DBのホスト,ポート番号,ユーザー名,パスワード,DB名
※以下は実際とは異なるが、説明を分かりやすくするために敢えてこうしている

```php:ServiceProvider.php
public function register()
{
    // ここでサービスコンテナに「db」という名前でインスタンスを格納しておく
    // ※「サービスコンテナ」については後述
    $this->app->singleton('db', function ($app) {
        // ここで初期設定パラメータをセットする
        return new DatabaseManager(
            config('database.host'),
            config('database.port'),
            config('database.username'),
            config('database.password'),
            config('database.database')
        );
    });
}
```

```php
$users = resolve('db') // ServiceProviderで予め「db」という名前でコンテナに格納したインスタンスを取得する
    ->table('users')
    ->all();
```
### サービスコンテナ
あるサービスインスタンスを**設定パラメータのセットが済んだ状態**で格納しておくところ。

### おさらい
ServiceProviderは主に外部サービスを利用するためのサービスインスタンスを、**設定パラメータのセットをして**サービスコンテナに登録しておくものである。
Django+Nginx＋gunicorn環境でのドメイン設定

#ドメイン名の設定
sudo vim /etc/nginx/sites-available/<設定ファイル名>
（server_nameの値としてドメイン名を設定）

>server {
 server_name xxxxx.com;
 （省略)
 }


settings.pyのALLOWED_HOSTに'ドメイン名'を追加

> ALLOWED_HOSTS = ['xxxxx.com']

#サービスの再起動で反映
sudo systemctl restart gunicorn.socket
sudo systemctl restart nginx
create-react-appで.eslintignore を有効にする

# WHY?
.eslintignore に定義されたファイルとディレクトリはESLintの検査対象外となります。
通常はrootディレクトリに配置するだけでOKですが、
create-react-appで作成した場合はrootディレクトリに配置しただけでは有効になりません。

# 手順
package.jsonと同じところに.envファイルを用意して以下を定義ます。

```..env
EXTEND_ESLINT=true
```

以上です。

こちらに載ってました。
[Enable .eslintignore with extend flag (#7562)](https://github.com/facebook/create-react-app/commit/6f5221c2d7df0b7a097cfdd461967422c3013e12#commitcomment-36349315)

# おまけ

create-react-appの中はこんな感じです。

```packages/react-scripts/config/webpack.config.js
{
  ignore: process.env.EXTEND_ESLINT === 'true',
}
```
Flutterのアニメーションにおけるlerpメソッド


## はじめに

Flutterのアニメーションについて勉強しようと「[“The Boring Flutter Development Show” で取り上げられたアニメーションを様々な方法で書きながら解説](https://medium.com/flutter-jp/custom-animation-c87e9d55b03b)」という記事を読んでいました。

その中でこのようなコードが書かれていたのですがよくわからなかったので調べてみました。

```dart
@override
Color lerp(double t) {
    if (t < 0.5) {
      return Color.lerp(begin, middle, t * 2);
    } else {
      return Color.lerp(middle, end, (t - 0.5) * 2);
    }
}
```


## lerpとは

lerpという単語をGoogleで調べてみると、「Linear interpolation」の略だということが判明しました。

Unityにもlarp関数というものがあるらしく、線形補間で2つのものの間を補完するときに使うみたいです。

Tweenにbeginとendを渡してアニメーションするといい感じになってくれるのはこのlerpメソッドがよしなにやってくれてるようです。

## 実際に使ってみる

lerpメソッドを使ったデモを用意しました。

ボタンをクリックするたびに色が変化していきます。

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="js,result" data-user="wim_web" data-slug-hash="JjYzOzy" data-preview="true" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="JjYzOzy">
  <span>See the Pen <a href="https://codepen.io/wim_web/pen/JjYzOzy">
  JjYzOzy</a> by うぃむ@謳って⤴謳って⤴雲の上ぇぇええ☁🥰 (<a href="https://codepen.io/wim_web">@wim_web</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

色が変化するコードはボタンの `onPressed` のなかにあります。

ここで重要なのがlerpメソッドで、lerpメソッドは3つの引数をとります。

```dart
lerp(start, end, t);
```

startとendを使用して線形補間をしており、tで取得する値を決めています。

`t = 0` だとstartの値が取得でき、`t = 1` だとendの値がとれます。
なので、`t = 0.5` だとstartとendの中間の値を取得することができます。

デモではボタンを押すことでtに値を0.1ずつ足していくことで `Colors.blue` から `Colors.red` まで少しずつ変化させています。

10回ボタンを押せば `t = 1` になってend(`Colors.red`)と全く一緒になるかというとデモの通りなりません。
ここは推測なのですが小数点による丸め誤差などが影響していると思われます。

なので、 `t += 0.1` の箇所を `t++` を変えて実行してみると一緒の値になることが確認できるかと思います。

上のデモではColorクラスのlerpメソッドを使用しましたが、アニメーションに指定できる型（EdgeInsetsなど）のそれぞれにlerpメソッドが定義されていて、それぞれにあった補完をしてくれるようになっています。

## コードの解説

最初にわからなかったコードを読み解いていきます。


```dart
@override
Color lerp(double t) {
    if (t < 0.5) {
      return Color.lerp(begin, middle, t * 2);
    } else {
      return Color.lerp(middle, end, (t - 0.5) * 2);
    }
}
```

ここでとりあげたlerpメソッドは `Tween<T>` のlerpメソッドなので引数はtしかとりません。（begin, endはすでにコンストラクタで渡されているため）

tの値によって返す値を変化させればアニメーションをカスタムすることができます。

ここではbeginからendに変化させるときに、真ん中でmiddle(Colors.white)を経由させます。

tの値は0〜1になります。

```
begin -> middle -> end

  0   ->  0.5   ->  1
```

まずbeginからmiddleに変化させるコードが `Color.lerp(begin, middle, t * 2)` になります。

tを2倍にしないと`Color.lerp`の第三引数にわたる値が0〜1にならなくなるためです。

middleからendに変化させるコードが `Color.lerp(middle, end, (t - 0.5) * 2)` です。

こうすることでbegin, end間をそのままアニメーションさせるのでなく、middleを挟んだアニメーションにすることができます。
[競プロ用]優先度付きキュー(heapq)まとめ

# いつ使うのか

1. あとから要素が追加される条件下で都度最大/最小の要素を早く取り出す場合。
2. 選択肢の中から要素を選ぶにあたって条件が2つある場合。(条件を満たすまで取得できない要素がある。その中で最大/最小の値を取得する。)

# 何がいいのか

push・popにO(logN)
要素数・最小値取得にO(1)

# どうするのか

1. `import heapq`する。
2. 空のリストを用意する。or既存のリストを`heapify()`する。
3. `heappush(heap, item)`でヒープに要素追加。
4. `heappop(heap)`でヒープから最小値の要素取得。

その他の操作

* 2と3を同時に行う場合は`heappushpop(heap, item)`でヒープにpushしたあとにpopできる（こちらの方が効率良い）
* popせずに最小の要素にアクセスする場合にはインデックスを0としてブラケット演算子でアクセス。

# イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/ad2e6c30-bbd4-e33d-716a-f22c2db85230.png)

# 考えること

ヒープは最小値の取得しかできないので最大値をとりたい場合は予め全要素を負にして突っ込んでおき、取得後に絶対値をとって戻す。

# テンプレート

2のケースに対して

```python
def main():
    # 取得可能になるタイミング毎に選択肢をまとめる。

    # 条件を変えていく。
    for n in range(N):
        # 選択可能になる選択肢をエンキュー(取り出す時に最大値が欲しいのでマイナスにする。)

        # ヒープが空でなければ最も良い選択肢を取得、マイナスを戻す。

    return
```

# 使用例

## 1のケース

[ABC096 B - Maximum Sum](https://atcoder.jp/contests/abc096/tasks/abc096_b)

```python
import heapq

def main():
    A, B, C = map(int, input().split())
    K = int(input())

    heap = [-A, -B, -C]
    heapq.heapify(heap)
    for _ in range(K):
        max = heapq.heappop(heap)
        heapq.heappush(heap, max * 2)
    
    sum = 0
    for i in heap:
        sum += i
    print(-sum)
```

## 2のケース

[第二回 アルゴリズム実技検定 F - タスクの消化](https://atcoder.jp/contests/past202004-open/tasks/past202004_f)

```python
import heapq

def main():
    N = int(input())

    # day日目に選択可能になる選択肢をまとめて管理しておく。
    tasks = [[] for _ in range(N + 1)]
    for _ in range(N):
        a, b = map(int, input().split())
        tasks[a].append(b)

    heap = []
    points = 0

    for day in range(1, N + 1):
        # 選択可能になる選択肢をエンキュー(取り出す時に最大値が欲しいのでマイナスにする。)
        for i in tasks[day]:
            heapq.heappush(heap, -i)
        # ヒープが空でなければ最も良い選択肢を取得、マイナスを戻す。
        if len(heap) > 0:
            points += abs(heapq.heappop(heap))
        print(points)
    return
```

上記の類題

[ABC137 D - Summer Vacation](https://atcoder.jp/contests/abc137/tasks/abc137_d)

選択する条件は2つ。

* M日後までに報酬を得ること → M日目から遡っていくと選択できるタスクが増えていく。
* その中で最大の値を取得すること

※ 2条件から選択する場合、厳しい方の条件から見ていくと良い。

```python
import heapq

def main():
    N, M = map(int, input().split())

    # day日目に選択可能になる選択肢をまとめて管理しておく。
    jobs = [[] for _ in range(M + 1)]
    for _ in range(N):
        a, b = map(int, input().split())
        if a > M:
            continue
        jobs[a].append(b)

    heap = []
    salary = 0

    # M日目から遡っていく。
    for day in range(1, M + 1):
        # 選択可能になる選択肢をエンキュー(取り出す時に最大値が欲しいのでマイナスにする。)
        for i in jobs[day]:
            heapq.heappush(heap, -i)
        # ヒープが空でなければ最も良い選択肢を取得、マイナスを戻す。
        if len(heap) > 0:
            salary += abs(heapq.heappop(heap))
    print(salary)
    return
```

# 参考

* https://docs.python.org/ja/3/library/heapq.html
RSpec で メソッドをモックしたいときに mock 用の allow メソッドと singleton メソッドを使うか迷ったときは allow メソッドを使うべき

# 概要
rspecではテストをしやすくするために、メソッドをモックしたいときがよくあると思います。

下記の例では `set_complex_config` メソッドに`admin?`メソッドが影響を受けるのですが、

`set_complex_config` メソッドはすでにそれ自体のテストコードがあり、そのレスポンスのみ欲しいという状況です。

```
# コード例は適当です
class User
  def admin?
    res = set_complex_config
    case res
    when 'hoge'
      'hoge'
    when 'fuga'
      'fuga'
    end
  end

  def set_complex_config
    # 複雑な処理
  end
end
```

このような場合のモックの仕方として私は2通りのやり方が思いつくので、どちらが良いかを考えてみました。

# mockの仕方
## ① singleton メソッドを定義してmockする

下記のように User クラスの set_complex_config メソッドを singleton メソッドで上書きする方法です。

```
let(:hoge_let) { 'hoge' }
it do
  user = create(:user)
  hoge_var = 'hoge'
  user.define_singleton_method(:set_complex_config) { hoge_var }
  user.set_complex_config => 動く

  user.define_singleton_method(:set_complex_config) { hoge_let }
  user.set_complex_config => wrong number of arguments (given 0, expected 2..3)
end
```

一見かっこいいですが、この場合、example内やbeforeブロック内で、define_singleton_method メソッドのブロックはlet変数を読むことができません。

## ② allow メソッドでmockする
allow メソッドでは問題なく動きます。

```
let(:hoge_let) { 'hoge' }
it do
  user = create(:user)
  allow(user).to receive(:attributes).and_return(hoge_let)
  user.set_complex_config => 動く
end
```

# 結論
素直に`allow().to receive().and_return()`を使った方が良さそうです。
open api 空オブジェクト許容とダイナミックキーの書き方

# 概要
open api 3(swagger)でAPI定義を書くとき、こういう定義ってどう書くんだろうと迷ったところを備忘録的に記録しておきます！

# 空オブジェクト許容
userオブジェクトが返るAPIがあります。そのAPIはuserがいないときは空オブジェクトを返します。

```
# user がいるとき
user: {id: 1, name: 'taro'}
# user がいないとき
user: {}
```

このような空オブジェクト許容を定義したいときは下記のように定義することができます、たぶん。

swagger editorではエラーにならないので間違ってはいないと思いますが、
下記イシューを見る感じ、色々と議論されているようです。

https://github.com/OAI/OpenAPI-Specification/issues/1368


```
      responses:
        '200':
          description: user response
          content:
            application/json:
              schema:
                type: object
                required:
                  - user
                properties:
                  user:
                    oneOf:
                      - $ref: '#/components/schemas/User'
                      - {}
```

# ダイナミックキー
ダイナミックキーは動的にキーが変わるスキーマです。

下記はuser_idがキー、user_nameが値のスキーマです。

このようなスキーマではキーの名前が毎回変わります。

```
user_id_name:
{
  1: 'taro'
}
```


この場合は、下記のように定義できます。

jsonの仕様上、キーは必ずstring型になるのでadditionalPropertiesのtypeは値のtypeのみを指定しています。

参考： https://swagger.io/docs/specification/data-models/dictionaries/

```
    UserIdName:
      type: object
      properties:
        additionalProperties:
          type: string

```
自分だけ git ignore したいファイルがあるときは git ignore global を使おう

# 概要
自分だけ git ignore したいファイルがあります。

## 例①
rubymine を使っており、`.idea` ファイルができてしまった。プロジェクト配下の `.gitignore` に追記したいが、
他のチームメンバー全員は他のエディタを使っているので `.idea` は生成されない。
`.gitignore` に自分の環境だけに生成されるファイルを追記したところで悪影響があるわけではないが、なんだか追記しにくい。

## 例②
`.gitignore` に追記した方が良いファイルを見つけたが直近で作成予定のプルリクエストにその修正を入れるのは
メインの変更内容の趣旨とは外れるのでやりにくい。しかし、ローカル環境での作業効率を上げるためにファイルを ignore したい。

# git ignore global を使おう
すべてのgitプロジェクトに影響する`ignoreファイル`を作ります。

参考： git ignore document
[git ignore global](https://git-scm.com/docs/gitignore/)

ドキュメントによると、プロジェクト配下の`.gitignore`よりも前に読み込まれるパスがあり、
そこに`ignoreファイル`を置くと、全プロジェクトに適用されるignoreになるということらしいです。

具体的には、下記記事の通りにします。

https://qiita.com/ueokande/items/e0409219e7c68e4277b9

下記ファイルにグローバルに適用したい設定を書いてください

```
mkdir $HOME/.config/git
vim $HOME/.config/git/ignore
```
Rails でセッションを特定のコントローラだけ無効にしたいとき

# 概要
クッキーを使ったセッションを特定のコントローラだけ無効にしたいときがあります。

例えば、管理画面Aでは active_record_store でセッション管理をしており、
管理画面Bでは devise token auth でセッション管理をしているときなどです。

この場合、管理画面Aでのみセッション管理が働いて欲しいのに、管理画面Bでも active_record_store によって
sessions テーブルにセッションデータの書き込みが発生してしまいます。

# 対策
セッションを無効にしたいコントローラーで下記の処理を記載すればOKです。

```
request.session_options[:skip] = true
```


参考
https://stackoverflow.com/questions/33318060/how-do-i-prevent-rails-from-creating-a-session
Rails の routing で namespace, module, scope, as の違い

# 概要
routing を書くときに紛らわしいメソッドをまとめました。

# ルーティングの各名称
```
resources :users


名前付きルーティング      パス                     ディレクトリ
      ↓                ↓                         ↓

   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

```

# それぞれのメソッドの対応表
|  | 名前付きルーティング | パス | ディレクトリ |
|:-----------:|:------------:|:------------:|:------------:|
| **namespace** |○ | ○ | ○ |
| **module** |× | × | ○ |
| **scope** | × | ○ | × |
| **as** | ○ | × | × |

きれいな routes ファイルを目指しましょう！

参考：
https://devblast.com/b/rails-5-routes-scope-vs-namespace
RSpec で hash の確認をするときは素直に include matcher を使おう

# 概要
rspec で hash を確認したいときに、eq matcher ではなく、include matcher を素直に使おうという記事です。

# コード
` { hoge: 'fuga' }`という hash があるときに、これを eq で確認しようとすると、

```
it do
  expect(subject).to eq { hoge: 'fuga' }
end
```

のようには書けません、{}がブロックと解釈されるからです。
なので eq を使うためには

```
it do
  expected_hash = { hoge: 'fuga' }
  expect(subject).to eq expected_hash
end
```

のように、hash を変数に入れなければなりません。

当たり前で記事にするまでもないかもしれませんが、

これでは面倒なのでinclude を使いましょう。

```
it do
  expect(subject).to include(hoge: 'fuga')
end
```
【SwiftUI】ビューをジェスチャーで回転させ、90°ずつスナップを効かせる方法

#【SwiftUI】ビューをジェスチャーで回転させ、90°ずつスナップを効かせる方法
こんにちは、たいちです([@taichi_swift_](http://twitter.com/taichi_swift_))

>たかし「お絵かきアプリとかでよくある、ビューを回転させて90°づつピタって止めるやつ、どうやって実装するんだろ...」

こちらのお悩みを解決します。

##ビューを回転させる方法
まずは、基本のビューを回転させる方法です。
SwiftUIでは、
`.rotationEffect(_ angle: Angle, anchor: UnitPoint = .center)`
というmodifierを使用します。

実際に使うときには、
`.rotationEffect(Angle(degrees: 90))`
みたいに使うわけですね。

<img width="414" alt="IMG_1985 2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494049/044905a6-2630-1cbf-ac5e-f5070f2bce22.jpeg">


```Swift
Text("RotationEffect")
    .rotationEffect(Angle(degrees: 90))
```

##ビューをジェスチャーで回転させる方法
続いて、ユーザーが指を使ってビューを回転させる方法です。
`.gesture()`
を使います。

まずは、角度を格納する変数を２つ用意します。


```Swift
@State var angle = Angle(degrees: 0.0)
@State private var oldAngle = Angle(degrees: 0.0)
```

そして、ジェスチャーを用意します

```Swift
var rotation: some Gesture {
    RotationGesture()
        .onChanged { angle in
            self.angle = self.oldAngle + angle                
        }
        .onEnded { angle in
            self.oldAngle = self.angle
        }
    }
```

そんでこのジェスチャーをテキトーなビューにがっちゃんこします。
`.rotationEffect(self.angle)`
`.gesture(rotation)`


```Swift
RoundedRectangle(cornerRadius: 20)
    .frame(width: 400, height: 300)
    .rotationEffect(self.angle)
    .gesture(rotation)
```

すると、二本指で自由に操れるビューができました。
<img width="207" alt="IMG_1986.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494049/02dc80c8-ec2f-c4a8-8bc1-fd3d78bb9cab.jpeg">


##ビューを回転させ、スナップさせる方法
やっときました。本題です。

先ほど定義した、rotationという名前のgestureにちょこっと細工を加えてあげます。

```Swift
var rotation: some Gesture {
    RotationGesture()
        .onChanged { angle in
            self.angle = self.oldAngle + angle
            if abs(Int(self.angle.degrees) % 90) < 5 {
                self.angle = Angle(degrees: Double(Int(self.angle.degrees) - Int(self.angle.degrees) % 90))
            }
        }
        .onEnded { angle in
            self.oldAngle = self.angle
        }
}

```

完成です。

```Swift
struct ContentView: View {
    @State var angle = Angle(degrees: 0.0)
    @State private var oldAngle = Angle(degrees: 0.0)
        
    var rotation: some Gesture {
        RotationGesture()
            .onChanged { angle in
                self.angle = self.oldAngle + angle
                if abs(Int(self.angle.degrees) % 90) < 5 {
                    self.angle = Angle(degrees: Double(Int(self.angle.degrees) - Int(self.angle.degrees) % 90))
                }                
            }
            .onEnded { angle in
                self.oldAngle = self.angle
            }
        }
        var body: some View {
        RoundedRectangle(cornerRadius: 20)
            .frame(width: 400, height: 300)
            .rotationEffect(self.angle)
            .gesture(rotation)        
    }
}
```
Can't find variable: $

javascript実行時にエラー

```
Can't find variable: $
```

jqueryを有効にすれば解決

```
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
```

# 参考
[https://stackoverflow.com/questions/14889985/cant-find-variable](https://stackoverflow.com/questions/14889985/cant-find-variable)
Blueqatで簡単な頂点被覆問題を解く

## :runner_tone1: この記事の目的

組合せ最適化問題の代表的な問題の一つである頂点被覆問題(Vertex Cover)を、量子アニーリングで解く方法を確認します。量子アニーリングにはMDR社のオープンソースフレームワークであるBlueqatを使用します。

## :runner_tone1: 頂点被覆問題について

頂点被覆問題(Vertex Cover)とは、グラフ・ネットワーク問題の一つで、**複数の頂点とそれを結ぶ辺があり、どの辺も少なくともその始点または終点のどちらかが、二つにクラス分けした頂点群のうちの一方のクラスに属する頂点(のいずれか)と接するもので、そのクラスを最小にする問題**です。

数学的に説明すると以下となります。

```math
頂点の部分集合 X \subseteq V に対して、どの枝も少なくとも一方の端点が\\
Xに含まれるとき、すなわち、任意の (i,j) \in E に対してX \cap {i,j} \neq 0 が\\
成り立つとき、Xを頂点被覆という。
```

以下に図を示します。
ここで、v1,v2,v3,v4,v5は頂点を、e1,e2,e3,e4,e5は辺を表します。
図1の通り、どの辺についてもその端点の一方が赤丸の頂点に属しています。
赤丸の数が最小になるケースを求める問題が頂点被覆問題です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/58adb207-98d4-1d83-2b26-8e6e94399ad4.png)


例えば、下の図2のような頂点を選択した場合、頂点の数は3個なので最適解にはなりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/cdcddef5-c1df-24e3-1e27-c5726fbc4803.png)

## :runner_tone1: 頂点被覆問題を量子アニーリングで求める

今回使用するオープンフレームワークのBlueqatや検証環境については、以下をご参照下さい。

■Blueqatでナップサック問題を解く一例
https://qiita.com/ttlabo/items/537564c90056a6d56879

この問題を量子アニーリングで解く際には、イジング模型に基づく定式化を行います。
頂点被覆問題(Vertex Cover)に関する定式化は、Andrew Lucas氏による論文を参考にすると以下となります。

```math
\begin{eqnarray}
ハミルトニアン\;H\;&=&\;H_A\;+\;H_B\\
H_A\;&=&\;A\sum_{u,v}^{}(1 - x_u)(1-x_v)\\
H_B\;&=&\;B\sum_{v}^{}x_v\\
但し、B<Aとする。
\end{eqnarray}
```

ここで、u,vの取り方を以下のようにします。
u,vがそれぞれ独立して頂点v1～v5を取るわけではありません。
u,vは図1に従い、取り得る頂点の組み合わせが限定されるため、以下の組み合わせとします。

```math
(u,v)の組み合わせ=(1,2),(1,4),(2,3),(3,4),(4,5)
```

今回はAの値を1、Bの値を0.5としました。
ハミルトニアンを式展開すると以下となります。

```math
H=5-\frac{3}{2}x_1-\frac{3}{2}x_2-\frac{3}{2}x_3-\frac{5}{2}x_4-\frac{1}{2}x_5\\
+x_1x_2+x_1x_4+x_2x_3+x_3x_4+x_4x_5
```

従って、QUBOマトリックスは以下となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/df29757d-5e71-a81b-6ca4-c00c05b6f87c.png)

## :runner_tone1: Blueqatのプログラミングとその解

以下、Blueqatのプログラムを掲載します。

```ruby:vertex_cover.py
import blueqat.opt as wq

a = wq.opt()
a.qubo = [
    [-1.5,    1,    0,    1,    0],
    [   0, -1.5,    1,    0,    0],
    [   0,    0, -1.5,    1,    0],
    [   0,    0,    0, -2.5,    1],
    [   0,    0,    0,    0, -0.5]]
    
result = a.sa(shots=500,sampler="fast")
z = wq.counter(result)

print(z)
```

プログラミングは以上です。
今回の計算結果、以下の解が得られました。

>Counter({'01010':439, '10101':33, '10110': 28})

上記の解を見ると、一番目の解が最適解とわかります。
x1～x5は以下の値を取ります。

|x1 |x2 |x3 |x4 |x5 |
|:-:|:-:|:-:|:-:|:-:|
|  0|  1|  0|  1|  0|

ここでは、0,1はクラス分けを意味しています。
0を取る頂点のクラスと、1を取る頂点のクラスに分かれます。

このクラス分けが今回の問題の解答となります。
x2,x4が図1の赤丸の頂点、x1,x3,x5がその他の頂点を意味します。

以上で頂点被覆問題の解が得られました。



## :runner_tone1: 出典

■参考論文
　Ising formulations of many NP problems
　https://www.frontiersin.org/articles/10.3389/fphy.2014.00005/full

## :runner_tone1: 関連情報

■Blueqatでナップサック問題を解く一例
https://qiita.com/ttlabo/items/537564c90056a6d56879

■GoogleのOR-Toolsでナップサック問題を解く - 組合せ最適化問題の基礎を実践
https://qiita.com/ttlabo/items/bcadc03004418f32f49d

■GoogleのOR-Toolsで数理最適化モデルの練習問題を解く(1)一番易しいマス埋め問題
https://qiita.com/ttlabo/items/7e8c93f387814f99931f

■[第1回] 最適化とは？ - 数理最適化を学ぶ勉強資料
https://qiita.com/ttlabo/items/e6970c6e85cce9ff4e34


## :runner_tone1: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。
PHP デストラクタの検証

デストラクタについて書いていきます。
こいつもインスタンス化した段階で呼ばれます。

あんまり使っているところは見ないのですが、
知識として入れていきます。
基本的に、処理の最後に呼ばれる印象です。

ざっくりした理解なので、実際に書いていきます。

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();

?>
```

```classTest.php
<?php

class classTest
{
    public function __construct(){
        echo 'Fist:メッセージ';
    }

    public function __destruct(){
        echo 'Last:メッセージ';
    }

}

?>
```

```
・実行結果
Fist:メッセージ
Last:メッセージ
```

では、他のメソッドがある前提で検証していきます。
classTestクラスのsampleメソッドを呼んだ場合どうなるでしょう。

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();
$app->sample();

?>
```

```classTest.php
<?php

class classTest
{
    public function __construct(){
        echo 'Fist:メッセージ';
    }

    public function __destruct(){
        echo 'Last:メッセージ';
    }

    public function sample(){
        echo 'sample:メッセージ';
    }

}

?>
```

```
・実行結果
Fist:メッセージ
sample:メッセージ
last:メッセージ
```
sampleメソッドが呼ばれた後にデストラクタが呼ばれています。


では、test_sample.phpの中の最後に
testという文字列を出力したらどうなるか検証していきます。

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();
$app->sample();
echo 'test';

?>
```

```classTest.php
<?php

class classTest
{
    public function __construct(){
        echo 'Fist:メッセージ';
    }

    public function __destruct(){
        echo 'Last:メッセージ';
    }

    public function sample(){
        echo 'sample:メッセージ';
    }

}

?>
```

```
・実行結果
Fist:メッセージ
sample:メッセージ
test
Last:メッセージ
```

ここでわかるのは、インスタン化が行われたプログラム(test_sample.php)の
最後に呼ばれるということですね。
plotの表示を大きくする。

自分用メモ

plotちょっと表示されるのが小さいから

```python
fig = plt.figure(dpi=150)
```
と書いておく。
すると大きく表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/80d590e5-45bb-cf1c-0868-9dc8ce737d60.png)

こんな感じのデフォルトサイズが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/b9ddda13-caf4-d576-d36e-19d6cb282450.png)
こんな感じに大きくなる

あと最後に

```python:relaxed:
plt.savefig('bifferSize.png')
plt.show()
```
って書けばローカルファイルに保存できる。

ここで

```python
plt.show()
plt.savefig('bifferSize.png')
```
って感じに先に`plt.show()`してしまうと保存された画像が真っ白になってしまう。
もしplt.savefigがうまくいかない場合はこの順番が間違っている可能性がある。










:relaxed:　:relaxed:　:relaxed:　:relaxed:　:relaxed:　:relaxed:　:relaxed:　:relaxed:　:relaxed:　:relaxed:　
今回のコード

```python
import matplotlib
import matplotlib.pyplot as plt
```

```python
fig = plt.figure(dpi=150)
plt.plot(x,ys,marker='.', color="blue", label = 'client')
plt.plot(x,yc,marker='.', color="red", label = 'server')
plt.xscale('log')
plt.ylabel('delay time [s]')
plt.xlabel('buffer size')
plt.legend()
plt.title('Relationship between buffer size and delay time')
plt.savefig('bufferSize.png')
plt.show()
```
only size-1 arrays can be converted to Python scalarsが出る原因

# 問題
```
only size-1 arrays can be converted to Python scalars
```

これが出てきてうまくグラフがかけない！！

問題のソースコードはこれ

```python
import matplotlib.pyplot as plt
import math
import np
x = np.linspace(0,1, 10000);
def y(a):
    return math.exp(a)
plt.figure(0)
plt.plot(x, y(x))
plt.show()
```

# 原因

### mathの関数は行列を扱うことができない

expをnumpyの関数をつかってあげれば解決

```python
plt.plot(x, y(x))
```

この部分では行列投げ込んでるから注意

よって

```python
def y(a):
    return np.exp(a)
```

としたら治る

# 解決後のコード
```python
import matplotlib.pyplot as plt
import math
import numpy
x = np.linspace(0,1, 10000);
def y(a):
    return np.exp(a)
plt.figure(0)
plt.plot(x, y(x))
plt.show()
```

参考：
https://blog.csdn.net/u013634684/article/details/49305655?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase