OmniAICreator/Qiita-1.07M huggingface dataset:
手数料を使ったReorg攻撃の可能性とその対策案

# はじめに

Bitcoin等のブロックチェーンにおいて、手数料の過剰支払いによってReorgを起こす手法がある気がしたのでメモしておきます。
既に提案されているかもしれないですし、あまり自信のある内容ではないのでツッコミ歓迎です。
~~ちなみに先日Binanceで7000BTCが流出した際、一瞬Reorgが話題に上りましたが、この記事の内容で早めに対応すれば一部取り戻せる可能性があったかもしれません（個人的にはやってほしくないです）。~~
*追記:記事を書いた時点ではしっかり調べていませんでしたが、下記tweet等で同じような方法が議論されたうえで、Reorgはしないと判断されていたようです。*
https://twitter.com/JeremyRubin/status/1125920452340117506?s=19

# 手法
ヒントになったのは下記の論文です。
[On the Instability of Bitcoin Without the Block Reward](http://randomwalker.info/publications/mining_CCS.pdf)
この論文は、将来ブロック報酬が小さくなったときに、手数料を後続マイナーに残すような戦略が発生し、セキュリティが低下する、というような内容です。
この後続マイナーに手数料を残すという発想は、現時点でも攻撃に使えるかもしれないと気が付きました。
以下説明です。

## 仮定

* 攻撃者の目的は、HonestチェーンのNブロック前からのReorgであるとします（今回は収益化手段までは踏み込みません）。
* 攻撃者は、Nブロック前では有効だが現在のブロックでは無効なBTCを持っているとします。
* マイナーは手数料とマイニング報酬だけを目的とし、そのためにはLongestチェーンを無視する事もあるとします（その行動によりBTCのブランドが毀損することは考慮しないとします）。
* （コメントを受け追記）攻撃に参加するマイナー間でのトランザクションとブロックの伝搬は、滞りなくできるとします。

## 手順

攻撃者はNブロック前で有効なBTCを元手に、その後のNブロック以上があふれる程大量のトランザクションを生成してブロードキャストします。このトランザクション群にはマイニング報酬に相当するような高額な手数料を均等に設定しておきます。

マイナーから見てみます。Honestチェーンではこのトランザクションは無効なので、高額な手数料は攻撃者チェーンでしか獲得できません。攻撃者チェーンをマイニングすることは直近Nブロックでの報酬を捨てることになりますが、手数料の期待値がそれを上回るなら、攻撃者チェーンでマイニングをするインセンティブが出てくるはずです。

ブロック容量を溢れるようにしているので、手数料が次のブロックで取り尽くされることがなく、Honestチェーンに追いつくまでインセンティブを維持できます。多数のマイナーが参加してHonestチェーンが伸びる見込みがなくなれば、攻撃成功とみていいでしょう。

**この手法の特徴は、マイニング設備を所有していたり、nicehash等でハッシュパワーを借りたり、マイナーに連絡を取ったりせずとも、プロトコル内で攻撃が可能となることです。**

なお、積み増しする手数料の金額はマイニング報酬より結構少なくても機能するかもしれません。分析もできそうですが、細かい話になってしまうので今後の課題とします。

# 対策案
Honestチェーン側でも同レベルの手数料を用意できればいいですが、誰が率先してやるのかという問題は残ります。
あるいは2017年のUASFのように、ユーザーノードで一定以上の手数料を無効とすれば、対策になるかもしれません。
Google Colaboratoryで簡単に画像を表示する方法

画像で説明していきます。使い方についてはいろんな方が説明されているので割愛します。

画像の矢印のところをクリックしていき、画像を選択してアップロードするだけです。
コードを書いてアップロードすることもできますがこっちの方が簡単そうなので紹介します。

CSVファイルなどにも応用できます。

<img width="500" alt="Screen Shot 2019-05-12 at 7.55.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58960/a4e30bfa-e984-6f4c-298f-9f9e5379604e.png">

<img width="500" alt="Screen Shot 2019-05-12 at 7.56.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58960/a254f968-0d6c-07bc-8861-50ae4a534212.png">


<img width="500" alt="Screen Shot 2019-05-12 at 7.56.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58960/c7bbe701-6bd8-cd0f-9b1b-bb06d8137249.png">

あとは表示させるコードを書いてRUN!

```python
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("futaba.png")

plt.imshow(img)
```
こんな感じで表示されます。
<img width="500" alt="Screen Shot 2019-05-12 at 8.05.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58960/1d42b363-79f3-352e-4376-7bbc16f5f474.png">
blueqatで量子ゲート その2

# 概要

blueqatで量子ゲートやってみた。
論理回路作ってみた。三日、掛かった。

# and

| a | b| c|
|:-----------------:|:------------------:|:------------------:|
| 0             |      0 |        0      |
| 0             |      1 |        0      |
| 1             |      0 |        0      |
| 1             |      1 |        1      |


```
Circuit(3).h[ : 2].ccx[0, 1, 2].m[ : ].run(shots = 100)

Counter({'000': 15, '010': 27, '100': 30, '111': 28})

```

# xor

| a | b| c|
|:-----------------:|:------------------:|:------------------:|
| 0             |      0 |        0      |
| 0             |      1 |        1      |
| 1             |      0 |        1      |
| 1             |      1 |        0      |

```
Circuit(3).h[ : 2].cx[1, 2].cx[0, 2].m[ : ].run(shots = 100)

Counter({'000': 21, '011': 20, '101': 29, '110': 30})

```

# or

| a | b| c|
|:-----------------:|:------------------:|:------------------:|
| 0             |      0 |        0      |
| 0             |      1 |        1      |
| 1             |      0 |        1      |
| 1             |      1 |        1      |

```
Circuit(3).h[ : 2].ccx[0, 1, 2].cx[1, 2].cx[0, 2].m[ : ].run(shots = 100)

Counter({'000': 31, '011': 18, '101': 23, '111': 28})

```

以上。
タブ切り替え（jQuery）

#jqueryを使ったタブ切り替えの実装



```html:index.html
<div class="container">
  <ul class="menu">
    <li>
      <a href="">サイトの概要</a>
      <div class="sankaku"></div>
    </li>
    <li>
      <a href="">サービスの内容</a>
      <div class="sankaku"></div>
    </li>
    <li>
      <a href="">お問い合わせ</a>
      <div class="sankaku"></div>
    </li>
  </ul>
  <div class="content">サイトの概要サイトの概要サイトの概要サイトの概要サイトの概要サイトの概要サイトの概要サイトの概要サイトの概要</div>
  <div class="content">サービスの内容サービスの内容サービスの内容サービスの内容サービスの内容サービスの内容サービスの内容サービスの内容</div>
  <div class="content">お問い合わせお問い合わせお問い合わせお問い合わせお問い合わせお問い合わせお問い合わせお問い合わせお問い合わせ</div>
</div>


```

```css:style.css
* {
  padding: 0;
  margin: 0;
  font-size: 25px;
  box-sizing: border-box;
}

ul {
  list-style: none;
}

a {
  text-decoration: none;
}

.container {
  width: 960px;
  margin: 0 auto 0;
}

.tab {
  margin: 0 0 100px 0;
}

.menu {
  display: flex;
  margin-bottom: 50px;
}

.sankaku{
  width: 0;
  height: 0;
  border: 20px solid transparent;
  border-top: 20px solid #333;
  margin: 0 auto;
  transition: all 0.5s ease-out; 
}

.menu li a {　
  width: 200px;
  display:block;
  padding: 8px 0;
  color: #000;
  background: #888;
  text-align: center;
  transition: all 0.5s ease-out;
}

.menu li a.active {　/*クリックされた時に付与される*/
  background: #333;
  color: #fff;
}

.content {
  width: 600px;
  padding: 8px;
  background: #333;
  color: #fff;
}

```

```javascript:main.js

$(function(){

  const btns     = $(".menu li a");
  const sankaku  = $(".menu li .sankaku");
  const contents = $(".content");

  contents.not(contents.eq(0)).hide();
  sankaku.not(sankaku.eq(0)).css("opacity", 0);

  btns.each(function(){
    $(this).on("click", function(e){
      e.preventDefault();
      let index = btns.index(this);
      btns.removeClass("active");
      $(this).addClass("active");
      contents.hide();
      contents.eq(index).fadeIn();
      sankaku.css("opacity", 0);
      sankaku.eq(index).css("opacity", 1);
    });
  });
});

```

#実際の動き

[タブ切り替え](https://gyazo.com/76f872e834496213c65463c97ac0aec2)
pandas.groupby 超簡単なチートシートっぽいもの（自分用）

pandasのgroupbyがなかなか便利だったのでチートシートっぽいものを作っておく。
ほぼ自分用のメモ。
# 参考にさせていただいたサイトなど

詳しいことは下記のリンクを参照

pandasのドキュメント
https://pandas.pydata.org/pandas-docs/stable/reference/groupby.html

nkmk.meさんのサイト
https://note.nkmk.me/python-pandas-groupby-statistics/

Takashi Yamamiyaさんの記事
https://qiita.com/propella/items/a9a32b878c77222630ae
# 環境とか
python 3.7.2
pandas 0.23.4

## データとかの準備
データはseabornのirisを使ってみる。

```python:qiit.rb
import pandas as pd
import seaboan as sns
df = sns.load_dataset('iris')
```

## どんなグループ分けができるのか未知のデータとかをざっくり調べるときに使えるかも。

species別にどれだけデータが入っているか？

``` python:qiit.rb
df.groupby('species').size()
```

![スクリーンショット 2019-05-12 7.19.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84834/2c5e9533-487b-0f05-9983-7218bf51d135.png)


.indexでグループのリストも取得できる。

``` python:qiit.rb
GroupList = df.groupby('species').size().index
```

![スクリーンショット 2019-05-12 7.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84834/94bd59ff-b8e2-26af-b80b-df4c0187e300.png)


各グループの平均とか
データフレームに対してだとデータフレームの各列の平均とかのデータフレームが返ってくる。

``` python:qiit.rb

df.groupby('species').mean()
```

![スクリーンショット 2019-05-12 7.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84834/25f69714-b9d7-2be1-71d1-beb48f734278.png)


データフレームのある列（シリーズ）に対してなら下記

```python:qiit.rb
df.groupby('species').mean()['sepal_length']
```
![スクリーンショット 2019-05-12 7.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84834/6aba8208-d8e6-c198-39b2-b79bdb7553b8.png)



## numpyの関数とか使うなら

.aggを使う。

```python:qiit.rb

df.groupby('species').agg(np.nanmean)

df.groupby('species').agg(np.nanmean)['sepal_length']

```

![スクリーンショット 2019-05-12 7.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84834/27075f75-385c-4b1d-fede-89c04f3ab212.png)


.aggは自作関数もOKみたい。

```python:qiit.rb
def TEST_DEF(DF):
    DF_MAX = DF.max()
    DF_MIN = DF.min()
    return DF_MAX - DF_MIN

df.groupby('species').agg(TEST_DEF)

```
![スクリーンショット 2019-05-12 7.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84834/e0526ad4-099c-d35f-2ddd-836b9c87ff1d.png)

他にも気が向いたら更新していく予定。
レガシーに 立ち向かうには リスペクト

# レガシーコードを否定しない。
否定から入らない。存在を認めよう。

# 現場の人間を低レベルだとバカにしない。
現場には現場のルールがあり、その点を知らないままに頭ごなしに決めつけることはリスクが高く、愚かしい行為である。

# 改善を考える前に、歴史を知るように努力する。

現場の人にインタビューをして、現状についてどう思っているのか確認してみる。
たいていの人は、現状のままで良いとは思っていない。だが打ち手が分からずにモヤモヤしている。そんなことが大半だった。

改善を成り立たなくしているのはスケジュールなので、いまのスケジュールの是非を問うことから始めてみたい。
Python　ファイル名の一括変更

Pythonの勉強がてら、麻雀のアプリでも作ってみようかなーと思いまして。
取り敢えず[いらすとやさんから麻雀牌の画像](https://www.irasutoya.com/2017/02/blog-post_8.html)を取ってきたのですが、
牌の種類ごとに一画像になっているので
それをツールで一牌ごとに切り取ったら以下の通りになりました。
<img width="1122" alt="スクリーンショット 2019-05-12 4.03.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/30716df2-17f0-6f92-5801-b680a6149acc.png">
<img width="1111" alt="スクリーンショット 2019-05-12 6.27.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/c0ad51d5-d56e-a430-e100-e6ab8068d571.png">

うまく加工できずファイル名がぐちゃぐちゃ…

せっかくだからPythonでファイル名の一括変換をやってみました。
ファイル名の真ん中に牌の種類名があるので、
それを正規表現で拾って連番を振ります。

#ファイル名の一括変更
以下のコードで一括変更できました。

```
from pathlib import Path
import os
import re

p = Path("/Users/Shared/Work/Ok")  #画像のあるディレクトリを取得
files = sorted(p.glob("*"))        #ファイルの一覧をソートして取得

syurui = ''                        #種類取得用一時変数
i = 0                              #種類ごとの連番
for file in files:                 #1ファイルづつループ
    if file.name.startswith("."):  #隠しファイルに対しては処理を行わない
        continue

    oldFilePath = file.__str__()   #現在のファイルフルパス取得
    print(oldFilePath)

    parentDir = file.parent.__str__()#親ディレクトリ名取得
    anchor = file.anchor             #ファイルパスの区切り文字取得
    fileName = file.name             #ファイル名称取得
    suffix = file.suffix             #ファイルの拡張子取得

    match = re.search(r'_(.*?)-', fileName) #正規表現　_から-の間が牌の種類名
    if syurui != match.group(1):     #種類ごとに連番iをカウント
        syurui = match.group(1)
        i = 0
    i = i+1

    newFileName = syurui+'_' + i.__str__() + suffix #変更後のファイル名
    newFilePath = parentDir+anchor + newFileName    #変更後のファイルフルパス
    print(newFilePath)

    os.rename(oldFilePath,newFilePath)              #ファイル名の変更

```


んで、結果は以下の通り
<img width="1116" alt="スクリーンショット 2019-05-12 6.28.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/1b4f26d6-f1b8-9a1a-1924-b27521708cee.png">

きれいに変換できました！
（Pythonになれてないので、結果として手作業で変更したほうが早くできた気がしますが…。）
Exception処理とか書かなくてもいいのでjavaよりシンプルにかけた気がします。
Cloud DataStoreのエンティティをGUIから確認する

# インストール

https://github.com/GabiAxel/google-cloud-gui

これをyarnで適当にインストールする

# Can't set headers after they are sent で怒られる

設定したプロジェクト名とかホストが間違えてるとこれが出る。

`/Users/name/.config/gcloud/emulators/datastore/`
ローカルで開発しているとここにenv.yamlがあるので、DATASTORE_PROJECT_IDとDATASTORE_HOSTを合わせる。
python　オブジェクトからの値取得について

Pythonでファイル名を一括で変換する処理を作っていたんですが、
fileオブジェクトからファイルフルパスとかファイル名を取得したい！
ってときにどんな関数書けば皆目検討つかなかったけど、
Pycharmの捕捉機能を使えばなんとなくわかったのでその方法のメモ。

#オブジェクト内の値の取得方法
Pycharmでのデバック中に、変数にカーソルを合わせると…
<img width="1119" alt="スクリーンショット 2019-05-12 5.43.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/cae8053a-c7dd-a612-9260-4cca207e2bcc.png">

下の画像のように吹き出しが出てくる。
この例だと、どうやら変数file はPosixPath型のようです。
※私はJavaが仕事のメインなので、動的型付け言語ってなれないです…、
<img width="481" alt="スクリーンショット 2019-05-12 5.45.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/107fac76-b1f4-d9e2-dad3-71fbb9ab6c2e.png">

んで、吹き出しの中の+ボタンを押すと
<img width="823" alt="スクリーンショット 2019-05-12 5.46.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/0ab2f346-35bf-4e96-e8b5-94dec69be61c.png">

ファイル名とかフルパスとかある！
じゃあ早速それを取得したいと思ったんですが、
_から始まるやつ（_strとか）と_から始まらないやつ（nameとか）
で取得の方法が異なる…。

結論から言うと、
_から始まるやつ（_strとか）は、　.__str__()の関数を利用して取得
_から始まらないやつ（nameとか）は、　.nameみたいにインスタンス変数を直接指定して取得
すればいいみたいです。
※隠蔽化？みたいな感じなんでしょうか…。
 
情報系の専門学校とかだとココらへん詳しく教えてくれるのかな？
取り敢えず動くものが作れればいいやってのはあんまりよくないですよね…。
GKE で k8s クラスタの node に ssh する

pod (もしくは container) に入ってコマンドを叩くのであれば kubectl でできる。

```
$ kubectl exec -it <pod-name> /bin/bash
```

では、node (もしくは instance) に入ってコマンドを叩くにはどうするか。

## 案1: クラスタにpodをたててgcloud compute ssh

kubectl run で gcloud インストール済みのコンテナを立てて、そこからnodeにsshする。
クラスタのノード(インスタンス)に gcloud compute instances するための権限がついている必要がある。インスタンスにつく標準 service account にその権限はついているので特別絞っていなければ権限があるはず。

```
$ kubectl run -it gcloud --image=google/cloud-sdk:alpine --rm --restart=Never -- /bin/sh
```

```
# gcloud compute instances list
# gcloud compute ssh ubuntu@<node-name> --zone <zone> --internal-ip
```

## 案2: クラスタと同じネットワークに踏み台を作っておく

クラスタと同じネットワークに踏み台を作っておき、そこから gcloud compute ssh する。

kubernetes 関係ない。

# おわりに

他に良い方法あれば welcome
DNSサーバ(bind)を仮想マシンとして作成／＃５：設定、named.conf

プライベートアドレスに加え、グローバルアドレスも解決してくれるフルリゾルバに仕立て上げる。

# bind設定サンプル（内部権威サーバ＋外部リゾルバ）
- root：グローバルアドレスを解決するため、rootドメインは "type hint＂。
- 再帰：グローバルのフルリゾルバなので、再帰問合せ可(recursion yes;)。
- 権威：プライベートアドレスの名前解決をする権威DNSサーバとして動作させる。
- 委任：自身が権威DNSサーバとして管理するゾーンと、別のDNSサーバに委任する（問合せする）ゾーンがある。このためにも再帰問合せを可とする

## ファイル名規約
[前回と同じ](https://qiita.com/harasakih/items/0e2518627b1011ef61e7)


## ゾーン定義(named.conf)
[必須事項,ローカルルール](https://qiita.com/harasakih/items/0e2518627b1011ef61e7)
 
以下は、debianの例。centos(/etc/named/)とdebian(/etc/bind/)でファイルの置き場所が変わっている。

```conf:/etc/named.conf
option {
....
  recursion yes;
  allow-recursion { 192.168.0.0/16; };
  forwarders      { 8.8.8.8; };
}
# rootドメインはグローバル設定
zone "."        { type hint;   file "/etc/bind/db.root"; };
# プライベート用のゾーン定義
zone "vpn"      { type master; file "/etc/bind/myzones/db.vpn"; };
zone "osmc"     { type master; file "/etc/bind/myzones/db.osmc"; };

```


## named.conf　その他オプション
| 指定項目 | 指定値 |
| :--- | :--- |
| recursion yes; | グローバルに対しフルリゾルバなので、yes |
| allow-recursion { 192.168.0.0/16; }; | 再帰問合せの受付元を制限 |
| forwarders      { 8.8.8.8; }; | 自分で解決できない場合の問合せ先 |
| include "....." ; | 指定ファイルを取り込む |
| zone "ゾーン名" IN { <br> type master; <br> file "FILE-NAME"; <br>} | ゾーンを "FILE-NAME" の内容で定義する |
DNSサーバ(bind)を仮想マシンとして作成／＃4：設定、named.conf

# bind設定サンプル（権威サーバ）
- root：内部DNSのルートドメインのDNSとして動作させる場合は、rootドメインも定義する。
- 権威：プライベートアドレスの名前解決をする権威DNSサーバとして動作させる。
- 委任：自身が権威DNSサーバとして管理するゾーンと、別のDNSサーバに委任する（問合せする）ゾーンがある。このため、権威サーバではあるが再帰問合せを可とする(recursion yes;)

## ファイル名規約(centos7)

| ファイル名 | 内容 |
| :--- | :--- |
| /etc/named.conf | 設定ファイルルート |
| <br>/etc/named/db.ゾーン名<br>/etc/named/re.x.y.z | /etc/named.conf でゾーン定義する場合<br>zone "ゾーン名" IN { file "../db.ゾーン名"; } ;<br>zone "z.y.z.in-addr.arpa" IN { file "../re.x.y.z";}; |
| /etc/named/db.ゾーン名<br>/etc/named/re.z.y.x | 正引き定義（NS,A)<br>逆引き(PTR) |
| /etc/named/named.conf.ゾーン名 | /etc/named.conf で include する場合 |

## ゾーン定義(named.conf)
必須事項

- ドメイン名(*.vpnなど)を勝手な名前にするので、rootの権威DNSは自分にする。そのため、typeはmasterとし、hintにしない。
- 委任を可とするため再帰問合せ可とする(recursion yes;)。

ローカルルール

- 他に委任するゾーン(ex *.vpn)は、rootの定義ファイル内に "NSレコードとして" 記載する。
- 自分が権威DNSとして管理するゾーンは、ゾーン定義ファイル(db.*)を作成し、named.confで参照宣言する。
- @ IN SOA MNAME RNAME () <BR>SOAレコードに記載する MNAME(ゾーンのNSのサーバ名)は、ns0.ゾーン名、とする。
 - 適当にすると、複数ゾーンで "同一MNAME:異IPアドレス" となる可能性があるため、ユニークとなるようにゾーン名を含める。
 - 委任先のDNSは、FQDNではなくIPアドレスで指定したい。他で定義されてFQDNを使わないため。
 

```conf:/etc/named.conf
options {
  listen-on port 53 { 192.168.0.0/16; 127.0.0.1; };
  listen-on-v6 port 53 { ::1; };
  directory       "/var/named";
  allow-query     { 192.168.0.0/16; 127.0.0.1; };
  version         "Unknown";
....
  recursion       yes;
  allow-recursion { 192.168.0.0/16; };
  forwarders      { 0.0.0.0; };
}

zone "."        { type master; file "/etc/named/db."; };
    | $TTL  24h
    | ; @ = "."
    | @ IN  SOA ns0.root. postmaster.root. (....)
    | .                      IN  NS  ns0.root.     # rootは自分
    | .                      IN  TXT "root-zone of vm-dns.hrsk"
    | ns0.root.              IN  A   192.168.0.121
    | ;;
    | vpn.                   IN  NS  ns0.vpn.      # サブドメイン"vpn."
    | ns0.vpn.               IN  A   192.168.0.102
    | ;;
    | osmc.                  IN  NS  ns0.osmc.     # サブドメイン"osmc."
    | ns0.osmc.              IN  A   192.168.0.102
    | ;; 
    | hrsk.                  IN  NS  ns0.hrsk.     # サブドメイン"hrsk."
    | ns0.hrsk.              IN  A   192.168.0.1
    |
zone "esxi"     { type master; file "/etc/named/db.esxi"; };
    | $TTL  24h
    | ; @ = "esxi"
    | @ IN  SOA ns0.esxi. postmaster.esxi. (....)
    |                        IN  NS  ns0.esxi.
    |                        IN  TXT "auth of esxi."
    | ns0                    IN  A   192.168.0.121
    | ;;
    | vm-dbsv                IN  A   192.168.0.126
    | vm-dmz                 IN  A   192.168.0.120
```


## named.conf　その他オプション
| 指定項目 | 指定値 |
| :--- | :--- |
| listen-on port 53 { 192.168.0.0/16; 127.0.0.1; }; | DNSクエリーをlistenするアドレス範囲とポート |
| allow-query     { 192.168.0.0/16; 127.0.0.1; }; | クエリ元を制限する |
| version         "Unknown"; | セキュリティのため bind のバーションは返答しない |
| recursion yes; | FQDNを右から再帰問合せするか、自分の情報だけで回答するか<br>yes:再帰問合せする<br>no:自分の情報だけで回答する |
| allow-recursion { 192.168.0.0/16; }; | 再帰問合せの受付元を制限 |
| include "....." ; | 指定ファイルを取り込む |
| zone "ゾーン名" IN { <br> type master; <br> file "FILE-NAME"; <br>} | ゾーンを "FILE-NAME" の内容で定義する |
学生が無料で使えるサービスまとめ

# 学生が無料で使えるサービスまとめ

## TL;DR
バイオ系の自分からすると驚きなのですが、IT関係の企業はかなり教職員・学生向けにサービスを無料で公開しています。
自分で情報収集するついでにまとめておきたいと思っています。 190512更新

## Tableau Academic
https://www.tableau.com/ja-jp/academic

データ分析の世界でExcelはもう古い、これからはTableauの時代といってもいいのではないかと思います。
普通に買うと￥100200/YearとかいうTableau Desktopが無料で使えます。企業でもよく導入されているらしいので学習してみても損はしないのではないでしょうか。

## Jetbrains IDEs
https://www.jetbrains.com/student/

JavaのIDEといえばJetbrainsらしいですね、自分はあまりJava触ったことがないので知りませんでした。
しかしほかの言語のIDEも豊富に存在し、それらが無料で使えるというのは非常に魅力的です。最近Pycharmを入れてみました。使いこなせるように苦闘中です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306203/8f273d25-112b-6857-e157-a7c87a9a2ac8.png)


## Asure for student
https://azure.microsoft.com/ja-jp/free/students/

Microsoftが学生向けに始めたサービスです。学生が登録すると$100のお小遣いがもらえます。
また、Windows 10 for education（Enterprise互換、Hyper-Vやリモートデスクトップ機能が使える。Docker for windowsが簡単に動くのでメリットが大きい）やVirtual Machine（仮想Linuxマシンや仮想Windows server）などが無料で使えます。
Microsoft Build 2019 Data Platform　メモ

#Microsoft Build 2019 Data Platform　メモ

##はじめに
Build2019のData Platform周りの発表についてdecodeに先行してメモ

**Microsoft Build 2019**
https://www.microsoft.com/en-us/build

セッションはこちらから見れます
https://mybuild.techcommunity.microsoft.com/sessions#top-anchor

以下で気になったものたちをつらつらとメモします。

##Azure SQL Database Hyperscale GA
https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-service-tier-hyperscale
>
- 最大 100 TB のデータベース サイズのサポート
- サイズに関係なく、コンピューティングに対する IO の影響もなく、ほぼ瞬間的に行われるデータベース バックアップ (Azure BLOB Storage に格納されたファイル スナップショットに基づく)
- 数時間あるいは数日かからずに数分間で行われる迅速なデータベース復元 (ファイル スナップショットに基づく) (データ操作の規模ではない)
- データ ボリュームに関係なく、高いログ スループットと速いトランザクション コミット時間による、全体的に高いパフォーマンス
- 迅速なスケールアウト - 読み取りワークロードのオフロード用と、ホット スタンバイ用に、1 つ以上の読み取り専用ノードをプロビジョニングできます。
- 迅速なスケールアップ - 大きいワークロードに対応する必要があるときはコンピューティング リソースを一定の時間でスケールアップでき、必要がなくなったらコンピューティング リソースをスケールダウンして戻すことができます。

##Azure SQL Database Serverless
弾性的なパフォーマンスとコストに最適化されたシングルデータベース
使ったり使わなかったりする期間のある開発テスト環境向きみたいです。

https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-serverless
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b3035b3d-f2ff-70df-0b2d-e6df7af547b0.png)

##Azure SQL Database Edge  
エッジデバイスにSQLDB入れられます。
https://azure.microsoft.com/ja-jp/services/sql-database-edge/

##Azure Data FactoryのスケールするETL/ELTフロー
立場上Data Factory周りはすごく気にしていますが、開発も盛んでどんどん新機能が入っています。

###Mapping Data Flows 
GUIでETL処理ができる機能
裏側ではおそらくDatabricks Runtimeが動いており、Sparkを使用したオートスケールするデータ加工処理が簡単にコードフリーで実装できる
Copy Activityで加工までしていたけどお役御免ですね。Load処理とTransform処理の役割がはっきりしそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b8941d5e-0cd5-81d8-01f2-7c47bb34ac4d.png)

###Wrangling Data Flows
PowerBI Servicesで先に実装されていたDataflowsのData Factory版
PowerBIはCompute部分が設定できなかったのに対してこちらはCompute数を設定できるようです。
Previewの申し込みは[こちら](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR9-OHbkcd7NIvtztVhbGIU9UNk5QM0dSWkFDSkFPUlowTFJMRVZUUUZGRi4u)

完全にDataflowsです。PowerBI Desktopで作った処理をそのまま持ってこれるようになりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/46040d3a-e3b0-3c41-7193-c5072708909e.png)

