OmniAICreator/Qiita-1.07M huggingface dataset:
エクセル　データの確認方法（並替、番号振、色付）

エクセルのシートからデータを印字して、数を確認する場合に有効な方法を考えた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/8a8ce394-1700-ca64-7a5f-6d58622e207e.png)
こんなデータがあったとすると、好きな家順には次のようにすれば良い
１　「ファイルタブ」を選択　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/0314c1a0-f037-744a-6ae3-e0c60ce94e48.png)
２　「オプション」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/4b21ede9-a1a5-aec5-2b9a-b9db6c23bba8.png)
３　「詳細設定」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/10c1bc29-cd17-c704-dad6-cad37054999a.png)
４　「ユーザー設定リストの編集」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/1304028d-897a-d847-0be1-f5f7237e1a8e.png)
５　オプション画面のインポートの左側の「↑」（赤枠参照）を選択
　　エクセル画面で予めリストを作成しておいて、その部分（青枠参照）を選択
　　「インポート」ボタン（緑枠参照）を選択
　　「追加」ボタン　を選択した後、「ＯＫ」ボタンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/bc6a24fa-0261-e3ba-8077-d25209814ac7.png)
６　最後に、シートに戻って、並べ替えたい範囲を選択（赤枠参照）
　　並べ替え画面の最優先のキーを設定し（緑枠参照）
　　設定を「ユーザー設定リスト」に変更する
　　すると、ユーザー設定リストが表示されるので先程作成したリスト（水色枠参照）を選択
　　（紫枠参照）し、最後に「追加」ボタン（紫枠参照）を選択して「OK」ボタンを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/b140c203-b840-d086-64cb-8cb05270277f.png)
やっとできた！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/65fdd884-0878-304d-7dcd-eaeb36116324.png)
更に、家ごとの人数を確認するのに「D2」セルに
【 = COUNTIFS(＄C＄２:Ⅽ２ , C２)】を入れて、オートフィルで最終まで作業を行うと
家ごとの武将の数が確認出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/e8543065-e288-5445-804d-0fa9e8f8911a.png)
最後は、家ごとに色付けをしてみる
色付けしたい、部分を選択し、「ホーム」タブを選択、「条件付き書式」、「新しいルール」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/602dc940-62ee-71e3-117b-2707f979a8f8.png)
「数式を使用して、書式設定するセルを決定」を選択する
数式は、【　＝＄C２　＝　＄K＄２　】
（※　ここでは、C列が「ｋ２」セルの値と一緒であれば、その行が色付けされる）
を入力した後、設定で、セルの色を指定する
これを家の分だけ繰り返す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/b939c3e9-aa11-086d-2fd3-63e70b792020.png)

あとは印字するだけで、家ごとの武将の数が数え易い（ハズ・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606540/345c5c97-4a9a-8a30-4e45-a1623ff32b98.png)
aiohttp_session で EncryptedCookieStorage を使う際のシークレットキー生成

備忘録。

