OmniAICreator/Qiita-1.07M huggingface dataset:
お名前.comのVPSにwordpressを入れる

# VPSにwordpressをinstall
お名前.comのVPSにwordpressをインストールする時にやっとことのメモ。
コントロールパネルにログインしてVPSサーバーが立ち上がっている事が前提。

## サーバーにloginしてサーバーのipアドレスを確認する
コンソール画面からサーバーにログインする。

```
$ ifconfig
```

## 一般用ユーザーを作成
現在は`root`で入っているの一般ユーザーを作成しておく。
rootだといつ何をぶっ壊すかわからんので。

```
$ useradd user-test
$ passwd password-test
```

## SSHで接続出来るようにする
SSHでサーバーにログインするときは公開鍵認証を使って行う。
必要な`Private Key`をサーバーにダウンロードする。
ダウンロードが終わったら、一般ユーザーのディレクトリに、サーバーの公開鍵をコピーしておく。`user-test`と`password-test`は置き換えてください。

```
$ cp -r /root/.ssh /home/user-test/.ssh
$ cd /home/user-test
$ chown -R user-test.user-test .ssh
$ ls -al .ssh
```
この作業が終わったら、スナップショットを作成しておいていつでもロールバック出来る状態にしておく。

### Apacheの確認
ここから先はsshで接続してからの作業。
Apacheがインストールされているか確認する。

```
$ rpm -qa | grep httpd
```

インストールされてなかったら`yum install httpd`でインストールする。

```
$ yum install httpd
```

Apacheの起動スクリプトの配置場所を確認して

```
$ rpm -ql httpd | grep init
```

Apacheの再起動

```
$ /etc/rc.d/init.d/httpd restart
```

### 接続できなかった場合
パケットフィルタリング(iptables)の設定でhttp通信が出来ているかどうかを確認してみる。許可されていない場合は以下の設定を書き加える。

```
$ vi /etc/sysconfig/iptables
```

追加する記述

```
-A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
```

ほんで`iptables`を`restart`

```
$ /etc/rc.d/init.d/iptables restart
```


## ブラウザで確認してみる
`ip`を打って、ページが表示されているか確認してみる。
Apacheのページが見えていれば設定はおｋ。

#phpとmysqlのインストール
確認。

```
$ rpm -qa | grep mysql
$ rpm -qa | grep php
```

なかったら`install`する

```
$ yum install php
$ yum install mysql-server
$ yum install php-mysql
```

## MySQLを起動

```
$ /etc/rc.d/init.d/mysqld start
```

## MySqlでDBを作成する

```
$ mysql -u root -p
```
でrootでsqlにログインする

```
$ mysql> CREATE DATABASE wp_database;

$ mysql> GRANT ALL PRIVILEGES ON wp_user.* TO wp_database@localhost IDENTIFIED BY 'password';

$ mysql> FLUSH PRIVILEGES;

$ mysql> exit;
```