それぞれモニタは共通の模様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9dbab73f-9e5f-0764-5de5-4fd3f57ec3cb.png)


ロードマップではStreamingも来るみたいですね
CatalogやMDMと統合するということはADF一つでデータマネジメントの機能を統括できるようにするんでしょうか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d8518bff-90c3-e66d-0b7f-0de03256b911.png)

##Cosoms DB のSpark Connector
CosmosDB推しは引き続き

セッションではラムダアーキテクチャの課題であるパーツが多すぎてそれぞれを選ぶ手間があるとし、それに対してコレ
ストレージをCosmosDBだけで乗り切るのは実際どうなんだろう・・・高くないのかな
Speed層をこの実装するのはすごくわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2ab4c070-a2b1-22b3-f946-24531fb07947.png)

つかれたのでここまで

##その他参考リンク
https://azure.microsoft.com/en-us/blog/analytics-in-azure-remains-unmatched-with-new-innovations/
https://blog.crossjoin.co.uk/2019/05/10/azure-data-factory-wrangling-data-flows/
論文まとめ：A simple yet effective baseline for 3d human pose estimation

# はじめに  
以下の論文
[1] J. Martinez, et. al. 
A simple yet effective baseline for 3d human pose estimation
のまとめ。ICCV2017にacceptされている。