[aiohttp_session の EncryptedCookieStorage](https://aiohttp-session.readthedocs.io/en/stable/reference.html#aiohttp_session.cookie_storage.EncryptedCookieStorage) を使う際のシークレットキーは、32バイトの bytes-like object もしくはそれを base64 エンコードした文字列でなくてはならない。

``` console
$ pip install cryptography
```

``` python
from cryptography.fernet import Fernet

print(Fernet.generate_key().decode())
```

aiohttp では以下のように設定する。
(生成したシークレットキーは環境変数 `SESSION_SECRET` に入れている)

``` python
from aiohttp import web
from aiohttp_session import session_middleware
from aiohttp_session.cookie_storage import EncryptedCookieStorage

session_storage = EncryptedCookieStorage(os.environ.get('SESSION_SECRET'))

app = web.Application(middlewares=[session_middleware(session_storage)])
```
Unity2Dでパックマン試作

 Unityの初心者の初心者です。Qiita初投稿。日本語がおかしいところご了承ください。

　2020年に『パックマン』が生誕40周年を迎えるにあたり、世界中の人々に愛されるゲームに敬意を表したいと思います。
　一週間完成する予定です。イメージ図はみなさんの幼い頃の思い出で想像してください。
![scene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618176/e6e23715-71da-0c70-4991-fd030e5fb824.png)

すべて完成（できるなら）できたら、1から書いて教えます。未経験者興味だけでもわかりやすく説明しますので、ご一緒に成長しましょう。
Pythonのpathlib備忘録

# pathlibとは
Python 3.4(?)以降の標準ライブラリにある便利機能([公式ドキュメント](https://docs.python.org/ja/3/library/pathlib.html#concrete-paths))
os ライブラリに代替する機能を多く揃えているだけじゃなく、もうなんか、すごい奴。

色々できすぎて優秀すぎるが故、調べるのが結構手間だったりする（機能が多すぎる）
そこで個人的によく使う`Path`の使い方のみ手早く記載していく。
もっと良い方法等あればコメントを頂きたく存じます。

### Pathオブジェクト準備
```python
# インポート
from pathlib import Path

# オブジェクト作成
p = Path(r"C:\Users\admin\Desktop\temp\hoge.txt")
```

### 各種情報の取得方法
```python
# ファイル名
print(path.name) # >> hoge.txt
# ファイル名 拡張子なし
print(path.stem) # >> hoge
# 拡張子のみ取得
print(path.suffix) # >> .py
# 先頭の.がいらない場合は切り取る
print(path.suffix.lstrip(".")) # >> py

# 親階層まで
print(path.parent) # >> C:\Users\admin\Desktop\temp
# 上位階層（\..\.. を結合させてもいいけどダサいじゃん？）
print(path.parents[0]) # >> C:\Users\admin\Desktop\temp
print(path.parents[1]) # >> C:\Users\admin\Desktop
print(path.parents[2]) # >> C:\Users\admin
```
### 基本操作
```python
# os.path.join()的な使い方
path = Path("src", "python", "naritoblog")  # src/python/naritoblog

# 演算子による結合
path1 = Path("src")
path2 = Path("python")
path3 = path1 / path2 / "naritoblog"  # src/python/naritoblog

# 文字列への変換
print(type(path3.__str__())) # >> str
# こっちでいい
print(type(str(path3)))      # >> str

# 相対パスから絶対パスへ変換
path1 = Path("hoge.txt")
print(path1)           # >> hoge.txt
print(path1.resolve()) # >> C:\Users\admin\Desktop\temp\hoge.txt
```
### フォルダ内の一覧取得
```python
path = Path("たいしょう")
# 全て取得
list(path.glob("*"))
# ファイルのみ
list(path.glob("*.*"))
# ディレクトリのみ
[list for list in path.iterdir() if list.is_dir()]
```
### 特定フォルダ以下全ての一覧取得
`Path`オブジェクトを使えば小難しい再帰処理も必要なし！

```python
# 以下の全て
list(path.glob("**/*"))
# 以下のファイル
list(path.glob("**/*.*"))
# 拡張子指定も可能
list(path.glob("**/*.txt"))
# ディレクトリのみ
[list for list in path.glob("**/*") if list.is_dir()]
```

### テキストファイルの入出力
もちろん`.txt`だけでなくテキストベースなら何でも。

```python
txt_path = Path("xxx.txt")
# ファイル作成（書き出し）
with txt_path.open("w", encoding="utf-8") as file:
    file.write("テスト出力")
# ファイルの読込
with txt_path.open("r", encoding="utf-8") as file:
    print(file.read())
```
え？長ったらしい？ じゃあこっち

```python
txt_path.write_text("記述内容", encoding="utf-8")  # 書き込み
src = txt_path.read_text(encoding="utf-8")  # 読み込み
```
### フォルダの作成
架空のPathオブジェクトを作成し、その存在を創造する。

```python
make_dir = Path("mkdir")
# parents ：親ディレクトリごと作成（mksirs的な）
# exist_ok：同名フォルダがいても作成できる（存在しているエラー落ちが無くなる）
make_dir.mkdir(parents=True, exist_ok=True)
# >> カレントディレクトリに「mkdir」というフォルダが作成される
```

### ファイル、フォルダの削除
ファイル削除にリムーヴなんて言いません。時代はunlinkです。~~声に出したい単語~~

```python
# ファイルの削除
a_txt = Path('xxx.txt')
a_txt.unlink()

# ディレクトリの削除（中身無しのみ）
rm_dir = Path('mkdir')
rm_dir.rmdir()
```

### ファイル名・拡張子の変更
要は`Path`オブジェクトの`name`属性と`suffix`属性のみの変更
変更するのは`Path`オブジェクトの情報であり、実態のファイルは変更しないことに注意
実態を変更したければ`os.rename`等を使用する（pathlibでもできるのかな？）

また似たような機能に`.rename()`があるが、妙に使いにくかったので割愛

```python
# ファイル名の変更（name属性）
path_a = Path(r"C:\temp\a_text.txt")
path_b = path_a.with_name("b_text.txt")
print(path_a) # >> C:\temp\a_text.txt
print(path_b) # >> C:\temp\b_text.txt

# 拡張子の変更（suffix属性）
path_a = Path(r"C:\temp\wich_test.txt")
path_b = path_a.with_suffix(".csv")
print(path_a) # >> C:\temp\wich_test.txt
print(path_b) # >> C:\temp\wich_test.csv
```
---
結論
#### `pathlib`関連の情報は公式ドキュメントが一番豊富
証明書

#### 証明書の構成物

- 主体組織名
- 証明書を発行した認証局
- 公開鍵
- 有効期限
- 認証局の署名(この証明書のハッシュ値を秘密キーで暗号化したもの)

証明書は、ルート証明書、認証局、サーバーのものが連結される
https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/
https://jp.globalsign.com/ssl-pki-info/ssl_practices/authentification.html

#### チェイン

サーバーの証明書の署名は認証局の公開キー、認証局の証明書の署名はルートの公開キーで復号する。
ルート直下の認証局の証明書の署名は、クライアントに登録されているルート証明書を用いて復号するか、もしくは、受信した証明書中のルートの公開鍵を使って復号して、このルート証明書がクライアントに登録されているルート証明書と一致するかのどちらかで検証が終了する。

#### 署名

##### RSA暗号の基礎理論

- アリスは巨大な素数$p, q$を選び、その積$n$を計算する
- $p-1, q-1$と公約数のない指数$e$を選ぶ
- 公開鍵として$(n,e)$を公開する
- アリスは秘密鍵として$de=1 \bmod p-1,de=1 \bmod q-1$となる$d$を$e$と$lcm(p-1,q-1)$に拡張ユークリッドアルゴリズムを適用して求める
- ボブは、メッセージ$m$を$m^e \bmod n$で暗号化して送信する
- 暗号化メッセージを受け取ったアリスは、$d$乗してmを復元する

安全性は$c=m^e \bmod n$としたとき、$m=c^d \bmod n$なる$d$を求めることが難しいことに依存する。

##### RSA暗号の署名

- アリスの公開キーを$(n_{alice},e_{alice})$、秘密キーを$d_{alice}$とする
- ボブの公開キーを$(n_{bob},e_{bob})$、秘密キーを$d_{bob}$とする
- ボブがメッセージをハッシュ化したものを$H$とする
- ボブは$(H^{d_{bob}} \bmod n_{bob})^{e_{alice}} \bmod n_{alice}$を署名とする
- アリスは、秘密キーで$H^{d_{bob}} \bmod n_{bob}$を復元する
- さらに、ボブの公開キーで$H$を復元する


#### 共通キー交換(DiffieHellman)

- 原始根$g$、素数$p$は公開
- アリスが$g^a \bmod p$をボブに送る、ボブは$g^b \bmod p$をアリスに送る
- アリスは、$g^b \bmod p$を$a$乗し、ボブは$g^a \bmod p$を$b$乗する
- $g^{ab} \bmod p$を共通キーとする
- なりすましは上段のチェインを辿った証明書の署名の検証で防止する

#### 失効

失効はごくまれな事象
電子証明書失効リスト（CRL - 失効した証明書のリスト）と比較する
https://ja.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E8%A8%BC%E6%98%8E%E6%9B%B8

OCSPレスポンダ（サーバーへHTTP通信）するものとCRLリストをローカルで比較するタイプがある。
https://www.infraexpert.com/study/sslserver13.html

参考
https://www.digicert.co.jp/welcome/pdf/wp_sslandroot-certificate.pdf
暗号理論の部分は、ゴブリッツの「暗号の代数理論」から引用
certbot letsencrypt を はじめから導入、自動更新

# ファイアウォールを追加

https でアクセスさせるために必要。

```

firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --reload


```


# インストール

```

cd /usr/local/bin/

git clone https://github.com/certbot/certbot
cd certbot
/usr/local/bin/certbot/certbot-auto certonly

chown root:root /usr/local/bin/certbot/certbot-auto
chmod 0755 /usr/local/bin/certbot/certbot-auto

/usr/local/bin/certbot/certbot-auto renew

```




エラーでませんね♪

#cron を仕掛ける

```cron.txt

0 1 1 * * /usr/local/bin/certbot/certbot-auto renew --force-renewal && service nginx restart

```

```

crontab cron.txt


```



これで 毎月1時にSSLを強制更新し、nginxをリロードする。
AWS Batchと既存ECSの名前が同じでRUNNABLEステータスから動かない

# はじめに

AWS BatchのキューがRUNNABLEから動かない・・・という人向けです。
今回は「AWS Batchと既存ECSの名前が同じこと」に由来する事象に遭遇しました。

世間的にも触りはじたばかりの人はRUNNABLEから動かないことはそこそこあるっぽくて、AWS公式で原因の大別が記載されてたりします。お困りの場合はこちらも合わせて参照してください。

- AWS公式: [AWS Batch ジョブが RUNNABLE ステータスで止まっている](https://aws.amazon.com/jp/premiumsupport/knowledge-center/batch-job-stuck-runnable-status/)


# 事象

AWS Batchに `playground` と命名した「コンピューティング環境」「ジョブキューの定義」「ジョブ」を作成し、 ジョブを積んでみました。コンピューティング環境の詳細は画像の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180193/b957fcb5-b6b3-0506-715a-2d970f0cb104.png)


- 正常に動いた際の期待は、「ECSのタスクがキューを捌いてくれる」です。
- 実際に起ったことは、「EC2インスタンスは起動するが、ECSクラスタでタスクが起動せずキューが捌けない」でした。

色々と試してみたところ「既存ECSの `playgournd` という名前のクラスタ/タスク定義」に由来していそうだとわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180193/e544426b-233a-1721-a128-0d1c6f1b359c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180193/9ab04d83-415c-7d2b-5da3-4d8341d0ae93.png)


# 解決方法

AWS Batchの名前を変更し、ユニークになるようにしました。要は作り直しです。

ex) `playground` => `playground_aws_batch` 

# 詳しい挙動は不明

AWS Batchの `playground` というジョブを送信すると、 ECSのタスク定義 `playground` に新しいリビジョンが追加する動きをしていました。AWS Batchの定義からサフィックス付きで `playground_Batch_hogehoge` のようなECSクラスタが自動生成されます。同時に、過去に自分で作成したECSクラスタ/タスク定義の `playground` も存在しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180193/1e2e9afb-f43d-6e82-941e-af8c0567080c.png)
AWS Batchのジョブ定義に `playground` というリビジョンを2件作成し、ジョブを送信。ECSタスク定義 `playground` を確認すると2件リビジョンが追加されていることがわかりました。元々は `playground:3` だけ。

これより下は未検証範囲で、詳しい動きははっきりしませんが・・・

