OmniAICreator/Qiita-1.07M huggingface dataset:
[Railsチュートリアル] 13.4.4 本番環境での画像アップロード S3の設定

# Railsチュートリアル

S3の設定でつまずいたので、メモにして残します。パーミッションの設定等、まずい点があれば教えてください。

AWSアカウントを新規作成したので、S3も１年間は無料で使えます（容量制限あり）。せっかくなので、頑張って１３章を完走したい。

## IAMユーザーを作成し、Access key、Secret key を得る

![snap_1141.png](https://qiita-image-store.s3.amazonaws.com/0/320718/3ace68c2-35c6-88fb-05bf-0a1ab7913be5.png)

IAMでユーザを作成する。

![snap_1142.png](https://qiita-image-store.s3.amazonaws.com/0/320718/bf1d9a73-f441-6d6b-cbf7-44bb1de06abc.png)

ダッシュボードに入ります。

![snap_1143.png](https://qiita-image-store.s3.amazonaws.com/0/320718/07e93646-aa5e-5604-90c6-bac42ad5b95f.png)

「ユーザーを追加」をクリック

![snap_1144.png](https://qiita-image-store.s3.amazonaws.com/0/320718/72a258ff-f5b9-7e2f-1063-891927a5ec88.png)

「プログラムによるアクセス」を許可

![snap_1145.png](https://qiita-image-store.s3.amazonaws.com/0/320718/59377f02-3310-9878-2e3c-1a4b2bee5d6b.png)

「グループの作成」をクリック

![snap_1146.png](https://qiita-image-store.s3.amazonaws.com/0/320718/62dd188d-a1de-cad1-db2a-e024e5df2f2a.png)

「AmazonS3FullAccess」のグループを作成

![snap_1147.png](https://qiita-image-store.s3.amazonaws.com/0/320718/60847c61-b29c-8f61-2808-8b8e95c05390.png)

そのまま「次のステップ」に進む

![snap_1148.png](https://qiita-image-store.s3.amazonaws.com/0/320718/9ac9933a-acac-fa03-bc93-6a5846a7dbc9.png)

そのまま「次のステップ」に進む

![snap_1149.png](https://qiita-image-store.s3.amazonaws.com/0/320718/b033e21e-98ce-7c5e-2ae9-9b2ccd77b9f9.png)

そのまま「ユーザーの作成」に進む

![snap_1150.png](https://qiita-image-store.s3.amazonaws.com/0/320718/21b03221-3ae8-a0e6-b0ba-9c3b888cc286.png)

やっと、「AccessキーとSecretキー」をダウンロードできます。csvファイルは大切に保管しておきましょう。

次は、「S3」を立ち上げます。

## S3の設定

![snap_1155.png](https://qiita-image-store.s3.amazonaws.com/0/320718/ac1b6287-765e-72a4-ca05-cff66da0b641.png)

バケット名（任意）とリージョン（東京）を決める。

![snap_1156.png](https://qiita-image-store.s3.amazonaws.com/0/320718/c6b7f810-c952-40c6-b8db-0108476271cf.png)

そのまま「次へ」進む

![snap_1157.png](https://qiita-image-store.s3.amazonaws.com/0/320718/a8128779-5c9e-3e5d-c923-f285ffddf20b.png)

私の環境では「ACLの管理」で両方ともチェックを外さないと、画像のアップロードと表示ができませんでした。あとで変えることができるので、「推奨設定」のまま進めましょう。

![snap_1160.png](https://qiita-image-store.s3.amazonaws.com/0/320718/da2af881-9b96-d6e9-93cc-9e9f6709ad8d.png)

これで「バケット」が作成できました。中の設定を確認してみましょう。

![snap_1161.png](https://qiita-image-store.s3.amazonaws.com/0/320718/0591b80c-039c-a36d-d5ce-931b2318063f.png)


「バケット名」をクリックする

![snap_1163.png](https://qiita-image-store.s3.amazonaws.com/0/320718/d3b282a7-6397-a964-8366-79dbe54b608c.png)

アカウントが一つだけ作成されています。この長ったらしい文字列は「正規ユーザーID」です。

この状態だと、heroku から写真のアップロードができませんでした。heroku の設定など見直しましたが、全て正しいようです。ここで困ってしまったのですが、色々いじっているうちに「解決策」を発見。

![snap_1175.png](https://qiita-image-store.s3.amazonaws.com/0/320718/8c287edc-e537-2a88-3979-e70ec2443313.png)

これが正しい方法かわかりませんが、「ACLの管理」のチェックを外すことで、画像のアップロードと表示ができるようになりました。

## ==AWS 正規ユーザーID の確認==
![snap_1166.png](https://qiita-image-store.s3.amazonaws.com/0/320718/0c5f55ff-7f89-7cf4-c5c8-bedc72fa79f5.png)

[自分の正規ユーザーIDの確認の仕方](https://docs.aws.amazon.com/ja_jp/general/latest/gr/acct-identifiers.html)

## ==Heroku の環境設定の確認==

![snap_1169.png](https://qiita-image-store.s3.amazonaws.com/0/320718/637e71ca-99da-f27e-c2a1-03dcb0c22582.png)

heroku の環境変数をダッシュボードから確認する。「Settings」=>「Reveal Config Vars」
PHP7.2をHomebrewでMac OSに導入する方法

#はじめに
Hombrewを使ってPHP7.2をインストールする方法について簡単にまとめました。

###環境
- `Mac OS Mojave Version 10.14`

- `Homebrew 1.8.6`

#導入Step

[1. PHP7.2のインストール](#1-php72のインストール)
[2. PATHを通す](#2-pathを通す)
[3. インストール確認](#3-動作確認)

##1. PHP7.2のインストール

HombebrewでPHPをインストールします。
（今回はPHP7.2を前提としていますが、適宜最新のものをインストールして下さい）

```
$ brew install php@7.2
```

##2. PATHを通す
インストールが完了する際に以下の様なメッセージがターミナルに表示されます。

```
php@7.2 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.
```
要するに、「インストールはしたけどパスは通していない」ということです。さらに表示されたメッセージに以下のような記述があります。

```
If you need to have php@7.2 first in your PATH run:
  echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile
```

これの意味するところは、bash_profileに export コマンドでPATHを通すような記述を追加すれば、パスを通すことが出来ると言うことなので、下記のコマンドを実行します。

```
$ echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile
```

`$ open ~/.bash_profile`で<b>.bash_profile</b>に次の2行が追加されたことを確認。

```
export PATH="/usr/local/opt/php@7.2/bin:$PATH"
export PATH="/usr/local/opt/php@7.2/sbin:$PATH"
```

##3. インストール確認
`$ php -v`でインストールされたPHPのバージョンを表示してみます。 

```
$ php -v
PHP 7.2.13 (cli) (built: Dec  7 2018 10:41:23) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.13, Copyright (c) 1999-2018, by Zend Technologies
```

PHP 7.2がインストールされていれば完了です。お疲れ様でした。
今までに作成したリポジトリをGitHub.ioで簡単にWEBページ化する方法

自分で作成する際に情報が分散しててちょっと手間取ったので書きます。
使ってるのはVSCodeです。
**ド初心者なので間違いがあったら優しくコメントでお知らせ下さい。**

知り合いから教えてもらったのですが、各リポジトリのmaster branchにプッシュすれば自動的にWEBページもアップデートされるという便利仕様。
github.ioのトップページから各リポジトリにリンクつなげたりとかするだけで簡単にポートフォリオが出来てしまう…。なんてこった。

[GitHubのmasterブランチをWebページとして公開する手順（GitHub Pages）](https://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096)
[たった５ステップ！Githubの機能「GitHub Pages」でホームページを制作しよう](https://ferret-plus.com/5875)
を参考にしています。ありがとうございます！

##①github.ioのリポジトリを作成

まず、githubのページでgithub.ioのリポジトリを作成します。
名前の付け方は、ユーザ名がHogehogeだったらHogehoge.github.ioとなります。
これがいわゆるトップページになります。

![screenshot-github.com-2018.12.30-20-32-29.png](https://qiita-image-store.s3.amazonaws.com/0/278395/351549ee-7896-8aac-7cbe-8e934f6f0f03.png)


##②先程作ったgithub.ioリポジトリをクローンする

ローカルにクローンします。

![screenshot-github.com-2018.12.30-20-35-10.png](https://qiita-image-store.s3.amazonaws.com/0/278395/4aa36dec-ae79-a36e-ce00-f3b0d902c784.png)

リポジトリのページにある、ここのURLをコピーして

VSCodeで適当なフォルダを開き、そこでterminalを開いて
`git clone https://github.com/USERNAME/USERNAME.github.io.git`（https://の部分は先程コピーしたURL）
と打てばクローンされます。
![git clone.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/c3314b09-93cc-64c1-e982-b6cb0fb631e1.png)

他のソフト使ってたりでよくわかんねー！って場合はすまんがググってくれ。
目的はgithub.ioリポジトリ内にindex.htmlを突っ込むことです。

##③index.htmlを作成してコミット、プッシュ

リポジトリの直下にindex.htmlを作成します。htmlはすっからかんのままでも大丈夫です。

![git clone 2.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/f6a0b014-792f-8b24-66c9-f6f4928fab09.png)

作成したら適当にコメント入れてコミット、プッシュを行います。

![git clone 3.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/42dbf59e-51f4-ccda-fd21-1676b82a108d.png)

![git clone 4.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/3edb90c0-8970-db33-1239-5babc1ad6f21.png)

この時点でhttps://[USERNAME].github.ioというトップページが生成されます。やったぜ。


##④公開したいリポジトリのソースコードを/docsに入れる

次はいよいよリポジトリの公開です。
つってもそんなに複雑なことはやらない。

こんな感じで、**リポジトリのソースコードをまるっと/docsに入れます。**
![git clone 5.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/08d2e2ca-67c1-fc1f-5822-e56cd6e93373.png)
![git clone 6.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/bca96341-1495-554f-4ecd-07509e13b357.png)

入れたら、Settingsタブを開いて
![git clone 7.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/d1f590a0-2418-85d7-5dde-05af97c44ee6.png)

![git clone 8.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/5757fdcd-b8ea-b149-3197-9e28c3a63af4.png)

Optionsの**GitHub PagesのSource部分を"master branch /docs folder"と選択し、SAVEを押します。**
そうすると図のように`"Your site is published at https://xxxxx.github.io/xxxxxx"`と表示されます。
少々ラグがあったりするのですぐには表示されないこともありますが、これでリポジトリをWEBページとして公開できます。
以上です！

新しくリポジトリ作る際も/docsにソースコード全部入れて作るようにすれば、Settingsいじるだけで簡単にWEBページになるという…。すげえ。
Vue.js+Firebaseでデータベースから呼び出せない事象を解決した

## 目次
- Todoアプリを作ってます
- データベースに保存できていないことに気づいた
- 解決方法

## Todoアプリを作ってます
まず初めに当事象は[私(@watuyo_2)](https://twitter.com/watuyo_2)が作成している、[Todoアプリ](https://todoapp-b6529.firebaseapp.com/)にて発生しました。

もともとLocalStrageにデータを保存し、それをVue.jsのcreated時に読み込むような実装をしていました。

しかし、当たり前ですがGoogleユーザーごとではなくブラウザのキャッシュごとに保存される形式になるので**Firebase**に保存するように実装しました。

そこでFirebaseに保存されるはずが…

## データベースから呼び出せてないことに気づいた
フォルダ構造はこんな感じです。

```
src
├── App.vue
├── components
│   ├── Home.vue
│   └── ToDo.vue
└── main.js
```

結論からお話すると、Firebaseから呼び出す(コンポーネントにデータを引き出す)際に必要な**userData**を読み込む実装をしていなかったことが原因でした。
なのでTodoページでは、何も取得できていませんでした。

これが誤ったコードです。

```vue
<template>
  <div id="app">
    <Home v-if="!isLogin"></Home>
    <ToDo v-if="isLogin"></Todo>
  </div>
</template>

<script>
import ToDo from './components/ToDo'
import Home from './components/Home'

export default {
  name: 'App',
  data() {
    return {
      isLogin: false,
    };
  },
  created: function () {
    firebase.auth().onAuthStateChanged(user => {
      console.log(user);
      if (user) {
        this.isLogin = true;
      } else {
        this.isLogin = false;
      };
    });
  },
  components: {
    ToDo: ToDo,
    Home: Home
  }
}
</script>
```
**isLogin**とFirebaseに格納したログインデータを引き渡せていません。

## 解決方法

コードの正誤表はこちら。
![スクリーンショット 2018-12-30 20.54.44.png](https://qiita-image-store.s3.amazonaws.com/0/253605/070b6885-694d-a1ae-9f7b-e8b93bb10f3e.png)


正しいコードは以下。

```vue

<template>
  <div id="app">
    <Home v-if="!isLogin"></Home>
    <ToDo v-if="isLogin" :user="userData"></Todo>
  </div>
</template>

<script>
import ToDo from './components/ToDo'
import Home from './components/Home'

export default {
  name: 'App',
  data() {
    return {
      isLogin: false,
      userData: null
    };
  },
  created: function () {
    firebase.auth().onAuthStateChanged(user => {
      console.log(user);
      if (user) {
        this.isLogin = true;
        this.userData = user;
      } else {
        this.isLogin = false;
        this.userData = null;
      };
    });
  },
  components: {
    ToDo: ToDo,
    Home: Home
  }
}
</script>
```
**isLogin**状態で表示されるTodo.vueを表示する際にログインデータに当たる**userData**を受け渡す実装(:user="userData")を追加しました。
更にcreatedフックにログイン状態によって**userData**を与えるかnullにするかを実装しました。
これでユーザごとに適切なデータを表示できます。

ちなみにcreatedフックはページが読み込まれるたびにデータを更新するので、常に最新のデータを反映できます。
詳しくはVueインスタンスのライフサイクルについて[公式ドキュメント](https://jp.vuejs.org/v2/guide/instance.html)を御覧ください。

## 感想
かなり初歩的な部分で躓いていました。
データの流れを順に追えば簡単な話ですね。

しかし、これでFirebaseのデータベースに好きなデータを保存する事ができるようになりました。
次からは間違いなく実装するぞ！！！
Webcamで全身フルトラッキング for SteamVR

# なんだこれ
VRchatのようなSteamVRを使用するゲームで、Viveトラッカーなしで全身フルトラッキングができるまでの手順。
Oculusがいつまで経ってもフルトラッキングに対応しないので作りました。
この方法を使えば実用性はともかく、理論上はVR機器無しでフルトラッキング状態でSteamVRゲームができます。

ただし現状これは3Dトラッキングではなく2Dトラッキングです。3Dトラッキング用のモデルは作成中ですが、実用的なスピードで動かせるのかはまだ未知数。現在使用しているAlphaPoseも1070tiで12FPSが最大ぐらいです。
機械学習つよつよの人頑張って

# Webcam フルトラッキングまでの手順
1. OpenVR上で動作する仮想トラッカーを作成する。
2. Webcamでモーション認識する。
3. モーション認識データを仮想トラッカーに反映させる

## 必要なもの
* Pytorchの動くPython3系 ([Anaconda](https://www.anaconda.com/download/)がおすすめ)
* GTX 1060以上のGPU

## 1. 仮想トラッカーの作成
[OpenVR Input Emulator](https://github.com/matzman666/OpenVR-InputEmulator) は仮想デバイスの作成をサポートします。これを利用したプロジェクトの1つに、[VRPlayspaceMover](https://github.com/naelstrof/VRPlayspaceMover)があります。このプロジェクトが仮想トラッカーの作成をサポートしていたので、こちらを利用しました。

こちらのプロジェクトを改造して、仮想トラッカーの位置をZeroMQを使ったソケット通信で上書きできるようにしたプロジェクトがこちら[(VRPlayspaceMover4DIYTracking)](https://github.com/TenteEEEE/VRPlayspaceMover4DIYTracking)です。
Windowsバイナリは[こちら](https://www.dropbox.com/s/d0v4rmww53er5l7/VRPlaySpaceMover4DIYTracking.zip?dl=0)。

### 使いかた
新たに`--externalTracking`という外部トラッキングシステムを有効にする引数を追加しているので、起動時にそれを書いてください
`PlayspaceMover.exe --fakeTrackers --bodyHeight (your height [m]) --externalTracking`

## 2. Webcamを使ったモーション認識
こちらは様々なOSSがありますが、いろいろ試したところ[AlphaPose](https://github.com/MVIG-SJTU/AlphaPose)が精度とスピードが良かったです。

こちらのプロジェクトを改造して、各モーション情報をZeroMQで外部に出力できるようにしたのが[こちら](https://github.com/TenteEEEE/AlphaPose/tree/pytorch)です。

### 使い方
`python webcam_demo.py`
トラッキング映像が見たければ
`python webcam_demo.py --vis`

## 3. 仮想トラッカーへのデータ送信
ソケット通信で改造したVRPlayspaceMoverに送ります。サンプルのPythonスクリプトは自分のVRPlayspaceMoverのsampleの中にあります。
`python sample/tracking_sample.py`
まだトラッキングデータをフィルタも補間もしない&OpenVRへの座標変換が大変なガバ実装なので、気になる人はみなさん好きに料理してください。

## システムの起動手順
1. `python sample/tracking_sample.py`
2. `python webcam_demo.py`
3. `PlayspaceMover.exe --fakeTrackers --bodyHeight (your height [m]) --externalTracking`

# トラッキングの様子 in VRchat
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">トラッキングの様子 <a href="https://t.co/nVM3yUgTTc">pic.twitter.com/nVM3yUgTTc</a></p>&mdash; TenteEEEE てんて- (@tenteeeee_vrc) <a href="https://twitter.com/tenteeeee_vrc/status/1079346617616977920?ref_src=twsrc%5Etfw">December 30, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# おわりに
**私はViveを買いました(完)**
scalaでinteractiveなshellコマンドを実行する

lispでやってるのを見てscalaだとどんな感じになるのかな？と思って調べた
この辺を参照
https://stackoverflow.com/questions/30103040/interact-i-o-with-an-external-process-in-scala
https://github.com/scala/scala/blob/99a82be91cbb85239f70508f6695c6b21fd3558c/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala

```scala
import java.io._
import scala.sys.process._


object Main extends App {
  val procIO = new ProcessIO(inputFn(_), outputFn(_), outputFn(_))
  val processBuilder = Process("/bin/bash")
  val process = processBuilder.run(procIO)

  private[this] def inputFn(stdin: OutputStream): Unit = {
    val writer = new BufferedWriter(new OutputStreamWriter(stdin))
    while (true) {
      val in = io.StdIn.readLine()
      writer.write(in + "\n")
      writer.flush()
      if (in == "exit") {
        return
      }
    }
    stdin.close()
  }
  private[this] def outputFn(stdOut: InputStream): Unit = {
    val reader = new BufferedReader(new InputStreamReader(stdOut))
    var line = reader.readLine
    while (line != null) {
      println(line)
      line = reader.readLine
    }
    stdOut.close()
  }
}
```
lispと違ってscalaだとあまり使う機会ないけどね〜

---

おまけ

```scala
val processBuilder = Process(Seq("/usr/local/bin/docker", "exec", "-i", <your docker container name>, "bash"))
```
こうすることでdocker execを実行することもできる
[Oracle Cloud] OCI IaaS 個人的重要アップデートまとめ（2017年）

2018/12/30 新規作成

***

Oracle Cloud Infrastructure(OCI)のIaaSに関連するアップデートを、独断と偏見でピックアップして並べてみました。

※利用可能なもののみに限定しています（〇〇を提供することを発表、みたいのは除外）。

公式のOCIリリース情報はこちら
https://docs.cloud.oracle.com/iaas/releasenotes/

### 2011年
| 月 | アップデート | コメント |
|:-----------|:------------|:------------|
|?|SaaS/PaaS提供開始|Oracle Cloudのスタート|

### 2012年
| 月 | アップデート | コメント |
|:-----------|:------------|:------------|
|?|IaaS提供開始|現在はOCI-Classicと呼ばれるサービスのスタート|

### 2016年

| 月 | アップデート | コメント |
|:-----------|:------------|:------------|
|10|OCI(旧Bare Metal Cloud Service)一般提供開始|"Gen2 Cloud" OCIはここからスタート|

### 2017年
IaaSとして必須のサービスや機能を揃えていった印象。そんな中シリアルコンソール接続や、ローカルNVMe SSDのついたシェイプの提供など「おっ」と思えるものも見られる。

| 月 | アップデート | コメント |
|:-----------|:------------|:------------|
|01|ロードバランサーサービス提供開始| |
|02|Auditサービス提供開始| |
|03|VCN内名前解決が可能に||
|03|VCNドメイン以外のドメインを設定可能に||
|04|FastConnect提供開始| |
|05|プライベートサブネットの作成が可能に| |
|05|Block Volumeのサイズを50GB-2TBまで指定可能に| |
|05|Ashburnリージョンがリリース|現在のデフォルトのホームリージョンです|
|05| **DensIOのシェイプが選択可能に** |ローカルNVMe SSDの永続領域がついたインスタンスです|
|06|Object StorageでPublic bucketsを指定可能に||
|06|Chef KnifeのOCI plugin提供| |
|06|ロードバランサーでsession persistenceが可能に||
|06|プライベートロードバランサーサービス提供開始||
|06|MSのADクレデンシャル情報でOCIログインが可能に||
|07|IPアドレス帯を指定してVCNを作成可能に||
|07|セカンダリVNIC、セカンダリプライベートIPを作成可能に||
|08|Amazon S3互換のAPIを利用可能に||
|08| **VMインスタンスへのシリアルコンソール接続が可能に** |インスタンスが起動しない時などに便利。ただのキャプチャでなく接続可能なので非常に便利|
|09|ルーティングテーブルにpricate IPを指定可能に||
|09|VCN内NTPサーバーの利用が可能に||
|09|Block Volumeのサイズを16TBまで指定可能に||
|09|Frankfurtリージョンがリリース||
|10|Auditログの保持期間を90-365日まで設定可能に||
|10|Baremetalインスタンスへのシリアルコンソール接続が可能に||
|10|Block Volumeのクローンが可能に||
|11| **X7基盤の提供開始** ||
|11|Local VCN Peeringが可能に|リージョン内のVCN間をインターネット経由せずに通信可能|
|11|VCNの"Delete All"機能提供|空のVCNについてセキュリティリストやサブネットなどをまとめて削除する機能|
|11|DNSサービスのアップデート。Aliasレコードの追加やTTLの編集などが可能に||
|11|パブリックサービス(Object Storageなど)へもFastConnectで通信が可能に||
|12|Tag機能提供開始||
|12|Data Transfer Service提供開始|OCIへデータの物理搬送サービス|
|12|コンソールからService limitsが確認可能に||
|12|VMインスタンスでEmulated modeが利用可能に|古いOSなどもVMで動かすことが可能に|
|12|IDCSとデフォルトでユーザー連携||
※太字は個人的に"これは"というもの

### 2018年
[[Oracle Cloud] OCI IaaS 個人的重要アップデートまとめ(2018年）](https://qiita.com/feifo/items/15a3fa8d0423fb921bbd)

以上
Django で Gmail を送信する （その２）

こちらのプログラムを改造して、宛先、タイトル、本文をページから変更できるようにしました。
[Django で Gmail を送信する](https://qiita.com/ekzemplaro/items/3265f755eb4537b18478)

送信画面
![gmail_dec3001.png](https://qiita-image-store.s3.amazonaws.com/0/179446/efad7807-8a27-5ded-4c6c-bf998efdcb88.png)

コードは GitHub にあります。
[ekzemplaro/django_gmail_send
](https://github.com/ekzemplaro/django_gmail_send)

デプロイの手順

1) ライブラリーのインストール

```bash
sudo pip install django-environ
```

2) GitHub からクローン

```bash
git clone https://github.com/ekzemplaro/django_gmail_send
```

3) proj01 (manage.py のあるフォルダー） に .env を作成

```text:proj01/.env
userId="aaabbb@gmail.com"
```

4) gmail_send/lib/credentials.json を置く

5) gmail_send/lib/test_gmail.py の
　　mail_to　を編集

6) .credentials の取得

```bash
ln -s ../../.env .
./test_gmail.py --noauth_local_webserver
```

>スクリプトの指示に従って、コードを入れて下さい。

取得できたら、次のようにして、メールが送信できることを確認

```bash
./test_gmail.py
```

7) 開発サーバーを起動

```bash
python manage.py runserver
```

8) ブラウザーで http://127.0.0.1:8000/gmail_send/ にアクセス
Tensorflow.js とスマホのカメラを使って背景除去(偽の海外旅行動画を撮ってみた)

# 背景

TensorFlow.js が楽しそうだった。
勉強がてらなんかウケ狙いの作ってみようと思った。

こんな感じの。

![sample_fake_vacation.gif](https://qiita-image-store.s3.amazonaws.com/0/111110/dc85f36d-6c1d-fb49-6499-13bbd797dd25.gif)

## デモ

[デモ](https://youheinakagawa.github.io/fake_vacation/)

## ソース

[Fake Vacation](https://github.com/youheinakagawa/fake_vacation)

## 元ネタ

[Tensorflow.js の Body Pix](https://github.com/tensorflow/tfjs-models/tree/master/body-pix)

人物を残して他の部分をぼかすというのがあり、それを元にしています。

## 仕組み

Body Pix のデモをカスタマイズしていますが、元のデモには人物だけを残すような仕組みがなかったので作ってみました。

画像データを`estimatePersonSegmentation`関数に渡すと、画像の中に人物がいる部分をピクセル単位で返すようになっているようでそのデータを元に切り抜き用のマスクデータを生成しています。

estimatePersonSegmentationから返ってくる値のざっくりとしたイメージ:
1の部分が人物らしきものが写っている部分。

```json:estimatePersonSegmentation.data
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
 0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,
 0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}
```

このあたりのマスク処理は以下のページを参考にさせていただきました。
ありがとうございました。

[canvasでいろんなマスクをかける
](https://qiita.com/keiskimu/items/140e6b8c7b81bf01d390)

`estimatePersonSegmentation`から帰ってきた 0, 1 の値をマスク化したのが下記の関数になります。
`ctx`には video タグから取得した画像データが予め入っている状態です。

```javascript:
    const drawMask = function (bodySegmentation) {
        const image_data = ctx.getImageData(0, 0, bodySegmentation.width, bodySegmentation.height);

        for (let i = 0; i < bodySegmentation.data.length; ++i) {
            if (bodySegmentation.data[i] === 1) {
                image_data.data[i * 4 + 3] = 255;
            } else {
                image_data.data[i * 4 + 3] = 0;
            }
        }

        ctx.putImageData(image_data, 0, 0);
    };
```

もとのデモから変更した部分は他にもフルスクリーンに対応したりなどありますがざっくりとこんなところです。

画像を変更する場合は CSS の body に指定されている画像を変更することで可能になります。

それではみなさま、良い年末年始を！
Dlib README.md の和訳

Dlibのユーザーの皆さんの利便性を向上するため、以下のドキュメントの和訳を作成した。

https://github.com/davisking/dlib/blob/master/README.md


---

# dlib C++ library [![Travis Status](https://travis-ci.org/davisking/dlib.svg?branch=master)](https://travis-ci.org/davisking/dlib)


Dlibは、実社会の問題を解決するためにC ++で複雑なソフトウェアを作成するのに利用する機械学習アルゴリズムとツールを含む最新のC ++ツールキットです。 メインのプロジェクトドキュメントとAPIリファレンスについては[http://dlib.net]（http://dlib.net）を参照してください。


## Compiling dlib C++ example programs

examplesフォルダに移動して、次のように入力します。

```bash
mkdir build; cd build; cmake .. ; cmake --build .
```

これですべての例題がビルドできます。AVX命令をサポートするCPUを持っているならば、次のように有効化してください。


```bash
mkdir build; cd build; cmake .. -DUSE_AVX_INSTRUCTIONS=1; cmake --build .
```

そうすることでいくつかのことが速くなります。

最後に、Visual Studioユーザーは通常すべてを64ビットモードで実行する必要があります。 デフォルトでは、Visual Studioはその出力とそれ自身の実行の両方で32ビットです。したがって、64ビットを使用するように明示的に指示する必要があります。 もう1990年代ではないので、おそらく64ビットを使いたいでしょう。 次のようにcmakeの呼び出しすことで64ビットの設定になります。

```bash
cmake .. -G "Visual Studio 14 2015 Win64" -T host=x64
```

## Compiling your own C++ programs that use dlib

examplesフォルダには[CMakeチュートリアル]（https://github.com/davisking/dlib/blob/master/examples/CMakeLists.txt）があり、何をすればよいのかがわかります。 [dlib Webサイト]（http://dlib.net/compile.html）にも追加の説明があります。

## Compiling dlib Python API

Pythonのサンプルプログラムを実行する前に、dlibをコンパイルする必要があります。 次のように打ち込みます。


```bash
python setup.py install
```


## Running the unit test suite

次のように入力して、dlib単体テストスイートをコンパイルして実行します。

```bash
cd dlib/test
mkdir build
cd build
cmake ..
cmake --build . --config Release
./dtest --runall
```

Windowsでは、コンパイラがテスト実行ファイルを `Release`というサブフォルダに入れるかもしれないことに注意してください。 その場合は、テストを実行する前にそのフォルダに移動する必要があります。

このライブラリはBoost Software Licenseの下でライセンスされています。これは[dlib / LICENSE.txt]（https://github.com/davisking/dlib/blob/master/dlib/LICENSE.txt）にあります。 ライセンスの長短は、クローズドソースの商用ソフトウェアであっても、あなたが好きなようにdlibを使用できるということです。

## dlib sponsors

この研究は、契約番号2014-14071600010の下で国家情報長官室（ODNI）、インテリジェンス高等研究プロジェクト活動（IARPA）によって支援された研究に一部基づいています。 ここに含まれている見解および結論は著者のものであり、ODNI、IARPA、または米国政府の公式の方針または表明または黙示の支持を必ずしも表すものとして解釈されるべきではありません。
VSCode で YAMLのキー重複を調べる

# VSCodeのプラグインでYAMLのキー重複を調べる
VSCodeのYAMLプラグインのフォーマット機能を使うと、キーが重複しているとエラーで知らせてくれる。


## VSCodeのプラグイン

名前: **YAML**
Id: redhat.vscode-yaml
説明: YAML Language Support by Red Hat, with built-in Kubernetes and Kedge syntax support
バージョン: 0.2.0
発行者: Red Hat
VS Marketplace のリンク: https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261981/92139d37-67ac-920b-baf8-62eeb8180695.png)

## 設定

インストールすると、SettingsにYAMLが追加されている。

Settingsを開いて、"yaml"で検索したところ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/261981/4d3814df-941b-7da7-47a9-f4316177b687.png)

そんで、この `Format` を **Enable** にする。

```
Yaml › Format: Enable
Enable/disable default YAML formatter (requires restart)
```

VSCodeを再起動すると設定が反映される。


## 重複の調べ方

1. YAMLファイルをVSCodeで開く
2. エディタにフォーカスがある状態で、option + Shift + F (mac)
3. コンソールに重複エラーが出力される。

**sample text**
grapesが重複している。

```yaml
en-US:
  # Note that our comments are important:
  # Don't let your yaml sorter delete them!
  bananas: |
    Bananas are "nice":
      - They are <b> sweet </b>.
      this: not a key  
    That is why everyone like bananas!
  grapes: We eat them.
  apples: >
    Apples are fine,
    just don't eat your 
    iPods!
  grapes: We dont' eat them.
```

**実行結果**

`message: Map keys must be unique; "grapes" is repeated (4:3)`

```ruby
[Error - 20:06:14] Request textDocument/formatting failed.
  Message: Request textDocument/formatting failed with message: Map keys must be unique; "grapes" is repeated (4:3)
   2 |   # Note that our comments are important:
   3 |   # Don't let your yaml sorter delete them!
>  4 |   bananas: |
     |   ^^^^^^^^^
>  5 |     Bananas are "nice":
     | ^^^^^^^^^^^^^^^^^^^^^^^
>  6 |       - They are <b> sweet </b>.
     | ^^^^^^^^^^^^^^^^^^^^^^^
>  7 |       this: not a key  
     | ^^^^^^^^^^^^^^^^^^^^^^^
>  8 |     That is why everyone like bananas!
     | ^^^^^^^^^^^^^^^^^^^^^^^
>  9 |   grapes: We eat them.
     | ^^^^^^^^^^^^^^^^^^^^^^^
> 10 |   apples: >
     | ^^^^^^^^^^^^^^^^^^^^^^^
> 11 |     Apples are fine,
     | ^^^^^^^^^^^^^^^^^^^^^^^
> 12 |     just don't eat your 
     | ^^^^^^^^^^^^^^^^^^^^^^^
> 13 |     iPods!
     | ^^^^^^^^^^^^^^^^^^^^^^^
> 14 |   grapes: We dont' eat them.
     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Code: -32603 

```
積ん読回避の勉強法

「この本面白そうだし読んでみたいけど、300ページもあって時間がないなぁ...」

そう思っている間に、**積ん読の仲間入り**させてしまった経験はございませんか？

僕は何度もあるのですが、[エンジニアの知的生産術](https://www.amazon.co.jp/エンジニアの知的生産術-──効率的に学び、整理し、アウトプットする-WEB-PRESS-plusシリーズ/dp/4774198765)にて紹介されていた勉強法が、積ん読解消に有効そうだったので**かいつまんで紹介**させていただきます。

# 順番に読まなくていいってよ
この本で紹介されている勉強法のアプローチは、**「知りたいところから勉強しよう」**です。
そのためにいくつか参考になる勉強法が紹介されています。

## 遅延評価的勉強法
本を読む時に1章から読み進めるのではなく、
**目的を分割して、目的に必要なところから飛び飛びに読んでいく。**
いう勉強法です。

シーケンシャルな読み方ではなくても、必要なところをバラバラに読み進めて行ったら、最後にジグソーパズルみたいに完成するから！というイメージです。

## YAGNI[^YAGNI]
これはプログラミングの原則の１つで、直訳すると「You Aren't Gonna Need It」(それ多分必要にならない)となります。

**今自分がやりたいことに必要な知識を学ぶ。**

という勉強法です。

ついつい「他人が必要だと言っていたり、将来必要になりそうな勉強」をしそうになりますが、自分に必要なことを勉強しましょう。とのことです。

知りたい時に、必要なことだけ勉強しましょう。

## matzの勉強法
プログラミング言語作者のまつもとゆきひろさんはソースコードの読み方[^matz]についてこう述べています。

1. **全体を読もうとしない。**面白そうなところをつまみ食いして先人の知恵を学べれば十分
2. **目的を持って読む。**何かを学ぼうと思ってソースを読むと効率的に理解できる。

**必要な箇所を目的を持って読む**

という勉強法です。

そもそもプログラムのソースコードは小説のように全体を読まないといけないものではないので、「全部を読んでやろう！」と思う必要はありません。

# まとめ
今までは「本やソースコードは順番に通しで読まないといけない。」という思い込みがあったのですが、どうやらそうではないようです。

まずは**「知りたいところから勉強しよう。」**というアプローチなら、とりあえず手は進められそうなのではないでしょうか？

ここで書いたことはほんの一部なので、全容を知りたければ是非[エンジニアの知的生産術](https://www.amazon.co.jp/エンジニアの知的生産術-──効率的に学び、整理し、アウトプットする-WEB-PRESS-plusシリーズ/dp/4774198765)をお手にお取りください！オススメです！(回し者ではありません。

[^YAGNI]: 原則の詳細はhttps://ja.wikipedia.org/wiki/YAGNI を参考に
[^matz]: 全部が読みたい方はこちら http://www.itmedia.co.jp/enterprise/articles/0712/26/news015.html
FaceAPIでリアルタイム感情認識を実装する

#感情センシング
MicrosoftのFaceAPIを活用してリアルタイムに感情センシングさせてみる

* カメラから画像を取り込み・保存(OpenCV)
* 画像をバイナリファイル化
* バイナリファイルをFaceAPIに送信
* 結果を取得
* 画像に反映し描画

#設定
headarのContent-Typeをapplication/octet-streamして
dataにバイナリファイルを送付する

```
'Content-Type': 'application/octet-stream',
```

#コード
```python
#%%
import cv2
import requests

#ローカル画像を分析してFaceAPIで解析する
#https://docs.microsoft.com/ja-jp/azure/cognitive-services/computer-vision/quickstarts/python-disk
#バイナリファイルを送ればよいみたい

headers = {
    # Request headers
    'Content-Type': 'application/octet-stream',
    'Ocp-Apim-Subscription-Key': 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', #write your key
}

write_file_name = './tmp.jpg'
api_url = 'https://japanwest.api.cognitive.microsoft.com/face/v1.0/detect'

# VideoCaptureのインスタンスを作成する。
# 引数でカメラを選べれる。
cap = cv2.VideoCapture(0)

params = {
    # Request parameters
    'returnFaceId': 'false',
    'returnFaceLandmarks': 'false',
    'returnFaceAttributes': 'emotion',
}


try:
    while True:
        ret, frame = cap.read()
        cv2.imwrite(write_file_name, frame)
        with open(write_file_name, 'rb') as f:
            img = f.read()
        response = requests.post(api_url,params=params,headers=headers,data=img)
        
        cv2.imshow('Raw Frame', frame)

        data = response.json()

        for id in range(len(data)):
            rect = data[id]['faceRectangle']
            emotion = data[id]['faceAttributes']['emotion']
            
            top = int(rect['top'])
            left = int(rect['left'])
            btm = top + int(rect['height'])
            right = left + int(rect['width'])
            #draw.rectangle((left, top, right, btm), outline=(255, 255, 255))
            cv2.rectangle(frame, (left,top),(right,btm),(255,255,255),3)
            #cv2.putText(frame,emotion,(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)
            emotion_result = ''
            dy = top + 0
            for e in emotion:
                emotion_result = e + ':' + str(emotion[e])
                dy = dy + 15
                cv2.putText(frame,emotion_result,(right + 10,dy), 0, 0.5,(255,255,255),1,cv2.LINE_AA)

        cv2.imshow('Raw Frame', frame)
        print("")

        k = cv2.waitKey(1)
        if k == 27:
            print()
            break
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))
```
Ruby gemを使ってYAMLをソートする

# YAMLをソートするには
以下のgemを使う。
[redealumni/i18n_yaml_sorter](https://github.com/redealumni/i18n_yaml_sorter)

- アルファベット順でソート
- キーが重複していても動く
    - [キー重複の調べ方](https://qiita.com/arikawa-i3/items/63f71613ac805da6fcf9)


## 使い方

ここではテキトーな作業フォルダを作ってそこでソートしてみる。

### Install
bundlerを使う方法（単にgem installでも可）

```shell

$ bundle init
---
Gemfileに以下を追加
  gem "i18n_yaml_sorter"
---
$ bundle install --path vendor/bundle
```

### 実行

bundle install出来たら、`sort_yaml`というコマンドが使えるようになっているので、
以下のコマンドでYAMLファイルをソートする。

```shell

$ bundle exec sort_yaml < #{入力YAMLファイル} > #{出力先ファイル} 
example:
$ bundle exec sort_yaml < ja.yml > ja_out.yml
```


### 実行結果

**before**

```yaml
en-US:
  # Note that our comments are important:
  # Don't let your yaml sorter delete them!
  bananas: |
    Bananas are "nice":
      - They are <b> sweet </b>.
      this: not a key  
    That is why everyone like bananas!
  grapes: We eat them.
  apples: >
    Apples are fine,
    just don't eat your 
    iPods!
  grapes: We dont' eat them.
```

**after**

```yaml
en-US:
  # Note that our comments are important:
  # Don't let your yaml sorter delete them!
  apples: >
    Apples are fine,
    just don't eat your
    iPods!
  bananas: |
    Bananas are "nice":
      - They are <b> sweet </b>.
      this: not a key
    That is why everyone like bananas!
  grapes: We dont' eat them.
  grapes: We eat them.
```

- コメントはそのままの場所に残るっぽい。
- キーが重複していると、値でソートするっぽい。


## 環境情報

意図せずこのバージョンだった。これじゃないと動かないとかではない。

```shell

$ rbenv -v
rbenv 1.1.1

$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin18]

$ bundle -v
Bundler version 1.17.1
```
Kotlin: なぜ while, for では break が使えて forEacn, repeat では使えないのか

Kotlin の `while`, `for` では `break`, `continue` が使えますが、`forEach`, `repeat` では使えません。
`forEach`, `repeat` は いずれも `for` で書き換えられるので、書き換えてしまえば `break`, `continue` が使えます。

* `something.forEach` => `for (it in something)`
* `repeat (time)` => `for (it in 0..time - 1)`

なぜこうなっているのか気になりますね。
（コルーチンの内部だと書き換えられない場合もあります。）

## なぜなのか

(現実をいってしまえば Kotlin がそう作られているからなのですが、)
`while`, `for` と `forEach`, `repeat` には大きな違いがあります。

* `while`, `for` は Kotlin の**構文**
* `forEach`, `repeat` は Kotlin の**関数**

似た記法になっているのでわかりにくくなっていますが、 `while`, `for` は構文として、 `break`, `continue` が使えるように設計されています。
一方で、 `forEach`, `repeat` は Kotlin の標準ライブラリで定められた高階関数です。

```Kotlin:例
repeat (3) {
    // this is function
}
```

つまり　`{ ... }` は関数です。
**関数の中で急に `break` や `continue` が出てくるのは変です**。 `break`, `continue` は使えません。

## イテレーションをコントロールする他の方法はないのか

`forEach`, `repeat` などの高階関数で、 ブロック部分を抜けるには、 `return` を使います。
関数ですから `return` で終了するのは自然に思えますね。

しかし、 `return` をそのまま使うと、 呼び出し元の関数を終了してしまいます。

```kotlin
fun something() {
    listOf(1, 2, 3).forEach {
        println(it)
        return // something を終了する
    }
    println("finish")
}
```

そこで、ラベルを使います。

### continue のような処理

#### ラムダを使う

`return@ラムダのラベル` でラムダの `continue` を行うことができます。

```kotlin
fun something() {
    listOf(1, 2, 3).forEach {
        println(it)
        return@forEach  // ブロック内の処理はここまで
        println(it)
    }
    println("finished")
}
```

このラベルは自分でつけることもできて `ラベル名@{ ... }` のように記述します。

##### もし forEach が二重だったら

二重で `forEach` がある場合は、ラベルを自分でつけます。
次のコードは外側のループに対して `continue` を行なっています。

```kotlin:Kotlin-lambda
fun something() {
    listOf(1, 2, 3).forEach outer@{ a ->
        listOf(4, 5, 6).forEach { b ->
            print(a)
            return@outer
            println(b)
        }
    }
    println("finished")
}
```

#### 無名関数を使う

ラムダを無名関数に変えれば、 単純に `return` で同じことができます。

```kotlin:Kotlin-anonymousfunction
fun something() {
    listOf(1, 2, 3).forEach(fun(value: Int) {
        println(value)
        return          // ブロック内の処理はここまで
        println(it)
    })
}
```

jQuery でも似たようなコードを見たことがあります。

```javascript:JavaScript
$("xxx").each(function  () {
  /* Code */
  if (x) return;
  /* Code */
});
```

### break のような処理

#### ラムダを使う

外側をスコープ関数の run で囲んで、 そのラムダを抜けるように `return@run` と記述します。

```kotlin:Kotlin-lambda
fun something() {
    run {
        listOf(1, 2, 3).forEach {
            println(it)
            return@run  // ループはここでおわり
            println(it)
        }
    }
    println("finished")
}
```

見てわかるように、 高階関数は break を前提に作られていません。

#### 無名関数を使う

ラムダと同じように `run` などのスコープ関数を使って `return@run` とします。

```kotlin:Kotlin-anonymousfunction
fun something() {
    run {
        listOf(1, 2, 3).forEach(fun() {
            println(it)
            return@run  // ループはここでおわり
            println(it)
        })
    }
    println("finished")
}
```

## まとめ

上に記述したのをまとめると次のようになります。

| | break | continue |
|:--|:--|:--|
| ラムダ | label | label |
| 無名関数 | flag and `return`, label | `return` |
Miller–Rabin(ミラーラビン)素数判定法について理解したい

RSA暗号で必須である素数を高速に生成させるため、素数生成アルゴリズムについて調査した。

#Miller–Rabin素数判定法とは
与えられた整数を素数かどうか判定するアルゴリズムの1種。
確率的アルゴリズムであり、検定に通った数が素数であると高い確率で信じられるアルゴリズムである。

##Miller–Rabin素数判定法の定理
奇素数 $p = 2^st+1$ $\(t$ は奇数$\)$と、 $p$ と互いに素な自然数 $a\big(a\in\mathbb{Z}_p\big)$ について以下(1)(2)のいずれかが成り立つ。  
(1) $a^t = 1 \bmod p$
(2) $a^{2^{0}t}, a^{2^{1}t}, a^{2^{2}t},..., a^{2^{s-1}t}$ の中に $p$ を法として $-1$ と合同になる数が存在  


##フェルマーの小定理
Miller–Rabin素数判定法を理解するうえで必要な事前知識としてフェルマーの小定理を紹介する。
>任意の素数 $p$ と $p$ と互いに素な自然数 $a$ について、
>　　$a^{p-1}\equiv 1\bmod p$
>が成り立つ。

##Miller–Rabin素数判定法の証明
$p-1=2^st$ よりフェルマーの小定理から $a^{2^st}\equiv 1\bmod p$ が成り立つ。
$a^t, a^{2t}, a^{2^2t},...,a^{2^{s-1}t}$
の中で $p$ を法として $1$ と合同でない ( $p$ で割って余りが $1$ と等しくない) ものが存在する場合、
その中で最大の数を $x$ とすると $x^2=1\bmod p$ が成り立つ。
つまり、$x^2-1=(x-1)(x+1)\equiv 0\bmod p$ が成り立ち、
$x\neq 1\bmod p$ より $x$ は $x=-1\bmod p$ を満たす。
この時 $x$ は(2)の条件を満たす。
このような $x$ が存在しない場合(1)の条件を満たす。




#Miller–Rabin素数判定法のアルゴリズム
入力：素数を判定する整数 $num$
出力：$num$ が素数の可能性があるとき$True$、素数でないとき$False$  
1. $num>2$ かつ $num$ が偶数であれば「$False$」を出力し終了
2. $num-1=2^st$ となる整数 $s\geq0$ と奇数 $t\geq3$ を見つける
3. $a\in\\{1,2,3,...,num-1\\}$ をランダムに選ぶ
4. $a^t\equiv 1\bmod num$ の場合「$True$」を出力し終了
5. $i=0$ とし、$i$ を $1$ ずつ増やしながら $i<s$ の間以下を繰り返す
　　1. $a^{2^it}\equiv-1\bmod num$ の場合「$True$」を出力し終了
6. 「$False$」を出力し終了  

上記のアルゴリズムをpythonで記述した例を以下に示す。(簡単のため引数は2以上の整数とする)

```python:
def Miller_Rabin_test(num):
    if num == 2:
        return True
    if num > 2 and num & 1 == 0:
        return False

    s, t = 0, num-1
    while t & 1 == 0:
        s, t = s+1, t >> 1
    a = random.randint(1, num-1)
    if pow(a, t, num) == 1:
        return True
    for i in range(0, s):
        if pow(a, pow(2, i) * t, num) == num-1:
            return True
    return False
```
#Miller–Rabin素数判定法の信頼性
Miller–Rabin素数判定法において合成数が素数の可能性があると判定されてしまう $a$ の数は多くても $\frac{n-1}{4}$ 個であることが知られている。(証明はまた今度にします)
つまりランダムに $k$ $(0<k<num)$ 個の $a$ を決めてテストを行う場合、全ての $a$ で合成数が素数の可能性があると判定されてしまう確率は $\bigg(\frac{\frac{n-1}{4}}{n-1}\bigg)^k=\frac{1}{4^k}$
$a$ の取る数が少なくても十分に信頼できることがわかる。

#参考文献
萩田真理子 (2010) 『暗号のための代数入門』 サイエンス社
どんな音源でも4分33秒にする

# 4分33秒とは
無音の音楽です。
[Wikipedia](https://ja.wikipedia.org/wiki/4%E5%88%8633%E7%A7%92)によると、
>音楽は音を鳴らすものという常識を覆す「無音」の音楽である。  
楽章を通して休止することを表すtacet[1]が全楽章で指示されており、演奏者は舞台に出場してから楽章の区切りを示すこと以外は楽器とともに何もせずに過ごし、一定の時間が経過したら退場する。

ということです。
作曲者が「無音」を聴こうと思いハーバード大学の無音室を訪れた際、自身の血流や神経系によるノイズが聞こえてきたことから音楽の将来を不安に思う必要はない(どんな静寂の中でも音はある)と気づいたことから作曲したらしいです。

周囲のノイズ、心臓の音、木々のざわめきなどから生まれる偶然性の音楽を楽しむものだそうです。ロマンチックですね。

秒数が4分33秒である必要はなく、用いる楽器もすべて演奏者に委ねられているらしいこの音楽。これを適当な音源から作り出してみます。


# やること
音源を逆位相に変換したものを、元の音源と重ね合わせます。

# 使うもの
pydub

# コード
```python
from pydub import AudioSegment
from pydub.playback import play

filename = 'hoge.mp3'

# オーディオファイルを開く
audio = AudioSegment.from_file(filename, format='mp3')
invert = audio.invert_phase()  # 逆位相に変換

merged = audio.overlay(invert)  # 合成

play(merged)  # 再生
```

無音が流れます。

保存したい場合は

```python
merged.export('fuga.mp3')
```
とすればOK

周りの静けさ、人々の雑踏の音などを楽しみましょう。
pythonでIMEを制御

# pythonでIMEを制御する

pywinautoを使って操作を自動化しようとすると、IMEについても制御が必要になることがある。とはいっても、整理してみたら

- ブラウザを立ち上げてから URL を指定するとき（URLを入力するときはIMEをOFFにしたい）

くらいだった[^1]が。そんなとき、Python側で頑張るのもひとつの方法だが、IMEのキーバインドで無条件で IME OFF になるような設定を用意しておいて、SendKeysでそのキーを送るのも手だと思った。実際のところ SHIFT_F12 とか、SHIFT_PGUPなどをそうしたキーに設定してみたが、当然のようにどの場合でもうまく制御できた。Google日本語入力なら、キーバインドを設定できるので、どの状態でもIME OFF になるようにすればいいのではないかと思う。こんな感じ



```:keymap.txt
...
DirectInput	Shift PageDown	IMEOff
Precomposition	Shift PageDown	IMEOff
Composition	Shift PageDown	IMEOff
Conversion	Shift PageDown	IMEOff
Suggestion	Shift PageDown	IMEOff
Prediction	Shift PageDown	IMEOff
...
```

そして python の側ではこんなふうにして。

```python:aho.py
...
pywinauto.keyboard.SendKeys('+{PGDN}') # IME OFF
...
```

くだらないことだけれど、一安心。



[^1]: 逆に IME ON に制御したい場合にはいまのところ出くわしていない。もしそういう場合にも考え方は同じでできるみたい。なお、IME ONの制御が必要かな、と思ったのは、ページ内の特定の場所に SendKeys を行いたいといった意図で、その場所を特定するために、検索（{^G}とか）で検索窓を立ち上げて、その窓内に対象文字列を入力するとき。たとえば、対象が全角で『パスワード』と書かれていたりする場合はよくある。だけど、そのときは、検索窓への入力としていきなり全角日本語文字をSendkeysできるみたい。わざわざIMEをONにしなくてもよい。やってみるとそりゃそうだ、という感じなのだけれど便利だなぁ。
エンジニアの新人教育はスパルタ？甘やかし？必要なのは適切なレベル設定の「ストレッチ・背伸び経験」 

# Inspired by

[新人プログラマをレビューで殺さない方法 - Qiita](https://qiita.com/hiraike32/items/32840b11536fa1b78621)

# ref

>フィードバック入門 耳の痛いことを伝えて部下と職場を立て直す技術 (PHPビジネス新書)


![image](https://user-images.githubusercontent.com/13635059/50546244-d10d8600-0c67-11e9-80ae-7ef67fbfff00.png)

# Image


![image](https://user-images.githubusercontent.com/13635059/50546239-b1765d80-0c67-11e9-9ccd-d8b5e1207b45.png)

😎😎😎


# what

適切なレベル設定をする
スパルタ or 甘やかしの2ギア設定とか雑すぎる
もっと無限に細かい100段階ぐらいのレベル調整が必要、たぶん、もっと繊細になりたい

# 学習の基本

人間が物事を習得するときの根本的な成長パターンでもある
コンフォートゾーンをほんのすこしだけ出て、興奮ゾーンに行く必要がある
興奮、楽しさを感じないようならそれは不安ゾーンに突入している証拠
そんなスパルタはうまく働くはずがない、たづなをゆるめよう
心理的に感じている簡単さ、退屈さ、難しさ

# コンフォートゾーンと不安ゾーン

ただし「コンフォートゾーンからの飛び出し」「過剰な行き過ぎ」は思ったより起きやすいと思うので注意したい inmyppinion

 # ref

![image](https://user-images.githubusercontent.com/13635059/50546268-2ea1d280-0c68-11e9-88e9-e8519f7efdef.png)

https://github.com/YumaInaura/YumaInaura/issues/62








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
fishでanyenvを(**env入れるたびに手作業でスクリプト書き換えせずに)使う

# はじめに

最近シェルをfishに変えました。
普段はnode.jsのバージョン管理にnvmを使っていたのですが、この機に乗じてanyenv+nodenvを使うようにしました。
(最初はanyenv+ndenvにしてましたが、[ndenvがdeprecated](https://github.com/riywo/ndenv)になっていたのでnodenvにしています。)

fishにanyenvをセットアップする方法を調べると、たとえば↓の記事がヒットします。
https://qiita.com/sea_ship/items/996ebb228e4eafa48c11

すると、下のように書いてあります。

> ~/.config/fish/config.fishを編集してndenvのパスを通します。
> anyenv init -の実行結果からndenvのROOTPATHとPATHを通すためのコマンドをコピーします。

`anyenv init -`とすれば良いだけのはずが、anyenvのバグ(?)のため手作業でパスを通す必要があるとのこと。
これでは`**env`を新たにインストール/アンインストールするたびにパスを更新する必要があり、非常に面倒です。

そこで、手作業に頼らずに`anyenv init`する方法を探しました。

**2019/01/08 追記**

コメントにて、anyenvがfish対応されていることをご指摘いただきました。
anyenvにpathを通した状態で、

```shell
$ anyenv init
```

した結果をconfig.fishに追記するだけで良いようです。

ただし、私が確認した限りでは、`ndenv`をインストールしている場合にはこの方法だとエラーになりました。
[`ndenv`と`nenv`をdeprecatedにする動き](https://github.com/riywo/anyenv/issues/38)もありますので、これらを使っている場合は`nodenv`に乗り換えるのが良いかと思われます。

ちなみに、上記確認したときの環境は以下の通りです。

* fish v3.0.0
* anyenv (commit [25ed0d8a4fdfa6cdd6832f3c6feb9ee713c8e887](https://github.com/riywo/anyenv/commit/25ed0d8a4fdfa6cdd6832f3c6feb9ee713c8e887)の時点)

**追記終わり**

# 手順

## 現状の問題

anyenvのREADMEを見ると、以下のようなInstall手順が書いてあります。

```shell
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l
```

このとき、`anyenv init -`を実行すると、実行中のシェル用のイニシャライズスクリプトが吐き出されるはずなのですが、fishの場合はbashの文法が混ざってしまうというバグがあります。

## 解決方法

そこで、fishのプラグイン[edc/bass](https://github.com/edc/bass)を使うことを考えました。
このプラグインは、bashのスクリプトをfishで実行できるようにしてくれるものです。

私はfisherman(v3)を使ってfishのプラグインを管理しているので、以下のコマンドでインストールしました。

```shell
fisher add edc/bass
```

その後、config.fishに以下を追記します。

```shell
set -x PATH $PATH $HOME/.anyenv/bin
bass 'eval "$(anyenv init - bash)"'
```

`anyenv init`の第二引数にはシェルの種類を渡すことができます。
`anyenv init - bash`とすることで、bash用のイニシャライズスクリプトを吐き出させることができます。
bash用のスクリプトを`bass`に渡すことで、bashスクリプトをfishで実行することが可能になります。

# まとめ

おそらくanyenvのバグだと思うので、こういったハックをせずとも動くようになるといいですね。
test.co.jp とは何？ example.com とは違うの？ @yumainaura  hoge fuga foo bar  も調べてみた。 #ドメイン 

# 何をテストしているんだろう？と思ったら

![image](https://user-images.githubusercontent.com/13635059/50546065-dc12e700-0c64-11e9-8c98-58aec2cbee41.png)

そっちのテストか‥か‥！意外だった。

試験弁っ今日。

# example.com って何？

例示用のドメイン。

「例にはexample.com を使いましょう」って言われるのを、今までどれだけ見たことか。

そりゃ「知らなきゃ無理ゲー」系だから仕方ないやつ。

# これだけ間違いが多いなら

test. 系は全部、なんとかしてしまっても良いんじゃないだろうか。

hogehoge 系しかり、foobar 系しかり。

# hoge.com

https://hoge.com/

キッチンやデザインの会社らしい。

![image](https://user-images.githubusercontent.com/13635059/50546077-27c59080-0c65-11e9-9147-7e40c61d1033.png)


# fuga.com

技術の会社らしい。これはさすがに狙って取った？
![image](https://user-images.githubusercontent.com/13635059/50546083-3ad86080-0c65-11e9-8a95-494f8fb2093c.png)

# foo.com

![image](https://user-images.githubusercontent.com/13635059/50546086-462b8c00-0c65-11e9-8941-ec1af402d453.png)

# bar.com

謎のおじさんがいた。

![image](https://user-images.githubusercontent.com/13635059/50546090-57749880-0c65-11e9-941d-ff7bc6ba3cdb.png)

>Foo’s home page

って書いてあるから、どうやら狙ったネタページっぽい？

# test.com

![image](https://user-images.githubusercontent.com/13635059/50546105-7ecb6580-0c65-11e9-8c3a-fdb98456f406.png)

>Online tests and testing for certification, practice tests, test making tools, medical testing and more.

認証をテストするサービス？しかし単にサイトがエラーを返しているだけのような気も？

# ref

https://qiita.com/hiraike32/items/32840b11536fa1b78621#comment-f4fb4d1e2da79d38197b
https://github.com/YumaInaura/YumaInaura/issues/61








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GitHubだけでLatexをコンパイルしてPDFをリリースにアップロードする

## モチベーション
GitHubへのpushをトリガーとしてコンパイルやlintを行なって継続的にコードをデリバリーするCIが開発プロセスの重要な要素となってきました．普段からCircle CIやTravis CIをいじっている人が論文を書こうと思った時，新しいコミットに対して最新のPDFを自動で作ってくれたら嬉しいなと思うのは自然なことです．

本記事ではCircle CIなどの外部CI環境を使わずに，先日リリースされた[GitHub Actions](https://blog.github.com/jp/2018-10-24-action-demos/)を用いて，PDFのビルドからGitHub Releasesへのアップロードまでを全てGitHub上で行う方法について述べます．
## 前準備
本記事ではGitHub Actionsを用いてPDFのコンパイルを行います．
まだアクセスできない方は，[こちら](https://github.com/features/actions)からサインアップしてアクセスできるようになるまで待ちましょう．

## 本題
GitHub Actionsではコマンドを全てDockerコンテナ上で実行します．
コマンドはDockerfileを用意することで任意のコマンドを自作することができます．
ここでは以下のディレクトリにファイルが配置されていると仮定します．

```
.
|-- .github
    |-- actions
       |-- latex
          |-- Dockerfile
          |-- entrypoint.sh
     |-- main.workflow
|- main.tex 
```

最初にLatexをコンパイルするためのDockerfileを書きます．

```Dockerfile
FROM ubuntu:16.04

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    curl \
    python3 \
    latexmk \
    lmodern \
    texlive \
    texlive-latex-extra \
    texlive-lang-japanese \
  && rm -rf /var/lib/apt/lists/*

RUN mktexlsr && mkdir -p /app
WORKDIR /app

ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
```

GitHub Actions上で上のDockerfileをビルドしてもらうことでLatexのコンパイルとGitHub Releasesへのアップロードに必要なコマンドをインストールしたコンテナができます．

次にentrypointは以下のように実装しました．

```entrypoint.sh
#!/bin/bash
set -eux

# build pdf (change if necessary)
pdflatex main.tex

# create release
res=`curl -H "Authorization: token $GITHUB_TOKEN" -X POST https://api.github.com/repos/[user]/[repo]/releases \
-d "
{
  \"tag_name\": \"v$GITHUB_SHA\",
  \"target_commitish\": \"$GITHUB_SHA\",
  \"name\": \"v$GITHUB_SHA\",
  \"draft\": false,
  \"prerelease\": false
}"`

# extract release id
rel_id=`echo ${res} | python3 -c 'import json,sys;print(json.load(sys.stdin)["id"])'`

# upload built pdf
curl -H "Authorization: token $GITHUB_TOKEN" -X POST https://uploads.github.com/repos/[user]/[repo]/releases/${rel_id}/assets?name=main.pdf\
  --header 'Content-Type: application/pdf'\
  --upload-file main.pdf
```

`[user]`と`[repo]`の部分は自分のもので置き換えてください．GitHub Actions実行中ではいくつかの環境変数が自動で設定されます．`GITHUB_TOKEN`はその１つで，GitHub Actionsが実行するたびに，その実行回のみ使用できるOAuthトークンが設定されます．

GitHub ReleasesのAPIについては[こちら](https://developer.github.com/v3/repos/releases/)をご覧ください．

最後にworkflowを定義します．

```main.workflow
workflow "Build PDF" {
  on = "push"
  resolves = ["Build"]
}

action "Build" {
  uses = "./.github/actions/latex"
  secrets = ["GITHUB_TOKEN"]
}
```
下の方にある`secrets = ["GITHUB_TOKEN"]`がないと環境変数にトークンが設定されないので必須です．

完成した`main.workflow`はGitHubのビューアーから見ると以下のような感じになります．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/72360/b9100f53-c33d-ca51-bc65-4afdfd46f4c3.png)

## 実行結果
以上のGitHub Actionsがセットされた状態でコミットがpushされると以下のようにGithub Releasesが作成され，PDFが添付されます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/72360/e89a8aae-fb74-1580-3879-00debf4e0505.png)

リリースの作成者がgithub-actionsなのが面白いですね．

## 参考文献
- https://maketips.net/tip/363/publish-and-upload-release-to-github-with-bash-and-curl
- https://dev.classmethod.jp/etc/github-actions-golang/
fatal: remote origin already exists. と表示された場合の解決法

こんにちは[@yukifreeworld12](https://twitter.com/yukifreeworld12)です。
Githubでエラーが出てハマったのでメモとして、
そして後世の同じエラーにハマった人の為にも...


## 問題
`fatal: remote origin already exists.`
と表示されてリポジトリにpushできない問題

## 対処法
originが存在していると書かれているのでそれを削除する

`$ git remote rm origin` originの削除
`$ git remote add origin git@bitbucket.org:ユーザー名/アプリ名.git`
`$ git push -u origin master`

## 最後に
見ていただきありがとうございました!!
記事がいいなと思ったらフォローといいねしてもらえるとうれしいです!!




「プログラミングで稼げていない」
「プログラミング知識を使って情報発信で稼ぎたい」

という方は↓もチェックすることをおすすめします。

https://yous12.com/
UserDefaultsで画像をローカルに保存する

#はじめに
投稿用の画像を下書きとしてUserDefaultsに保存した時のメモです。
###主に使う変数

```swift:ViewController.swift
   let defaults = UserDefaults.standard
   var saveArray: Array! = [NSData]()
   var image: UIImage!
```

#ViewControllerでの記述
まずはimageをNSData型にキャストして配列としてUserDefaultsに保存する。

```swift:ViewController.swift
 func sendSaveImage() {
        //NSData型にキャスト
        let data = image.pngData() as NSData?
        if let imageData = data {
            saveArray.append(imageData)
            
            defaults.set(saveArray, forKey: "saveImage")
            defaults.synchronize()
        }
    }
```

保存したデータを取得する。

```swift:ViewController.swift
func defaultsArray() {
        //UserDefaultsの中身が空でないことを確認
        if defaults.object(forKey: "saveImage") != nil {
            let objects = defaults.object(forKey: "saveImage") as? NSArray
            //配列としてUserDefaultsに保存した時の値と処理後の値が変わってしまうのでremoveAll()
            saveArray.removeAll()
            for data in objects! {
                saveArray.append(data as! NSData)
            }
        }
        tableView.reloadData()
    }
```

配列からtableViewに反映する。

```swift:ViewController.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell
        
        //data型にキャストしてUIImageとして取り出す
        cell.cellImageView.image = UIImage(data: saveArray[indexPath.row] as Data)
        cell.cellImageView.frame = CGRect(x: 0, y: 1, width: cell.bounds.size.height - 2, height: cell.bounds.size.height - 2)
        cell.cellImageView.contentMode = .scaleAspectFill
        cell.cellImageView.clipsToBounds = true
        
        return cell
    }
```

#結果
実行後の結果はこんな感じです。

<img width="375" alt="IMG_8497.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/292456/13b75fe7-e80b-318a-3b2c-67bbe5a56f71.jpeg">

#最後に
cellを削除するときはとりあえずこんな感じで行なっています。

```swift:ViewController.swift
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let deleteButton: UITableViewRowAction = UITableViewRowAction(style: .normal, title: "削除", handler: {(action, index) -> Void in
            //指定したcellを削除した状態でUserDefaultsをリセットして保存し直す
            saveArray.remove(at: indexPath.row)
            defaults.removeObject(forKey: "saveImage")
            defaults.set(saveArray, forKey: "saveImage")
            defaults.synchronize()
            tableView.deleteRows(at: [indexPath], with: .fade)
        })
        deleteButton.backgroundColor = .red
        
        return [deleteButton]
        
    }
```

終わり。