２年前に発表された古い論文だが、その後の論文に与えた影響を考えて、ざっくりリサーチする。

arXivのリンク：
https://arxiv.org/abs/1705.03098

コードは著者らのかどうかわからないが
https://github.com/una-dinosauria/3d-pose-baseline
などいくつか存在。

# 概要  
1. 単眼・RGB画像から３次元骨格を推定する際に生じる誤差が、２次元骨格を推定する時の誤差に由来するのか、あるいは２次元骨格を３次元骨格に変換する時の誤差に由来するのかをリサーチした
2. 結論としては、２次元骨格を推定する時の誤差に由来していた
3. その際に単純なMLPでも２次元骨格を３次元骨格へ精度よく変換できることを示した

# 問題設定  
関節の個数を $n$とする。

２次元における各関節の座標を ${\rm \bf x} \in \mathbb{R}^{2n}$  、３次元における各関節の座標を ${\rm \bf y} \in \mathbb{R}^{3n}$ とする。

検証したい内容は $f^* : \mathbb{R}^{2n} \to \mathbb{R}^{3n}$ なる $f^*$ がどれくらいの精度をもっているか。

よって

```math
f^* = \min_f \frac{1}{N} \sum^N_{i=1} \mathcal{L} (f({\rm \bf x}_i) - ({\rm \bf y \rm}_i))
```