タスク定義の追加までは動いているっぽいが、 `playground*` のプレフィックスのECSクラスタが2件あるため、どちらのECSクラスタで動かすかわからなくなっている状態なのかな？手動でECSクラスタを消したり追加したりの検証が必要になってきそうですが、そこまではやれていません。

# 関連記事

ネットワーク関連で詰まった場合はこちらが参考になるかも。

- [AWS BatchのジョブがRUNNABLEのまま進まない - Qiita](https://qiita.com/sekitaka_1214/items/dbfc16d26168efc39900)
http-serverによるローカル HTTPS server 構築 (5分でできる)


# はじめに
https環境でないと動かないJavascript APIなどを試験するのにローカルになんちゃってhttpsサーバが欲しくなった。以下の手順が最も簡単で速い方法だと思ったのでここに記す。


## mkcertのインストール
Macの場合

```zsh
% brew install mkcert
```

他の環境でも適宜インストールしてください。

## CAのインストール(初回のみ)
```zsh
% mkcert -install
```

## サーバ証明書、秘密鍵生成
下記コマンドで適当なフォルダに証明書、秘密鍵を生成。mkcertコマンドには証明したいアドレス, ホスト名を全て指定。 ローカルネットワークの他PCからもアクセスしたいので、自PCのPrivate Address (e.g. 192.168.11.2)も追加（各自適当に)。

```zsh
% mkdir ~/cert
% cd cert
% mkcert localhost 127.0.0.1 192.168.11.2
% ls
localhost+2-key.pem	localhost+2.pem
```
## http-serverインストール

```
% npm install -g http-server
```

## サーバ起動
サーバ証明書、秘密鍵を指定してhttp-serverを起動する.

```zsh
% http-server -c-1 . --ssl --key ~/cert/localhost+2-key.pem --cert ~/cert/localhost+2.pem
```

ブラウザから https://localhost/, https://192.168.11.2/ などにアクセス.
OctoberCMS　Migrate

#OctoberCMSでテーブルを作成するには
plugin > プラグイン名 > プロジェクト名 > updates 以下にファイルを作成する。

##テーブル作成
例）usersテーブルを作成する

```php:create_users_table.php
<?php namespace Kobayashi\Corporate\Updates;

use Schema;
use October\Rain\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('プラグイン名_プロジェクト名_users', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('fullname');
            $table->string('email');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('kobayashi_corporate_estimates');
    }
}
```
##version.yaml作成
updatesファイルの中に作成

```yaml:version.yaml
1.0.1: First version of プロジェクト名
1.0.2:
  - 'create table users'　　　　　//コメント
  - create_users_table.php　　　　//実行するファイル名
```

##カラム追加

```php:update_users_table.php

<?php namespace プラグイン名\プロジェクト名\Updates;

use Schema;
use October\Rain\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;

class UpdateUsersTable extends Migration
{
    public function up()
    {
        Schema::table('プラグイン名_プロジェクト名_users', function (Blueprint $table) {
            $table->string('tel')->nullable();
　　　　 });
    }
    public function down()
    {
        Schema::table('プラグイン名_プロジェクト名_users', function ($table) {
            $table->dropColumn('tel');
        });
    }

}
```

###version.yaml追記

```yaml:version.yaml
1.0.1: First version of プロジェクト名
1.0.2:
  - 'create table users'　　　　
  - create_users_table.php
- 1.0.3:
- 'update table users'
- update_users_table.php

```

##カラム変更

```php:update_users_table_2.php
<?php namespace プラグイン名\プロジェクト名\Updates;

use Schema;
use October\Rain\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;

class UpdateUsersTable2 extends Migration
{
    public function up()
    {
        Schema::table('プラグイン名_プロジェクト名_users', function ($table) {
            $table->dropColumn('email');
        });
     
    }
    public function down()
    {
　　　　Schema::table('プラグイン名_プロジェクト名_users', function (Blueprint $table) {
            $table->string('email')->nullable();
　　　　 });
    }

}
統計に関する数値指標について100%自分用のメモ

## 相関
2つの事象の間にある何らかの関係のこと。
-1~1の相関係数で表す。因果関係とは異なる点に注意。

## 有意水準
[こっち](https://qiita.com/undead_ban/items/0789352e24c707badfd7)にちゃんと書いた

## 度数分布
一定区間に区切った階級に含まれるデータの総数の分布。
ヒストグラムなどを使って表現する。

## 分散
データの平均値との差の二乗を平均したもの

## 標準偏差
分散の平方根

## 中央値
大小に並べたとき、中央の値。
9個なら5番目、8個なら4番目と5番目の平均。

## モード
一番多く出現している値。

## ポアソン分布
単位時間あたりにある事象が平均してλ回起こる場合に、その事象がx回起こる確率。むず。
$$f(x) = \frac{e^{-\lambda}\lambda^x}{x!}$$

## 正規分布
山の形をした一般的な分布。標準偏差と平均を決めてあげたら定まるよ。

## 累積度数分布
度数の合計を積み上げて、分布の偏りを示す。
ローレンツ曲線によって視覚化し、ジニ係数で偏り具合を数値化する。

## 移動平均
一定期間の平均の変化を時系列で追うことによって、季節などの変動を除いた増減が分かりやすくなる。
各月とその前後の月の平均値を使う中央移動平均、各月とそれ以前の月の平均値を使う後方移動平均、各月とそれ以後の月の平均値を使う前方移動平均がある。
illustratorで波線をつくる方法

イラレでなみなみ線を作るときの備忘録

# これ作ります
<img width="725" alt="スクリーンショット 2020-04-13 10.07.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70283/37964695-7dad-1c54-c84a-14b8f98bfef4.png">

# 直線ツールで直線書く
<img width="278" alt="スクリーンショット 2020-04-13 10.03.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70283/12e0d547-77b8-4566-a1fe-22dc154e047a.png">
<img width="728" alt="スクリーンショット 2020-04-13 10.03.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70283/3e93a573-8edd-d678-4552-e7d93da1ccd2.png">

# ジグザグにする

```
効果 > パスの変形 > ジグザグ…
```
<img width="843" alt="スクリーンショット 2020-04-13 10.05.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70283/f7c7d2f4-936f-e4e7-9ff8-46ffaad1aff7.png">

ポイントを直線的にすれば、ギザギザ線になります。
<img width="1085" alt="スクリーンショット 2020-04-13 10.06.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70283/fbb57315-93b9-c5ad-2723-7dd211694b65.png">

# 完成
<img width="725" alt="スクリーンショット 2020-04-13 10.07.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70283/37964695-7dad-1c54-c84a-14b8f98bfef4.png">
熟読したいJava勉強用サイトまとめ

## Java学習用サイトまとめ
### 全般
#### Lombock
https://blog.y-yuki.net/entry/2016/10/12/003000

#### ちょっといいJavaコードを書こう
Effective Java的な
https://qiita.com/nishemon/items/b581b3430cc6225098ca

#### モダンなJava開発ガイド
https://qiita.com/yoichiwo7/items/17190cb440ab7d253cea

### Java8関連
#### Optinal
https://qiita.com/chooyan_eng/items/02f775f591c0312a9faf

#### Stream API
https://qiita.com/takumi-n/items/369dd3fcb9ccb8fcfa44

#### メソッド参照
https://qiita.com/kws9/items/d1cfbcb483be87bf25e7

#### ラムダの基礎
https://qiita.com/subaru44k/items/c55d9b9fc419f0d09c64

#### 非同期処理（CompletableFuture）
https://qiita.com/subaru44k/items/d98ad79d21abccedb20b#_reference-10bfc3d1ccbdee538552

### Java11
#### Java8→Java11
https://qiita.com/nowokay/items/1ce24079f4daafc73b4a

### 設計思想
#### Nullオブジェクト
https://vain0x.github.io/blog/2016-08-18/null-object-patterns/
#### Value Object
https://qiita.com/ikemo/items/8df668b3efd38026a416
#### ドメイン駆動
[ドメインの言葉を使ったコード](https://ja.wikisource.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%8C%E7%9F%A5%E3%82%8B%E3%81%B9%E3%81%8D97%E3%81%AE%E3%81%93%E3%81%A8/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E8%A8%80%E8%91%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89)
#### Immutable Java、Null安全
https://qiita.com/newta/items/ccf9116909dc61ed7123

#### tell don't ask
https://tech.quartetcom.co.jp/2019/09/26/oop-training-tech/
https://scrapbox.io/vitocchi/Tell_Don't_Ask
PyTorch + Cuda10 GPU + windows 最新セットアップ注意点まとめ(2020年4月)

# 最終セットアップ一覧（2020年4月時点）
- セットアップマシン：[azure vm NV6](https://docs.microsoft.com/en-us/azure/virtual-machines/nv-series)
- OS: Win10
- python: 3.7.7
- virtualenv + pipインストール環境
- torch: 1.4.0
- torchvision: 0.5.0
- CUDA: 10.2.89

# cudaセットアップ
- 結論：すんなり[公式サイトからダウンロード](https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal)してインストールすればうまくいく。
  <img width="1312" alt="Screen Shot 2020-04-13 at 10.03.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547017/49e5b8b2-588f-0c1d-f1ec-1e3af63c9ed6.png">
  

# python version
- 結論：64bitを選んで、現時点pythonは３.７を選ぼう。
- cuda10は３２bitがサポートしていないので、pythonは86_64の[64ビット](https://www.python.org/ftp/python/3.7.7/python-3.7.7-amd64.exe)を使わないといけない。
- python3.8はまだいろいろ試されていなくて、下記エラーが結構出る。  
  なので3.7が最新の実行できる環境。  
  `RuntimeError: error in LoadLibraryA`
- リリース予定の[torch1.5](https://github.com/pytorch/pytorch/pull/35368)で解決しそう。  
  いつ出るか。

# pytorchのインストール方法
- 結論：思い込みのpipインストールが行かず、[公式サイト](https://pytorch.org/)で環境通りにセットアップする。  
  <img width="850" alt="Screen Shot 2020-04-13 at 9.33.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547017/7b8894be-2670-1c5f-a3a5-d6bcc852cdef.png">
- 実行コマンド：　`pip install torch===1.4.0 torchvision===0.5.0 -f https://download.pytorch.org/whl/torch_stable.html`

