OmniAICreator/Qiita-1.07M huggingface dataset:
Numpy > np.concatenate()と自前のarray結合の処理時間比較 > np.concatenate()が3割ほど速い

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

### 背景

@redshoga さんの[コメント](https://qiita.com/7of9/items/49c101989f7ac8d8f1ec/#comment-3da282737a04d6c23474)においてnp.concatenate()を紹介いただいた。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

Numpyで以前ひっかかったのは、np.append()が遅く、Pythonでの結合にした上でnp.array()にするという処置をしたことがあった。
[TensorFlow > TFRecords > Queue and Threadsでの読込み > 読込みを進めるに連れ、読込み時間が増加する > 犯人はnp.append()](https://qiita.com/7of9/items/761049a8bd5c830a395a)

np.concatenate()は遅いかどうかをJupyterの`%%timeit`で計測した。
[Jupyter Notebook > %timeit range(100) > 処理時間の計測 > %%timeit > 複数文の処理時間の計測](https://qiita.com/7of9/items/72df5443bde6bd3c4b0f)

### 比較

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/99d60c08-f923-44a3-c4d7-2843a9091360.png)

np.concatenate()の方が3割ほど速い。

ソースの可読性も良くなると思われるため、np.concatenate()を使わせていただきます。
LogLevel覚書

前に調べたログレベルの設定メモ。log4j。
でも多分１年近く前のメモ。メモ捨てるのももったいなくて、こちらに記載。

ALL: 全てのレベルを出力
OFF: ログを出力しない

ログレベルが高い(と言っていいのか?下に行くほど詳細)順に、

1. FATAL
2. ERROR
3. WARN
4. INFO
5. DEBUG
6. TRACE

ログレベルを指定しない場合は、ERROR がデフォルト。


Log4Jの設定では
処理段階があって、
RootLogger -> Logger -> AppendeRef -> Appender -> Formatter
各段階で level の制限ができる

Loggerは複数の AppenderRef が指定できるから
Logger で info, でもAppenderRefの一つでは info で、もう一つでは warn みたいなことができる。
RaspbianでJoy-Conを使う

自作携帯ゲーム機を完成させるにあたり、Joy-Conを使えるようにする必要があり軽く調べた。

<a class="twitter-moment" href="https://twitter.com/i/moments/925836568262090757?ref_src=twsrc%5Etfw">自作ゲームハード(仮称: RetroSwitch)</a> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

Joy-Con単体でもBluetoothコントローラとして使用可能だが、「２つのコントローラを組み合わせて１つのコントローラとして使う」にはRaspbian側でのドライバのインストールが必要。

国内外問わず、体系的に記述された記事が見当たらなかったので記事としてあげる。
※Go言語は初めて触るので、勝手がわからず導入が難しかった。

# 使用するもの
・Go言語 ver 1.8以上 (Raspbian用)
・riking/joy-con driver

# 作業前提
・Raspbian系ディストリビューションが起動し、bashが使える状態になっていること
・何らかの方法でインターネットに接続されていること
・Joy-Con(L)(R)2台とも、RaspbianにBluetooth接続されていること
(ペアリングの為に各Joy-Conの側面Syncボタンを長押しする以外は、通常のBT接続手順と変わらないため割愛)

# 作業
以下、piユーザーで作業する前提。

## Go言語のRaspbian向けバイナリをダウンロード

```
wget https://storage.googleapis.com/golang/go1.8.linux-armv6l.tar.gz
sudo tar -C /usr/local -xzf go1.8.linux-armv6l.tar.gz
export PATH=$PATH:/usr/local/go/bin
```

PATHを追記

```:~/.profile
PATH=$PATH:/usr/local/go/bin
```

## joy-con driverのインストール


ドライバをダウンロードしてインストール(コンパイル)する。

```
mkdir -p ~/go/src/github.com/riking
cd ~/go/src/github.com/riking

git clone https://github.com/riking/joycon.git

cd joycon/prog4
go get ./...
```

上記の作業で、 /home/pi/go/bin/jcdriver にJoy-Conのユーティリティ/ドライバがインストールされた。

# 接続テスト

予め2台のJoy-ConをRaspbianに接続しておく。

ユーティリティを起動する。

```
sudo /home/pi/go/bin/jcdriver
```
下図のように、[console]>　という文字が表示された後に"Connected to ～"が2列続けば、正常に2台とも接続・認識されている。

![Gyazo - 4dcee48c911132d0213ea07e7afae6b9.png](https://qiita-image-store.s3.amazonaws.com/0/59328/fdc99e6b-4b7f-85b7-73c6-6293b1618eb4.png)

この状態で、各Joy-Conの**ZL/ZR(トリガーボタン)を同時押し**すると、それぞれのJoy-Conの接続インジケータが1プレイヤーの位置に固定され、OS上から一つのコントローラとして認識できるようになる。
ここで、誤ってL/Rを同時押しするとエラーになり強制終了されるので注意。

# コントローラの設定

筆者はRetroPieで使用する前提だったため、RetroPieのController Configration上で割り当て設定をした。

[Controller Configuration](https://github.com/RetroPie/RetroPie-Setup/wiki/Controller-Configuration)

割り当て自体は問題がなかったものの、実際にゲームを起動すると**入力が二重にされる問題**が発生。
単体のJoy-Conも個別のコントローラとして認識していたため、RetroArchの設定を変更して1P以外のコントローラの割り当てを解除した。
RetroArchについては筆者もあまりわからないため詳細説明は控える。

別のディストリビューションでも、似たような問題が発生する可能性があるだろう。


# ユーティリティ自動起動設定

正常動作が確認できれば、OS起動時に自動実行されるよう、rc.localに追記する

```:/etc/rc.local
/home/pi/go/bin/jcdriver &
```

強制終了された際のリスタートまで考えるのであればデーモン化が望ましい。



# 参考

・Install Golang 1.8 on Raspberry Pi
https://gist.github.com/marcelitocs/19bdfd22befecbe0d3eef3271260e528

・drew-wallace/switchberry: A guide to setting up the SwitchBerry
https://github.com/drew-wallace/switchberry

joy-conドライバインストールはSwitchBerryのものを参考にさせていただいた。


# おきまりごと
・本ページの情報/データを参照/使用して発生したいかなる不利益/損害について責任を負いません。
・記事内容の無断転載は認めません。本ページへのリンクまたは作者名(クレウス)を含んでください。
・必要に応じて随時追加/修正を行います。
KotlinでFuelとMoshiを使ってjsonをPOSTする

# 参考

* [HTTPクライアントライブラリFuelを初めて使ってみた](https://qiita.com/fanfanta/items/c4643656ac8fdbec38ea)
* https://github.com/kittinunf/Fuel
* [Kotlinと相性が良いMoshiのkotlin extensionを使う](https://qiita.com/egugue/items/f1f35c250f7a25768751)
* https://github.com/square/moshi

# 例

* moshiを利用して、リクエストをJSON文字列に変換
* FuelでPOSTする

```java
  val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
  val requestAdapter = moshi.adapter(SampleRequest::class.java)
  
  val header: HashMap<String, String> = hashMapOf("Content-Type" to "application/json")

  val sampleRequest = SampleRequest(
    name = "XXXXX",
    age = 11
  )
  val (_, _, result) = Fuel.post("http://example.com/sample/api").header(header).body(requestAdapter.toJson(sampleRequest)).responseString()

  val (data, _) = result

  println(data)
```

# Gradleの設定　

```java
dependencies {
...
  compile "com.squareup.moshi:moshi:1.5.0"
  compile "com.squareup.moshi:moshi-kotlin:1.5.0"
  compile 'com.github.kittinunf.fuel:fuel:1.11.0'
  compile 'com.github.kittinunf.fuel:fuel-gson:1.11.0'
...
}
```
pySpherepts > sphereptsのNumpy、Scipy実装 > 結果: sphereptsと同じものが得られた

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

### 関連

https://github.com/gradywright/spherepts

### pySpherepts

上記のMATLABコードの一部である[getIcosNodes.m](https://github.com/gradywright/spherepts/blob/master/code/getIcosNodes.m)をNumpy+Scipy実装した。
名称は「pySpherepts」とする。

コードは中身を整理した上でGitHubに上げる予定。

### pySpherepts結果

使ってみた。

```test_getIcosNode_171126.py
import numpy as np
import getIcosNodes_171126 as gIN

xs, tris = gIN.getIcosNodes(4,0)
print(xs)
np.savetxt('res_IcodsNodes_4_0_171126.txt', xs, fmt="%.5f")
```

上記の結果をMATLAB上で読込み、オリジナルのsphereptsの表示プログラムplotSphNodesで表示してみた。

```test_numpyIcosNodes_171126.m
function test_numpyIcosNodes_171126()
    xs = load('res_IcodsNodes_4_0_171126.txt')
    plotSphNodes(xs)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9f42933f-cf07-56e6-bab8-aa822b6c1a55.png)

### spherepts結果

オリジナルのsphereptsの結果

```matlab
>> [x0,tri0] = getIcosNodes(4,0);
>> plotSphNodes(x0)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2f974e21-9f5e-111c-ee95-fe0cac3b7984.png)

同じものが得られた。

MATLAB分からなかったので、勉強しながら20時間はかかっただろうか。
Makeのsubstで半角スペースを除去する

半角スペースを除去する方法が分からなかったので調べた。

# 参考
http://blog.jgc.org/2007/06/escaping-comma-and-space-in-gnu-make.html

# 結論
```make
FOO = 1 2  3
BAR = $(subst $() ,,$(FOO))  # BAR = 123
```

# 解説
- 普通のsubstの使い方はこう。

```make
FOO = 1a2aa3
BAR = $(subst a,x,$(FOO))  # 1x2xx3
```

- 2文字目以降の半角スペースは同じように置換できる。

```make
FOO = 1a 2a a 3
BAR = $(subst a ,x,$(FOO))  # 1x2xx3
```

- でも先頭が半角スペースだと、トークンを区切る半角スペースと区別できない。

```make
FOO = 1 a2 a3
BAR = $(subst  a,x,$(FOO))  # 1 x2 x3
```

- なので、空の文字列が入った変数を先頭においてやる。

```make
EMPTY =

FOO = 1 a2 a a3
BAR = $(subst $(EMPTY) a,x,$(FOO))  # 1x2xx3
```

- `$()`に値を与えるのは（おそらく）不可能なので、常に空文字列が入っていることになる。これを上記の`$(EMPTY)`として使う。

```make
FOO = 1 a2 a a3
BAR = $(subst $() a,x,$(FOO))  # 1x2xx3
```
Railsの主キーでUUIDを使うメモ

## 追記

[RailsのモデルIDにUUIDを使う（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_01_04/50565)

こちらの方が正確で良さそうです。

リンク先にも書いてありますが、UUIDのidではActiveRecordのfirst, lastなどのメソッドが期待通りに動きません。
したがって、

```rb 
     it '新規作成されたエントリーにリダイレクトされる' do
        post :create, params: { user_id: user, entry: valid_attributes }
        expect(response).to redirect_to(Entry.last)
     end
```
こういうテストが場合によって通らなくなりました。正しいかわかりませんが、`Entry.order(:updated_at).last` と修正して１番最新につくられたものを取得しています... 

---

- Rails 5.1.4
- PostgreSQL 9.6.4

posts/63
comment/2 のように
パス内に記事数などが露出してしまうのが気持ち悪かったので主キーにuuidを使います

migrationファイルのcreate_tableの引数にid: uuidを指定

```rb
create_table :users, id: :uuid do |t|
  t.string :email
  ...
end
```

のような感じで・

```rb 
[1] pry(main)> User.first
  User Load (0.4ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 1]]
=> #<User:0x00007fe81e37dd50
 id: "1fb04a9d-9006-4887-be85-48fe54d34d45",
 email: "admin@example.com",
...
```

IDが連番じゃなくなりました。


ローカルでは使えていたがherokuにpushしてからmigrateしようとすると ` function gen_random_uuid() does not exist ` と怒られるので、

```shell-session
 $ heroku pg:psql                                                                                                                      
=> CREATE EXTENSION "uuid-ossp";
=> CREATE EXTENSION pgcrypto;
=> \q
 $ heroku run rake db:migrate 
.....
```


一番初めの日程にマイグレーションファイルを作成すればよかったかもしれない  (未確認）

```
class EnablePgcryptoExtension < ActiveRecord::Migration[5.1]
  def up
    enable_extension 'uuid-ossp'
    enable_extension 'pgcrypto'
  end
end
```


## 参考にさせていただいたページ

- [rails+postgresでidにuuidを使う](http://docs.komagata.org/5455)
- [heroku postgresのDBにローカルPCから遠隔アクセスする](https://qiita.com/emadurandal/items/b955a4eaa273529ebba0)
MySQL ShellをEC2にインストール

# インストール方法

EC2のAmazon Linux AMI 2017.09.1にMySQL Shellをインストールしてみた。

```
$ wget https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm
$ sudo rpm -Uvh mysql57-community-release-el6-11.noarch.rpm

$ yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community       無効
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - Sou 無効
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community       無効
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - Sou 無効
mysql-connectors-community/x86_64  MySQL Connectors Community        有効:  34+8
mysql-connectors-community-source  MySQL Connectors Community - Sour 無効
mysql-tools-community/x86_64       MySQL Tools Community             有効:    51
mysql-tools-community-source       MySQL Tools Community - Source    無効
mysql-tools-preview/x86_64         MySQL Tools Preview               無効
mysql-tools-preview-source         MySQL Tools Preview - Source      無効
mysql55-community/x86_64           MySQL 5.5 Community Server        無効
mysql55-community-source           MySQL 5.5 Community Server - Sour 無効
mysql56-community/x86_64           MySQL 5.6 Community Server        無効
mysql56-community-source           MySQL 5.6 Community Server - Sour 無効
mysql57-community/x86_64           MySQL 5.7 Community Server        有効:   219
mysql57-community-source           MySQL 5.7 Community Server - Sour 無効
mysql80-community/x86_64           MySQL 8.0 Community Server        無効
mysql80-community-source           MySQL 8.0 Community Server - Sour 無効

$ sudo yum -y install mysql-shell
...
完了しました!

$ which mysqlsh
/usr/bin/mysqlsh
```

2017/11/25時点では下記のパッケージがインストールされた。

+ python26-2.6.9-2.89.amzn1.x86_64  
+ python26-libs-2.6.9-2.89.amzn1.x86_64  
+ mysql-shell-1.0.10-1.el6.x86_64

アンインストールは以下。

```
$ sudo yum autoremove mysql-shell
...
Dependencies Resolved

======================================================================================================================================================
 Package                           Arch                       Version                                Repository                                  Size
======================================================================================================================================================
Removing:
 mysql-shell                       x86_64                     8.0.12-1.el6                           @mysql-tools-community                      25 M
Removing for dependencies:
 python26                          x86_64                     2.6.9-2.89.amzn1                       @amzn-updates                               19 M
 python26-libs                     x86_64                     2.6.9-2.89.amzn1                       @amzn-updates                              1.7 M

Transaction Summary
======================================================================================================================================================
Remove  1 Package (+2 Dependent packages)
...
```
今更ですが、RaspberryPi に Ruby をインストールして Lチカ してみる。


いろいろありまして、RaspberryPi を入手したので、Lチカをしてみました。
Lチカ についてはネットで調べると詳しい情報がたくさんあるのですが、折角なので記録しておきます (^^

## Ruby のインストール
RaspberryPi の OS は raspbian を使います。
apt-get でインストールしてもいいですが、現時点ではバージョンが 2.1.x でしたので、rbenv を使ってインストールします。

```
# apt-get update
# apt-get install git

$ cd ~
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

$ cd .rbenv
$ mkdir plugins
$ cd .plugins
$ git clone git://github.com/sstephenson/ruby-build.git

$ cd ~
$ source .bash_profile
```

`$ rbenv` でヘルプが表示されたら成功です。
次に ruby をインストールするのに必要なモジュールもインストールします。

```
# apt-get install autoconf
# apt-get install libssl-dev libyaml-dev
# apt-get install bison build-essential
# apt-get install libreadline6-dev
# apt-get install libncurses5-dev
```
でインストール

```
$ rbenv install 2.4.2
```
これはすごく時間かかります。気長に待ちましょう(^^
完了したら

```
$ rbenv rehash
$ rbenv global 2.4.2
```
として、全体で使えるようにします。
が、RaspberryPi の GPIO を使う場合は root 権限が必要みたいです。
sudo でも ruby が使えるようにリンクを張っておきます。

```
# ln -s ~/.rbenv/shims/ruby /usr/bin/ruby
# ln -s ~/.rbenv/shims/irb /usr/bin/irb
```

## LED点灯回路
回路の方を作ります。
＃配線をするときは電源を切ってから行いましょう。→ `# shutdown -h now`

回路図は以下。

![LED_Test.png](https://qiita-image-store.s3.amazonaws.com/0/59523/44002182-f321-c589-710a-35e93fdc0104.png "LED_Test.png")

今回は GPIO 21番に 100Ω の抵抗と LED を繋ぎます。
＃回路図作成には [Qt-BSch3V](http://www.vector.co.jp/soft/mac/business/se481361.html) を使用させて頂きました。

## GPIO への出力
`/sys/class/gpio` が GPIO を操作する時に使うパスみたいです。

### 手動で信号出力してみる
```
$ cd /sys/class/gpio
$ echo 21 > export

$ ls
export	gpio21	gpiochip0  gpiochip100	gpiochip128  unexport
```
21 は GPIO の番号です。
export へ GPIO の番号を渡すと `gpio21` というリンクができます。＃gpio21番へのポートが開いた感じですね。
あとはこれに対して操作します。

```
$ echo out > gpio21/direction
$ echo 1 > gpio21/value
```
これで LED が点灯したと思います。

direction に 入力(in) か 出力(out) かを書き出して、value に on(1)/off(0) を書き出します。
消灯する場合は

```
$ echo 0 > gpio21/value
```
とすればOKです。

最後は開いたポートを閉じておきます。

```
$ echo 21 > unexport
```

### ruby で信号出力してみる
GPIO を操作する gem があるので、それをインストールします。
https://github.com/jwhitehorn/pi_piper

```
$ gem install pi_piper
```

そしたらコードを書いてみます。
作業フォルダに移動して、

```
$ cd ~/src
$ vi led_onoff.rb
```

```ruby:led_onoff.rb
require "pi_piper"

pin_a = PiPiper::Pin.new(:pin => 21, :direction => :out)

loop do
  pin_a.on
  sleep 1
  pin_a.off
  sleep 1
end
```

実行すると 1秒点灯 - 1秒消灯 を繰り返します。

```
# ruby led_onoff.rb
```

以上で Lチカ 完了です。

## まとめ
ハードウェアを制御するのってやっぱり緊張します。
出力とLEDの間に抵抗を入れていないサイトもありますが、失敗したら壊れるってのはやっぱり怖いです。
＃なので 100Ω 入れました。

`V = RI` という公式は知っていますが、実際にいくらになるのかってのがやっぱりよくわからないですね。。。

LEDを光らすためには 10mA 程度必要というお話しを聞いたことがありました。
今回は `V = 3.3[V]` で `I = 0.01[A]` なので、 R は `3.3 / 0.01 = 330` だと思うのですが、LEDにも光るためには電圧が必要で、だいたい 2V 程度らしく、実際に抵抗にかかる電圧は `3.3 - 2 = 1.3[v]` なので、`1.3 / 0.01 = 130` ということのようです。

調べればわかることなのかもしれませんが、LEDを光らすためには 10mA程度の電流を流すことと、その際に 2V程度の電圧降下がある、ということが分からなければ、安全な回路が組めません。
＃何に当たればそういうことが書いてあるのかがわからない。。。
そういうところが難しい点なのかなと思います。
シェルスクリプトの日付処理を拡充する（年始、年末、月初、月末、週初、週末を取る）

シェルスクリプトで月末ってどうやって取るんだろう？

ということで、調べて見ると以下のような感じだった。

```sh
date -d "2017-11-01 +1month -1day" "+%Y-%m-%d"
```

1. 指定の日付を月初にする（11月1日にする、これがポイント）
2. 1ヶ月加算（12月1日にする）
3. 1日減算（12月1日の前日にする＝11月30日）

なるほどなぁと思った。

PHPとかだとCarbon使ったり、JavaScriptだとmoment.js使ったりしているんですが、dateコマンドにこれらの機能があるといいなと思いました。
コマンド化は出来ていませんが、シェルスクリプトで使えるとちょっとしたデータ解析とか、調査が捗るかなと思ったので、シェル関数にしてみました。

```sh:date_functions.sh
date_init_given_date() {
    format=${1}
    given_date=${2}
    if [ "${given_date}" = "" ];
    then
        date "${format}"
    else
        date "${format}" -d "${given_date}"
    fi
}

date_start_of_year() {
    format=${1}
    given_date=$(date_init_given_date "+%Y-01-01" "${2}")
    date -d "${given_date}" "${format}"
}

date_end_of_year() {
    format=${1}
    given_date=$(date_start_of_year "+%Y-%m-%d" "${2}")
    date -d "${given_date} +1year -1day" "${format}"
}

date_start_of_month() {
    format=${1}
    given_date=$(date_init_given_date "+%Y-%m-01" "${2}")
    date -d "${given_date}" "${format}"
}

date_end_of_month() {
    format=${1}
    given_date=$(date_start_of_month "+%Y-%m-%d" "${2}")
    date -d "${given_date} +1month -1day" "${format}"
}

date_start_of_week() {
    format=${1}
    given_date=$(date_init_given_date "+%Y-%m-%d" "${2}")
    dow=$(date "+%w" -d "${given_date}")
    date -d "${given_date} -${dow}day" "${format}"
}

date_end_of_week() {
    format=${1}
    given_date=$(date_init_given_date "+%Y-%m-%d" "${2}")
    dow=$(date "+%w" -d "${given_date}")
    diff=$(expr 6 - ${dow})
    date -d "${given_date} +${diff}day" "${format}"
}
```

```sh:test_date_functions.sh
#!/bin/sh

source date_functions.sh

date_start_of_year "+%Y-%m-%d"
date_end_of_year "+%Y-%m-%d"

date_start_of_year "+%Y-%m-%d" "2017-01-23" # 2017-01-01
date_end_of_year "+%Y-%m-%d" "2017-01-23" # 2017-12-31

date_start_of_month "+%Y-%m-%d"
date_end_of_month "+%Y-%m-%d"

date_start_of_month "+%Y-%m-%d" "2017-01-23" # 2017-01-01
date_end_of_month "+%Y-%m-%d" "2017-01-23" # 2017-01-31

date_start_of_week "+%Y-%m-%d"
date_end_of_week "+%Y-%m-%d"

date_start_of_week "+%Y-%m-%d" "2017-11-05" # 2017-11-05
date_end_of_week "+%Y-%m-%d" "2017-11-05" # 2017-11-11
```

地味にこういう痒いところに手の届かないパターンがシェルやLinuxコマンドにはあるかもしれない。。。
ひとまず最近シェルスクリプトで月末を取りたかったときに調べたものの備忘録と今後の活用のために共有です。
MySQL Shellでコマンドラインからsqlをバッチ実行する

# 用途
UnitTestの初期化、終了時に、コマンドラインからSQLをバッチ実行したい。
UnitTest中は、インターラクティブな入力ができないので、コマンドラインからパスワードも指定したい。
SQLは外部ファイル化したい。

# コマンド
`--passwords-from-stdin`オプションと`--password=[password]`の両方を指定します。

```
$ mysqlsh --host=[host_name] --port=[port] --user=[user] --password=[password] --sql --passwords-from-stdin --file=[sql_file_path]

mysqlx: [Warning] Using a password on the command line interface can be insecure.
...
(SQL実行結果)
```

# 注意事項
コマンドラインの入力情報は、漏れる可能性があるので、テスト用アカウントを作成して実行すること。

# 備考
ファイルの指定は、`--file`オプションの代わりにリダイレクトでも可能。

```
$ mysqlsh --host=[host_name] --port=[port] --user=[user] --password=[password] --sql --passwords-from-stdin < [sql_file_path]
```

コマンドラインに直接SQLを指定する場合は`--execute`オプションを使う。

```
$ mysqlsh --host=[host_name] --port=[port] --user=[user] --password=[password] --sql --passwords-from-stdin --execute='[SQL]'
```

複数行のSQLだったら`;`で区切って指定する。

```
$ mysqlsh --host=[host_name] --port=[port] --user=[user] --password=[password] --sql --passwords-from-stdin --execute='[SQL];[SQL];'
```

SSLで通信したい場合は、Amazonからパブリックキーを取得して（[https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem](https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem)）、`--ssl-ca`オプションを指定します。

```
$ mysqlsh --host=[host_name] --port=[port] --user=[user] --password=[password] --sql --passwords-from-stdin --ssl-ca=[pem_file_path] --file=[sql_file_path]
```
【Heroku】GitHubで作成したFlaskアプリをHerokuに連携させる

## はじめに
すでに自分が`github`で作った`Flask`アプリを`Heroku`にデプロイするために必要なことをまとめました

## 1.準備
1. [Herokuの公式サイト](https://dashboard.heroku.com/)で、アカウントを登録します。

1. Getting Startedの[set up](https://devcenter.heroku.com/articles/getting-started-with-python#set-up)から`Heroku`をダウンロードします

1. Personal appsから`new`を書かれたボタンを押して[アプリを作成](https://dashboard.heroku.com/new-app)します。
この時、アプリ名はなんでもいいですが、関連するのが望ましいとは思います。

## 2.GitHubアカウント連携
<img width="1280" alt="herokuA.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/0a85a6b7-116e-6592-3b12-6220c3c7c645.png">

作成したアプリを押すと、↑のような画面になるので、`Deploy`タブを選択し、`Deployment method`の`GitHub`を押します。

そのあとは、自分のデプロイしたいリポジトリを選びます。

<img width="1280" alt="herokuB.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/3b644e20-ff96-9d9a-b9e5-f3330aa0230e.png">

↑この状態になってればOKです

## 3.必要ファイルを作成
自分のデプロイしたいリポジトリにファイルを三つ作成します。
terminalなどで、リポジトリのディレクトリのルートに入り以下を実行します

```
$ pip install gunicorn
$ pip freeze -l > requirements.txt
$ echo "web: gunicorn 起動ファイル名:app --log-file -" > Procfile
$ echo "pythonの環境" > runtime.txt
```

**例** `manage.py`を`python-3.6.3`で起動するなら、

```
$ pip install gunicorn
$ pip freeze -l > requirements.txt
$ echo "web: gunicorn manage:app --log-file -" > Procfile
$ echo "python-3.6.3" > runtime.txt
```

## 4.デプロイ
先ほどの変更をそのままpushすれば反映されます

```
$ git add .
$ git commit -m 'Heroku'
$ git push origin master
```

## 5.確認
```
$ heroku login
$ heroku open --app 自分の作成したアプリ
```
これで確認できるはずです。ちなみに、若干のタイムラグがあるので即時反映はされません。

できない場合は、

<img width="1280" alt="herokuB 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/c0416fed-e8ad-c5c8-8b52-9e8d2cf85631.png">

`Deploy Branch`を押して、下の方に出て来る`View`を押して確認してください

## おわりに
参考にしたサイトは、

* [Flask を触ってみる + Heroku で動かす](https://qiita.com/sqrtxx/items/2ae41d5685e07c16eda5)
* [HerokuとGitHubの連携を試してみました](http://tyoshikawa1106.hatenablog.com/entry/2015/08/12/002325)

です
keras を用いた放射能汚染区域の推定

#keras とは、
Google製のA.I.関連ライブラリである tensowflow を簡単に扱うためのライブラリ？ということでいいかな？
というわけで、本件の前提として最低 python3系 と keras のインストールが必要です。
当方では、とりあえず Anaconda を Windows7 64bit版に入れて、keras を追加したようなかっこうです。（そいつらのインストール方法は他に譲ります。）

#keras の例題としては、
MNIST（文字認識ネタで死ぬほどよく出てくるやつ）とかは飽きた、ていうか、入力データが画像だと前処理がややこしいというか、初心者向けで、もっと全体を見渡せるような、軽くて簡単な数値入力～数値出力～視覚化、みたいな例題があれば初心者としてはうれしいではないかと。
＃自分も思い切り初心者だし。

で、本件ではどういう課題を想定するか、なんですが、、

#あるヤバい施設の周囲の放射能レベル
をいくつかの地点で測り、**危険だった地点の座標と、安全だった地点の座標**とを、ニューラルネットワークで構築したモデルに学習させ、**危険区域がどんな広さ・形なのか**を推定しようという作戦です。

これにより、**あなたの家が危険区域に入っているかどうか、が一目瞭然になる！**というわけです。
いや・・決して実際のデータではないです！　架空です、架空。

入力値は、実際なら何ベクレルとかいう数値になるのでしょうけど、本件ではとりあえず、測定地点のXY座標と、そこで測定した放射能レベルが危険値なのか安全値なのか、という二値の判定をインプット（教師データ）として学習させます。

#入力データのイメージ ：
測定地点の座標と、そこの放射線が危険レベル(=1)かどうか、という判定。
たとえば、
`[東経=135.01, 北緯=35.01, 危険度=0 (ここは安全レベル)]
　：
[東経=135.05, 北緯=35.05, 危険度=1 (ここは危険レベル)]
　：`
で、入力データをプロットするとこんな感じ。
![input_image.png](https://qiita-image-store.s3.amazonaws.com/0/216556/903274e5-885f-a39d-eab2-71e9b61f88d1.png)


#ニューラルネットワークの形状（Shape）：
２－３－２の、かなりベーシックなやつにします。
（世間では**ディープなんとか**の話でもちきりですが、こちらは全然ディープではありません。）
![nn232.png](https://qiita-image-store.s3.amazonaws.com/0/216556/b180bf6f-ee35-2e9a-cf1e-32ead5885c9a.png)
出力層は1個にしてゼロイチで判定してもいいんですが、成行き上２つにしました。
（実は、元ソースはMNISTの4--9 判断のチュートリアルからパクってて、
　出力をひとつにする修正方法がわからない・・）
なお、後で隠れ層と出力層にバイアスを追加したが、図示してません。

#出力例：
で、危険区域の形をビジュアルに示すことが目標（アウトプット）です。
上記の入力をモデルに食わせると、次のような区域が推定されました。
![output_image.png](https://qiita-image-store.s3.amazonaws.com/0/216556/60f77bc6-e2cc-d673-26a3-9fdded551a35.png)

（測定地点の座標は乱数を用いているので、再実行してもこの通りにはなりません。）

ところで、上の出力イメージの**どこがエライのか？**ってわかりますか？
赤い点と青い点の境界は**「非線形分離」**を表現している、と言えるんではないしょうか？
すなわち、2次元平面では分類の境界が1本の直線で表せるならば**「線形分離可能」**とか言われます。
しかし本件では明らかに、危険区域と安全区域は1本の直線では分けられない。
そこで、隠れ層が（ひとつ）あるニューラルネットワークを採用することにより、
直線では表せない（＝非線形の）境界線を求められる、という理屈を**「一目瞭然」**に
表現できているのです！　エライ！

#ソースコード：
[https://github.com/uminor/radioactive_area](https://github.com/uminor/radioactive_area)

上のリンクから、radioactive_area.py をとってきて、

 `python radioactive_area.py 5000`

とかで走らせます。5000 というのは学習の繰り返し数（エポック）です。
入力データの座標生成に乱数を用いているため、再実行しても上記の通りにならず、（5000回では）収束が見えない場合もあります。

#学習曲線

ログをリダイレクトして、上記付属のツール log_analyzer.p で読ませる
 `python radioactive_area.py 5000 >log.txt
 log_analyzer.py log.txt >learning_curve.csv`
と、学習曲線（損失と精度）のcsvデータが出力されます。

これをExcelで読み込ませてグラフを作ってみると、
![learning_curve_image.png](https://qiita-image-store.s3.amazonaws.com/0/216556/a8cd8655-7ef9-85c1-c3b3-b85f925f0131.png)

こんなかんじ。
- 横軸がエポック回数。
- loss が損失関数。
- acc が学習用データに対する精度で、１に近づけば完璧だが、データによる。
　今回は評価用データは用意していない。つまり交差妥当性評価はおこなっていない。

#最適化関数のカスタマイズ
（ソースにコミット済み）
≪変更前≫
`model.compile(loss = 'sparse_categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy'])]`
≪変更後≫
`from keras.optimizers import SGD`
`　:`
`sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = sgd, metrics = ['accuracy'])`

＃カスタマイズといっても適当にサンプルソースからコピペしただけ。。
これによって学習の収束が10倍ぐらい速くなった感じ！

その後、隠れ層と出力層にバイアスを考慮してなかったのを追加。
`model.add(Dense(units = hidden_units, input_dim = 2, use_bias=True))`
`model.add(Dense(units = 2, use_bias=True))`
福岡Ruby会議02 スライドまとめ

福岡Ruby会議02に参加してきました。  
Rubyは好きなんですけど、がっつりやってるわけでもないので理解できてないことも多いので、後でもう一度読むために公開されているセッションをまとめました。  

- twitter(#fukuokark02)とGoogle検索で見つけたものです
- スポンサーLT大会はスライドが見つからなかったのでとりあえず一つにまとめてます
- 足りないものは編集リクエストしてもらえると助かります

## タイムテーブル
|トラック1|トラック2|
|---|---|
| [A Ruby Programming Episode](https://speakerdeck.com/snoozer05/a-ruby-programming-episode-ruby-is-my-glasses-my-stationery-and-my-language) / 島田浩二 |[Rubyで書くParser (自力かライブラリか、それが問題だ）](https://speakerdeck.com/yotii23/rubydeshu-kuparser-zi-li-karaiburarika-soregawen-ti-da) / 鳥井雪 |
|[めんたいトーク #1: メドピアの全力Rails化取り組み晒します](https://speakerdeck.com/fukumura/metohiafalsequan-li-railshua-falsequ-rizu-mishai-simasu) / 福村彰展（メドピア株式会社 執行役員 CTO） ||
| [Keynote: Finding Ruby Again](https://speakerdeck.com/a_matsuda/finding-ruby-again) / 松田明 |  |
| めんたいトーク #2:マネーフォワードにおけるRubyエコシステム事例の紹介と、CTOより福岡の皆様へご挨拶 / 中出匠哉（株式会社マネーフォワード CTO） 卜部昌平（同 フルタイムRubyコミッター）| |
| [Rustで書いたライブラリをRuby/mrubyから呼び出す実践的な方法](https://speakerdeck.com/mizzy/mruby) / 宮下剛輔 | [Railsチュートリアルを支える継続的組版技術](https://speakerdeck.com/yasulab/continuous-integration-for-ebook) / 安川要平|
| [めんたいトーク #3: mockmockを支える技術](https://speakerdeck.com/mockmock/mockmockwozhi-eruji-shu) / 毛利啓太（株式会社Fusic 技術開発部門 mockmock開発チーム） 高瀬昭弘（同 mockmock開発チーム）  |  |
| スポンサーLT大会   | [コンパイル時計算への招待](https://speakerdeck.com/takecheeze/konpairushi-ji-suan-hefalsezhao-dai) / take-cheeze |
| [200万ドメインのHTTPS化を見据えたmrubyによる大規模証明書管理アーキテクチャ サーバ台数を100分の1にする技術](https://speakerdeck.com/matsumoto_r/2-millions-cert-by-mruby) / 松本亮介| [なぜRubyだったのか？Rubyで成長したOSS](https://speakerdeck.com/k1low/fukuokark02)  / 小山健一郎|
| 飛び梅トーク: Cookpad と Ruby / 庄司嘉織（クックパッド株式会社 技術部部長/エンジニア統括マネージャ）  |  |
| [Keynote: Rubyにおけるトレース機構の刷新](http://atdot.net/~ko1/activities/2017_fukuoka_rubykaigi_02.pdf) / 笹田耕一 |  |
ACIDの意味がわからない！

## まえがき
ACID特性とはトランザクションが満たさなければいけない4つの性質である。最近はNoSQLとリレーショナルデータベースの対比で用いられることも増えてきたため、きちんと意味を理解したい。

## トランザクションとは
現実世界における1つの処理、例えばATMを利用してお金を振り込むという処理をすると、銀行のシステム内部では複数のSQLが実行される。簡単に言えば、依頼人の残高をUPDATEして(減らして)、振込先の残高をUPDATEする(増やす)のである。この2つのSQLはどちらか片方だけ実行しても無意味なのであり、両方実行されて初めて現実世界においてお金を振り込んだことになる。現実世界の1つの処理に対応した複数のSQL(この例でいえば、2つのUPDATE文)のかたまりをトランザクションと呼ぶ。

## 想定するシチュエーションとそれを実現するトランザクション
ACIDを語るときは、銀行の入出金のシチュエーションを考えるのが良い。ここでは以下のシチュエーションを想定する。

__AさんはBさんにX円送金する。__

さて、上記のシチュエーションはデータベースの世界ではどのようにして実現されるだろうか。例えば、銀行口座というテーブルがあり、Aさんの残高、Bさんの残高を保存しているとしよう。すると、Aさんの残高からX円引き、Bさんの残高にX円足せば送金できる。したがって、このシチュエーションは、次の2つのSQLによって実現されるだろう。

1. UPDATE TABLE 銀行口座 SET 残高 = 残高 - X WHERE 名前 = 'A';
2. UPDATE TABLE 銀行口座 SET 残高 = 残高 + X WHERE 名前 = 'B';

この2つのSQLを1つのトランザクションとして実行するとき、トランザクションが満たすべき4つの性質(Atomicity,Consistency,Isolation,Duration)についてそれぞれ説明する。これらの性質が満たされないとどんな不具合が起きるかという点から理解すると良いと思う。

## Atomicity(原子性)
Atomicityとは、トランザクションが完了した時点において、トランザクションの中身がすべて実行完了したか、まったく実行されていないかのどちらかしか起こらないという性質である。例えば、1のSQLは実行したが2のSQLは失敗した、という中途半端な状態でトランザクションが終了することは許されない。現実世界においては、送金完了したか、送金失敗したかのどちらかしかない。もしこの性質を満たさないとすれば、送金の途中で取引が終了してしまう可能性がある。

## Consistency(一貫性)
Consistencyとは、トランザクションの実行完了ごとにデータベースが一貫性を維持するという性質である。データベースの一貫性とは、正常な状態から正常な状態へ遷移することである。異常な状態とは、残高が負の値になるなどである。もしこの性質を満たさないとすれば、トランザクション終了後にAさんの残高がマイナスになってしまう可能性がある。

## Isolation(独立性)
Isolationとは、トランザクションの実行は、他のトランザクションに影響を受けないし、影響を与えないという性質である。この性質が満たされないとすれば、AさんとCさんが同時にBさんに送金した場合に、どちらかの送金が消失する可能性がある。

## Duration(永続性)
Durationとは、トランザクションの実行により行われたデータベースへの変更は永続するという性質である。銀行口座というテーブルが保存しているデータは、過去のすべての入出金のトランザクションの積み重ねである。もしこの性質が満たされないとすれば、過去に行った送金処理がなかったことになるということが起こりうる。

## あとがき
ACID特性を理解するには、現実世界とのつながりを考える必要があるなと感じました。
AIで競輪予想 その１

#環境準備編
以下の順番で環境設定を行っていきます。
1.AWS（EC2）にubuntuを立ち上げる
2.MySql（5.6.16-1~exp1 (Ubuntu)）のインストール
3.Pythonのインストール
4.seleniumのインストール

##1.AWS（EC2）にubuntuを立ち上げる
ここはできる前提で。

##2.MySql（5.6.16-1~exp1 (Ubuntu)）のインストール
[Ubuntu 16.04へMySQL 5.6をインストールする方法](https://qiita.com/tabimoba/items/cfa20294390e58ff478f)を参考にした。

```
$ sudo -s
# add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty universe'
# apt-get update
# apt install mysql-server-5.6
# apt install mysql-client-5.6
```
途中、MySQLのrootのパスワードを聞かれます
![mysql.png](https://qiita-image-store.s3.amazonaws.com/0/209991/054f3994-d30a-e335-5f30-000e7d11d6dd.png)

インストールが終了したら、MySQLを起動します

```
# service mysql start
# mysql -u root -p
```

今晩はここまで。
活性化関数　Swish

<h1>活性化関数　Swish</h1>
<h3>前提</h3>
DeepLearningで、活性化関数として用いられるrelu関数は、安定して良い精度を出せるものとして様々なモデルに使われているそうです。(知らなかった...)
しかし、限界はあるので、reluに変わる活性化関数の研究はつねに行われてきました。そこでgoogleの社員によって発見されたのがswishです。



<h3>swish関数</h3>
　  <h5>**f(x)=x·sigmoid(βx)**</h5>
<h3></h3>
 これを使っていろいろなデータで検証したところ、reluと比べて、平均して0.7％くらい精度が上がったらしいです。今まで提唱された他の活性化関数と比べても、様々な種類のデータセットに対して良い精度が出せて汎用性が高いんだそうです。
　実装するのもめちゃくちゃ簡単です。reluのところを少し変えればできます。TensorFlowのライブラリにはもう入ってるそうなので、tf.nn.swish(x) で呼び出せます。
<h4>他の発見</h4>
　このswish関数を見つける過程で得られた発見が個人的には面白いと思いました。
　swish関数を見つける過程では、いろいろな関数を組み合わせてみたらしいんですが、組み合わせの最終段階で、ｘそのものを引数の一つに取るのがいいんだとか。　
　他にも、複雑な組み合わせより、シンプルなもののほうがいい結果が出るらしいです。（完全に私的な感覚ですけど、過学習させないために次元を減らすのに近いのかなと思います。）

<h1>まとめ</h1>
swishを使えば同じモデルでもコードを少し変えるだけで精度がよくなるので、知っといて損はないと思います。基本的にはreluで問題ないと思いますが、少しでも精度を良くしたいと思ったら、利用してみるのがいいと思います。
【Docker × Mackerel】mackerel-plugin-accesslog でアクセスログを簡単に監視する

## 概要
Docker Compose を利用し、web-server コンテナと mackerel-agent コンテナを立ち上げた上で、mackerel-plugin-accesslog を利用して web-server のアクセスログをメトリックとして投稿し、モニタリングしてみる。

## 前準備
以下の導入に関しては本記事では割愛します。

- docker-compose コマンド叩ける環境
- httpd インストール済みイメージ(今回は Apache/2.4.6)
- Mackerel アカウント

## docker-compose
準備した docker-compose.yml はこんな感じ。

```yml:docker-compose.yml
version: '2'

services:
  web-server:
    image: web-server
    ports:
      - "80:80"
    volumes:
      - web-server-log:/var/log/httpd

  mackerel-agent:
    image: mackerel/mackerel-agent
    hostname: web-server-monitor
    environment:
      - apikey=your_apikey
      - enable_docker_plugin=true
      - include=/etc/mackerel-agent/conf.d/*.conf
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /var/lib/mackerel-agent/:/var/lib/mackerel-agent/
      - ./mackerel_conf:/etc/mackerel-agent/conf.d
      - web-server-log:/web_server_log
    depends_on:
      - web-server

volumes:
  web-server-log:
```

web-server イメージには、予め httpd がインストール済みで、起動時のコマンドで httpd が start する。
web-sever コンテナ内の /var/log/httpd を volume 用コンテナ web-server-log を経由させ、mackerel-agent コンテナ内で参照できるようにしている。

mackerel-agent environment で、`include=/etc/mackerel-agent/conf.d/*.conf` とすることで、コンテナ内の /etc/mackerel-agent/conf.d ディレクトリ下の .conf ファイル内の設定を、コンテナ起動時に読み込む。
今回はホスト側 docker-compose.yml ファイルと同じ階層に mackerel_conf ディレクトリを作成し、これをコンテナ内 /etc/mackerel-agent/conf.d にマウントする。

## 設定ファイル

https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-accesslog
README にある通り、mackerel-agent の設定ファイルに2行程追加するだけの簡単なお仕事。

今回の`/path/to/access.log` は、web-server-log から mackerel-agent コンテナ内にマウントされている /web_server_log ディレクトリ内の access_log ファイルにあたる。

ホスト側の mackerel-agent 設定ファイル用ディレクトリ mackerel_conf 下に、以下の内容で設定ファイルを作成する。ファイル名は末尾が.confなら何でも良い。

```conf:accesslog.conf
[plugin.metrics.accesslog]
command = "mackerel-plugin-accesslog /web_server_log/access_log"
```
## 起動

おもむろに docker-compose up

```
$ docker-compose up -d
```

コンテナが立ち上がった頃に、Mackerel の管理画面からメトリック一覧を見てみると・・・

![204.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/e05984b1-7ca9-a14a-6797-efca25bb3afd.png)

きてます！

## まとめ
 - Docker × Mackerel の相性◎
 - HTTPステータスコードに応じて監視ルールを設定することができる
 - 他にも多くの便利な agent plugin あります
 - mackerel-plugin-apache2 を使えば、apache のメトリックも簡単に取得できるので、またの機会に
AMD VEGA + ROCm で XMR(モネロ) マイニングを行う(1120 H/s @ 75W)

漢なら Linux で VEGA で ROCm で XMR(モネロ)マイニングしたいですね!

やりましょう! 

## 環境

* VEGA 64 + PCIex gen3 対応マザー
* Ubuntu 16.04.3
* ROCm 1.6.180(kernel 4.11-0) + ROCm OpenCL

ROCm と ROCm OpenCL は https://github.com/RadeonOpenCompute/ROCm にある手順を使ってセットアップしておきます.

既存の amdgpu-pro OpenCL や nvidia OpenCL 環境が入っているとうまく OpenCL ドライバが初期化されず動かないときがあるのでパッケージ管理注意ください. 

`/opt/rocm/opencl/bin/x86_64/clinfo` で VEGA OpenCL 設定が正しく出力されるか確認しておきましょう.

## miner のコンパイル

https://github.com/xmrig/xmrig-amd を使います.

microhttpd と libuv のパッケージを apt で入れておきます.
libuv については, `libuv1-dev` のほうをインストールしておきます.

```
$ mkdir build
$ cd build
$ OpenCL_ROOT=/opt/rocm/opencl cmake ..
$ make
```

## miner 設定

https://www.reddit.com/r/MoneroMining/comments/74hjqn/monero_and_vega_the_definitive_guide/

を参考にして, VEGA 64 の場合 config で intensity 2016, 1800 の 2 thread にします.

## xmrig 実行時の注意点

`xmrig` だと stdin あたりをいろいろいじっているのか, `nohup` で起動することができません. とりあえずは http ポートを設定して web で確認できるようにし, かつ config で background を true にして background 実行するようにします.

## 電力効率を高める.

デフォルトだと 1175 H/s(620 H/s + 555 H/s)で 195W 消費と悲しい結果になりました...

そこで `rocm-smi` で powertune を試しました.

`rocm-smi --setsclk 2` で core 1084 MHz, mem 800 MHz で 1120 H/s(590 + 530) で 75 W となりました.

(消費電力は rocm-smi の表示なので, 実際にはワットチェッカーで計測する必要あり) 

電力効率は Windows での 1800 H/s @ 160W に比べれば良くなりましたので, Linux の場合は長期運用向けですね.


## TODO

* xmr-stak-amd を試す.
* Ethash など他のアルゴリズムも試す.
* ワットチェッカーで実際の消費電力を確認する.
* 1120 @ 75 W 運用だと, GPU 暖房としては使えないので, 冬の暖房対策を考える(VEGA x 4 という手もあるか?)
【メモ】MySQLでユーザ追加と権限付与を1度のコマンドで行う

時々使うが毎回忘れてググってるのでメモ

```
grant all on {DB名}.* to {ユーザ名}@'{IP}' identified by '{パスワード}';
```

ユーザ追加したらその次はどうせ権限付与なんだから1発でやっちゃいたいですよね。
パスワードをクォーテーションで囲わなかったらエラー起きたので注意
Python記事の関連タグ番付表（2017年度版）を作成してみた

# やること
Qiitaをスクレーピングして、Python記事の関連タグを調べ、番付表を作成する。

# 対象
2017年に投稿された記事


# コード

```py:python_tags.py
import requests
from bs4 import BeautifulSoup
import re
import operator
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties


def scrape():
    baseurl = 'https://qiita.com/tags/Python/items?page={}'
    page = 1
    tag_dict = {}
    is_end = False

    while not is_end:
        print('page:', page)
        url = baseurl.format(page)
        html = requests.get(url).text
        soup = BeautifulSoup(html, 'lxml')
        items = soup.select('article.ItemLink')
        cnt = 0

        for item in items:
            post_date = item.select('div.ItemLink__info')[0].text
            post_date = re.search(r'(\S+\s\d+,\s\d+)', post_date).group(1).strip()
            if post_date.split(', ')[-1] == '2016':
                cnt += 1
                if cnt > 5:
                    is_end = True
                    break
                else:
                    continue

            tags = [x.text.strip() for x in item.select('li.TagList__item')]
            for tag in tags:
                if tag not in tag_dict:
                    tag_dict[tag] = 1
                else:
                    tag_dict[tag] += 1

        page += 1

    with open('python_tags.csv', 'w', encoding='utf-8') as f:
        tag_list = sorted(tag_dict.items(), key=operator.itemgetter(1), reverse=True)
        for tag in tag_list:
            f.write(','.join(map(str, tag)) + '\n')

    print('scrape done')
    

def make_graph():
    tags = []
    nums = []
    with open('python_tags.csv', 'r', encoding='utf-8') as f:
        for line in f:
            tag, num = line.strip().split(',')
            if 'python' not in tag.lower():
                tags.append(tag + ' (' + num + ')')
                nums.append(num)
            if len(tags) == 20: break

    tags = tags[::-1]
    nums = nums[::-1]
    x = np.arange(1, 21)

    fig = plt.figure()
    fp = FontProperties(fname=r'yugothib.ttf', size=10)
    fig.patch.set_facecolor('white')
    plt.barh(x, nums, tick_label=tags, align='center')
    plt.yticks(fontproperties=fp)
    plt.show()


def main():
    scrape()
    make_graph()


if __name__ == '__main__':
    main()

```

# 結果
上位20位をプロットしてみた。機会学習・人工知能関連の記事が非常に多く投稿されていることが分かる。
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/185448/d29be2c6-fb9f-aa39-0c5a-977400aee08f.png)
Scalaにおけるcase classのパターンマッチ

# コンストラクタパターン

Scalaの`match式`には◯◯パターンと言うものが幾つかありますが、ケースクラスのコンストラクタによるパターンマッチを `コンストラクタパターン` と言います。

内部的には、ケースクラスにより生成されるコンパニオンオブジェクトの `unapply()` (extractor/抽出子) を利用しているようです。

#### 深いパターンマッチ
match式で判定される時に、トップレベルのオブジェクトのチェックだけでなく、引数のオブジェクト、更にその内容までチェックしてくれます。

(与えられた引数から友達のボブかを判定する例)

```scala
// 友達
case class Friend(name: String, age: Int, languages: List[String])

// 同僚
case class Coworker(name: String, age: Int, skill: String)

object Main extends App {
  def myFriend(f: Any): String = f match {
    case Friend("Bob", 34, List("English", "Japanese")) => "友達のボブです"
    case _ => "この人は知らないな"
  }

  // Friendオブジェクトであり
  // 第一引数が "Bob"
  // 第二引数の年齢が Int 34、
  // 第三引数の言語が List型で引数に "English" "Japanese" 
  // のときだけマッチする
  val bob = Friend("Bob", 34, List("English", "Japanese"))
  println(myFriend(bob)) // 友達のボブです

  // １つでも違うと、それは友達のボブではない
  val bob_2 = Friend("Bob", 21, List("English", "Japanese"))
  println(myFriend(bob_2)) // この人は知らないな

  // Friendオブジェクトではない時も当然マッチしない
  val suzuki = Coworker("Suzuki", 21, "Programing")
  println(myFriend(suzuki)) // この人は知らないな
}
```
【Swift3】TextField以外をタップしたら、キーボードを閉じる方法

# 【Swift3】TextField以外をタップしたら、キーボードを閉じる方法

TextFieldの入力後などにキーボードを閉じたい場合。
今回は入力したTextField以外をタップしたタイミングで
キーボードを閉じる処理を追加しようとしたのですが、
Swift3での書き方がわからなくて困ったので、メモです。
# 対処方法

まずこれを追加

```swift
import Foundation
import UIKit

extension UIScrollView {
    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.next?.touchesBegan(touches, with: event)
    }
}
```

こちらも追加

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

（Xcode9.1使用）
Stripeを使って開発をするときにmockサーバーを利用する

# やりたいこと
決済サービスの一つである[Stripe](https://stripe.com/jp)を利用するサービスを開発する際に、実際のサービスAPIを利用せず開発を進められるようにします。

# [stripe-mock](https://github.com/stripe/stripe-mock)のインストール
実際のStripe APIを模倣するmockサーバーサービスがStripeによって提供されているので、これをインストールして利用できるようにします。

## for macOS
homebrew を使ったインストールとサービスの有効化について紹介します。

```bash
$ brew install stripe/stripe-mock/stripe-mock
$ brew services start stripe/stripe-mock/stripe-mock
```
デフォルトでは`http://localhost:12111`でmockサーバーが動作するようです。

## mockサーバーを利用するように設定を変更する
ここでは、railsを利用する場合の設定方法について紹介します。

サービスAPIエンドポイントの設定は`Stripe.api_base`にあるので、development環境でrailsが動作する場合には、mockサーバーを参照するように設定を追加します。

```ruby
# config/environments/development.rb

Rails.application.configure do
  # other something...
  Stripe.api_base = 'http://localhost:12111'
end
```

# 確認
rails consoleを使って動作を確認してみます。

```bash
$ bin/rails console

> Stripe.api_base
=> "http://localhost:12111"

> Stripe::Charge.list
=> 
<Stripe::ListObject:0x3fe3bb271990> JSON: {
  "data": [{
    "id":"ch_1B3q3s2eZvKYlo2CLdghKZFC",
    "amount":2000,
    "amount_refunded":0,
    "balance_transaction":"txn_1B3kCO2eZvKYlo2CQHzTvqYJ",
    "captured":false,
    "created":1234567890,
    "currency":"usd",
    "description":"My First Test Charge (created for API docs)",
    "fraud_details":{},
    "livemode":false,
    "metadata":{},
    "object":"charge",
    "paid":false,
    "refunded":false,
    ...,
  ],
  "has_more": false,
  "object": "list",
  "url": "/v1/charges"
}
```

mockサーバーにあらかじめ登録されていた購入データが表示されるのが確認できます。

# できないこと
+ APIからのレスポンスはあらかじめ規定されたものが返されるため、データの永続化を含む検証は難しいみたいです。

# 参考
+ https://stripe.com/docs
+ https://github.com/stripe/stripe-ruby
+ https://github.com/stripe/stripe-mock
Raspberry PI 3 と RPZ-IR-Sensor を利用してセンサーの値を取得する #IoT #I2C


以前の記事（[Raspberry PI 3 と RPZ-IR-Sensor を利用して家電を操作](https://qiita.com/ynozue/items/f415d958cff34bc71f3d)）で照明を操作しましたが、今回は RPZ-IR-Sensor の他のセンサーを利用してみようかと思います。

# センサーをサンプルプログラムから確認
例によって公式ページのサンプルを動かしてみます。
http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor.php

## ダウンロード
```sh
$ wget http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor/rpz-sensor.zip
--2017-11-25 19:11:14--  http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor/rpz-sensor.zip
indoor.lolipop.jp (indoor.lolipop.jp) をDNSに問いあわせています... 157.7.107.148
indoor.lolipop.jp (indoor.lolipop.jp)|157.7.107.148|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 29245 (29K) [application/zip]
`rpz-sensor.zip' に保存中

rpz-sensor.zip                               100%[============================================================================================>]  28.56K  --.-KB/s    in 0.1s    

2017-11-25 19:11:15 (230 KB/s) - `rpz-sensor.zip' へ保存完了 [29245/29245]
```
## 解凍
```sh
$ unzip rpz-sensor.zip 
Archive:  rpz-sensor.zip
   creating: rpz-sensor/
  inflating: rpz-sensor/readme.txt   
   creating: rpz-sensor/cpp/
  inflating: rpz-sensor/cpp/rpz-sensor  
  inflating: rpz-sensor/cpp/BME280I2C.o  
  inflating: rpz-sensor/cpp/TSL2561I2C.o  
  inflating: rpz-sensor/cpp/BME280I2C.h  
  inflating: rpz-sensor/cpp/TSL2561I2C.cpp  
  inflating: rpz-sensor/cpp/Makefile  
  inflating: rpz-sensor/cpp/main.o   
  inflating: rpz-sensor/cpp/BME280I2C.cpp  
  inflating: rpz-sensor/cpp/TSL2561I2C.h  
  inflating: rpz-sensor/cpp/main.cpp  
   creating: rpz-sensor/python3/
  inflating: rpz-sensor/python3/rpz_sensor.py  
  inflating: rpz-sensor/python3/tsl2561.py  
  inflating: rpz-sensor/python3/bme280i2c.py 
```
解凍したディレクトリ内に readme.txt があるので、こちらの内容通りに python のプログラムを実行してみます。

## rpz_sensor.py の実行
BME280(温湿度、気圧センサー) と TSL2561(光(照度)センサー) に同時アクセスできる rpz_sensor.py を実行するには docopt パッケージが必要なためインストールします。

### docopt インストール
```sh
$ sudo pip3 install docopt
Collecting docopt
  Downloading docopt-0.6.2.tar.gz
Building wheels for collected packages: docopt
  Running setup.py bdist_wheel for docopt ... done
  Stored in directory: /root/.cache/pip/wheels/b2/16/5f/c33a2bb5f2dce71205f8e65cbfd05647d79d441282be31fd82
Successfully built docopt
Installing collected packages: docopt
Successfully installed docopt-0.6.2
```

### 実行
**電気をつけた状態**

```sh
$ ./rpz_sensor.py
BME280 0x77
 Temp     : 26.5C
 Pressure : 1021.8hPa
 Humidity : 26.5%

TSL2561
 Lux : 131.4lux
```

**電気を消した状態**

```sh
$ ./rpz_sensor.py
BME280 0x77
 Temp     : 28.3C
 Pressure : 1022.7hPa
 Humidity : 23.6%

TSL2561
 Lux : 0.0lux
```

## 実行時にエラーが出る場合
以下の記事を参考にして、Raspberry Pi の設定で**I2Cが無効**になっていないことを確認してください。
[Check! Raspberry Pi で I2C を使いたい（トラブルシューティング）](https://qiita.com/dz_/items/ead14b05879c9acc3507)

## まとめ
温度以外（気圧、湿度、照度）については問題なく検知できてるようですが、温度はやたら暑い感じなっています。
公式ページをよく読むと Raspberry Pi 本体の発熱影響を受けるとか、、、直接つける場合はあんまり意味ないですね。
![Kobito.4ecUxO.png](https://qiita-image-store.s3.amazonaws.com/0/203864/20e27265-8b2d-0599-64b9-812955d9e39f.png "Kobito.4ecUxO.png")
XmlRpc::XmlRpcValueでrosparamをまとめて取得

rosparamである値を取ってくるということは非常に簡単にできます。
以下のようにパラメータのキーを元にノードハンドラ経由でパラメータを取得します。

```cpp:sample.cpp
ros::NodeHandle nh;
std::string global_name, relative_name, default_param;
if (nh.getParam("/global_name", global_name))
{
  ...
}

if (nh.getParam("relative_name", relative_name))
{
...
}

// Default value version
nh.param<std::string>("default_param", default_param, "default_value");
```

しかし、ある程度大きなプログラムを書く場合、これだけでは困ることがあります。
僕は以下のようなyamlファイルでパラメータを設定し、それを一気に読み込んで設定をロードするようなノードを作る必要に迫られました。

```yaml:ros_ship_recognition.yaml
input_cloud: /velodyne_points
target_objects:
  buoy:
    stl_filename: BUOY.stl
    marker_filename: BUOY.dae
  (object_name):
    stl_filename: (object_stl_file).stl
    marker_filename: (object_dae_file).dae
```

こういったrosparamの設定方法ではそもそもキーの名前がソースコード作成の段階で決められていないので上の簡単な方法ではパラメータ取得ができません。
そこで、今回はこう言った構造のパラメータを取得する方法について調べました。

#複雑な構造のrosparamの取得

こう言ったパラメータはXmlRpc::XmlRpcValueを介して取得できます。
ノードハンドラを経由してパラメータを取得するやり方も引数が変わるだけで基本的に変わりません。

```cpp:sample.cpp
XmlRpc::XmlRpcValue parameters;
nh_.getParam(ros::this_node::getName(), parameters);
pointcloud_topic_ = std::string(parameters["input_cloud"]);
XmlRpc::XmlRpcValue target_objects_params = parameters["target_objects"];
std::string resource_path = ros::package::getPath("ros_ship_recognition") + "/data/";
for(auto object_param_itr = target_objects_params.begin(); object_param_itr != target_objects_params.end(); ++object_param_itr)
{
  std::string stl_path = resource_path+std::string(object_param_itr->second["stl_filename"]);
  std::string mesh_path = resource_path+std::string(object_param_itr->second["marker_filename"]);
  object_models_.push_back(load_object_model(object_param_itr->first,stl_path,mesh_path));
}
```

取得したパラメータとキーの組み合わせはstd::mapのような形式で取得できます。
そのためfirst,secondといたメンバにアクセスすることでキーとパラメータを取得することができます。
これにイテレータを組み合わせることでキーが未知であったとしてもパラメータを取得することができますね！！
ESP32 開発環境構築

#情報参考元
インストール手順はここ。

https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md

#環境構築と動作確認(Lチカ）

## 1. GitHubからツールをダウンロード
GitHubのコマンド、またはツールを使ってESP32開発ツールをダウンロードします。

- Source Location:`https://github.com/espressif/arduino-esp32.git`
- Target Directory: `C:/Users/[YOUR_USER_NAME]/Documents/Arduino/hardware/espressif/esp32`

私の場合、SourceTreeを使ってこんな感じ

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/7027ba9e-9097-dcea-bbe1-a551455dbecb.png"  width=50%>

## 2. get.exeの実行

ダウンロード完了後、toolsの下の"get.exe"を実行します。DOSまどが開いて2つほどzipをダウンロードして自動的にCloseします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/8e8b8176-23d9-1f40-5a93-e3b4cb3fbbd9.png" width=80%>


実行後のフォルダは、私の場合以下のようになっていました。
このあたり、元情報と異なりますね。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/81482d3c-4a01-be01-fa2a-0c7a51472ea1.png" width=80%>

## 3. ESP32をつなぐ

元情報には「ボードをつないでドライバがインストールされるのを待つ。」という記載がありますが、つないでも何も起こりませんでした。

## 4. Arduino IDEを起動する
Arduino IDEを起動して、COMポートを選択します。
確かに、ESP32のボードが増えています。素のESP32というのはないので、とりあえずESP32 Dev Moduleを選びます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/7e56bc95-adfb-c8fb-29be-7c96dcc683cd.png" width=80%>

## 5. Lチカコードを記載する

```ruby:Lチカ

void setup() {
  // put your setup code here, to run once:
  pinMode(17, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(17, HIGH);
  delay(1000);
  digitalWrite(17, LOW);
  delay(1000);
}
```
## 6. 書き込み

ギャーまぶしい。
毎度まぶしすぎるので、そろそろ程よいLEDを作らねば…

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/8221d42a-9888-ade2-57ed-2f350bd6b073.jpeg" width=60%>
slack,node-red,watson(NLC),kintoneで自動応答システムを構築！

#背景
社員からのシステムトラブルや事務的な申請の対応方法などの問い合わせがベラボーに多くの工数を取られている

#実現したい事
問い合わせとか来ても(ぶっちゃけ)対応したくない。時間取られたくない。
だから、自動で答えてくれるBotをサクっと作る。

#実現方法
##　構成
チャット：slack
質問に対しての回答を考える：watson
watsonの回答を蓄積する：kintone
全体：node-red

・最初のNLCでおおまかに何に関しての質問かを分類する。
　(基幹システム？事務手続き？NW？サーバー？PC？どれなんだ)
・次の並列NLCで問い合わせの内容を分類する。
　ここでは１つのNLCではゴールまでたどり着かないので２つの並列とした。
　２つでも足りない場合は増やせばいいと思う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/6b9b35ff-39ae-555c-3c2e-0cfc25632dd5.png)

##　フロー(node-red)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/1a61f715-7294-288d-0607-ea8fc078684e.png)

#NLCを選んだ理由
いろいろ調べてみたけど、トレーニング方法がポイントで判断しました。
##　Conversation
###　トレーニング方法
-フロー作る
-インテントの基になる単語をいっぱい登録する
-エンティティの基になる単語をいっぱい登録する
-意図したフローに流れなかった場合は修正する

※フロー作るのが面倒くさいなと思った。。。

##　Retrieve & Rank
###　トレーニング方法
-質問に対して、回答の精度を紐付けする(回答合ってるか、合ってないかを評価する)
-それを登録する

※作ってる最中にRetrieve & RankのサービスがなくなりDiscoveryに統合されてしまった。
　サービスが不安定(API投げても「サーバ不安定です」みたいなレスが返ってくる)なのと、ドキュメントまだ少ないので選択肢から外しました。

#まとめ
いろいろやってみましたが、きっとDiscoveryが最適解。もうちょっと安定するまでは様子見。
NLCも使い易いので問題ない印象。
長文に対してどう処理したらいいのかイメージつかないので、ここは残課題。
node-redのフローの内容とか完全に割愛したので、ご要望とかもらえたら次回でもやろうと思います。
CentOS(Linux)でhttpsなサイトにアクセスできないときに確認すること

ルートCA証明書の更新をすれば解決するかもしれません。
`$ yum update ca-certificates`

curlやJenkinsなどからhttpsなサイトにアクセスできないというトラブルを数件見ていますが、どちらもこれで解決しました。
意外と情報が載っていないのでQiitaに投稿しておきます。

過去に証明書を下手に書き換えちゃったことが疑われる場合は、updateではなくreinstallしましょう。
iOS Safariのスライダー（input type="range"のやつ）のつまみをでかくする

inputタグのrangeタイプを用いると出て来るスライダー、
iPhoneやiPadでも表示はされるが小さすぎてつまみずらい。

実は、以下のようにCSSを用いて`::-webkit-slider-thumb`でつまみを指定して
widthとheightを両方とも指定することで大きくできる。

```css
input[type="range"]::-webkit-slider-thumb {
    width: 35px;
    height: 35px;
}
```

スライダーのCSSを一から作り直すタイプの解決策はよく出てくるが、
「デザインとか仮だしこのままでいい。つまみの大きさだけ、すぐにでっかく！」
という人向けの最速の解決法は意外とググっても出てこないのでここに書き残しておいた。
Powershell  1〜4999までの数字をローマ数字に変換する関数



```ps1
# 1〜4999までの数字をローマ数字に変換する関数
function Number-ToRoman ($number) {

    if (($number -ge 5000) -or ($number -le 0)) {
    return "1から4999までの数字を入力してください"
    }

    $result = ""

    # ローマ数字(name)と数字(value)を組み合わせた連想配列
    $hash_roman_num = @{
     "m" = 1000
    "cm" =  900
     "d" =  500
    "cd" =  400
     "c" =  100
    "xc" =   90
     "l" =   50
    "xl" =   40
     "x" =   10
    "ix" =    9
     "v" =    5
    "iv" =    4
     "i" =    1
    }


    # 数字(value)の大きい順に、連想配列を並び替え
    $hash_roman_num_sort = $hash_roman_num.GetEnumerator() |Sort-Object value -desc



    foreach ($key_value in $hash_roman_num_sort) {
        $count = [math]::floor($number / $key_value.value)
        $number = $number % $key_value.value
        [string]$result += ($key_value.key -as [string]) * $count
    }


    return $result

}

```

<br>

```ps1

# 実行
Number-ToRoman 0
=> 1から4999までの数字を入力してください

Number-ToRoman 5000
=> 1から4999までの数字を入力してください

Number-ToRoman 1
=> i

Number-ToRoman 2
=> ii

Number-ToRoman 3
=> iii

Number-ToRoman 4
=> iv

Number-ToRoman 5
=> v

Number-ToRoman 10
=> x

Number-ToRoman 1000
=> m

Number-ToRoman 4999
=> mmmmcmxcix

```