## wordpressをinstallする
[wordpress 公式サイト](https://ja.wordpress.org/)からwordpressをdownloadしてきてサーバーにアップロードする。
`wp-config-sample.php`をコピーして`wp-config.php`にリネームする。

以下の行を作成したDBに合わせる。
`define(‘DB_NAME’, ‘wp_database’);`
`define(‘DB_USER’, ‘wp_user’);`
`define(‘DB_PASSWORD’, ‘password’);`

ここを書き換えたらブラウザからwordpressにアクセスして、ボタンをポチる。
上手く行かないときは`httpd.conf`とかの`Document Root`の設定や`.htaccess`が動くかなどの確認をする。

だいたいこんな感じでVPSにwordpressはinstallできた。
ActiveAdmin + PaperClip、チェックボックスを用いたUIで画像を削除

# ActiveAdmin
Railsでイケてる管理画面を簡単に作るためのクールなgem。
CRUD系の処理は自動で実装してくれるし、それなりにカスタマイズも簡単なので使いやすい。

参考:
(公式) https://github.com/activeadmin/activeadmin
http://morizyun.github.io/blog/active-admin-gem-rails/


# 問題
自動で実装してくれるCRUD系の処理は、基本的にparamsを[突っ込んでいるだけ](https://github.com/activeadmin/activeadmin/blob/d01155f73a0e2cc27d712792270357e2b3759d05/lib/active_admin/resource_controller/data_access.rb#L164)なので、ちょっと凝ったことをしようとすると手を加える必要がある。
たとえば、PaperClipで画像を取り扱っているModelについて、*formに【画像を削除する】というチェックボックスを置いて、チェックが入っている状態で `#update` が呼ばれたら画像を消す* みたいなことがやりたいとき。
もちろん `#update` をオーバーライドすることはできるんだけど、せっかくgemを使っているのでその辺りに手を加えてコードを汚すのも気が引ける。

# 解決策
Model側で仮想属性を定義してあげる。
具体的には下記。

```app/model/user.rb
class User < ActiveRecord::Base
  attr_accessor :remove_image # 画像削除のための仮想属性
  
  before_validation { image.clear if @remove_image.try!(:==, "1") }
  
  def remove_image
    @remove_image || false
  end

  def remove_image=(value)
    attribute_will_change!('remove_image') if remove_image != value
    @remove_image = value
  end
end
```

```app/admin/user.rb
form do |f|
  f.semantic_errors

  f.input :name 
  f.input :email
  f.input :image, as: :file, hint: f.object.image.present? ? image_tag(f.object.image.url) : nil
  if f.object.image.present?
    f.input :remove_image, as: :boolean, required: :false, label: '画像を削除する'
  end         

  f.actions
end
```

`remove_image` という仮想属性と、それに対するアクセサを定義する。
`before_validation` 内で、仮想属性を参照し、チェックされていた場合は画像を削除。
`remove_image=(value)` 内で `attribute_will_change!` を呼んでおかないと、**画像の削除のみが行われた場合にインスタンスの変化が認識されず、 `save` が実行されないみたいです。**そのため `before_validation` で定義した処理が走りません。注意。

## 参考
[ActiveAdmin](https://github.com/activeadmin/activeadmin)
[Active_admin Rails 4.2の管理画面を最短時間で作ろう！active_admin[Devise入り]](http://morizyun.github.io/blog/active-admin-gem-rails/)
[Remove paperclip images Active Admin - Stack Overflow](http://stackoverflow.com/questions/21838434/remove-paperclip-images-active-admin)
Pythonの文字列処理図解

以下の記事の内容を図にしてみました。

* [Python2で文字列を処理する際の心掛け - Qiita](http://qiita.com/FGtatsuro/items/cf178bc44ce7b068d233)
* [Python3で文字列を処理する際の心掛け - Qiita](http://qiita.com/FGtatsuro/items/f45c349e06d6df95839b#_reference-8515bd0fd14912011bd1)

※詳細についてはそれぞれの記事を参照してください。

#Python 2.x
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/52291/8d7ccbd3-77c9-ec0b-6a4e-d8babee67b3c.png)

#Python 3.x
![Untitled(1).png](https://qiita-image-store.s3.amazonaws.com/0/52291/9b766490-43e5-db0a-412f-d60ececf8c55.png)
Ansibleでタスクをサーバごとに順番で実行する


https://groups.google.com/forum/#!topic/ansible-project/rBcWzXjt-Xc
ここから拝借

```
  tasks:
    - name: set fact
      set_fact:
        marker: marker
    
    - name: group by marker
      group_by: key=marker
      changed_when: no
      
    - name: target task
      debug:
        msg: "Performing task on {{ inventory_hostname }}, item is {{ item }}"
      with_items: "{{ groups['marker'] }}"
      when: "hostvars[item].inventory_hostname == inventory_hostname"
```

markerという変数を各ホストで設定して、その変数でgroup_byすることによって、
タスクが実行されるホストをグルーピングできる模様。

なので、group_byまでいくと以下のような配列が出来る
\#host1, host2の2ホストで実行した場合

```
groups['marker'] = ['host1', 'host2']
```

あとは、上記変数を `with_items` で食わせてあげて、
`when`でhostvarsを順番に回してあげ、現在実行対象の`inventory_hostname`を比較することで、
上記配列の1ホストごとに順番にタスクが回っていく仕組み(っぽい)
Golangにて"compress/flate"パッケージがflateで圧縮したデータを復元できなかった件について

Golangにデータの圧縮と復元のパッケージをいくつ実装しています、"compress/flate" の他、 "compress/gzip" と "compress/zlib" なども提供されています。

ただ、HTTPクライアント `Content-Encoding` に `deflate` のリクエストデータを復元できなかった。

```go
import (
	"compress/gzip"
	"compress/flate"
)

// Decode request body by content encoding
func decodeRequestBody(r *http.Request) (string, error) {

	ce, _ := r.Header["Content-Encoding"]

	for _, x := range ce {
		switch x {
		case "gzip":
			gr, e := gzip.NewReader(r.Body)
			defer gr.Close()
			if e != nil {
				return "", e
			}
			return readAll(gr)
		case "deflate":
			fr, e := flate.NewReader(r.Body)
			defer fr.Close()
			if e != nil {
				return "", e
			}
			return readAll(fr)
		}
	}

	// No Content-Encoding header detected
	return readAll(r.Body)
}

// Read from reader to string
func readAll(r io.Reader) (string, error) {
	if body, err := ioutil.ReadAll(r); err != nil {
		return "", err
	} else {
		return string(body), nil
	}
}
```

これではうまくいかなかった：

```
panic: flate: corrupt input before offset 5
```

調べたところ、この [スレード](http://stackoverflow.com/questions/29513472/golang-compress-flate-module-cant-decompress-valid-deflate-compressed-http-b) のように、入力データは `Zlib` のストリームなので、 `compress/zlib` を使うべきだった。

なんでクライアントが `Zlib` のデータなのに `Content-Encoding` に `deflate` 設定したのだろう。
Autoprefixer RailsでCSSのベンダープレフィックスをsprocketsに任せよう


# はじめに

CSS3のアニメーションなど新し目のものを使おうとするとベンダープレフィックス(-webkit-hogehoge)みたいなのをつけないといけない時があるよね？

ベンダープレフィックスをつけるとこんな感じで同じようなことを各ブラウザ向けに何度も書かなければならなくなってしまう。

```css
  animation: spin 1s infinite linear;
  -webkit-animation: spin 1s infinite linear;
```

このベンダープレフィックスを意識していちいちこのプロジェクトで対応するブラウザにはこのCSSにはこのプレフィックスが必要なんて考えたりするのって生産性が悪いよね？

それにシンプルなコードにならない。

そこでベンダープレフィックスを自動でつけてくれる[Autoprefixer](https://github.com/postcss/autoprefixer)なんだけど、基本的にGulpやWebpackなどフロントエンドのツールに組み込んで使うんだ。

そこで僕らのRailsでcssをminifyしてくれたりメッセージダイジェストをつけたりしてくれるSprocketsにAutoprefixerの機能をつけてくれたのが[Autoprefixer Rails](https://github.com/ai/autoprefixer-rails)だ



### 検証環境
* Rails: ver4.3.1
* scssファイルをSprocketsでコンパイルしてcssへ変換



# RailsにAutoprefixer Railsを組み込む方法
	
## Gemfileに追記

Gemfileに下記を追記

```
gem 'autoprefixer-rails'
```


## 設定ファイルを追加
config/autoprefixer.yml


```
browsers:
  - "> 5%" #上位1%のブラウザを対象にする 
  - "last 2 versions" #下記以外は最新のメジャーブラウザ2バージョンのみサポート
  - "IE >= 11" # IEは11以上
  - "Android >= 4" # Androidは4系をサポート
```

上記の設定だと、上位5%以上のシェアのブラウザに対して、そのブラウザの過去2のバージョンをサポートするが、IEは11以上、Androidは4以上をサポートするということになる。
ここでIE >= 8と書くとIE8以上を対象にしてくれるというわけだ。(対象にしたくないけど)


パーセンテージ指定ところはどのブラウザ名なのか、各バージョンで見てるのか正直良くわからなかった
詳細は https://github.com/ai/browserslist を参考にしてもらいたい。

## キャッシュの削除

キャッシュの削除が推奨されているので素直にクリアしといたほうが良さそう。
あまりトリッキーなことをしないでいるdevelopment環境のならたぶんやらなくても良さそう

```
bin/rake tmp:clear
```

# コンパイル結果

assets:precompile したり、development環境で逐次コンパイルした結果以下のようになる。

### コンパイル前のSCSS

```scss
.sample {
  animation: spin 1s infinite linear;

  @keyframes spin {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
  }
}
```

-------

### コンパイル後のCSS
-webkitのベンダープレフィックスがついているものが追加されているのがわかる

```css
.sample {
  -webkit-animation: spin 1s infinite linear;
          animation: spin 1s infinite linear;
}
@-webkit-keyframes spin {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}
@keyframes spin {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}
```
LinuxでSPI (spidev)を使う

LinuxでSPIを使う方法を調べてみました。

言語はCで、デバイスドライバはspidevを使う想定です。

# 端子
SPIでは通常4本の端子を使う。

* MOSI : Master Out Slave In
* MISO : Master In  Slave Out
* SCLK : SPI clock
* GND  : GND

その他に以下の端子を使う場合がある

* CS   : ChipSelect
* SYNC : 転送単位を表す信号。 8bit単位、16bit単位などが良く使われる。

# API 

## デバイスのオープン

* デバイスは /dev/spidev.0.0 などとなる。　数字の部分が変わる。

```c
int fd;
fd = open("/dev/spidev0.0", O_RDWR);
```

## SPIデータ読み書き用のAPI
* ioctlを使う。
* SPI_IOC_MESSAGE(N)を使う。Nは一度に転送するspi_ioc_transferの個数。
* 読み書きの例

```c
#define HOGE_SPI_SPEED_HZ    1000000
#define HOGE_SPI_DELAY_USECS 0
#define HOGE_SPI_BITS        8


uint8_t tx[3] = {1, 2, 3};
uint8_t rx[3] = {0, };
struct spi_ioc_transfer tr[1];

tr[0].tx_buf        = (unsigned long)tx;
tr[0].rx_buf        = (unsigned long)rx;
tr[0].len           = ARRAY_SIZE(tx);
tr[0].delay_usecs   = HOGE_SPI_DELAY_USECS;
tr[0].speed_hz      = HOGE_SPI_SPEED_HZ;
tr[0].bits_per_word = HOGE_SPI_BITS;
tr[0].cs_change     = 0;

ioctl(fd, SPI_IOC_MESSAGE(1), tr);
```

## SPI設定用のAPI
* ioctlを使う。

```c
#include <linux/spi/spidev.h>
```

* 設定用ioctlの説明

| ioctl | description |
|:-:|:-:|
|SPI_IOC_WR_MOD   |  Read of SPI mode (SPI_MODE_0..SPI_MODE_3) |
|SPI_IOC_WR_MODE  | Write of SPI mode (SPI_MODE_0..SPI_MODE_3) |
|SPI_IOC_RD_LSB_FIRST|Read SPI bit justification|
|SPI_IOC_WR_LSB_FIRST|Write SPI bit justification|
|SPI_IOC_RD_BITS_PER_WORD|Read SPI device word length (1..N)|
|SPI_IOC_WR_BITS_PER_WORD|Write SPI device word length (1..N)|
|SPI_IOC_RD_MAX_SPEED_HZ|Read SPI device default max speed hz|
|SPI_IOC_WR_MAX_SPEED_HZ|Write SPI device default max speed hz|


あとで実際に試した結果を追記予定。


# 参考

* http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-3_ja-2.0.0/ch02.html
* https://www.linux.com/learn/how-access-chips-over-spi-beaglebone-black
MNISTのデータセットの簡易可視化

# はじめに

機械学習のサンプルはMNISTの手書き文字認識をやることが多いんだけど、「機械学習する人はMNISTのデータがどういうものかくらい知ってるでしょ？」って感じで、データ構造の説明が無いことが多い。

ってなわけで、機械学習のド素人がChainerのサンプルで使われるMNISTの手書きデータセットがどういうものかよく見てみる。Chainerはインストール済みであること前提。

# データ構造

まずはデータをロードしてみる。chainer.datasets.get_mnist()でデータセットが読み込まれる。そのtestをあれこれしてみる。

```py
>>> import chainer
>>> train, test = chainer.datasets.get_mnist()
>>> test
<chainer.datasets.tuple_dataset.TupleDataset object at 0x2aaab303c910>
>>> len(test)
10000
>>> len(test[0])
2
>>> len(test[0][0])
784
>>> test[0][0]
(snip)
        0.        ,  0.        ,  0.        ,  0.        ], dtype=float32)
>>> test[0][1]
7
```

上記から以下のようなことがわかる。

* `test`は10000個のサンプルデータからなるTupleDatasetクラス
* `test[i]`はi番目のサンプルデータ
* `test[i][0]`はi番目のサンプルの784個のfloat32のデータ
* `test[i][1]`は整数で、i番目の手書きサンプルの「正解」を表す

`784 = 28**2` なので、28×28のグリッドのグレースケールのデータなんだろう。

# 可視化

というわけで、これを二値化して可視化してみる。とりあえず0番のデータ決め打ちで。

```py:
import chainer
n = 0
train, test = chainer.datasets.get_mnist()
s = 28
print test[n][1]
for i in range(1,28):
  for j in range(1,28):
    v =  test[n][0][j + i*s]
    if v > 0.1:
      print "*",
    else:
      print " ",
  print "\n"
```

最初に正解を、次に手書きデータを出力する。結果はこんな感じ。

```shell-session
$ python show_mnist.py 
7
                                                      

                                                      

                                                      

                                                      

                                                      

                                                      

          * * * * * *                                 

          * * * * * * * * * * * * * * * *             

          * * * * * * * * * * * * * * * *             

                      *   * * * *   * * *             

                                  * * *               

                                  * * *               

                                * * * *               

                              * * * *                 

                              * * *                   

                              * * *                   

                            * * *                     

                          * * * *                     

                          * * *                       

                        * * * *                       

                      * * * *                         

                    * * * *                           

                    * * * *                           

                  * * * * *                           

                  * * * * *                           

                  * * *                               

                                                      



```
0番のデータは数字の「7」ですね。世の中の機械学習のサンプルはこれを入力にして、どの数字の可能性が高いかを判定している模様。
gcloudコマンドでsshのkeyを追加


gcpのインスタンスへのsshキー登録ですが
通常のauthorized_keysにsshキーを追加する方法だと
インスタンスを再起動するたびにauthorized_keysが再作成されてしまいます。
そのためせっかく登録したものが消えてしまいうまくいきません。
インスタンスへのsshキー登録はインスタンス作成画面、または設定画面から行う必要があります。
以下はその登録を画面でポチポチするのではなくgcloudコマンドでやってしまう方法です。

通常のキー作成のくだりは省略します。

gcpをすでにお使いの方は
VMインスタンス→インスタンスの作成
で出てくる作成画面でsshキーを追加します。
その後、最下行にある

同等の REST またはコマンドライン

のコマンドラインのところをクリックしてください。
すると同等のインスタンスを作成するためのgcloudコマンドが表示されます。
なんて便利なんだ！
これを見て、shでそのコマンドを流せば一発でsshキーを設定したインスタンスが作成できます。

のですが後からkeyを追加する場合はコマンドラインを見れる場所がありません。
その場合、以下のコマンドでsshキーを追加することができます。

    gcloud compute instances add-metadata インスタンス名 --zone ゾーン名 --metadata "^#&&#^ssh-keys=ユーザー名:ssh-rsa キー本体 ユーザー名" 

簡単な例は以下の通りです。

    gcloud compute instances add-metadata instance01 --zone asia-east1-a --metadata "^#&&#^ssh-keys=testuser:ssh-rsa XXXXXXXXX  testuser"

XXXXXXXXXには自分が生成したKeyの文字列を入れてください。
これでコマンドラインからインスタンスにsshキーを追加することができます。
よくわかるBlurMaskFilter

```java
paint.setMaskFilter(new BlurMaskFilter(radius, style));
```

上記コードの`radius`はぼかしの半径を設定しますが、`style`の方がよくわからなかったので調べてみました。

[こちらの記事](http://android--examples.blogspot.jp/2015/11/how-to-use-blurmaskfilter-in-android.html)に様々なBlurMaskFilterのスタイル例が紹介されています。

## Blur.INNER

![Blur.INNER](http://1.bp.blogspot.com/-qju86oNKqqQ/VkrrmYA5q5I/AAAAAAAAb9g/KlPOIDqPTCc/s1600/AndroidBlurMaskFilterInnerBlur.png)
描画領域の内側に向かって、外側の色が溶け込むようなぼかしをかけます。

## Blur.NORMAL

![Blur.NORMAL](http://4.bp.blogspot.com/-lwqx_Dislas/VkrrmYWhUVI/AAAAAAAAb9c/shXXidtPkJg/s1600/AndroidBlurMaskFilterNormalBlur.png)
描画領域とその外側全体にぼかしをかけます。いわゆる「普通にぼかす」という状態。

## Blur.OUTER

![Blur.OUTER](http://3.bp.blogspot.com/-Ot4AwDi2-ew/VkrrmiDD_eI/AAAAAAAAb9k/x-USmEtTtoI/s1600/AndroidBlurMaskFilterOuterBlur.png)
描画領域には**色を置かず**、その外側に漏れるように描画します。

## Blur.SOLID

![Blur.SOLID](http://1.bp.blogspot.com/-VM-MfWCY74w/VkrrnFEmLAI/AAAAAAAAb90/wDKPozdd4tk/s1600/AndroidBlurMaskFilterSolidBlur.png)
描画領域は**ぼかしをかけずに描画し、**、さらに外側に漏れるようにぼかしを描画します。**Blur.OUTER+ぼかしのない描画**です。


名前だけからはイマイチどのような描画結果になるのか想像しづらいですが、例を見れば一目瞭然ですね！
PyQtGraphが、インタプリターで使用できない事がある。

## これが実行できない場合がある
###とりあえず、これをやって、
端末から、下記したコードが実行できない事があります。
OSの違いによる現象ではないかと思ってます。

コレとか、

```py:Python_console
import pyqtgraph as pg
pg.plot([0,1,2],[3,4,5])
```
コレ。

```py:Python_console
import pyqtgraph as pg
import numpy as np
pg.image(np.random.rand(10,10))
``` 
ついでにコレも。

```py:Python_console
import pyqtgraph as pg
pg.dbg()
```

###こうなってほしい

![20161104-02.png](https://qiita-image-store.s3.amazonaws.com/0/137888/b9f98641-34fc-4f7a-85a5-b63af3b95514.png)
![20161104-01.png](https://qiita-image-store.s3.amazonaws.com/0/137888/c7a937c8-7d55-f473-92f7-92e0234d2c90.png)
![20161104-03.png](https://qiita-image-store.s3.amazonaws.com/0/137888/302590c6-0973-a690-0952-7f2d3d0f02c1.png)
これを使うと、3DCGのblenderとかみたいに、ユーザーがpython consoleから操作する、上級者向けのアプリが作れそうだ。
そういや、3Dで、こういうのがあるから、pythonを勉強し始めたんだっけか。
・・・普通に動く。


## しかし、こうなる場合も（Windowsの場合）
### 私の環境だけかも知れませんが・・・

ウィンドウは現れるけど、フリーズしたような状態になってしまう。
[この知恵袋に、載っていたのと、同じ状態だと思いっています。](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12150648942)

![20161011-1.png](https://qiita-image-store.s3.amazonaws.com/0/137888/7ceb1523-e199-3cd9-c5fe-47e6ef175af4.png)
(これ以外にも、グラフの軸は表示されるけどフリーズする、という場合もあった。)

ちなみに、PySideと連携させた場合は、これが起こる環境のWindows PCでもちゃんと表示されます。([とりあえずこれをim.pyとして保存し、実行する。](http://qiita.com/yozi/items/71f5b43ea99258d5fb81#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E3%81%93%E3%82%8C%E3%82%92impy%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%97%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B))

###　Windowsでは、できないというわけじゃない。
[ここ](https://github.com/pyqtgraph/pyqtgraph/blob/develop/examples/SimplePlot.py)にあったのを、もう少し簡単にしてみました。

```py:
import sys
import pyqtgraph as pg
plt = pg.plot([0,1,2],[3,4,5])
if __name__ == '__main__':
    if sys.flags.interactive != 1 or not hasattr(pg.QtCore, 'PYQT_VERSION'):
        pg.QtGui.QApplication.exec_()
```

またできなかった・・・と思いきや、
![20161011-2.png](https://qiita-image-store.s3.amazonaws.com/0/137888/790897bf-4486-a228-f499-f1857209b935.png)
出来てます。

### ???こんな場合もありか。（matplotlibを使えば・・・）
原因は不明ですが、いったんmatplotlibで、プロットした後なら、pyqtgraphが使えるようになる様です。
偶然気付いた。

```py:
import matplotlib.pyplot as plt
plt.plot([0,1,2],[0,1,2])
plt.show()
```
とでもしておき、matplotlibのwindowを消してから、

```py
import pyqtgraph as pg
pg.plot([0,1,2],[3,4,5])
```
とすると、無事にできてしまいます。
pyqtgraphのimportは、matplotlibの前でも大丈夫なようです。

matplotlibが、何の役割をしているのか分かりません。


## こうなる（Ubuntuの場合）
![20161010screenshot27.png](https://qiita-image-store.s3.amazonaws.com/0/137888/cfe4c050-a250-05a3-d54e-723a0ec11e8f.png)
できる!一発！！

ちなみに、これは、インタラクティブな操作が可能なグラフです。

-  左クリックのドラッグで左右に移動。
-  右クリックのドラッグでズーム。
-  右クリック一回押しから出るメニューから、軸のlog表示、画像の保存や、プロットデータの保存などにも対応しています。

## ちなみに、matplotlibと比較しますが、
```pycon:Python_console_session
import matplotlib.pyplot as plt
plt.plot([0,1,2],[3,4,5])
plt.show()
```  
3行かかります。
![20161010screenshot28.png](https://qiita-image-store.s3.amazonaws.com/0/137888/f22bfdbc-1cdf-b5f9-489c-31748cb1f1ba.png)
こちらも、インタラクティブに操作できます。
詳細は省きますが、
下側のボタンを押す→ドラッグすると画面が動くという様な感じです。

私は、UbuntuのPyQtGraphの操作の方が、手っ取り早く動いてくれて、好きです。
[Linux] LTP(Linux Test Project)のビルドと実行方法まとめ

# LTP(Linux Test Project)とは
[LTP - Linux Test Project](http://linux-test-project.github.io/)

LTP(Linux Test Project)とはLinuxの信頼性、堅牢性、および安定性を検証するテストスイートを提供するオープンソースソフトウェアとのこと。


# 環境準備
## リリースページから最新のソースを取得

[Releases · linux-test-project/ltp](https://github.com/linux-test-project/ltp/releases)

```console:例：20160920リリースをダウンロード
$ wget https://github.com/linux-test-project/ltp/releases/download/20160920/ltp-full-20160920.tar.bz2
$ tar xvf ltp-full-20160920.tar.bz2
$ cd ltp-full-20160920
$ ls
COPYING           README.kernel_config  config.guess  include     pan              scripts
IDcheck.sh        TODO                  config.sub    install-sh  runalltests.sh   testcases
INSTALL           VERSION               configure     lib         runltp           testscripts
Makefile          aclocal.m4            configure.ac  ltpmenu     runltplite.sh    tools
Makefile.release  autom4te.cache        doc           m4          runtest          utils
README            compile               execltp.in    missing     scenario_groups  ver_linux
```

もしくはGithubのリポジトリからクローンして下さい
[linux-test-project/ltp: Linux Test Project](https://github.com/linux-test-project/ltp)

## ビルドとインストール
以下のドキュメントを参考にしてください。

[ltp/mini-howto-building-ltp-from-git.txt at master · linux-test-project/ltp](https://github.com/linux-test-project/ltp/blob/master/doc/mini-howto-building-ltp-from-git.txt)

```console:ビルドとインストール例
$ make autotools
$ ./configure
$ make -j4
$ sudo make install
```

`/opt/ltp` 以下にインストールされます。

# LTP実行
## 注意
標準のテスト項目には故意にシステムをクラッシュさせるテストも含まれるため、実行には注意して下さい。

## HTML形式で結果を出力

シェバンが`#/bin/sh`のため、Ubuntu(dash)など、`bash`がデフォルトシェルじゃない場合はエラーになる可能性があります。
Ubuntuやデフォルトシェルを `bash` 以外に設定している場合はシェバンを修正するか実行時に`bash`を指定して下さい。

```console
$ sudo bash /opt/ltp/runltp -f syscalls -g test.html
```

`-g` オプションで、html出力を指定することができます。出力結果例は以下のようになります。
(例としてUbuntu16.04 on VirtualBoxにて実施)

![LTP.png](https://qiita-image-store.s3.amazonaws.com/0/37721/b0efe6c8-f0a7-c21a-8901-17e473af0631.png)

# LTPへテストを追加する

LTPへテストの追加も出来る様子。（未検証）

[Linux Test Project - Documentation » Technical Papers](http://ltp.sourceforge.net/documentation/technical_papers/node4.php)

# 参考
[LTPによるLinuxシステム検証 - Qiita](http://qiita.com/stc1988/items/e53a6e9ac818233cc66f)
[Linux Test Project - Documentation » Technical Papers](http://ltp.sourceforge.net/documentation/technical_papers/node4.php)
[configureの作り方(autotoolsの使い方） - のぴぴのメモ](http://nopipi.hatenablog.com/entry/2013/01/14/025509)
CSV出力で空文字だけダブルクオートつけられてつらい時

タブ区切りのファイルを出力して、それをmysqlにloadする処理を作ったら、空文字が「""」と入ってしまうデータがあった。
調べてみたら、**nilの出力は空文字だが、空文字の出力は「""」になってしまう**もよう。

* 検証プログラム

```
require 'csv'

data = [[1, "XXX", nil, "", " ", 111],[2, "YYY", nil, "", "  ", 222]]

CSV.open("out.csv","w", col_sep: "\t") do |out|
  data.each do |d|
    out << d
  end
end

out_csv = File.read("out.csv")
puts "out.csv.inspect=" + out_csv.inspect
puts "out.csv.to_s=\n----\n" + out_csv.to_s + "\n----"
```

* 結果

```
out.csv.inspect="1\tXXX\t\t\"\"\t \t111\n2\tYYY\t\t\"\"\t  \t222\n"
out.csv.to_s=
----
1       XXX             ""              111
2       YYY             ""              222

----
```

１文字以上の文字列はつけないけど、空文字はつけるとかなんで？？？

**force_quotes**でいっそ全部ダブルクオートつけるか、**CSV::Converters**とか使ってデータごとに形式を決めるのが正しいのかもしれないのだけど面倒なので、**空文字は全部nilに変えてしまう**ことにした。


* 検証プログラム

```
require 'csv'

data = [[1, "XXX", nil, "", " ", 111],[2, "YYY", nil, "", "  ", 222]]

CSV.open("out.csv","w", col_sep: "\t") do |out|
  data.each do |d|
    #out << d
    out << d.map{|_d| _d.to_s == "" ? nil : _d}
  end
end

out_csv = File.read("out.csv")
puts "out.csv.inspect=" + out_csv.inspect
puts "out.csv.to_s=\n----\n" + out_csv.to_s + "\n----"
```

* 結果

```
out.csv.inspect="1\tXXX\t\t\t \t111\n2\tYYY\t\t\t  \t222\n"
out.csv.to_s=
----
1       XXX                             111
2       YYY                             222

----
```
JSのクラス名をゲットする

EventEmitterとかのEvent名にクラス名を仕込みたいなと思って、自分のクラス名を取得する方法を考えた。
シンプルに `this.constructor.name` でよかった。extendsした時の挙動がよくわからなかったので試した。

```js:code.js
class Base {
  constructor() {
    console.log("Base"); // line 1
    console.log(this.constructor.name); // line2
  }

  getClassName() {
    console.log(this.constructor); // line4
    console.log(this.constructor.name); // line5
  }
}

class Something extends Base {
  constructor() {
    super()
    console.log("Something"); // line 3
  }
}

var o = new Something();
o.getClassName();
```

```shell-session:result
Base
Something
Something
[Function: Something]
Something
```

サンキューです
standaloneクラス

#standaloneクラス
Ti<i>k</i>Z などで図だけを作るときに便利なクラスファイル。
TeX Live や MikTeX にはもれなくついてくる。

#基本的な使い方
Ti<i>k</i>Z で作った図を dvipdfmx を利用して PDF として出力する。

```howtouse.tex
\documentclass[dvipdfmx,tikz]{standalone}

\begin{document}
\begin{tikzpicture}
\node[circle,draw] {Example};
\end{tikzpicture}
\end{document}
```

`platex` + `dvipdfmx` で，大きさが図とぴたり同じの PDF ファイルが得られる。
得られた PDF ファイルを別のファイルに `\includegraphics` で取り込んだり，
`pdftocairo -png` で png ファイルに変換したものを利用したりできる。

##tikzpicture環境が複数ある場合

複数の `tikzpicture` 環境がある場合，
`dvipdfmx` を使わないのであれば
`\documentclass[tikz]{standalone}`
とすることで，各 `tikzpicture` 環境ごとに頁を変えた pdf ファイルが得られる。
しかし，
`\documentclass[dvipdfmx,tikz]{standalone}`
とするのは（私の手元では）うまくいかない。

複数の `tikzpicture` 環境を 1 頁にまとめた pdf ファイルを `dvipdfmx` を通して得るには，
`documentclass` のオプションに `tikz` を指定せず，`\usepackage` で Ti<i>k</i>Z を読み込む。

```howtouse.tex
\documentclass[dvipdfmx]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\node[draw] {Example};
\end{tikzpicture}
\begin{tikzpicture}
\node[circle,draw] {Example};
\end{tikzpicture}
\end{document}
```

これが最良の解決手段なのか，再確認しようね。＞自分

#こんな使い方も

```mathexp.tex
\documentclass{standalone}

\begin{document}
$\displaystyle\sum_{k=1}^n k = \frac{n(n+1)}2$
\end{document}
```

別の文書に取り込めるような PDF ファイルが得られる。

#参考
CTAN: https://www.ctan.org/pkg/standalone
【Unity】シーン遷移時に暗くなる問題

いつも引っかかるので備忘録メモ

## 対応方法 (Unity 5.4.1)
1. 暗くなるSceneを開く
2. 上のメニュー -> Window -> Lighting
3. LightMapsタブ -> Autoのチェックを外す -> Build

これで暗くならない！
Watson IoT Platform APIを使ってみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。

Watson IoT PlatformのAPIは下記で説明されています。
[IBM® Watson™ IoT Platform HTTP REST API](https://docs.internetofthings.ibmcloud.com/swagger/v0002.html)

#### 新しいデバイスを登録してみます。
- Device Type `dtmf01`　の配下に、新しいDevice IDとして `dimf03`　を追加してみます
- IoT Platformサービスを用意します。ここでは組織IDは`org123`とします
- APIキーを取得します。ここでは下記とします
API キー
`a-org123-apikey1234`
認証トークン
`Token0123456789abc`

- cURLで下記を実行します`curl --user a-org123-apikey1234:Token0123456789abc -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"deviceId":"dimf03"}' {https://org123.internetofthings.ibmcloud.com/api/v0002/device/types/dtmf01/devices}`

- IoT Platformのダッシュボードで新しいDevice IDが登録されているのを確認します

![スクリーンショット 2016-10-11 19.05.57.png](https://qiita-image-store.s3.amazonaws.com/0/125842/fd947b82-3332-e99d-f46a-e34e385b9c40.png)
aurora: Cross-platform Beanstalk queue server console

![aurora](https://raw.githubusercontent.com/Luxurioust/aurora/master/aurora.png)



## Overview

aurora is a web-based Beanstalk queue server console written in Go and works on macOS, Linux and Windows machines. Main idea behind using Go for backend development is to utilize ability of the compiler to produce zero-dependency binaries for multiple platforms. aurora was created as an attempt to build very simple and portable application to work with local or remote Beanstalk server.

## aurora
GitHub [github.com/Luxurioust/aurora](https://github.com/Luxurioust/aurora)

## Features

- Cross-platform support macOS/Linux/Windows 32/64-bit
- Simple installation (distributed as a single binary)
- Zero dependencies
- Common list of servers in config for all users + optional Basic Auth
- Each user can add its own personal Beanstalk server
- Full list of available tubes
- Complete statistics about jobs in tubes
- Realtime auto-update with highlighting of changed values
- You can view jobs in ready/delayed/buried states in every tube
- You can add/kick/delete jobs in every tube
- You can select multiple tubes by regExp and clear them
- You can move jobs between tubes
- Ability to Pause tubes
- Search jobs data field
- Customizable UI (code highlighter, choose columns, edit auto refresh seconds, pause tube seconds)
Amazon Linux (EC2)上でPython3とDjangoをインストールして、Webサーバを動かす

メモ代わりに残します。
インスタンスは立ちたてホヤホヤという前提です。


##Python3をインストール
Amazon Linuxに元から入っているPythonのバージョンは`2.7.12`です。
そんなわけで、今回はPython 3系をインストールします。
幸いにも、YUMのamzn-mainレポジトリに、Python3がコレクションされています。


```
# yum list | grep python35
python35.x86_64                        3.5.1-13.7.amzn1               @amzn-main
python35-devel.x86_64                  3.5.1-13.7.amzn1               @amzn-main
python35-libs.x86_64                   3.5.1-13.7.amzn1               @amzn-main
python35-pip.noarch                    6.1.1-1.23.amzn1               @amzn-main
python35-setuptools.noarch             12.2-1.32.amzn1                @amzn-main
python35-tools.x86_64                  3.5.1-13.7.amzn1               @amzn-main
python35-virtualenv.noarch             12.0.7-1.13.amzn1              @amzn-main
mod24_wsgi-python35.x86_64             3.5-1.23.amzn1                 amzn-main
python35-libs.i686                     3.5.1-13.7.amzn1               amzn-main
python35-test.x86_64                   3.5.1-13.7.amzn1               amzn-main

```

この中から、パッケージを選択します。
僕の場合は、下記の様にしました。

```
# yum install python35-devel python35-libs python35-setuptools
```

**ここでpipをインストールしなかったのは、あとでeasy_installを使ってインストールするためです。**
インストール完了後、`python35`というコマンドで、Python３.5が利用可能になります。

```
# python35
Python 3.5.1 (default, Sep 13 2016, 18:48:37)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

続いて、Python3系向けに、pipをインストールします。

```
# /usr/bin/easy_install-3.5 pip
```

これで、`pip3`というコマンドで、python3用にpipが利用可能になりました。

## Djangoインストール

とりあえず、pipをupgradeします。

```
# pip3 install --upgrade pip
```

そして、Djangoのインストール

```
# pip3 install django
```

上手くインストールできているか確認します。

```
# python35
Python 3.5.1 (default, Sep 13 2016, 18:48:37)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print(django.get_version())
1.10.2
>>>
```

上記のようになっていれば、うまくインストール出来ています。

## Webサーバ動かす
**もしウェブブラウザで確認するなら、セキュリティグループで80番へのリクエストを許可してください。**

とりあえず、Django用のディレクトリを作成します。

```
# mkdir django
# cd django

```

続いて、プロジェクトを作成します。

```
# django-admin startproject pro1 # pro1はプロジェクト名
# cd pro1 # プロジェクトのディレクトリに移動
# python35 manage.py migrate
# python35 manage.py createsuperuser # superuser作成
```

Webサーバを動かします。

```
# python35 manage.py runserver 0:80 # IPアドレス:ポートで指定。IPアドレス0なら外部向けにも動作
```

これで、Webブラウザからサーバにアクセスしたときに、下記のページが表示されるはずです。

![スクリーンショット 2016-10-11 18.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/85797/9759979e-8b50-ce87-b7c1-6798b6424a21.png)

おつかれさまでした。
イマドキWebサービスの監視について考えてみる

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。
2016年度下期のミッションの一つに、プロダクトの監視整備というお仕事をまかされました。
がんばります。(決意表明)

とはいえ、監視の目的もはっきりしておらず、サービス自体のSLAも明確に規定されておらず、
今の水準のものを広げていくだけで良いのかもはっきりしておらず…
まずはできることとして、「イマドキのWebサービス」は、どんな体制でやっているのかを調べることにしました。

# 各会社の採用プロダクト
- [WEB系各社で使われている監視ツールまとめ](http://mikeda.hatenablog.com/entry/2015/10/17/134805) << 超！良エントリ

# ツールごとの特徴
調べてみて思ったこととして、ぶっちゃけ、どれを使うにしても、
「頑張れば何でもできる」とは思いました。

## Nagios
- メリット
    - 現在利用中
    - 検知時トリガ処理なども仕込めるので、作り込みを覚悟すれば何でもできる
- デメリット
    - 設定ファイルがテキストベースで少し扱いづらい
    - AWSからyumできるバージョンが日本語対応していない
    - Nagios-pluginsが他のyumと競合することが(まれに)ある
    - 基本的にPull型監視

## Munin
- [「Muninでかんたんサーバー監視」～初心者でもよくわかる！VPSによるWebサーバー運用講座(3)](http://knowledge.sakura.ad.jp/beginner/3669/)
- メリット
    - 導入は簡単そう
- デメリット
    - どっちかと言えばviewが評価されている印象で、監視能力に特筆するものは無さそう

## Zabbix
- [NagiosとMuninを両方合わせたことができる](http://techlife.cookpad.com/entry/2015/04/28/100000)
- メリット
    - WEB+DB PRESS Vol.94 でもAWSの監視として取り上げられていた
    - 資料が多い
    - エージェントをインストールすれば勝手に監視対象に追加してくれる
- デメリット
    - Nagiosの資産がそのままは使えない
    - PostgreSQLが必要

## Sensu
- メリット
    - エージェントを入れればPushで通知してくれる監視なのは良い
    - Nagiosの資産を利用できる
    - Uchiwaで複数Sensuをまとめられるのはとてもよい<br>(メインプロダクトの本番/開発、新規事業などいろいろな軸があるので)
        - [Uchiwa で複数の Sensu をまとめて管理しよう](http://qiita.com/m_doi/items/2ecd75c638bea6b45eaa)
- デメリット
    - ただし設定やセットアップが煩雑という声がある

## AWS CloudWatch
- メリット
    - AWSのマネージドサービス
    - カスタムメトリクスを使えば比較的なんでもできるとは思う
- デメリット
    - APIのリクエスト制限
    - 必要な値は自分で登録の仕組みも作る必要がある

## Hinemos
- NTT DATA製、国産ツール
- メリット
    - Jobの運用監視ができる
    - AWS対応も一応あり
- デメリット
    - 監視項目の追加が難しい
    - これだけ高機能なのに利用されていないのにはそれだけの理由がありそう

## New Relic
- [パフォーマンス監視サービスのNew Relicが超便利な件](http://qiita.com/y_uuki/items/dd4fce78b1bc32b64600)
    - このエントリに書いてあるけれども、死活監視というよりパフォーマンス監視のツール

## Mackerel
- 有料なので試せてない。ただし国産ツール

# おわりに
今のところ、Nagiosから乗り換えるならまずはZabbixかなという気がしていますが、
もしおすすめがあればぜひ教えてください！

おしまい。
RubyMineの開発のはじめ方 

# はじめに
- 普段はVimで開発していたのですがRubymineが便利そうだったのでRubymineを導入してみました。

# RubyMineのダウンロード
- Download
    - https://www.jetbrains.com/ruby/

# 導入
## 導入時役にたった資料
- http://qiita.com/ruzia/items/2edd8d45c16ac2c70dd7

## ターミナルからrailsプロジェクトを作る
```$ rails new project_name -d mysql
```

## mysql内にデータベースを作成する

```
$ mysql -uroot
mysql> create database project_name_development;
```

## RubyMineでプロジェクトを開く
### 先程作成したプロジェクトをRubyMineで開きます
<img width="475" alt="Welcome_to_RubyMine.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/1d4c0a9f-c0fe-7736-43ef-17dfdd639bb0.png">

### プロジェクトを選択します
<img width="416" alt="Open_File_or_Project.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/439311f8-73ea-d094-53aa-7fb0fb5d9311.png">

### コマンドの実行も可能です。bundle installを実行します。
<img width="1394" alt="Gemfile_-_employee-search_-____Develop_rails_employee-search_.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/1926927d-0d85-ed9d-ffc2-8b2fafaf8eb4.png">

ターミナルから以下を実行し、準備OK!
```bundle install
```

# 便利なショートカット
| コマンド | 内容 | 
|:-----------|:------------|
| cmd + shift + o       |        ファイル検索 |
| cmd + shift + a     |      コマンド検索 |
| cmd + shift + l       |        整形|
MYSQL ユーザー作成めも

よく忘れるのでメモ。

## テンプレ
`````````````````````````````````````
 GRANT 権限 ON DB名.テーブル名　TO ユーザ名　INDENTIFIED BY 'パスワード';
 flush privileges;
`````````````````````````````````````


## サンプルSQL
`````````````````````````````````````
 GRANT ALL ON *.* TO developer@localhost IDENTIFIED BY 'password';
 flush privileges;
`````````````````````````````````````
 

`````````````````````````````````````
 GRANT SELECT , INSERT , DELETE , UPDATE , CREATE , DROP , FILE , ALTER ,INDEX ON * . * TO user_name IDENTIFIED BY 'passwd';
 flush privileges;
`````````````````````````````````````
IntelliJでJavaVMのスタックサイズを変更する

#環境
- macOS Sierra
- IntelliJ IDEA 2016.2.4

#やり方
Run > Edit Configurations
<img width="334" alt="スクリーンショット 2016-10-11 18.23.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/26440/7fe62285-ae4b-77ec-e330-65b78602c6a6.png">

Application > 対象のクラス > Configuration > VM options
<img width="795" alt="スクリーンショット 2016-10-11 18.27.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/26440/cb9972f4-73f2-c03b-0932-d908e39e2a40.png">

VM optionsの項目に
`-Xss2048k`
を入力する。(この場合、スタック領域を2048KBに設定)

## 対象のクラスがない場合
main文を書いて一度実行をする。
AWSの請求額を毎日slackに通知させる

# 背景
AWSの料金体系は複雑であり、なかなか理解しにくい。
開発用に固定IPを取得し、そのまま放置したら請求が来た。
巨額な請求を避けるため、slackに請求額を通知させることにした。
先人（他の方）のベースに、足りない所を補足する。

# 流れ
大まかな流れを示す。

1.IAMのロール作成
2.Lambdaのファンクション作成　
3.クーロン作成

# 手順
**1.IAMのロール作成**
Cloud Watchにアクセスためのロール（権限をまとめたもの）を作成する。
作成方法は、下記を参照。
http://qiita.com/saku/items/fc6b70a420a5c510de2b

**2.Lambdaのファンクション作成**
請求額を取得し、slackに通知するコードは下記を参照。
hookUrl（※）とslackChannelのみ、変更するだけでよい。
※hookUrlとは、slackが外部とのメッセージをやりとりするためのURL。
指定したchannelのhookUrlの取得は、URLを参照。

**3.クーロン作成**
定期的（平日の9時）に通知させるよう、クーロンを指定する。
URLを参照。

# URL
- 1.ファンクション作成。
http://qiita.com/saku/items/fc6b70a420a5c510de2b
- 2.webhookのURL取得方法。
http://qiita.com/vmmhypervisor/items/18c99624a84df8b31008
- 3.CronジョブでLambdaのファンクションを実行。
https://blog.manabusakai.com/2015/10/cron-job-to-lambda-scheduled-event/
64bitのネイティブライブラリを含めないでビルドする

あるライブラリAとライブラリBがありって、ライブラリAはarmeabi-v7aのネイティブライブラリしか含んでおらず、ライブラリBはarmeabi-v7aとarm64-v8aのネイティブライブラリを含んでいる場合、実行時にUnsatisfiedLinkExceptionでアプリが終了してしまいます。これはライブラリBのarmeabi-v7aのネイティブライブラリのみをAPKに含むようにすることで回避できます。

以下のようにモジュールレベルのbuild.gradleに記述することで解決しました。

```groovy
apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        ...

        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}
```
Windowsでvagrantを利用して仮想マシンを立ち上げてみる 

# なぜvagrantをやろうとしたか
開発環境を構築する上で、仮想マシンを管理するのが大変だったので簡単にしたい。
vagrantなら機能拡張とか簡単っぽいし、環境構成ファイルをGitHubとかで共有するだけで、開発環境も共有できそう。
# ゴール地点
WindowsでVirtualBoxをvagrantで起動し、SSHでの接続を確認する。
# 前提条件
VirtualBoxとSSH接続ができるツールがインストールされている。
# やりかた
## vagrantをインストールする。
まずは以下のURLから、最新のvagrantをインストールしましょう。
http://www.vagrantup.com/

## vagrantにBOXを追加する。
BOXとは仮想マシンの起動時にベースになるイメージファイルです。
OSイメージから作成するのが通常らしいですが、今回は用意されているものを使用しましょう。(こちら→http://www.vagrantbox.es/)
下記のコマンドで追加できます。

```
$ vagrant box add {title} {url}
```
titleはわかりやすい名前であれば何でも大丈夫です。
urlはイメージファイルのパスを設定しましょう。

追加できているか確認したいときはlistコマンドで確認できます。

```
$ vagrant box list
```

## 追加されたBOXを初期化する。
適当なディレクトリを作成し作業スペースにしましょう。
cdコマンドで該当のディレクトリに移動して、BOXの初期化をします。
僕はCドライブの直下にworkspace/vagrantboxを作成しました。

```
$ vagrant init {title}
```
titleは先ほど作成したBOXと同じやつです。
成功していれば、作業スペースにVagrantfileが作成されているはずです。

## 仮想マシンを起動する。
仮想マシンを起動する前に、プライベートなIPアドレスを設定しましょう。
Vagrantfileを適当なエディタで開いて、config.vm.network "private_network"の行のコメントを外しましょう。

``` Vagrantfile.
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.33.10"
↑これ
```

編集を保存したら、vagrantコマンドで仮想マシンを起動します。
必ずVagrantfileと同じディレクトリで実行してください。

```
$ vagrant up
```

## SSH接続して確認してみる。
自分の使用しているツールでSSH接続をしてみましょう。
ユーザ名:vagrant
パスワード:vagrant
IP:アドレス:192.168.33.10(config.vm.network "private_network"のやつ)

## 仮想マシンを終了する。
最後に仮想マシンを停止しましょう。

```
$ vagrant halt
```

削除するときは下記のコマンドで削除もできます。

```
$ vagrant destroy
```

ここまで出来たら仮想マシンの立ち上げは完了です。
お疲れ様でした。
Python-matplotlibで画像の座標を読取る

#はじめに
数式や数値データがなく，グラフの画像だけがある場合に，画像からプロット座標を読み取って数値化したい場合があると思います．

これを実現するためにPythonのmatplotlibを使ってみました．

やっていることは，

+ 画像を表示する
+ 表示した画像内をクリックすることで座標を読み取る
+ クリック点に丸を打って画像を保存する

というものです．
座標軸をきちっと設定することにより，グラフデータの数値化ができるようになるはずですが，それは今後考えたいと思います．

#プログラム

```
$ python3 py_img_test.py
/Users/kk/.pyenv/versions/3.5.2/lib/python3.5/site-packages/matplotlib/backend_bases.py:2437: MatplotlibDeprecationWarning: Using default event loop until function specific to this GUI is implemented
  warnings.warn(str, mplDeprecation)
```
上の警告が出て，どうしても消せなかったので，下の行を入れて警告を消しています．

```
import warnings;warnings.filterwarnings('ignore')
```

クリック座標取得には，```ginput``` を使っています．

下は，よく使う割に忘れてしまう，画像の余白を調整して出力する文です．

```
plt.savefig('fig_test.png', bbox_inches="tight", pad_inches=0.2)
```

##プログラム全文

```python:py_img_test.py
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import warnings;warnings.filterwarnings('ignore')

im=Image.open('fig_PSHQ1.png')
im_list=np.asarray(im)
plt.imshow(im_list)

nn=5
a=plt.ginput(n=nn)
for x,y in a:
    print(x,y)
    plt.plot( x,y, 'ro' )

plt.savefig('fig_test.png', bbox_inches="tight", pad_inches=0.2)
plt.show()
```

#画像表示事例
別途作成したグラフ（ファイル名：fig_PSHQ1.png）を読み込んで，画像上を5点クリックすると，下のコンソール出力およびクリック点を赤丸で示したグラフが表示・保存されます．

##コンソール出力

```
$ python3 py_img_test.py
205.951612903 1005.9516129
318.85483871 825.306451613
489.822580645 689.822580645
680.14516129 589.822580645
1125.30645161 415.629032258
```

##出力画像
![fig_test.png](https://qiita-image-store.s3.amazonaws.com/0/129300/a995d615-f247-3e4a-c997-ce2eef4aa4b1.png)




#参考サイト
##画像を表示
[http://qiita.com/zaburo/items/5637b424c655b136527a](http://qiita.com/zaburo/items/5637b424c655b136527a)
[http://www.mwsoft.jp/programming/computer_vision_with_python/1_2_matplotlib.html]
(http://www.mwsoft.jp/programming/computer_vision_with_python/1_2_matplotlib.html)

##座標値取得
[http://seesaawiki.jp/python-project/d/%BA%C2%C9%B8%C3%CD%BC%E8%C6%C0(ginput)]
(http://seesaawiki.jp/python-project/d/%BA%C2%C9%B8%C3%CD%BC%E8%C6%C0(ginput))

#警告を消す
[http://dothiko.hatenablog.com/entry/2014/11/27/001000](http://dothiko.hatenablog.com/entry/2014/11/27/001000)
sotaを対話的に開発する（jRuby）

# 前提と目的

[Sota](http://sota.vstone.co.jp/sota/) のプログラミングは、通常VstoneMagic、もしくはEclipseによるJavaでの開発になります。

しかし、Javaで開発して転送して実行してーというプロセスを踏むのがめんどくさそうだなと考え、REPL的に動作確認をできるように[jRuby](http://jruby.org/)からsota君を動作させます

これによってjRubyのreplであるjirbで1行づつSotaに処理を実行させることができるので、対話的に動作が可能になるので理解が進みやすくなるかなと思います。

# 環境構築

Sota/RaspberryPi 版

```
### sotaにsshでログインしてから
$ sudo apt-get install jruby
$ jruby --version
jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2012-12-11 6586) (Java HotSpot(TM) Client VM 1.8.0) [arm-java]
$ jirb --version
irb 0.9.5(05/04/13)
```
なんかjruby異様に古いですね。（いまは気にしない）

私の利用しているsotaはJava8にしてあります、必要であれば入れてください。（jRubyを入れる前にinstallしてしまったので必須かよくわからない）

動いた環境のjavaは以下の状態

```
$ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)
```

# 動作確認

jirbで動作確認します。
javaのexampleをもとにjRubyで動くコードを用意します。
以下の2つのExampleをもとにLED/モータ/スピーチの動作確認をしてみます。
https://github.com/vstoneofficial/SotaSample/blob/master/src/jp/vstone/sotasample/MotionSample.java
https://github.com/vstoneofficial/SotaSample/blob/master/src/jp/vstone/sotasample/TextToSpeechSample.java

以下をコピーしてsshでsotaに接続してjirbで動作させてみましょう。

``` example.jrb
require 'java'
require "/home/vstone/lib/core-2.2.jar"
require "/home/vstone/lib/sotalib.jar"
require "/home/vstone/lib/SRClientHelper.jar"
require "/home/vstone/lib/jna-4.1.0.jar"
require "/home/vstone/lib/javase-2.2.jar"
require "/usr/local/share/OpenCV/java/opencv-310.jar"
require "/home/vstone/lib/gson-2.6.1.jar"

java_import "java.awt.Color"
java_import "jp.vstone.RobotLib.CRobotUtil"
java_import "jp.vstone.RobotLib.CRobotMem"
java_import "jp.vstone.RobotLib.CSotaMotion"
java_import "jp.vstone.RobotLib.CRobotPose"
java_import "jp.vstone.RobotLib.CPlayWave"

CRobotUtil.Log("log", "Servo On")
mem = CRobotMem.new
motion = CSotaMotion.new(mem)
mem.Connect
motion.InitRobot_Sota

CRobotUtil.Log("log", "Rev. " + mem.FirmwareRev.get.to_s)

motion.ServoOn
pose = CRobotPose.new
pose.setLED_Sota(Color.new(255,255,255), Color.new(255,255,255), 255, Color.new(255,255,255))
pose.SetPose([1,2,3,4,5,6,7,8].to_java(:Byte), [0,900,0,-900,0,0,0,0].to_java(:Short))

motion.play(pose,5000)
motion.waitEndinterpAll()

pose.setLED_Sota(Color.new(255,0,0), Color.new(0,255,0), 255, Color.new(255,0,0))
pose.SetPose([1,2,3,4].to_java(:Byte), [500,-900,-500,900].to_java(:Short))
motion.play(pose,1000)
motion.waitEndinterpAll()

java_import "jp.vstone.sotatalk.TextToSpeechSota"
CPlayWave.PlayWave(TextToSpeechSota.getTTS("やっほー"),true)
```

というわけでこの程度で動きました。
MVCについてわかっていることをまとめる


##事前知識(間違っている部分がある可能性)

###全体の流れ

1. URLが入力されるとルーティングを操作するroute.rbにURLのルーティングと一致したコントローラのアクションに割り振る.
2. 割り振られたコントローラのアクション内で操作を行う.
3. この際にモデルとコントローラでのやり取りを行い,もしデータベースとのやり取りが行われる際はモデルが担当する.
4. コントローラとモデルのやり取りを行いながら,アクション名と同じビューにコントローラのデータ(インスタンス変数)を渡してHTML等を描画する.
5. 描画されたHTMLファイルをコントローラで受とり,それをブラウザに返す.


###MVCの役割

- Model
	
	Model(以下モデル)はデータベースの操作や,データの管理等のビジネスロジックを行うもので,
	特に重要なデータの処理等はここに書くべきである.
	ただし,モデル自体が肥大化する可能性があるので,気をつけなければならない.
	
- Controller

	Controller(以下コントローラ)は主にビューやモデルとのやり取りを行い,やり取りは各アクションで
	まとめられている.
	コントローラは軽量であるべきなので,処理は各コントローラのヘルパーやモデルに書くべきである.
	
- View
	
	View(以下ビュー)は主にコントローラとやり取りを行い,コントローラからのデータを取得して,
	専用のERB(埋め込みRuby)を使う.
	ERBは最終的にHTMLとして描画される.
	モデルからのデータはすべてコントローラを中継してビューに送られる.
	ビューではDRYに基づいて部分ビュー(パーシャル)を使ってERBを細かく分けることができる.
	ビューのHTMLはコントローラを経由してブラウザに送られる.
	
	
##MVCの調査

###MVCが使われる理由

簡単に言うと質の高いインタラクティブなアプリケーションを作成する際に役割を分けて分業ができるため.
なので,変更があっても他には変更の影響を受けにくくて済む.

###MVCモデルについて

MVCには2種類の構造がある.これらの違いはMVCがやり取りを行う際にどういったやり取りをするかである.

1. Push-MVC
2. Pull-MVC

- Push-MVC

このMVCではモデルとビューがどのようにやり取りを行うかと言うときに,コントローラが中間となってモデルとビューのやり取りを行うMVCである.
RailsはこのPush-MVCを採用している.

- Pull-MVC

このMVCではモデルとビューが直接やり取りを行う.


####なぜPush-MVCなのか?
Pull-MVCを実装するとなると,2つの問題が生じる.

1. 特にビューがHTMLを描画する際に必ずモデルにアクセスを掛ける必要があり,Push型と比べて描画速度が遅くなる.
2. HTTPの性質ステートレスがビューとどのモデルに紐付けられているかという情報を忘れてしまうため,セッションに関連付けの情報を保持する必要があり,実装が難しくなる.

このため実装は難しいとされている

###M,V,Cについて(事前知識からの付け加え)

- Model(モデル)

	Model(以下モデル)はデータベースの操作や,データの管理等のビジネスロジックを行うもので,
	アプリケーションの状態を表したり,その状態を加工するメソッドをまとめたもの.
	その為,肥大化してしまう.
	
- Controller(コントローラー)

	ユーザの操作に基づき,加工したモデルの操作をする役割を持っている.その為,コントローラーは肥大化しない.
	
- View(ビュー)
	モデルの状態を参照し,視覚表現するもの.
Dev Fest tokyo 2016


Dev Festいってきたのでメモ。

## 初心者のためのRxJava

Reactive Extensionの略

Reactive Manifest
Reactive Programing流行った
定義は曖昧。むーん。

データフローを定義して変更を伝播していくこと

従来はTransformational
変数に一つ一つ設定していく

Reactive
データフローを決めて、変更を伝播させる

普通にリクエスト投げるだけだとレスポンスを待ってスレッドをブロックしちゃう
コールバックを設定する必要がある
コールバック減る

Androidだと色々書いてるのがツラくなる
非同期処理ツラい

### Rxとは？

ReactiveProgrammingにインスパイアされてできた
非同期、イベントベースのプロぐらい民具
Observable Sequences
観測できるもの
Subscriberを取れる

Composing
シングルタップをダブルタップに変換させる
Operator

元々Linqを使いたかった

### RxJavaで何ができるか

- 非同期処理
- UIイベント処理
- 非同期＋UIイベント処理

### メリット

- イベント・非同期処理が扱いやすい
- 状態変数が少なくて済む
- データフローの見透しガッ良くなる

### デメリット

- 直感的とは限らない
    - 普通なら読むと大体分かるけど、Operatorの使いこなしが必要なので難しいかも
    - 罠がけっこうある

### なぜ学習コストが高いか？

オペレータがたくさんある
ややこしい概念が多い

- ドキュメント嫁
- RxJSで貯める
    - Javaだとビルドに時間がかかる
    - 違いはほとんどない
    - 納得いったらJava使うみたいな方法
    - 良いのはラムダ式が使えること
- オペレータのカテゴリを覚える
- ライブラリを利用する
    - 実はObservable.createでObservable作るのは鬼門
    - fromEmitterオススメ
- 楽しむ
    - 全てはストリームである
    - 頭の使い方が異なる
    - android-jp.herokuapp.com

### RxJavaのこれから

- RxJava 2.0 RCC2
- 今月末には正式版出る予定
- Reactive Streamsベース
- Java9で標準化される非同期処理のガイドライン
- これから導入するなら2.0にトライしてみて

https://speakerdeck.com/hkurokawa

### 使う使わないの基準は？

- 単純な非同期処理一本とかならいらない
- 複雑なUIとの組み合わせをしたい場合は適してると思う
- 諦める

### ユニットテストは？

- 一番問題になるのはScheduler
- スレッド周り
- フックポイントというのがあるよ
- 全部非同期からどう気にして動くようにできる
- 2.0で改善されてるらしい
- TestSubscriberで結果の検証はできる

### これからRxJava始めるなら？

- 勉強してみたいなら2.0
- 実際に開発するなら、2.0に色んなライブラリが対応してない

## エンジニアとして知っておくと幸せになれる(かもしれない)機械学習とTensorFlowの事

https://goo.gl/o8gBB1

機械学習、人工知能がブーム


勉強方法

1. 機械学習を賢いブラックボックスとして扱う
    1. よくわからんけど割り切って使う
    2. 言ってることは分かるがおもしろくない
2. 用途別に呼び出す手法を判断できるようになる
    1. scikit-learnっていうチートシートあるから見ろ

Tensorflow Playgroundがあるのでこれ使うと楽しい

ステップ3に行くには数学がチラチラ見える硬派な本で知識を蓄える必要がある

深層学習は？

Tensor
多次元の行列
定数、変数、プレースホルダーを宣言できる
デバイスに展開して実行する

### Web over HTTPS

https://speakerdeck.com/jxck/web-over-https

Googleのセキュアの記事

抜け落ちてる話があるんじゃないの？
安全とは？
記事に書かれてない。
HTTPサイトは本当に全て危険なのか？

今何が起こっているのか

HTTPはテキストベースでシンプル

最初は

- ドキュメント共有のプラットフォーム
- インターネット使えるのも一部の人
- パケットが見えるとか気にする必要がなかった

サイトからシステムになることで、センシティブな情報が流れるようになった

Wi-Fiで簡単にのぞける。
JSの脆弱性とかMan in the Middleがよく前提になってる

HTTPSにしとけば
間で見ても暗号化されてるから見れない

秘情報がなければ暗号化しなくて良いか？

どんな検索してるか、どんなもの使ってるかわかったら色々分かることもあるよね

技術的には層だけどそんなことやるやつはいないよね

そうではない

やらないと思われてたことを実はやってる人がいたのがわかった
これがターニングポイント

日本では通信の秘密が憲法で定められてる

言論の自由のためにはこのサイトはHTTPSじゃなくてもいいよねとか言ってらんねえ

とりあえずHTTPSでいいのか？

暗号化されたデータのまま保存しておく

国だったら

- 法律で殴りまくって秘密鍵の提出要求できる
- 物理で殴りまくって素因数分解で解析する

牧歌的な時代は終わった

前提が変化した

Webはもっと殺伐している
通信は見られている

HTTPSにしないのならば、HTTPSにしない理由を分かるようにする必要がある

PFS
これだけは押さえとけ
広域盗聴されて、鍵さえあれば全部読めるのはまずい

Ephemeralの付く鍵交換を利用

大変なのは…

- 証明書
    - 買え
    - ビジネスをまともにやるなら買え
    - それすらできないビジネスはクソ
    - Let’s Encryptって言われると思ったら大間違いだ。なめんな。
    - 非営利や個人サイト向けのためのものだ
- URL変更
    - リダイレクトする
    - 毎回リダイレクトすると遅いから、HSTS
    - HTTPS化の指標の一つ
    - HTTPS化のゴール
- MixedContents
    - 埋め込まれて得るHTTPサブリソース

HTTPSでしかできないこと
最初からHTTPSにしとこう

古いガラケー問題
時間が解決してから動き出すのでは遅い
準備をやっていくしかないですよ

後手に回るほどツラくなる

TLS関連のインシデントが多い
重要度が高まったからそこを狙うメリットが増えた
今後はもっと増えると思う

インシデントには敏感に。

日和見暗号
Opportunistic Encryption

TLS1.3
何とかしよう
ZeroRTT
RFCももうすぐ出そう

HTTPSを前提にした開発ノウハウ

hostsファイルに127.0.0.1を本物のドメイン書いて社内CAからValidな証明書発行して使ってる
企業名義のAppleアカウントを登録する時にDUNS番号でエラーが出た際の問い合わせ先

# DUNS番号とは...？
・Appleアカウントを会社名義で取得する際、必要となる会社認識番号のこと
・登記簿謄本の写しがあれば取得可能
・Appleの申請フォームから無料で取得できるが、時間が結構かかる（目安30日〜）
・公式代理店の東京商工リサーチで有料で取得も可能。（目安5日〜、3,000円〜）
・詳しい取得方法などは以下に譲ります。
**[iOS] 無料でD-U-N-S Numberを取得する手順**
https://www.crunchtimer.jp/blog/technology/administration/557/
・このリファレンスは「DUNS番号と企業名が一致しません」とエラーが出続けた時のためのものです。


# もしDUNS番号でエラーが置きた場合...!

## エラーとは
・取得したDUNS番号と会社名を入力しても「一致しません」と出て申請が進めない状態を指す。

## まずは東京商工リサーチへ

### 概要

・まずはDUNS番号を管理している「dun&brandstreet社」の公式代理店「東京商工リサーチ」に連絡する！
・電話でDUNS番号を言い、「何ていう名前で登録されていますか？」と聞くのがベスト。
・「~Inc.」で申請したのに「LLC.」で登録されていたりする。

### 問い合わせ先

**D&B D-U-N-S® Registered™**
http://www.tsr-net.co.jp/service/product/registered/

電話番号：03-6910-3111
受付時間：9:00～17:30 （土日祝日、会社特休日を除く）

## 次にApple Developer Programへ

### 概要

・東京商工リサーチで聞いた英語の会社名でも、申請フォームで「登録会社名と違うよ」と怒られた時はここに連絡する！
・東京商工リサーチやdun&brandstreet社から「こういった名前で登録されています」という正式なメールと登記簿謄本を添付して、再登録することができる。

### 問い合わせ先

**Apple Developer Program telephone support**
https://developer.apple.com/contact/phone/

電話番号：0120-9333-88
受付時間：9:00-17:00 （月-金）

## 最後に

・企業名義のAppleアカウントを取得するにはめちゃくちゃ時間がかかることを覚悟しましょう！
[Python] Pandas のデータフレームの他のデータフレームと特定列が一致しないものを抽出

## これを書く

結論を先に書いてしまうとこうです。

```python
df3 = df1[~df1['row1'].isin(df2['row2'])]
```

## こういうことをやりたい

あるデータフレームdf1から、
そのデータフレームのもつcolumn 'row1'と、
比較対象データフレームdf2のもつcolumn 'row2'を比較し、
row2には存在しないrow1をもつ行をdf1から抽出したい。

SQLで書くとこうです。

```sql
SELECT * FROM df1
WHER df1.row1 NOT IN (SELECT row2 FROM df2)
```
df1のデータ

|color |row1    |
|:-----|:-------|
|red   |eagle   |
|blue  |shark   |
|yellow|lion    |
|green |elephant|
|white |tiger   |
|black |world   |

df2のデータ

|name|row2    |
|:---|:-------|
|Sela|shark   |
|Leo |lion    |
|Tusk|elephant|
|Amu |tiger   |

df1から取り出したいデータ

|color|row1 |
|:----|:----|
|red  |eagle|
|black|world|

## 実装

```python:Zyuohger.py
import pandas as pd
df1 = pd.DataFrame({
        'color':['red',  'blue', 'yellow','green',   'white','black',],
        'row1' :['eagle','shark','lion',  'elephant','tiger','world',],
    })
df2 = pd.DataFrame({
        'name':['Sela', 'Leo', 'Tusk',    'Amu',],
        'row2':['shark','lion','elephant','tiger',],
    })

df3 = df1[~df1['row1'].isin(df2['row2'])]

print df3
```

## 結果

実行すると次のようになります。

```
$ python Zyuohger.py
   color   row1
0    red  eagle
5  black  world
```