# cudaはwindowsでのマルチスレッドサポートしないケースがあるので要注意！
- pythonのmultiprocessingのPoolなど使って、モデルのクラスをラップしたりして実行すると、`RuntimeError: cuda runtime error (801) : operation not supported`が発生する。
- 文字通りに使用できない。ここが[公式サイトの説明](https://pytorch.org/docs/stable/notes/windows.html#cuda-ipc-operations)
- でもなぜか[azure vm NV6](https://docs.microsoft.com/en-us/azure/virtual-machines/nv-series)では実行ができてしまう。他の環境では高い確率で失敗するからできれば避けましょう。
- `THCudaCheck FAIL file=C:\w\1\s\windows\pytorch\torch/csrc/generic/StorageSharing.cpp line=245 error=801 : operation not supported
Traceback (most recent call last):
  File "C:\python-venv\****.py", line 97, in <module>
    main(args)
  File "C:\python-venv\****.py", line 87, in main
    p.map(prcess_img_wrapper, values)
  File "c:\users\your\appdata\local\programs\python\python37\lib\multiprocessing\pool.py", line 268, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "c:\users\your\appdata\local\programs\python\python37\lib\multiprocessing\pool.py", line 657, in get
    raise self._value
  File "c:\users\your\appdata\local\programs\python\python37\lib\multiprocessing\pool.py", line 431, in _handle_tasks
    put(task)
  File "c:\users\your\appdata\local\programs\python\python37\lib\multiprocessing\connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "c:\users\your\appdata\local\programs\python\python37\lib\multiprocessing\reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
  File "C:\python-venv\lib\site-packages\torch\multiprocessing\reductions.py", line 242, in reduce_tensor
    event_sync_required) = storage._share_cuda_()
RuntimeError: cuda runtime error (801) : operation not supported`
crontab 設定時間にコマンド実行


## crontab 設定時間にコマンドを実行する
**設定内容を見る**

	$ sudo crontab -u ユーザ名 -l

**設定内容の編集**

	$ sudo crontab -u ユーザ名 -e

	* * * * * 実行コマンド

設定項目は左から「分」「時」「日」「月」「曜日」
	
| 設定項目  |  数値   |
|:--------:|:------:|
|    分    |   0-59  |
|    時  	|   0-23  |
|    日    |   1-31  |
|    月	    |   1-12  |
|    曜日   |0-7 (0または7は日曜日）|




**設定例**

	15  *  *  *  * open -a safari   // 毎時15分にsafariを起動
	02  4  *  *  * open -a safari   // 毎日AM 4:02 にsafariを起動

「/」の後に実行したい間隔の値を設定することで、その間隔で実行出来る

	*/10  *  *  *  * open -a safari　// 10分毎にsafariを起動
	00  0-23/3  *  *  * open -a safari // 3時間毎にsafariを起動

「,」で区切ることで、複数の値を設定することが出来る

	30  4,9  *  *  * open -a safari // 毎日AM 4:30とAM 9:30に実行
	00  3  *  *  1,5 open -a safari // 毎週月、金曜日のAM 3:00に実行

「-」で指定することで、実行範囲を指定することが出来る

	00  3-6  *  *  * open -a safari // 毎日AM 3:00 4:00 5:00 6:00に実行
	15  3-5  10  *  * open -a safari // 毎月10日のAM 3:15 4:15 5:15に実行
Powershellでの起動実行スクリプト profile.ps1 編集


powershellのデフォルト設定ではスクリプトの実行が禁止されているので .bashrc 的な定義を使える様にするには

1. 全てのスクリプトを実行出来るようにする
2. 署名したスクリプトだけを実行出来るようにする

その上で、profile.ps1を編集することになります
で、多くの記事がとりあえず1を設定しますが、ここは安全性を高めるためにあえて2の方法をとったとします
詳しくはこちらから
https://qiita.com/fumi-m/items/9ea021511634020dca0c


この場合、ちょっとした修正を profile.ps1に追加する度にスクリプトに署名をし直す必要が出てくるのです・・・

で、署名をするためにはそれなりのコマンドを打ち込まないと行けないので、profile.ps1を編集する度に署名が必要なので方法をまとめて見ました

## 設定すべきファイルは？

profile.ps1 はどこにあるのでしょうか？

{{ユーザー別のホームドキュメントディレクトリ(c:\Users\ユーザー名\Documents とか)}}\WindowPowerShell\Microsoft.PowerShell_profile.ps1

長くて覚えていられないですよね？
このパスは変数 $profile で定義されているようです。

そして、メモ帳へのエイリアスが notepad で定義されているので、以下で起動出来る感じ

```
> notepad $profile
```

## 再度署名

```powershell
$Cert = Get-ChildItem Cert:\CurrentUser\Root | ? {$_.Subject -eq "CN=CodeSigningForPS"}
Set-AuthenticodeSignature -Cert $Cert -Filepath $profile
```

## aliasの設定について

### 1. パスが通っていないコマンドへのalias設定

```powershell
Set-Alias sakura ("C:\Program Files (x86)\sakura\sakura.exe")
```

### 2. functionの作成

powershellのSet-Aliasは引数を受け取れないとかで、オプション指定が必要な場合は関数を作る必要がありそう

```powershell
function dc(){
  cd c:\dev\jobrainbow\docker-dev\recruit
  docker-compose up
}
```

それぞれ、

```
> sakura
```

でサクラエディタが開くし

```
> dc
```
でディレクトリに移動してdocker-compose upをしてくれるようになります
Bluetooth on Raspberry

## Work as Beacon
### by hci
1. open hardware  
`sudo hciconfig hci0 up`
2. change its operating mode to “Low Energy Advertising“  
`sudo hciconfig hci0 leadv 3`
3. set the Pi’s Bluetooth to broadcast the iBeacon payload data.  
`sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 06 1A FF 4C 00 02 15 C7 C1 A1 BF BB 00 4C AD 87 04 9F 2D 29 17 DE D2 00 00 00 00 C8 00`  


|id|Byte Value | Description|
|---|---|---|
||0x08|	Defines the OGF as the Bluetooth Command Group 0x08
||0x0008|	Defines the OCF so that we set the bluetooth advertising data
||1F|	Defines the data length of our entire payload
||02|	Data length of the next section, 2 bytes
||01|	Data Type, defines that this section is flag data
||06|	Defines the flag needed for Low Energy Advertising mode
||1A|	Data length of the final section of the payload, 26 bytes
||FF|	Data Type, defines that this section is manufacturer specific data
||4C|	Defines the manufacturer ID, in this case apple (0x4c00)
||00|	Second part of the manufacturer ID
||02|	Defines the sub type, which in our case is an iBeacon
||16|	Defines that the following data is “service data” for eddystone
||15|	Data length of the subtype payload, which should be 21 bytes
||C7|	Proximity UUID, 1st Byte
||C1|	Proximity UUID, 2nd Byte
||A1|	Proximity UUID, 3rd Byte
||BF|	Proximity UUID, 4th Byte
||BB|	Proximity UUID, 5th Byte
||00|	Proximity UUID, 6th Byte
||4C|	Proximity UUID, 7th Byte
||AD|	Proximity UUID, 8th Byte
||87|	Proximity UUID, 9th Byte
||04|	Proximity UUID, 10th Byte
||9F|	Proximity UUID, 11th Byte
||2D|	Proximity UUID, 12th Byte
||29|	Proximity UUID, 13th Byte
||17|	Proximity UUID, 14th Byte
||DE|	Proximity UUID, 15th Byte
||D2|	Proximity UUID, 16th Byte
||00|	Major 1st byte – Distinguishes devices using same UUID
||00|	Major 2nd byte – Distinguishes devices using same UUID
||00|	Minor 1st byte – Distinguishes devices using same UUID
||00|	Major 2nd byte – Distinguishes devices using same UUID
||C8|	Signal Power – Used to optimize distance calculations.

### by BlueZ
1. Enable Experimental Flag for BlueZ  
`sudo nano /lib/systemd/system/bluetooth.service`  
 Find a line starting with “ExecStart” and add “–experimental” at the end of the line   
`ExecStart=/usr/libexec/bluetooth/bluetoothd --experimental`  
2. Download Example Code  

```bash
wget www.kernel.org/pub/linux/bluetooth/bluez-5.43.tar.xz
tar xvf bluez-5.43.tar.xz
ls -l bluez-5.43/test/example-advertisement
```


## Method 1
`sudo bluetoothctl`
`help`

## Method 2
`hciconfig ` //list devices
`hcitool scan` //scan
Leftを_Lに書き換えるだけのMEL

```
string $topObjGroup = "eyeBlinkLeft_middle_geo_grp1";
string $listFullPath[] = `listRelatives -ad -fullPath $topObjGroup`;
string $list[] = `listRelatives -ad $topObjGroup`;

int $i = 0;
for($obj in $list)
{
    string $renameL = `substitute "Left" $obj "Right"`;
    rename $listFullPath[$i] $renameL;
    $i++;
}
}
Laravel マイグレーション時にエラーが出て困った話

## 目的

- 初回マイグレーション時にエラーが出力されて解決した話をまとめる

## エラー内容

- エラー`SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' `を筆頭としたエラーが出力された。
- 下記にマイグレーション時のコマンドとエラー内容を記載する。

```terminal
$ php artisan migrate

   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = calculation_drill_app and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

      +34 vendor frames 
  35  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

## エラーの原因

- Mysqlのrootのアカウントのパスワードとlaravelアプリ側の.envなどに記載したパスワードが一致していなかった。

## 解決方法

1. アプリ名ディレクトリで下記コマンドを実行して「.env」ファイルを開き`DB_PASSWORD=`の部分の編集を行った。

    ```terminal
    $ vi .env
    ```
1. アプリ名ディレクトリで下記コマンドを実行して「database.php」ファイルを開き`'password' => env('DB_PASSWORD',`の部分の編集を行った。

    ```terminal
    $ vi config/database.php
    ```
1. MySQLを再起動しマイグレーションを実施したところエラーは解消された。

## 自分宛てメッセージ

- Laravelだけに限らないがマイグレーション時のエラーは自分の経験上大体MySQLのユーザとパスワードの入力ミスの事が多いので記入時には注意する。
【効率改善】togglですらしんどくなってきたのでActivityWatchに乗り換えてみた

## はじめに

最近、**時間の捻出**について考えることが多くなってきています:bulb:

これまで[Toggl](https://toggl.com/)を使って自分の時間を測定していたのですが、**作業開始/終了時にボタンを押す**必要があり、**そもそも忘れる**ことが多かったのでなんとか自動集計してほしいなーとか考えていました。

以下アプリを導入してみたところ、**自動集計で手間なく振り返り**が出来るようになったので、自分のタイムトラッキングアプリ乗り換え歴とともに、それぞれに感じたメリット・デメリットをまとめてみました:bulb:
[ActivityWatch](https://activitywatch.net/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/64188854-15d5-f1f1-aa52-56c3eb2ea36e.png)


## 環境
```yaml
OS: macOS Catalina 10.15.3
```
## 乗り換え歴とそれぞれのメリット・デメリット

---
### 【第1ステージ】 Trello + Pomello
[Trello](https://trello.com/)でタスク管理開始

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/efb2eba7-0588-1945-f510-341e7a61da5d.png)

[Pomello - Stay focused. Accomplish more.](https://pomelloapp.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/798e775d-d9d2-e224-2d85-3954d2a3d1ed.png)

#### :o: メリット

- Trelloのタスク一覧性はさすがの見やすさ
- TrelloとPomelloが自動連携してくれて、稼働時間が自動集計
- ポモドーロ・テクニックで集中力の保持はしやすい

#### :x: デメリット

- 小さいタスクをカードに登録するのがめんどくさい
- CUIで結構操作できるが、リスト間移動しづらいとかで不完全
- 1つのボードで全部やろうとするとツラい
- 別のボードに長期タスク入れると結局見えなくて忘れる
- Pomelloの25分/5分休憩に自分が無理に合わせている感覚がある
- Pomelloが画面のどこかにいる必要がある（ちょっとジャマ）
- Pomelloのボタンを押す必要がある

ポモドーロ・テクニックは間違いなく効果はあったんですが、人間贅沢なもので「ボードの仕分け」やら「カードの作成」に対して管理しきれませんでした。

「何かいいものないかな〜:thinking:」と思っているときに、**超効率よく学習を進めている方**が使っていたのが**「toggl」**です:bulb:

---
### 【第2ステージ】 toggl

[Toggl - Free Time Tracking Software](https://toggl.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/c23c068b-0787-3540-381c-e385dd754aff.png)

#### :o: メリット

- ボードの概念がないのでラク
- プロジェクト単位での仕分けがカンタン
- ボタンを押し忘れても後から書き換え出来るので大丈夫

#### :x: デメリット

- なんだかんだボタン押し忘れた後の手入力が面倒
- 細かいタスクをいちいち集計するのが面倒
- 脳ミソが疲れてくる or 超集中してる とボタン押し忘れ多発

結局、**「自己管理のために自分の時間を使いたくない」**というワガママを抱えていることに気づいたので、また運用中途半端で終了。

「もうむしろ勝手にやってくれるのないかな〜:thinking:」と思っているときに、CTOから教わったのが**「ManicTime」**です。

[ManicTime](https://www.manictime.com/)

ただ、**Macに対して対応しきれていない**のか、サーバーをDocker環境下で動かす必要があり、ちょっと面倒:sweat_smile:

いくつかの類似サービスの中から、OSSの**「ActivityWatch」**を使用してみることにしました:bulb:

### 【第3ステージ】 ActivityWatch (現在)

[ActivityWatch](https://activitywatch.net/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/64188854-15d5-f1f1-aa52-56c3eb2ea36e.png)

#### :o: メリット

- 完全自動集計で**運用コストがかからない**
- **インストールしたら自動で**`localhost:5600`を使用してサーバー構築してくれる
- ローカル環境下で完結するので**セキュア**
- 使用アプリごと、閲覧ページごと、など複数の軸で切り分けて集計してくれる
- 以下のような円グラフも勝手に作ってくれる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/6cf77322-52e2-18d8-1265-08c8d5d96122.png)


#### :x: デメリット

- PC操作以外の集計はされない（当然）
- マジでキッチリ集計されるので自分用とはいえちょっと恥ずかしい:relieved:

エンジニアなど、**仕事がPCで完結する方**にはなかなかオススメです:wink:

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [ActivityWatch](https://activitywatch.net/)
- [ManicTime](https://www.manictime.com/)
- [Toggl - Free Time Tracking Software](https://toggl.com/)
Macにdockerインストール

僕の環境です。
初心者が頑張ってみました。完全にメモです。
Mac OS Catalina 10.15.4

##dockerダウンロード
公式ページよりダウンロードします。
https://www.docker.com/
<img width="918" alt="スクリーンショット 2020-04-12 14.23.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/ac095493-351b-4f62-0dca-032f8dfcedd4.png">
「get started」より、
<img width="1405" alt="スクリーンショット 2020-04-12 14.23.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/5f3151dd-6d40-ce2f-c775-57d90bb3b2c5.png">
「Download for Mac」を押して、
<img width="976" alt="スクリーンショット 2020-04-12 14.25.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/964d4147-b80c-615b-f7fd-1d61bd911784.png">
左下の「Get Docker Desktop for Mac(stable)」をダウンロード。

##インストール
ダウンロードしたファイルをダブルクリックしてインストール。
途中で認証を要求されるので、パスワードとか入力。
<img width="420" alt="スクリーンショット 2020-04-12 14.29.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/e3f21323-8f4b-2134-df07-e65c7143ad95.png">
クジラのマークが出てきたらOK。かわいい。
クリックして「Docker Desktop is runnning」があれば起動中。

##dockerコマンド
ターミナルを起動。
とりあえず試しで、以下のコマンドをいれる。

```
$ docker run hello-world
```
```
Unable to find image ' hello-world:latest' locally
```
最初にこんな文章が出てくるが、少し待ったらDockerhubからDockerデーモンが自動でpull（ダウンロード？）してきてくれて、下の文章が出てくる。
<img width="528" alt="スクリーンショット 2020-04-12 14.44.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/4ffe63ec-1abc-200b-d573-c2b1fbfcdc18.png">
この下にもdockerがどう動作したのか解説した文章もある。
もう一度同じコマンドを入力したら、ダウンロードが必要ないので高速で起動する。
docker run コマンドは、
・docker pull　…　イメージの取得
・docker create　…　コンテナ作成
・docker start　…　コンテナ起動
を一度にやってくれるらしいです。
あと、「:latest」はタグ。指定しなければlatestタグのイメージがpullされる。
##docker hub
dockerイメージのレジストリサービス。登録する。
https://hub.docker.com<img width="1135" alt="スクリーンショット 2020-04-12 15.08.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/6401525e-1638-19fd-b0d9-2ab694e9ec7c.png">

こんなトップページ。
ここでさっきの「hello-world」を検索したら
<img width="939" alt="スクリーンショット 2020-04-12 15.12.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/f65ac203-64be-8850-f289-8c8aef3fd0b0.png">
「official」マークがついてるやつ。さっきはこれをpullしてきてくれてた。
名前にスラッシュ「/」が入ってたら個人が公開してるやつ。

この辺を参考に必要なイメージをpullしてコンテナ作成していく。

##PC上のイメージ

```
$ docker images
```
```
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        15 months ago       1.84kB
```
これで確認できる。
「REPOSITORY」は自分で付け直しできる。

```
$ docker tag hello-world my_world
```

```
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        15 months ago       1.84kB
my_world            latest              fce289e99eb9        15 months ago       1.84kB
```
「TAG」も付け直しできる。
さっきの新しい名前の後ろに```:（新しいタグ名）```付けたら変わる。


####イメージの詳細
```
$ docker inspect my_world
```
よく使うコマンドで大事。らしい。
大量の文字が返ってくる。

####イメージ削除
```
$ docker rmi my_world
```
####pull
```
$ docker pull hello-world
```

####自分でDockerイメージファイル作成（イメージビルド）

```
FROM イメージ作成時の元になるイメージを指定

```
Dockerfileの書き方まだあるんですが非常に難しいですね。
初心者には理解しきれず。。。
今回はここまでにします。
Dockerfileの書き方はいずれしっかり勉強してまた記事をあげたいと思っています。

ありがとうございました。
[Rails][Devise][Carrierwave]を使ってTwitter認証でprofile画像を取得する方法

#はじめに
**（*注意：この記事は学習の一環として実装した物の一部を記事にしています。又、技術的に最適な方法ではない可能性があります。）**

**`omniauth-twitter`**,**`devise`**,**`carrierwave`**を使って
twitteのプロフィール情報（:name, :image）を取得する機能を実装しておりました。
`twitter認証`を使って取得する際に`profile画像(auth.info.image)`が`null`で返ってきてしまい大変ハマってしまったのですが解決できたので解決方法を載せておきます。
画像が保存される先はuploads/tmpになております。

**注意：twitter認証時に取得した画像はuploads/tmpに保存される構成です。**
**uploads/tmp以外のフォルダに保存されるような実装はしていませんのでご理解の程よろしくお願いします。**

##Userの[image]がnullで返ってくる

- user.image = auth.info.image　(nullが返ってくる。)
- デフォルトでアイコン画像が入るようにしているので`image`には`presence: true`にはしておりません。

##環境##
- **`rails (5.2.4.1)`**
- **`carrierwave (2.1.0)`**
- **`devise (4.7.1)`**
- **`omniauth-twitter (1.4.0)`**

##omniauth-twitter+devise
`Devise`と`omniauth-twitter`の実装手順は省略します。

実装手順を確認したい方は
[こちら](https://github.com/heartcombo/devise/wiki/OmniAuth:-Overview)を確認してください。

ハマった部分は少し載せます。、、
上記Linkのoverviewのコードではこのようになってます↓

```ruby:app/model/user.rb

#アバター用のアップローダーをユーザーモデルに紐付け
  mount_uploader :image, AvatarUploader 

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0, 20]
    user.name = auth.info.name  
    user.image = auth.info.image #←ここ！ nullが返ってきた。or #ActionDispatch::Cookies::CookieOverflow が返ってきた。
  end

private

  # メールアドレスはダミーのメールアドレスを作成します
  def self.dummy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com"
  end
end
```
##解決方法

原因は[carrierwave](https://github.com/carrierwaveuploader/carrierwave),**Overview**の
**`Uploading files from a remote location`**
に記載されている事の確認不足でした。
解決方法はいたって簡単でした。

`user.image` or `image:`に`user.remote_image_url`or`remote_image_url`に変更すればいいだけです。
carrierwaveのアップローダーを`:image`にマウントさせてるのでクロスドメインで情報を取得する場合は`:image`の部分を変更してあげる必要があります

###carrierwaveの使う時のkey:の書き方


```ruby
def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = User.dummy_email(auth)
    user.password = Devise.friendly_token[0, 20]
    user.name = auth.info.name  
    user.image = auth.info.image #←ここを
    user.remote_image_url = auth.info.image #に変更してあげる
  end

```

key:に値を入れるパターンも一緒です。

```ruby 
def self.from_callback(auth)
  user = User.where(provider: auth.provider, uid: auth.uid).first
  unless user
    user = User.create(
      email:            User.dummy_email(auth),
      password:         Devise.friendly_token[0, 20],
      name:             auth.info.name,
      image:            auth.info.image #←ここを
      remote_image_url: auth.info.image #に変更する
  end
  user
end
)
```

これでクロスドメイン経由でtwitterのprofile画像が取得できました。

##参考
https://y-hilite.com/3215/
Anaconda Prompt のエラーメッセージにユーザー名が含まれているとき


<br/>
#### 友人がGraphvizを使っていたので真似して環境構築したときのメモです。

<br/>


# エラーの内容
```
(smplenv) C:\Users\TAROU YAMADA>dot -V
```
<br/>
とコマンド入力したら、
<br/>

```
'dot -V' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
<br/>
ではなく
<br/>

```
'C:\Users\TAROU' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
<br/>
とエラーが出ました。




# 原因

ユーザー名の苗字と名前の間に空白があることが原因でした。

空白を入れた覚えはないので、最初の設定の時にユーザー名を日本語にしたせいだと思います。

# 解決法
最初に設定したユーザー名を変えることはできても、問題のディレクトリの名前（ユーザー名）を変えることはできないor面倒らしいということがわかったので、新たにローカルアカウントを作成しました。

今度はユーザー名はちゃんと英語にしました！


# 補足

コマンドプロンプトで上記のコマンドを（空白がある状態で）入力したときは異常がなかったので、Anaconda Prompt 独自のものだと思われます。
深層学習(Coral TPU)とかでのPythonエラー「ValueError: Model provided has model identifier '<!', should be 'TFL3'」への対処

#目的
Coral TPUをCoralのページをみて動かそうとして、
**おおぼけ**で、
以下の難しそうなエラーをたたき出した。

```
ValueError: Model provided has model identifier '<!', should be 'TFL3'
```
エラー全体を以下に示す。

```
C:\_work1\_win_corel1\edgetpu_runtime\corel\tflite-master\python\examples\classification>python classify_image.py --model mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels inat_bird_labels.txt --input images/parrot.jpg
Traceback (most recent call last):
  File "classify_image.py", line 122, in <module>
    main()
  File "classify_image.py", line 99, in main
    interpreter = make_interpreter(args.model)
  File "classify_image.py", line 73, in make_interpreter
    {'device': device[0]} if device else {})
  File "C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\tflite_runtime\interpreter.py", line 205, in __init__
    model_path, self._custom_op_registerers))