を求める。$f^*$ はニューラルネットとする。

# ニューラルネットのアーキテクチャ  

 $f^* : \mathbb{R}^{2n} \to \mathbb{R}^{3n}$ の $f^*$ は以下のようなアーキテクチャ。

<img width="842" alt="simple_yet_pose_img00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/0819d100-bd38-577a-7b8e-1eefafccaf66.png">
[1]figure1より

（全結合ーbatch normーreluーdropout）x2 したものに入力をaddするresicual blockが２つ。

２次元の骨格は[2]のstacked hourglassを用いて求める。

# 結果  
結果の１つはこんな感じ。

<img width="842" alt="simple_yet_bone_img01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/5891c7a5-e753-0cdc-bea3-323dc3884c64.png">
[1]table2より

他の手法よりロスがかなり低い。・・・２次元骨格から３次元骨格への変換部分は誤差が少ないと言える。

# reference  
[2] A. Newell, K. Yang, and J. Deng. Stacked hourglass net-
works for human pose estimation. In ECCV, 2016.
AtCoder diverta 2019 Programming Contest C - AB Substrings(400点)

#問題概要
[問題へのリンク](https://atcoder.jp/contests/diverta2019/tasks/diverta2019_c)

$N$個の文字列がある。$i$ 番目の文字列は $s_i$ 。
これらの文字列を任意の順に並べる。作った文字列に部分文字列 `AB` が最大いくつ含まれるか求めよ。

#制約条件
- $1≤N≤10^4$
- $2≤|s_i|≤10$
- $s_i$ は英大文字のみからなる

#考えたこと
求める値に影響を与える文字列は以下の4パターン

1. 末尾がA
- 最初がB
- 末尾がAで最初がB
- 部分文字列 `AB` が含まれている

基本的にパターン4にパターン1とパターン2の小さい方を足したものが答えとなる(小さい方以上に `AB` の文字列を作ることはできないので)が、コーナーケースとして1と2と3が重なる、あるいは存在しない場合がある。
1と2と3のパターンが重なる場合は「末尾がAで最初がB」となっている `該当ケース数-1` が答えとなる。例えば$BA, BAAA, BZOPDA$が該当するケースだとした時、左端にB、右端にAが配置されワンセット分余ることになる。1と2と3のパターンが存在しない場合は0である。

`max(0, ba-1)` で1と2と3のケースが重なっているか、存在しないかは判定すればよい。

#解答

```c.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n; cin >> n;
    int ab = 0;
    int a = 0;
    int b = 0;
    int ba = 0;
    for(int i = 0; i < n; i ++) {
        string s; cin >> s;
        int l = s.size();
        if(s[l-1]=='A') a++;
        if(s[0]=='B') b++;
        if(s[0]=='B' && s[l-1]=='A') ba ++;
        for(int j = 0; j < l-1; j ++) {
            if(s[j]=='A' && s[j+1]=='B') ab ++;
        }
    }
    if(a==ba && b==ba) cout << ab + max(0,ba-1) << endl;
    else cout << ab + min(a,b) << endl;
}
```
pythonでProcessingを動かす

#Processingとは
>電子アートとビジュアルデザインのためのプログラミング言語であり、統合開発環境である。アーティストによるコンテンツ制作作業のために、詳細な設定を行う関数を排除している。 視覚的なフィードバックが即座に得られるため、初心者がプログラミングを学習するのに適しており、電子スケッチブックの基盤としても利用できる。

#インストール
[公式サイト](https://processing.org/download/)から使用しているOSに合ったものをダウウンロード、インストールしてください. 

#pythonモードの設定
インストール完了後Processingを開くと, デフォルトではJavaが設定されています. 
赤枠部分から「モードの追加...」を選択してください. 
<img width="696" alt="スクリーンショット_2019-05-12_2_11_17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/d04271db-9281-99d8-a2f7-5c976428610f.png">

そしてPython Modeを選択して, インストールをクリックしてください. 
<img width="737" alt="スクリーンショット_2019-05-12_2_17_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/0113358f-bc34-8587-a629-f6830f7014a7.png">

以上で, Pythonモードを使用することができます. 
<img width="696" alt="スクリーンショット 2019-05-12 2.19.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/e73eb82b-07f5-039e-4ae0-305eb68952d3.png">

#実行してみる
ちゃんと動くか軽く確認してみましょう. 
以下のコードを実行してみます. 

```python
text("Hello World!", 20,50)
```
しっかりとHello World!が表示されています. 
<img width="123" alt="スクリーンショット 2019-05-12 2.23.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/4bcdb58a-ed49-6d68-e626-6fe1c46f0cf1.png">

#おわりに
今回はProcessingのインストールについて紹介しました. 
もう少し具体的な使い方についても今後記事にしていこうと思います.
Elixir episode:1 リスト

# 環境

```shell-session:sh
$ lsb_release -d
Description:    Ubuntu 18.04.2 LTS

$ elixir -v
Erlang/OTP 21 [erts-10.3.5] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Elixir 1.8.1 (compiled with Erlang/OTP 20)
```

# はじめに

[Elixir episode:0 実行ファイル](https://qiita.com/feelinguy/items/3b171d25b43af45856c2) のプロジェクトを使う。
いや、使わんでもいい。

# `Fg.List`

`touch lib/fg/list.ex`

```elixir:fg/lib/fg/list.ex
defmodule Fg.List do
  def cons(x, y), do: [x | y]

  def head([x | _y]), do: x

  def tail([_x | y]), do: y
end
```

`$ iex -S mix`

```elixir:iex
iex(1)> alias Fg.List, as: L
Fg.List
iex(2)> list = L.cons(1, L.cons(2, L.cons(3, [])))
[1, 2, 3]
iex(3)> L.head(list)
1
iex(4)> L.tail(list)
[2, 3]
iex(5)> L.head([1])
1
iex(6)> L.tail([1])
[]
```

おっけー？

# 無名関数

`$ iex`

```elixir:iex
iex(1)> first = fn (x, _y) -> x end
#Function<12.128620087/2 in :erl_eval.expr/5>
iex(2)> second = fn (_x, y) -> y end
#Function<12.128620087/2 in :erl_eval.expr/5>
iex(3)> first.(1, 2)
1
iex(4)> second.(1, 2)
2
```

# カリー化

全ての関数を、１引数の関数で表現すること。

```elixir:iex
iex(5)> first = fn x -> fn _y -> x end end
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(6)> second = fn _x -> fn y -> y end end
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(7)> first.(1).(2)
1
iex(8)> second.(1).(2)
2
```

なんの役に立つのか？実利的にはあまり役に立たない。
関数とは何か？と考える場合には役に立つ。
ざっくり言えば、関数の一般化である。

# ラムダ算法

ラムダ算法の説明はしない。
以下はカリー化を施した関数によって、
関数のみでリスト（データ構造）を作れることを示している。

```elixir:iex
iex(9)> cons = fn x -> fn y ->  
...(9)>   fn selector -> selector.(x).(y) end
...(9)> end end
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(10)> head = fn list -> list.(first) end
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(11)> tail = fn list -> list.(second) end
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(12)> list = cons.(1).(2)   
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(13)> head.(list)
1
iex(14)> tail.(list)
2
iex(15)> list = cons.(1).(cons.(2).(cons.(3).(nil)))
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(16)> head.(list)
1
iex(17)> head.(tail.(list))
2
iex(18)> head.(tail.(tail.(list)))
3
iex(19)> tail.(tail.(tail.(list)))       
nil
```

# `Fg.List` を書き換える

```elixir:fg/lib/fg/list.ex
defmodule Fg.List do
  def cons(x, y) do
    fn selector when is_function(selector, 2) ->
      selector.(x, y)
    end
  end

  def head(list) when is_function(list, 1) do
    fn x, _y -> x end  # first selector
    |> list.()
  end

  def tail(list) when is_function(list, 1) do
    fn _x, y -> y end  # second selector
    |> list.()
  end
end
```

`$ iex -S mix`

```elixir:iex
iex(1)> alias Fg.List, as: L
Fg.List
iex(2)> list = L.cons(1, L.cons(2, L.cons(3, nil)))
#Function<0.76478687/1 in Fg.List.cons/2>
iex(3)> L.head(list)
1
iex(4)> L.tail(list)
#Function<0.76478687/1 in Fg.List.cons/2>
iex(5)> L.tail(list) |> L.head()
2
iex(6)> L.tail(list) |> L.tail() |> L.head()
3
iex(7)> L.tail(list) |> L.tail() |> L.tail()
nil
```

また来てくれよなーノシ
Rでcron設定をめちゃ簡単にやって自動スクレーピングする

#WEBスクレーピングが出来るようになると、次は自動実行したくなるのでやってみた。
rocker/tidyverse での環境構築から。
rockerはみんな ubuntu がベースなので apt コマンドが使えます。

使うのは "cronR" Rパッケージ：
https://cran.r-project.org/web/packages/cronR/index.html
https://github.com/bnosac/cronR
現行メンテナのjwijffelsさんに感謝感謝

# Rからなんでもやっちゃう
```R
# 関連パッケージと読み込み
pacman::p_load(cronR, miniUI, shiny, shinyFiles)

# cronのインストールと起動
system("sudo apt-get install -y cron")
system("sudo service cron start")
```
```R:cron_runcode.R
print(paste("EXECUTED :", Sys.time()))
warning(paste("WARNING! :", Sys.time()))
```

# マニュアル通りにやってみる

```R
# おや？解説通りに書くとエラーになる
f <- system.file(package = "cronR", "extdata", "/home/rstudio/cron_runcode.R")
cmd <- cron_rscript(f)
```
```
Error in cron_rscript(f) : file.exists(rscript) is not TRUE
```

```R
# これで TRUE 返ってくるのに...
file.exists("/home/rstudio/cron_runcode.R")
```

# stackoverflowは神
https://stackoverflow.com/questions/50350285/error-while-using-cronr

```R
# こっちが正解
cmd <- cron_rscript("/home/rstudio/rvestproj/cron_runcode.R")

# これだけで追加完了
cron_add(cmd, frequency = 'minutely', id = 'job1', description = 'Book data crawler')
```

動いたぜやっほう！

```
[1] "EXECUTED 2019-05-11 17:00:01"
Warning message:
WARNING! 2019-05-11 17:00:01 
[1] "EXECUTED 2019-05-11 17:01:02"
Warning message:
WARNING! 2019-05-11 17:01:02 
[1] "EXECUTED 2019-05-11 17:02:01"
Warning message:
WARNING! 2019-05-11 17:02:01 
```

```R:管理コマンド
# これで設定中のジョブが見える(cronRから設定したものだけ)
cron_ls()

# これで全て消す
cron_clear(ask=FALSE)

その他の書式例：
cron_add(cmd, frequency = 'minutely', id = 'job1', description = 'Customers')
cron_add(cmd, frequency = 'hourly', id = 'job2', description = 'Weather')
cron_add(cmd, frequency = 'hourly', id = 'job3', days_of_week = c(1, 2))
cron_add(cmd, frequency = 'hourly', id = 'job4', at = '00:20', days_of_week = c(1, 2))
cron_add(cmd, frequency = 'daily', id = 'job5', at = '14:20')
cron_add(cmd, frequency = 'daily', id = 'job6', at = '14:20', days_of_week = c(0, 3, 5))
cron_add(cmd, frequency = 'daily', id = 'job7', at = '23:59', days_of_month = c(1, 30))
cron_add(cmd, frequency = 'monthly', id = 'job8', at = '10:30', days_of_month = 'first', days_of_week = '*')
cron_add(cmd, frequency = '@reboot', id = 'job9', description = 'Good morning')
cron_add(cmd, frequency = '*/15 * * * *', id = 'job10', description = 'Every 15 min')   

```
crontab書き慣れてないと毎回大変なんですよね。
こりゃ楽です。

本格的にややこしいジョブは自分で crontab -e しないとですが、
僕は「１クローラ：１dockerコンテナ」で組んでいるので 全く困りません。


Rstudioの中から全部出来ると、Unix慣れてない人も安心して触れて素敵です。
次はgoogledriveパッケージで結果を更新します
【pix2pix】AIの力で人を勝手に踊らせてみた

# はじめに
この記事は「[【pix2pix】AIの力で人に勝手にポーズを取らせてみた【OpenPose】](https://qiita.com/shaka/items/70f18568eabb8d32055e)」の続きです。

上記の記事では人に任意のポーズを取らせることが可能になりました。
この記事ではそこから更に発展させて動画を作成することを目指します。

## 前回の技術で動画作成
前回の記事でも静止画を大量に並べて動画も作っていました。（下記）
![moto (1).gif](https://qiita-image-store.s3.amazonaws.com/0/178995/ef3142eb-010c-15c1-8718-f1cc7e24d9b3.gif)

遠目で見るとそれなりに良い感じに見えるのですが、ちゃんと画像を確認すると下図のような腕や足が消えてしまったりしていました。
![661-outputs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178995/c33110ef-d5e1-97f1-1043-941ab83807e1.png)

また、背景がコロコロ切り替わってしまうのも気になります。

# 諸問題への対処
仮説として人と背景を一緒に生成しようとするから学習の難易度が高くなってしまっているのではないかというのがあります。
その為、背景と人物を切り分けることを考えます。

## 人と背景の分離
人と背景を切り分けるために[End-to-end Recovery of Human Shape and PoseのHuman Mesh Recovery](https://github.com/akanazawa/hmr)を使用します。例を以下に示します。
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178995/c2b95a40-bc36-8628-f721-808371a2f591.jpeg)
これを用いると写真から3Dmeshを作成することができます。出力画像は作成した3Dmeshを重ねて描画しています。
作成した3Dmeshの位置に該当するピクセルだけを切り抜くと以下のようになります。
※顔部分はプライバシー保護の観点から黒塗り、3Dmeshはちょっと情報が多くなるようにいろいろつけてます
![1921.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178995/be6b21f5-fee3-0e0c-b076-1413dce40a21.jpeg)
この手法は既にある3Dmeshを動かしているため、手足が無くなることはありません。
これをpix2pixで学習させることで白塗のところは描画せず、それ以外の所には何かしらが描画され、シルエット的には手足が消滅しているように見えないはずです。
更に、3Dmeshは正面、背後なども判断できるというメリットもあります。今回はそういったダンスを用意できなかったので見せられませんが…

# 処理の流れ

![sample2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178995/3ed21460-9097-1ba2-9cd8-94123b1fe69e.jpeg)


# 今回の方法で動画作成
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">人を踊らせる奴更新した <a href="https://t.co/OzNeU3LjRe">pic.twitter.com/OzNeU3LjRe</a></p>&mdash; <a href="https://twitter.com/open_cans/status/1127213842486816768?ref_src=twsrc%5Etfw">2019年5月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 終わりに
今回の方法で背景がコロコロ切り替わることがなく（削除したからね）、「シルエット上は」手足が消えなくなることもなくなりました。
生成された人物も鮮明になったことから背景も生成するよりは人物だけを生成したほうがよりよくなると言えそうです。
この方法はHuman Mesh Recoveryの人物の推定精度に依存しているのであまりスマートな解決策とは言えません。もっとスマートなやり方があったら教えてください（12Gメモリ以上のGPUを使わない方法に限る）

# 余談
最初はeverybody dance nowという論文の方法を使って踊らせてみよう！と始めました。実はこれ結構な茨の道で要求スペックが最低でもメモリ12G、もしくは24GのGPU。これに加えて学習データ14万枚でした。12Gはあくまでも最低ラインでありまともに動かそうとすると24Gは欲しいです。ほんと。。。

どれぐらいえげつないか説明しましょう。
ちなみに12ギガメモリのGPUですが買おうとすると18万円ほどします(https://www.amazon.co.jp/EVGA-%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%AB%E3%83%BC%E3%83%89-Superclocked-GDDR5-768bit-%EF%BC%8812G-P4-3992-KR%EF%BC%89/dp/B00KLTHMH4)
awsで賄おうとするとp3.8xlargeです（1時間 $12.24）

私は18万もさすがに出せないので一度p3.8xlargeで試しに動かしてみました。この時に用いた学習データは256*256の画像を1018枚でした。
これで1エポック4分程でした。そして200エポックがデフォルトなので800分・・・学習データの数と1エポックの時間は比例するのでこれを14万枚やろうとすると地獄です。ちょっとお試しでやってみようとかできません。

今回の物は6GメモリのGPUで動かしているので上の物に比べればだいぶお得だと思います。
もっと安くもっときれいに作れるようになりたいなぁ。
サイト名、ドメインを変更

#はじめに

機械学習やら色々な新しい事を実践的に試すべく
エロサイトを開発中。[あなろぼ](http://motodachi.me/)
開発実践用にオープンしているので広告は入っておりませんのでお気軽にどうぞ。
色々工夫したアプリケーションの作りになっているのでレスポンスは速いはず。

今回はサイト名を変更、それに伴う諸々の作業をまとめて行こうと思う。

#サイト名の変更を思い立った経緯
サイト名の変更の理由は主に2つ。
・気分を一新
　サイト作って約1年。最初の頃は色々モチベーション高く作ってたけど半年以上ほったらかしでドメイン新しくしたらモチベーションまた上がるかなぁ、、と。
・SEO関連
　前のはドメインやサイト名に「えろ」を入れていたせいか全然Google経由でアクセスがないんだよね。超ビッグキーワード過ぎて。
　広告も載せてないし、自分のスキルアップのためにやってるっていっても多くの人に来てもらったほうが嬉しいじゃん。てことでサイト名を変更しよかな、と。

#サイト名の候補
サイトを一緒に作ってる友人とともに何がええかなーって案を出す。このサイトは中国展開も見据えているので中国で通じる名前でいくかーなどなど。
候補を作ってはググって検索のライバルがどれだけあるかをチェック。

その結果新しいサイトは「[モトダチ](http://motodachi.me/)」に決定しました。（パチパチ）

サイト変更に伴い、遊びに来てもらえると嬉しいです。
その際、コメントでもアドバイスあれば速攻改修するんでぜひお願い致します。

#サイト変更に伴いやったこと
#####ドメインの取得
一番最初はこれ。
おれは[Onlydomain](https://www.onlydomains.com/)っていうサイトでドメインを全て管理してます。お○前ドットコム、メールうざすぎて。。(あれスパムレベルですよ、、、)

あとOnlydomainはチャットがあっていつでもカスタマーサポートにチャットでサポートしてもらえるしなんだかんだずっと利用してます。

#####DNSの設定
ドメインが取得できたら次はDNSの設定。
ダチトモではCloudflareっていうCDNサービスを使っているので、Cloudflareに向けて設定完了。
Cloudflare良いよ、使ってない人はぜひ導入しちゃって下さい。

#####アイコンの変更
サイト名決まったらPhotoshopでアイコン作成。
なぜか今回はカブトムシをキャラクターに据えましたよ。
あとFaviconも生成して終了。

#####リダイレクト設定
もとのeroiro.meからdachitomo.meにリダイレクトしないとあかんということでnginxで設定。

`
sudo vi /etc/nginx/nginx.conf
`
server節を分割してリダイレクトしちゃいます。

```nginx.conf
server {
    listen 80;
    server_name  eroiro.me www.eroiro.me;
    return 301 http://motodachi.me$request_uri;
}
```
nginxを再起動。
あとはMeta箇所を編集して終了。

これでサイト名変更、ドメイン変更完了です。

ぜひぜひ[モトダチ](http://motodachi.me/)をよろしくです。
[elk] dockerhubイメージのpull数をELKでトラッキングする

# 背景
dockerhubへイメージをリリースする場合、dockerhubサイトからのようにpullの数が確認できる

|<img width="311" alt="スクリーンショット 2019-05-11 21.14.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/3c6d6e9a-f960-88ef-6ba5-77bc30925f32.png">|
|:-:|


ラボの環境でプロジェクトの色々メトリックを管理するの中、このpull数も可視化したい。この数はdockerhubのAPIで取れる。また、すでにプロジェクトのメトリックはELKのダッシュボードで管理されるため、この数もそこにいれたい。ここで、その方法をまとめる。

# 環境

- ホスト CentOS 7 (jq packageをインストール済み）
- ELKスタック 7.0 (サーバ 10.128.64.200）


# index作成

以下のスクリプトで、ELKにおいて`dockerhub-track`というindexを作成する

```json
$ curl -XPUT "http://10.128.64.200:9200/dockerhub-track" -H 'Content-Type: application/json' -d'
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas" : 2
    },
    "mappings": {
      "dockerhub": {
        "properties": {
           "download": { "type" : "integer" },
           "created": { "type": "date"}
        }
      }
    }
}'
```
UPDATE: ELS 7.x から上のスキーマは使えなくなった。

次に、kibanaのindex mamangementにて、新しいパターンを作成し、`created` を `time filter field` にする。

|<img width="952" alt="スクリーンショット 2019-05-12 0.42.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/0fd28d6b-4fea-01ee-bae5-6f05a54d73ee.png">|
|:-:|

# データ更新

ELKのindexへデータを更新するスクリプトを作成する。例えば、`/home/user/script/update.sh`

```shell:update.sh
#!/bin/sh

# 
PROXY=""
DOCKER_URL="https://hub.docker.com/v2/repositories/username/project/"
PULL=$(curl -s -x $PROXY $DOCKER_URL | jq .pull_count)
DATE=$(date -u +"%Y-%m-%dT%H:%M:%S")
echo $PULL
echo $DATE

# DATE is in UTC
curl -s -XPOST $DOCKER_URL -H 'Content-Type: application/json' -d "{\"download\": $PULL,\"created\":\"$DATE\"}"
```

`DOCKER_URL`を`username`と`project`に合わせ、変更する。dockerhubのprojectに関した情報は以下のapiで取れる。

```
https://hub.docker.com/v2/repositories/username/project/
```

また、ラボの環境にproxyが必要ならば、`PROXY`をそのurlを置き換える必要ある。例えば、

```shell
PROXY="http://10.128.3.103:8080"
```

このスクリプトをcronに1時間ごと実行するように仕掛ける。例えば、このように

```shell-session
0 * * * *         /home/user/script/update.sh > /dev/null 2>&1
```

これで、準備が完了である。残りは、kibanaで従来通り、`dockerhub-track`のmetric visualをついかすれば、dockerhubのpullの数をトラッキングできる。

|<img width="945" alt="スクリーンショット 2019-05-12 1.09.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/bf8135a4-a2a6-e01f-d354-79bf5fb5e0ae.png">|
|:-:|


# まとめ

dockerhubのAPIを用い、pull数をELKでカウンター表示する方法を説明した。このようにプロジェクトの色々情報をELKで可視化できる。
とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-11 on Twitter

# とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-10 on Twitter
 [*](https://twitter.com/YumaInaura/status/1126869789467652098")
<https://github.com/YumaInaura/YumaInaura/issues/1773>
# とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-10 on Twitter [ポエム] on @Qiita
 [*](https://twitter.com/YumaInaura/status/1126883416262057985")
<https://qiita.com/YumaInaura/items/0658b19861976be13758>
# 職業エンジニアも挫折の連続。

 [*](https://twitter.com/YumaInaura/status/1127018283935227904")

>エンジニアになってから初めて挫折すると辛いので、
>
>プログラミング勉強中に挫折するのは正解かもですね。
>
>立ち上がれれば力になるし、諦めて他の道に進んだ場合でもエンジニアになってから挫折することは無くなります。（進んだ先で別の挫折があるだろうけど）
# スポーツで体を動かすのと同じようにプログラマは頭を動かすのが楽しい。

 [*](https://twitter.com/YumaInaura/status/1127021447325503489")

# Linux の uniq コマンドが効かない？ sort と組み合わせないとだめだよ！ on @Qiita
 [*](https://twitter.com/YumaInaura/status/1127034580282642434")
<https://qiita.com/YumaInaura/items/3e9d8d935d17ca94e166>
# Qiita運営により爆速で限定公開になったようです。

 [*](https://twitter.com/YumaInaura/status/1127044434497900544")

# プログラミングの書籍は概念理解のために優れているかもしれない。

 [*](https://twitter.com/YumaInaura/status/1127090641874251776")
![image](https://pbs.twimg.com/media/D6Q69kQV4AEwz7K.jpg)

# プログラミング学習は書籍？ネット？という質問は問題設定が間違っている。

 [*](https://twitter.com/YumaInaura/status/1127093880501850113")

# ruby でローカルのPDFファイルをテキスト化する例 on @Qiita
 [*](https://twitter.com/YumaInaura/status/1127101851755659264")
<https://qiita.com/YumaInaura/items/e90f95eea07569526bcf>
# 集中力を散らされて何もしてない時間で仕事をしたつもりになっていないだろうか。

 [*](https://twitter.com/YumaInaura/status/1127123936339095552")

# プログラミングの楽しみとフレームワーク疲労。

 [*](https://twitter.com/YumaInaura/status/1127127420480380929")




# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
RaspberryPiにVSCodeをインストールして起動してもウィンドウに何も表示されない問題

# 問題
[こちらの記事](http://dotnsf.blog.jp/archives/1073495828.html)を参考にRaspberry Piにcode-ossをインストールして起動したところ、ウィンドウは出てくるものの中に何も表示されない状態になってしまいました。
# 原因
2019年5月12日現在、最新版の1.32.0-1550644812はバグがあり、正しく表示されない状態のようです。
# 対処法
以前のバージョンに戻して対応しました

```terminal
$ sudo apt-get install code-oss=1.29.0-1539702286
```
また、修正版が出るまで更新されるのを防ぐためにアップデート対象外にします。

```terminal
$ sudo apt-mark hold code-oss
```
修正版がリリースされたら以下のコマンドでアップデート対象にします。

```terminal
$ sudo apt-mark unhold code-oss
```

# 参考サイト
- [Visual Studio Codeのver.1.32は、Raspbianでは未だ使えません！] (https://www.fabshop.jp/visual-studio-code-1-32)
- [Python on a Raspberry Pi using VS Code](https://dev.to/jimbobbennett/python-on-a-raspberry-pi-using-vs-code-2e45)
初めてのJavaScript

#JavaScriptとは
JavaScript（ジャバスクリプト）とは、プログラミング言語のひとつである。Javaと名前が似ているが、全く異なるプログラミング言語である。(Wikipedia参照)

Javaというプログラミング言語は大学の図書館で見たことがあり知っていたのですが、JavaScriptという言語は初耳でマイナーな言語だと思っていたのですが...
これがなんと今ではほぼ全てのWebサイトで使われているとかなんとか。

###で、何ができるの???
JavaScriptは、主にWebサイトやWebアプリの開発によく使われます。Webサイトやアプリではフロントエンド、バックエンドで処理が行われます。フロントエンドは見た目部分、バックエンドは内部の処理などを担当します。JavaScriptは両方の処理に長けています。何はともあれコードを書いて実際に動きを見てみないとJavaScriptについて理解は深まらないでしょう。

#実際に書いてみる
では実際に書いてみましょう。コードを書くためにはediterというコードを書く場所が必要です。自分はVisual Studio Codeを使っています。
[Visual Studio Code - Code Editing. Redefined](https://code.visualstudio.com/)
#Hello World を表示してみる。
```html:sample.html
<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>初めてのJavascript</title>
 </head>
<body>
 <script>
   //ここにjavascriptを書く。
　　window.alert("Hello World");
 </script>
</body>
</html>
```
説明していくとscriptタグで囲んでいる場所以外はHtmlの決まった書き方でscriptタグの中にJavaScriptのコードを書いていきます。
では、scriptタグの中をみてみましょう。window.alert("Hello World")と書かれています。
window.alertは()で指定された文字列をダイアログ表示するための命令です。そして()内に表示させたい文字列を書くのですが、文字列は""で囲わないといけません。
これでダイアログにHello World と表示できたかと思います。ちなみにscriptタグ外にJavascriptのコードはかけないので注意が必要です。

#次回予告
次回の記事はJavaScriptの基本的な記法について書こうと思います。
それでは、また次回会いましょう。
サービス、サービス
vapor xcode実行ができなくてハマった件

下記の記事を参考にVaporでサーバーサイドSwiftの環境構築を行った時に、以下のエラーが出てハマった話。
[VaporでサーバーサイドSwiftを試してみた](https://qiita.com/toshi586014/items/9f763f9ce6a4793d7c8b)

結果から書くと、プロジェクト内のcloud.ymlで定義していたswift_versionとインストールされているswiftのバージョンの不一致が原因だった。

```yml:cloud.yml
swift_version: "4.1.0"
```



以下のコマンドでインストールされているswiftのバージョン確認

```terminal:terminal
$ swift -version
```

※自分の場合swift_version: "5.0.1"に修正して、再度vapor xcodeを実行したら成功した。

```yml:cloud.yml
# swift_version: "4.1.0"
swift_version: "5.0.1"
```

```terminal:terminal
$ vapor xcode
```

これで通った！

***

以下、出力されたエラー↓

```terminal:terminal
$ vapor xcode
Generating Xcode Project [Failed]
/Users/~/Hello: error: manifest parse error(s):
<module-includes>:5:9: note: in file included from <module-includes>:5:
¥#import "copyfile.h"
        ^

～省略～

<unknown>:0: error: could not build Objective-C module 'Darwin'
```
競プロ参戦記 #45 DivRem Number | diverta 2019

今週は実質 ABC/ARC の企業コンでした。

## diverta 2019 Programming Contest

- この連載記事では、着手した問題の考察を自分なりに書いていきます。
    - 前回: [競プロ参戦記 #44 Three Religions | コドフォ #556 Div.2](https://qiita.com/vain0x/items/80cc96b3c83dfd5f17a6)
- 問題の詳細は問題一覧を参照してください。
    - 問題一覧: https://atcoder.jp/contests/diverta2019/tasks

## A - Consecutive Integers

問題概要: N 個の整数 1, 2, .., N のうち連続する K 個を選ぶ選び方は何通りか。

考察:

具体例を試すと簡単に法則性が見つかって、N - K + 1 だと分かります。例えば N=7, K=4 だと4通りです。

```
    N=7, K=4

    1 2 3 4 5 6 7
    ^^^^^^^
      ^^^^^^^
        ^^^^^^^
          ^^^^^^^
```

形式的に考えるなら、選ばれる区間の左端 (最小値) に注目して数えるのがよいです。上の例でいうと 1, 2, 3, 4 の4つ。

一般に m が選ばれる区間の最小値であるためには、m 以上の値が K 個必要です。そのため N から大きい順に K-1 個の値は区間の最小値になりません。N 個のうち K-1 個を除くので、N - K + 1 が答えです。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/diverta2019/submissions/5349162

## B - RGB Boxes

問題概要: 以下の3種類の箱が売られている。これらの箱を購入して、ちょうど N 個のボールを買う方法を数えよ。

- R 個のボールが入った赤色の箱
- G 個のボールが入った緑色の箱
- B 個のボールが入った青色の箱

考察:

精選10問でやったやつです。

赤・緑の箱を購入する個数を全探索すれば、ボールの個数の合計を N にするために買うべき青の箱の個数が確定するので、2重ループを回すことで解けます。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/diverta2019/submissions/5350694

## C - AB Substrings

問題概要: N 個の文字列がある。これらの文字列を好きな順番に並び替えて連結したとき、部分文字列に含まれる `AB` の個数の最大値を求めよ。

考察:

文字列の途中に含まれている `AB` は、連結の順番に関係なく数えられるので無視していいです。これらは最初に数えておくことにします。

後は文字列の連結部分に出現する `AB` の個数を最大化すればいいです。連結部分以外は興味がないので、各文字列の最初と最後の文字以外は除去していいです。結果、文字列は以下の4パターンになります。

- BA
- By
- xA
- xy

(x は B でない任意の文字、y は A でない任意の文字。)

理想的には以下のように A, B がすべて `AB` の形で並ぶようにするとベストです。

```
xA BA BA .. BA By    xA By  xA By  ..  xA By    xy .. xy
```

これは xA, By がどちらも1つ以上存在し、xA, By の個数が等しいという仮定をしています。実際にはコーナーケースを考慮する必要があります。

BA が存在しないときは xA, By を交互に並べて、ペアになった個数だけ `AB` が出現します。これは xA, By の小さい方の個数です。以下、BA が存在するとします。

xA が存在しないときは、BA の左側の B をすべては活用できないので、BA を1つ xA に変換しても `AB` の個数は減りません。同様に By がないときも BA を 1つ By に変換できます。これにより xA, xB が存在することにできて、後は上記のように並べればいいです。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/diverta2019/submissions/5348857

## D - DivRem Number

問題概要: 整数 N が与えられる。N 以下の正の整数 m で N を割ったとき商と余りが等しいとする。そのような m の総和を求めよ。

考察:

N を m で割ったとき商が q で余りが r になるというのを式で表すと以下の通りです。

```rust
    N = q・m + r       (0 ≤ r < m)
```

ここで q = r を代入すると

```
    N = q・m + q = (m + 1)・q
```

となり q が N の約数に限られることが分かります。N の約数は O(√N) しかないので全列挙可能です。

したがって、N の約数 q を列挙して m = (N / q) - 1 が条件を満たすか確認すればいいです。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/diverta2019/submissions/5357508

### 約数の列挙

正整数 N の正の約数 d を列挙するときは以下の2つに注目します。

1. d が N の約数なら N/d も N の約数
2. d ≤ N/d のとき d ≤ √N

1つ目は **約数はペアで出現する** という話です。これは d・(N/d) = N からいえます。例えば N=12 なら以下の通り。

- d = 1 に対して N/d = 12 も約数
- d = 2 に対して N/d = 6 も約数
- d = 3 に対して N/d = 4 も約数

2つ目は **約数のペアのうち小さい方が最大で √N** という話です。例えば N=9 なら最大の約数は √9 = 3。(証明は式変形するだけ。)

そういうわけで √N 以下である「約数のペアのうち小さい方」を列挙すれば大きい方の約数もすべて列挙できて、全体として O(√N) 時間です。

```rust
fn divisors(N: i64) -> Vec<i64> {
    let mut ds = vec![];
    let mut d = 1;
    while d * d <= N {
        if N % d == 0 {
            ds.push(d);
            ds.push(N / d);
        }
        d += 1;
    }
    ds
}
```
VBAちっぷす 「Util＿ProcessLog」

```vb

Option Explicit

Private beginTime As Single
Private log_row As Long

'
' ログ情報を初期化する。
'
Public Sub InitLog()

  ThisWorkbook.Sheets("ログ").Range("A:C").Clear
  log_row = 2
  beginTime = 0
  Call CalcTimer.setBeginTime
End Sub


'
' ログを出力する。
'
Public Sub WriteLog(message As String)

  If log_row = 0 Then
    log_row = 2
    beginTime = 0
    Call CalcTimer.setBeginTime
  End If
  
  Dim currentTime
  currentTime = Format(Now, "yyyy/mm/dd hh:nn:ss")
  
  Dim currentPathTime As Single
  currentPathTime = CalcTimer.getDiffTime
  
  With ThisWorkbook.Sheets("ログ")
    .Range("A" & log_row).Value = currentTime
    .Range("B" & log_row).Value = currentPathTime
    .Range("C" & log_row).Value = message
    log_row = log_row + 1
    

  End With
  
End Sub
```
【初学者】２次元リストが分かりにくかったのでポケモンで考えてみた件


今回は二次元リストがイメージしにくかったので身近なゲームで表現してみました。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

##二次元リストとは
二次元リストとは、リストの要素を２つ用いたもの。要素の数だけ多次元のリストができますが、今回は基礎の２次元を触れていきます。

###二次元リストの作成

```
Bag = [ tool , monster_ball , WAZAmashine ]

tool = [ “キズぐすり”,”いいキズぐすり”,”ふしぎなアメ”]
monster_ball = ["monster","super","hyper","timer","master"]
WAZAmashine = ["なみのり","そらをとぶ","いわくだき"]

＃バッグという項目のなかにtool,monster_ball,WAZAmashineという項目がある

print(Bag[0][1])
	>>> “いいキズぐすり”

```

バッグ→どうぐ→いいキズぐすり
という流れのイメージがです。

###二次元リストの統合
二次元リストでは間のtool,monster_ball,WAZA の部分を省略できます

```
Bag = [ [ “キズぐすり”,”いいキズぐすり”,”ふしぎなアメ”],["monster","super","hyper","timer", "master"],["なみのり","そらをとぶ","いわくだき"]]
```

このように直接繋げることができる

####追加・更新・削除
もちろん単純なリストと同じようにリストの操作も行えます。

#####要素の更新

```
Bag[0][3] = "げんきのかけら"
print(tool)
	>>>[“キズぐすり”,”いいキズぐすり”,”げんきのかけら”]
```
#####要素の追加
```
Bag.append(["いいつりざお", "じてんしゃ", "ポケモン図鑑"])
print(Bag)
	>>>[[“キズぐすり”,”いいキズぐすり”,”ふしぎなアメ”],["monster","super","hyper","timer", "master"],["なみのり","そらをとぶ","いわくだき"]["いいつりざお", "じてんしゃ", "ポケモン図鑑"]]
```
```
Bag[0].append("むしよけスプレー")
print(tool)
	>>>[“キズぐすり”,”いいキズぐすり”,”げんきのかけら”,”むしよけスプレー”]
```
#####要素の削除
```
del Bag[0][1]
print(Bag[0])
	>>>[”いいきずぐすり”,”ふしぎなアメ”]
```


##最後に
今回は多次元リストをイメージするためにポケモンのモデルで考えてみました。他にもわかりやすい例えを発信しているかたがいればコメント欄に共有してください！！