ValueError: Model provided has model identifier '

<!', should be 'TFL3'

```

#対処方法

モデルファイルである
mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite
のファイル取得（ダウンロード）に失敗しているだけ。
再度、正しく、取得（ダウンロード）すれば問題なし。
ワタシの場合は、リンク先を保存等で、なんか、
**htmlかxmlか、とにかく、モデルじゃないものを、大事にダウンロード保存していました。**
サイズでも気づくと思います。普通。

[再掲]
**正しく、取得（ダウンロード）すれば問題なし**

#まとめ
この記事は、、、この間違いをする人が少ないと思うので、微妙だが、
一人二人には、お役に立つ可能性あり。
初心者によるプログラミング学習ログ 289日目

#100日チャレンジの289日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
289日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>289日目　6h<br>・xdデザインカンプからのサイト模写<br>・ヘッダーとナビの配置に超苦戦<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1249426946024329217?ref_src=twsrc%5Etfw">April 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
偽陽性・偽陰性の分布を計算するスクリプトを書いたよ

既に類似のものが存在するかもしれませんが、「**検査精度・実際の陽性率・検査対象人口を入力とし、偽陽性・偽陰性の人数とそれらが検査結果に占める割合を計算する**」スクリプトを書き、jsFiddle で公開しました。

# 偽陽性・偽陰性分布計算
https://jsfiddle.net/darutk/Lbhwp1d4/show/
![偽陽性・偽陰性分布計算.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/416df044-8734-5105-f255-759634f436ef.png)

スクリプトの主要な計算部分にコメントをつけると次のようになります。

```js
// 実際の陽性率と検査対象人口から、実際に陽性の人の数を計算する。
let positive_population = Math.round(input.positive_ratio * input.population);

// 実際に陰性の人は、検査対象人口から実際に陽性の人の数を引いたもの。
let negative_population = input.population - positive_population;

//【真陽性】実際に陽性の人のうち、検査結果も陽性になる人の数。
let true_positive = Math.round(input.test_accuracy * positive_population);

//【偽陰性】実際の陽性の人の数から、検査結果も陽性の人の数を引くと、偽陰性の数になる。
let false_negative = positive_population - true_positive;

//【真陰性】実際に陰性の人のうち、検査結果も陰性になる人の数。
let true_negative = Math.round(input.test_accuracy * negative_population);

//【偽陽性】実際の陰性の人の数から、検査結果も陰性の人の数を引くと、偽陽性の数になる。
let false_positive = negative_population - true_negative;
```

# 偽陽性の割合は想像以上に高い

**全体に占める実際の感染者の割合が低いと、検査精度が良くても偽陽性になる確率はかなり高くなります。**仮に一万人に一人の割合で感染していたとすると、検査精度が 99% でも、陽性判定のうち実際に陽性なのは 1% くらいです。

![偽陽性・偽陰性分布計算2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/354227fd-8d60-0ce5-4b72-698d96de7bc8.png)

対象を絞らずに 1 億人検査すると、999,900 人の偽陽性が出るので、医療崩壊待った無しです。

# 検査精度の応用

この検査精度の話ですが、**意思決定論**的なものを学んだことのある人達にはよく知られています。いろいろ応用ができます。

例えば、激しい雨が降る夜に轢き逃げ事件を目撃した人が「車の色は赤だったと思う」と証言したとき、赤い車だけに対象を絞って捜査をすべきでしょうか？ もしも、その街に存在する車の中で赤い車の割合が極端に低い場合、むしろ逆に「轢き逃げ事件の車の色は赤ではない」確率のほうが高いでしょう。ですので、車が赤であることの物的証拠がない段階では、見間違いの恐れもある状況下にあった目撃者の証言だけをもとに捜査対象を赤い車だけに絞るのは不適切だと言えます。

# おわりに

偽陽性・偽陰性の分布の計算自体は小学生が習う算数でできます。重要なのは、偽陽性・偽陰性の概念を知り、**偽判定の割合が直感に反して高くなる**ことを認識しているかどうかです。この概念については、小学校・中学校で教えたほうがよいと昔から思っています。
nodenvのnpmでglobal installしたパッケージのPATHが通らない場合

あれ？あのコマンド、NPMでグローバルインストールしたはずなのに、パスが通ってない！これじゃターミナルから叩け無い！どうしよう！というやつ。
備忘録として書いておく。

## つまり

```bash
$ npm install -g @hoge/cli
```

をしても

```bash
$ hogecli
bash: hogecli: command not found
```

になるとき。

## 確認する

```bash
$ which npm
/Users/{{username}}/.anyenv/envs/nodenv/shims/npm
```
nodenvのshims下に入っていればOK

```bash
$ ls /Users/{{username}}/.anyenv/envs/nodenv/shims
bower    express  firebase nest     ng       node     node-gyp npm      npx      vue
```

所望のパッケージコマンドが、ここにないことを確認する。
PATHではここを見に行ってるので、ここになければ、コマンドは見つからない。
なお、それぞれはコマンドと同名のシェルスクリプトで、環境をセットしたのち、実際のbinの呼び出しを行ってくれる。

## rehash

```bash
$ rm /Users/{{username}}/.anyenv/envs/nodenv/shims/.nodenv-shim
$ nodenv rehash
```

これで再び `/Users/{{username}}/.anyenv/envs/nodenv/shims` 下にコマンド名のシェルスクリプトが生成される。
Flutterでproviderを使った画面実装の最小サンプル

# TL;DR

- providerを使ってlistviewの構成および、そのlistviewへの動的な追加を実装する際にベースとなる実装を書きました
- なるべくいろんな呼び出し方を使っています
- 静的解析はしていないので適宜const等追加してください
- 非同期な処理の場合は実際は`async/await`を挟むだとか、addした後にテキストをクリアしたい場合は`TextEditingController`を追加することになります
- providerは便利

# 準備

```pubspec.yaml
dependencies:
  provider: any
```

# ChangeNotifierを実装したクラス

```chats.dart
import 'package:flutter/material.dart';

class ChatData with ChangeNotifier {
  final _chats = <String>[];

  List<String> get chats => _chats;
  int get chatCount => _chats.length;

  String getChat(int index) {
    return _chats[index];
  }

  void addChat(String chat) {
    _chats.add(chat);
    notifyListeners();
  }
}
```

# main.dart

```main.dart
void main() => runApp(ChangeNotifierProvider<ChatData>(
      create: (context) => ChatData(),
      child: App(),
    ));

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'provider sample',
      home: ChatScreen(),
    );
  }
}
```

# チャット画面

```screen.dart
class ChatScreen extends StatelessWidget {
  const ChatScreen({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: SafeArea(
      child: Column(
        children: <Widget>[
          Expanded(
            child: ChatList(),
          ),
          Divider(height: 2, color: Colors.black),
          ChatInput(),
        ],
      ),
    ));
  }
}

class ChatList extends StatelessWidget {
  const ChatList({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ListView.separated(
      shrinkWrap: true,
      separatorBuilder: (context, index) => Divider(color: Colors.black),
      itemCount: Provider.of<ChatData>(context).chatCount,
      itemBuilder: (BuildContext context, int index) {
        return ChatListTile(index: index);
      },
    );
  }
}

class ChatListTile extends StatelessWidget {
  const ChatListTile({Key key, @required this.index}) : super(key: key);
  final int index;

  @override
  Widget build(BuildContext context) {
    return Consumer<ChatData>(
      builder: (context, chatData, child) {
        final currentChat = chatData.getChat(index);
        return ListTile(
          title: Text(currentChat),
        );
      },
    );
  }
}

class ChatInput extends StatelessWidget {
  const ChatInput({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 40,
      child: TextField(
        onSubmitted: Provider.of<ChatData>(context, listen: false).addChat,
      ),
    );
  }
}
```

# 完成

<img width="250" alt="スクリーンショット 2020-04-13 3.14.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190157/0d49b0a5-3f36-8537-b33e-771857101b5b.png">
Webを使った新人研修　～Linuxコマンド編 - viコマンド～

######[Webを使った新人研修　～Linuxコマンド編～](http://qiita.com/fujisystem/items/63b787ac71e9bdcaf3f6)

#viコマンド 「viエディタの起動」
vi（ヴィーアイ）は、UNIX環境で人気があるテキストエディタ。大体のLinuxでビルトインされていることが多いです。
viは、「VIsual editor」ないし「Visual Interface」に由来するようです。
Shellを作成したり、テキストファイルを記載したりと使いこなすと非常に便利です。
セキュアな環境ではこのエディタのみで開発する場合もあるかもしれません。
viの派生でvimというものもあります。

まずは、「実践」してみましょう。

##実践する
LinuxマシンのエミュレートされているWebページを開きましょう。
・jor1k
http://s-macke.github.io/jor1k

早速「viエディタの起動」してみましょう。
左側の黒いウィンドウで以下のコマンドを実行し、最後にエンターキーを押して下さい。

```
vi test.txt
```

![vi01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110729/c8f43bb0-a01a-a5cd-14a3-fee7921b86e3.png)

##解説
画面左下に表示されている"test.txt"が現在開いているファイル名になります。
Windowsのメモ帳や秀丸エディタなどとは操作方法や考え方が異なるので予め留意してください。

###モード
viでは、"モード"を適宜切り替えてテキストを編集していきます。
[Wiki](https://ja.wikipedia.org/wiki/Vim)に乗っていますが

| モード  | 状態  |
|:--|:--|
| ノーマルモード  | カーソル移動やテキストの削除、コピー、ペーストなどの簡単な指示を行う。 |
| ビジュアルモード  | テキストを選択するだけのモード。 |
| 挿入モード  | 実際にテキストを入力するモード。 |
| コマンドラインモード  | ファイルを開いたり、検索・置換などの様々な指示を行う。  |

初学者には最初は、"ノーマルモード"と"挿入モード"のみ教えます。

####ノーマルモード
カーソルの操作方法を以下のみ最初に教えます。

| キーボード操作  | コマンド表現  | 機能 |
|:--|:--|:--|
| j  | j  | 下にカーソル移動 |
| k  | k  | 上にカーソル移動 |
| h  | h  | 左にカーソル移動 |
| l  | l  | 右にカーソル移動  |
| x  | x  | カーソルの現在位置の文字削除  |

####挿入モード
このモードに入ると、キーボードでタイプしたキーがそのままテキストとして出力されます。
以下のみ最初に教えます。

| キーボード操作  | コマンド表現  | 機能 |
|:--|:--|:--|
| i  | i  | カーソル位置の前から挿入モードを開始する。  |
| ESC  | -  | 挿入モードからノーマルモードに戻る。  |

<br/>
例題を示して記憶の定着を図ってみます。

##例題
１．「vi test.sh」と入力して、bash用ファイル「test.sh」を開く。
２．「Hello World!」と表示する部分を記載する。
３．「:wq」で、保存してviエディタを終了する。
４．「chmod」で、ファイルに実行権限を付与する。
５．ファイルを実行する。

```bash:bash
vi test.sh
~-~- 以下をvi上で記載
#!/bin/sh
echo "Hello World!"
exit 0
~-~-
chmod 755 test.sh
./test.sh
```

<br>
###実行後の画面
![vi02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110729/59345e65-99e1-2e6a-d6bf-341abf22e637.png)

～本日はここまで
Vue.js devtoolsのChrome用拡張機能で"Vue"が現れなかったが解決した。

#概要
Google Chromeの拡張機能 Vue.js devtoolsの導入記事は既にありますが、それらを読んでも導入がうまくできませんでした。ここでは、恥を忍んでその解決法をご紹介します。
#何が起こったか
大体のVue.js devtools導入お助けサイトでは、
1. [Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)へGo＆追加！
2. 、拡張機能の設定画面から、「ファイルのURLへのアクセスを許可する」にチェック！
3. 導入終了！デベロッパーツールのVueタブから使えるよ‼

みたいな書き方をしていると思いますが、私は↑で言うと3でVueタブが表示されませんでした。
#どうしたのか
1. デベロッパーツールの一番右上の「×」のひとつ左の「・が縦に三つ並んだやつ」からSettingsをクリック
2. 一番下、DevToolsという項目の"Auto-open DevTools for popups"にチェック
3. リロード
4. 表示された
In App Purchaseのレシートの種類

## レシートについて

レシートの種類は2つあり、iOS6スタイルレシートとiOS7スタイルレシートが存在する
現在はiOS6スタイルレシートの取得方法はdeprecatedとなっており、APPからは取得できないが、デベロッパーのサーバ側では保持したままといったケースはあり得る

## iOS6スタイルレシート

- iOS6以前に使われていた[スタイル](https://godoc.org/github.com/evalphobia/go-iap/appstore#IAPResponseIOS6)
- 現在は[取得方法](https://developer.apple.com/documentation/storekit/skpaymenttransaction/1617722-transactionreceipt)がdeprecatedとなっており取得できない

## iOS7スタイルレシート

- iOS7以降に使われるようになった[スタイル](https://godoc.org/github.com/evalphobia/go-iap/appstore#IAPResponseIOS7)
- Bundleに保持している[appStoreReceiptURL](https://developer.apple.com/documentation/foundation/bundle/1407276-appstorereceipturl)からいつでも取得可能