OmniAICreator/Qiita-1.07M huggingface dataset:
CMPedometerを用いた歩数の取得方法

# 検証環境
- XCode8.3.3
- Swift3.1
- iOS10.3.1
- iPhone6s+

# 歩数の取得
端末内の歩数は`CMPedometer`で取得できる。
https://developer.apple.com/documentation/coremotion/cmpedometer

Info.plistに`NSMotionUsageDescription`(`Privacy - Motion Usage Description`に自動で置き換えられた)を追加して利用目的を書く必要がある。これがないとクラッシュする。

# コード
以下のようなコードで簡単に歩数を取得することができた。handlerが実行されるのはメインスレッドではないので、UIを更新する場合は、メインスレッドでの実行が必要なので注意が必要。

`startUpdates(from:withHandler:)`などでライブでデータを取得する場合はstopも呼ぶようにする。

```swift

@IBOutlet weak var label: UILabel!
    var pedometer: CMPedometer!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        pedometer = CMPedometer()

        let calendar = Calendar(identifier: .gregorian)
        let date = calendar.date(from: DateComponents(year: 2017, month: 9, day: 4))!

        // onetime
        pedometer.queryPedometerData(from: date, to: Date()) { (data, error) in
            guard let data = data else { return }
            DispatchQueue.main.async {
                self.label.text = "\(data.numberOfSteps)"
            }
        }

        // always
        pedometer.startUpdates(from: date) { data, error in
            guard let data = data else { return }
            DispatchQueue.main.async {
                self.label.text = "\(data.numberOfSteps)"
            }
        }
    }

    deinit {
        pedometer.stopUpdates()
    }
```
no decode delegate for this image format の解放

# no decode delegate for this image format

## 前提です
* nvmがインストールしてある
* npmつまり使っている
* ImageMagickを使っている（ここは直接原因ではありませんが今回はこれだったので）

## nvm useで変更される環境
　理解してお使いの方にはなんてことない話ですが、私みたいに「かっこいいから」と真似して特に意図もなくnvmを使うとこのエラーを出すことがあります。

## 対策シェル
　時間がないので簡潔に。

nvm_use.sh
```
source $(brew --prefix nvm)/nvm.sh
nvm use --delete-prefix $1 --silent
export NODE_PATH=$(npm root -g)
```

これを実行します
```
sh nvm_use.sh v7.10.0
```


## これでとりあえず自分は回避できました。
この件で出力されるエラーメッセージにはno decode delegate for this image formatなんてのもありましたが、要するにインストールしたモジュールが見えないのが原因でした。
何が起きてるのか理屈はまた気が向いたら別途アップします。
PHPでdate.timezoneを設定したのに反映されない時の対処法メモ（Macユーザー向け）

## 事象

タイトルの通りです。

## 環境

- MacBook Pro (Retina, 13-inch, Mid 2014)
    - MacOS Sierra 10.12
    - PHP 5.5.38
    - Apache 2.4.23

## 対処法

### 1. ターミナルでPHPの設定ファイル（php.ini）のパスを確認

```bash:ターミナル
$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/5.5
Loaded Configuration File:         /usr/local/etc/php/5.5/php.ini <--ココ
Scan for additional .ini files in: /usr/local/etc/php/5.5/conf.d
Additional .ini files parsed:      /usr/local/etc/php/5.5/conf.d/ext-gmp.ini,
/usr/local/etc/php/5.5/conf.d/ext-pdo_pgsql.ini,
/usr/local/etc/php/5.5/conf.d/ext-xdebug.ini
```

### 2. php.iniでタイムゾーンを設定

```bash:ターミナル
$ vim /usr/local/etc/php/5.5/php.ini

...
 907 [Date]
 908 ; Defines the default timezone used by the date functions
 909 ; http://php.net/date.timezone
 910 ;date.timezone =
 911 date.timezone = "Asia/Tokyo" <--ココ（"付けても付けなくてもOK）
...
```

### 3. 2で設定したタイムゾーンが反映しているか確認

```bash:ターミナル
$ php -i

...
date

date/time support => enabled
"Olson" Timezone Database Version => 2015.5
Timezone Database => internal
Default timezone => UTC
...
```

```php:phpinfo()で確認する場合は以下記述してブラウザにてアクセス
<?php

phpinfo();

?>
```

<img width="1077" alt="dateのところ.png" src="https://qiita-image-store.s3.amazonaws.com/0/74725/e3657865-eeaa-ad16-8dbf-0c41dd770070.png">


あれ？なんかWarning出てるし、Default timezoneが「UTC」のままだ。
何故だ？...

### 4. そもそもphp.iniファイルが正しく読み込まれているか確認

```bash:ターミナル
$ php -i

...
Loaded Configuration File => (none)
...
```

<img width="1076" alt="configんとこ.png" src="https://qiita-image-store.s3.amazonaws.com/0/74725/6a428fe5-1933-125f-c372-5782655c5d0c.png">

あちゃー、（none）ってなってるし。そもそもあかんやん。

### 5. Apacheの設定ファイル（httpd.conf）でphp.iniのパスを指定してあげる

まずはhttpd.confファイルのパスを確認

```bash:ターミナル
$ apachectl -V

...
 -D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
```

httpd.confファイルを編集、行末あたりに以下php.iniのパス指定を追記。
そしてApache再起動。

```bash:ターミナル
$ vim private/etc/apache2/httpd.conf

...
537 <IfModule php5_module>
538 PHPINIDir /usr/local/etc/php/5.5/
539 </IfModule>
...

$ sudo apachectl restart
```

### 6. 最終確認

再度phpinfoを確認してみると...

<img width="951" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/74725/597d8d5e-8cd5-dd0a-167b-b58b753fbfbe.png">

よしよし。そして肝心のtimezoneはというと...

<img width="958" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/74725/37566b84-377d-086e-8eba-026549e41ca5.png">

よっしゃー。php.iniのtimezone設定が有効になったー。

### 以上、解決

ありがとうございました。

### 参考文献

[「PHPINIDir」でphp.iniのパスを指定](https://www.deep-deep.jp/blog_engineer/archives/4132)
※こちらの記事のPHP7用の設定をPHP5用に焼き直しました。ありがとうございましたm(_ _)m
Phoenixの最新versionをインストールする方法

Phoenixの最新versionをインストールする方法

[公式ホームページ](https://hexdocs.pm/phoenix/installation.html#content)

肝心なコマンド（ワンライナー）
```
$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez
```

インストール時のサンプル

```
mix phoenix.new sample


＃短縮系のこちらでもコマンド使えます
mix phx.new phoenix_example
```

[参考記事](http://giraphme.hatenablog.com/entry/2017/08/19/015846)
Jupyter + Matplotlib > scatterplotの色(とcolorbar)の指数表示 (例: 10^2, 10^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)
```

### 手順

参考: https://stackoverflow.com/questions/17201172/a-logarithmic-colorbar-in-matplotlib-scatter-plot

1. `import matplotlib as mpl`
2. plt.scatter()にnorm=mpl.colors.LogNorm()を追加
    - vmaxは適宜（ない場合はデータの最大値になる)

### code

```py:test_logcolorbar_170916.ipynb
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from pylab import rcParams
import matplotlib as mpl

rcParams['figure.figsize'] = 5, 5  # adjusted 
rcParams['figure.dpi'] = 150  # adjusted

def get_value(ax, ay):
    return 10**(ax + ay)

# 1. get data
NUM_DATA = 10000
x = np.random.rand(NUM_DATA)
y = np.random.rand(NUM_DATA)
color = get_value(x, y)

# 2. draw data
size = 25  # arbitrary

plt.scatter(x, y, size, color, cmap=cm.jet, norm=mpl.colors.LogNorm(), vmax=1000)
#plt.scatter(x, y, size, color, cmap=cm.jet)
plt.colorbar()
```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c6bd668b-e665-14e3-5896-4c107fbc2801.png)
一次関数の方程式グラフをPythonで描画してもらう

最近中学で一次方程式のグラフをやっていて「これPythonにやってもらえれば~~楽できる~~面白いじゃん」と思って作ることにしました。

# 仕様
変化の割合（傾き）と切片を入力するとグラフが表示される。
変化の割合が分数にしたい場合はy/xのような形で入力する。

# 使うもの
- Python2.7(PyCharmインストールしたばっかなので・・・)
- PyCharm community edition（デザインかっこいい！）
- matplotlib（Mac使っていいよと言われると、とりあえずsinカーブ）
- numpy（結構お気に入り）

# 流れ
1. 変化の割合と切片を入力させる
2. xとyのデータを作成
3. matplotlibでグラフを描画

# 製作開始！
とりあえず必要なものをimport

```main.py
import matplotlib.pylab as plt
import numpy as np
```

入力は`raw_input()`で行う。

```main.py
# 省略
import matplotlib.pylab as plt
import numpy as np

print("Liner equation:")
le = raw_input()
```

式から変化の割合を取得。式は$ rx+i $のような形なので`+`より前の文字列が変化の割合になります。それを`split`で取得します。

```main.py
import matplotlib.pylab as plt
import numpy as np

print("Liner equation:")
le = raw_input()

rate = le.split("x")[0]
```
次に切片を取得します。切片が0の場合を考えて取得してみます。

```main.py
import matplotlib.pylab as plt
import numpy as np

print("Liner equation:")
le = raw_input()

rate = le.split("x")[0]
ic = 0 if le.split("x")[1] == "" else le.split("x")[1]
```

次はxとyの変化の量を初期化してあげます。

```main.py
import matplotlib.pylab as plt
import numpy as np

print("Liner equation:")
le = raw_input()

rate = le.split("x")[0]
ic = 0 if le.split("x")[1] == "" else le.split("x")[1]

x_rate = 1
y_rate = 1
```

次に変化の割合が分数の場合(/で区切られている場合)の処理と区切られていないときの処理を作ります。

```main.py
import matplotlib.pylab as plt
import numpy as np

print("Liner equation:")
le = raw_input()

rate = le.split("x")[0]
ic = 0 if le.split("x")[1] == "" else le.split("x")[1]

x_rate = 1
y_rate = 1

if rate.find("/") > -1:
    x_rate = int(rate.split("/")[1])
    y_rate = int(rate.split("/")[0])
else:
    x_rate = 1
    y_rate = 1 if rate == "" else int(rate)
```

あとは変化の量で配列を生成します。

```main.py
import matplotlib.pylab as plt
import numpy as np

print("Liner equation:")
le = raw_input()

rate = le.split("x")[0]
ic = 0 if le.split("x")[1] == "" else le.split("x")[1]

x_rate = 1
y_rate = 1

if rate.find("/") > -1:
    x_rate = int(rate.split("/")[1])
    y_rate = int(rate.split("/")[0])
else:
    x_rate = 1
    y_rate = 1 if rate == "" else int(rate)

x = np.linspace(-x_rate / 2,x_rate,4)
y = x * y_rate + int(ic)
```

最後に配列からグラフを描画します。

```main.py
import matplotlib.pylab as plt
import numpy as np

print("Liner equation:")
le = raw_input()

rate = le.split("x")[0]
ic = 0 if le.split("x")[1] == "" else le.split("x")[1]

x_rate = 1
y_rate = 1

if rate.find("/") > -1:
    x_rate = int(rate.split("/")[1])
    y_rate = int(rate.split("/")[0])
else:
    x_rate = 1
    y_rate = 1 if rate == "" else int(rate)

x = np.linspace(-x_rate / 2,x_rate,4)
y = x * y_rate + int(ic)

plt.plot(x,y,"r-")
plt.show()
```

これで完成です！

あとは実行して一次方程式を入力してあげると描画してくれます。

$ 4x+5 $
$ x+1 $
$ -3x-5 $

まだPythonも初心者なのでアドバイス等お願いします。

今気がついたけど式からグラフを出す授業終わってた・・・
rails compass 導入したらローカルサーバーが起動しない

## はじめに
今回 **gem 'compass-rails'** をgemfileに記述したらサーバーが立ち上がらなくなった。

```ruby:Gemfile
#(中略・・・)
gem 'compass-rails'
```


エラーとしては、

```text:エラー文
There was an error while trying to load the gem 'compass'. (Bundler::GemRequireError)
Gem Load Error is: undefined method `has?' for Sass::Util:Module
Did you mean?  hash
               Hash
```

このような文言だった。つまり、gem の compassをロードすることがうまくいかないということなのだろう。

## 解決策
このような流れで解決した
###1. gemfile のcompass-rails の部分を下の記述に変更

```ruby:Gemfile
#(中略・・・)
gem 'compass-rails', github: 'Compass/compass-rails'
```

###2. アプリケーションディレクトリで次のコマンドを実行

```text:ターミナル
rm Gemfile.lock
bundle install
``` 

###3. サーバーを立ち上げてみる

きちんとサーバーは立ち上がった。


##おわりに
今回はじめて投稿してみました。ご意見いただけるとうれしいです。
Firebase tips(Command)

# FIREBASE TIPS
	
## Install

```shell-session:command
npm install -g firebase-tools
```

## Setting
### 1. Login

```shell-session:command
firebase login
```

### 2. Init

```shell-session:command
firebase init
```

### 3. Current own state

```shell-session:command
firebase list
```

## Database 
### 1. Database push
object name is determined automatically.

```json:test.json
{
	"no"	: 1,
	"name" : "test"
}
```

```shell-session:command
firebase database:push /coffeeandcode-japan c:/firebase/test.json
```

`result`
![push.png](https://qiita-image-store.s3.amazonaws.com/0/199460/d139d6b3-a090-b76c-bc6c-a334c94a6825.png )

### 2. Database set
It can make object name.

```shell-session:command
firebase database:set /coffeeandcode-japan/aaaa  c:/firebase/test.json
```

`result`
![set.png](https://qiita-image-store.s3.amazonaws.com/0/199460/1bbe541a-1dd7-2b18-2878-f56b8a155dc7.png)

### 3. Database update

```shell-session:command
firebase database:update /coffeeandcode-japan/aaaa  c:/firebase/update.json
```

```json:update.json
{
	"no"	: 1,
	"name" : "update"
}
```

`result`
![update result](https://qiita-image-store.s3.amazonaws.com/0/199460/703c2958-eb38-89b4-7529-b7e27ab7ed89.png)


### 4. Database get 
```shell-session:command
firebase database:get /
firebase database:get /coffeeandcode-japan
firebase database:get /coffeeandcode-japan/-Ku7DioDNyP18SmP9e73
```
### 5. Database remove
```shell-session:command
firebase database:remove /coffeeandcode-japan/-Ku7DioDNyP18SmP9e73
```
動的処理可能な開発用のローカルhttpサーバー

Nodejsで立てられる簡易的なローカル用サーバーは色々ありますが、クエリーやポストの内容で少し違ったレスポンスを返したい時ないですか？そういうのができるのが見つからなかったのでかなりやっつけですが作りました（やっつけなんでもっといいのあったら教えてください）。

https://github.com/gomo/simple-dynamic-server

アクセスしたパスにファイルがない場合`.js`を付与してrequireし実行します。

例えば`http://localhost:8888/foo.html`で動的に処理したい場合、`foo.html`を作らずに代わりに`foo.html.js`を作ってそこで処理する関数をエキスポートしてやればOKです。関数の引数は`function(request, response)`です。

例えば下記は、react+Ajaxでページネーションを実装するときに使ったページの一部です。

```js
var url = require("url");

module.exports = function(request, response){
  var requestUrl = url.parse(request.url, true);
  var page = parseInt(requestUrl.query.page, 10)

  var resp = {
    items: [
      {
        id: 1234
        ...
      }
      ...
    ],
    paging: {
      "page": page,
      "pageCount": 10,
      "hasNext": page < 10,
      "hasPrev": page > 1,
      "perPage": 20
    } 
  }

  //Fixed ID not to be duplicated.
  for (var index = 0; index < resp.items.length; index++) {
    var element = resp.items[index];
    element.id = page.toString() + element.id
    resp.items[index]  = element
  }

  response.write(JSON.stringify(resp));
  response.end();
}
```
RaspberryPi3にCentOSの魂を注入

天命を受けてポチっとしたRaspberryPi3に、せっかくだから仕事で使っているCentOSを入れてみようじゃないかと立ちあがった、アラフィフのカピバラおじさんの奮闘記。

> 初めてのQiitaへの投稿で舞い上がっているけど、次回から多分ごく普通になると思う

# SDカード作成
1. まずは[ご本尊](https://wiki.centos.org/Download)からイメージファイルをダウンロード。
`AltArch Releases` ⇒ `armhfp (Arm32)` ⇒ にある`RaspberryPi3 (img)`にリンクあり。執筆時点（2017/09/15）のバージョンは、[CentOS-Userland-7-armv7hl-Minimal-1708-RaspberryPi3.img.xz](http://mirror.centos.org/altarch/7/isos/armhfp/CentOS-Userland-7-armv7hl-Minimal-1708-RaspberryPi3.img.xz)
1. xz形式なので、適当に解凍すると、img形式になる。
1. SDカードをMacに差し、デスクトップ上にマウントされたボリューム名を覚えておく。（以下の場合、`2DDACD9B`）  
![スクリーンショット 2017-09-15 22.55.20.png](https://qiita-image-store.s3.amazonaws.com/0/202530/469936a1-88ad-6438-19a8-99d8ce46c784.png)

~~~~
$ df
Filesystem                512-blocks       Used Available Capacity  Mounted on
/dev/disk0s2               232500288  121974560 110013728    53%    /
devfs                            227        227         0   100%    /dev
map -hosts                         0          0         0   100%    /net
map auto_home                      0          0         0   100%    /home
/dev/disk1s1                 1023440      90176    933264     9%    /Volumes/2DDACD9B
~~~~
上記の場合は、/Volumes/`2DDACD9B`に対応する/dev/disk1s1が、マウントポイント。

~~~~
##### 一旦、アンマウント
$ diskutil umount /dev/disk1s1
Volume 2DDACD9B on disk1s1 unmounted
##### SDカードへの書き込み。ddコマンドを入力するさいのパラメータは、/dev/disk1s1ではなく、/dev/rdisk1とする。（`disk`の直後の数字より後にある2文字を削り、`disk`ではなく`rdisk`にする。これにより、強制的にシーケンシャルアクセスとなり、速くなる）
$ sudo dd if=<<イメージファイル名>> of=/dev/rdisk1 bs=1m
##### 書き込みが終了したら、再度アンマウントする。
$ diskutil umount /dev/disk1s1
~~~~

で、書き込みに要した時間は、MacMini(Mid 2007)+MacOSX 10.7.5+USB2.0+SD:Class10の組み合わせで、

~~~~
2017年 9月16日 土曜日 12時58分46秒 JST
Password:
3072+0 records in
3072+0 records out
3221225472 bytes transferred in 302.823495 secs (10637304 bytes/sec)
2017年 9月16日 土曜日 13時03分53秒 JST
~~~~

5分くらいで書き込めました。

> `2017/09/16`
あまりにSDカードへの書き込みが遅かった件は、[ここ](http://qiita.com/sira/items/0e7cc588276b8bec35ac)を見て解決。1文字の違いで60倍の速さに。

~~2017年 9月15日 金曜日 23時52分59秒 JST
Password:
3072+0 records in
3072+0 records out
3221225472 bytes transferred in 18838.239655 secs (170994 bytes/sec)
2017年 9月16日 土曜日 05時07分04秒 JST~~

~~5時間15分:scream_cat:
で、仕方がないので、我が家の最速マシン（7年前の最新型Windows）でWin32DiskImagerを使ってみる。
5分1秒:scream_cat:
・・・これから試行錯誤でCentOSの再インストールを頻繁にすると思われるので、この時だけはWindowsマシン使うか。~~

# おしまい
で、SDカードをRaspberryPi3に挿せばCentOSが起動。タイトルにある「魂を注入」はこれで終わり。この後は各種セットアップ作業だけど、これは追々。
Android の JUnit テストで Locale を切り替えて実行する

# TL;DR
* `Locale.setDefault(...)` する

# 背景
* 言語によって挙動が変わる関数の JUnit テストを書きたい
* 例）人物の表示名を返す関数
 *  日本語の時：姓＋名
 *  それ以外の時：名＋姓

```Kotlin:Person.kt
data class Person(val firstName: String, val lastName: String) {
    fun displayName(): String =
            when (Locale.getDefault()) {
                Locale.JAPAN -> "$lastName $firstName"
                else -> "$firstName $lastName"
            }
}
```

# テストコード

```PersonTest.kt
class PersonTest {

    private val person = Person(firstName = "Taro", lastName = "Yamada")

    @Test
    fun displayNameTestJp() {
        Locale.setDefault(Locale.JAPAN)
        Assert.assertEquals("Yamada Taro", person.displayName())
    }

    @Test
    fun displayNameTestUs() {
        Locale.setDefault(Locale.US)
        Assert.assertEquals("Taro Yamada", person.displayName())
    }
}
```

# 結果
<img width="300" alt="スクリーンショット 2017-09-16 10.27.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/b611337c-bbb4-7da3-1a55-869d70d4b137.png">
MacでSML#のインストール覚書


Macで[SML#](http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/)をインストールするには、[公式サイトの説明](http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/3.3.0/ja/Ch5.S3.xhtml)のとおりすれば良いはずなのだが現時点ではエラーがでてインストールできない。

ちょっと調べてみたら、どうやら、

[http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp.rb](http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp.rb)の５行目

```sha256 "(stdin)= 8dec09e576b987a55915fbe154d5fe5b379399519433f50d3ba28232951c5977"```

が、おそらくコピペしたときにでも間違えたらしく動かない。

どうみても```(stdin)= ```が余計なので、これを省いたスクリプトを以下に全文のせておく。

```ruby:smlsharp.rb
class Smlsharp < Formula
  desc "Standard ML compiler with practical extensions"
  homepage "http://www.pllab.riec.tohoku.ac.jp/smlsharp/"
  url "http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp-3.4.0.tar.gz"
  sha256 "8dec09e576b987a55915fbe154d5fe5b379399519433f50d3ba28232951c5977"

  depends_on "llvm37"
  depends_on "gmp"
  depends_on "yajl"
  depends_on "xz" => :build

  def install
    system "./configure",
           "--prefix=#{prefix}",
           "--with-llvm=#{HOMEBREW_PREFIX}/lib/llvm-3.7"
    system "make", "install"
  end

  test do
    assert_match "val it = 0xC : word", shell_output("echo '0w12;' | smlsharp")
  end
end
```


このスクリプトを```smlsharp.rb```の名前で保存しておいて（ファイル名が違うと動かない）、以下のコマンドを実行すると無事インストールできた。

```
$ brew install http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/massivethreads.rb
$ brew install smlsharp.rb
```

ちなみにインストールには４３分ほどかかった。その時のログが以下。
時間に余裕があるときにしたほうがよさそうです。

```/usr/local/Cellar/smlsharp/3.4.0: 698 files, 41.9MB, built in 43 minutes 9 seconds```

## ドキュメント

ちなみにSML#のドキュメントは[こちら](http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/3.3.0/ja/manual.xhtml)。
ADDA + Matplotlib > 2dplot_ReIm_170916.ipynb > v0.1, v0.2 > show scatterplot of [the number of iterations] for various values of Re{m} and Im{m}

```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)
ADDA v.1.3b6
```

### About

Is a tool to show the scatterplot of [the number of iterations] run for various values of Re{m} and Im{m} (m: refractive index).

### Example input file

```
INPFILE = "ReIm_170916.tbl"  # obtained using [read_numIter_170916_exec]
```

Ref: [ADDA > bash script > read_numIter_170916_exec > to extract the number of iterations from log files](http://qiita.com/7of9/items/8d7d76f5ced659e795cd).


## v0.1
### code

Run on Jupyter + Matplotlib.


```py:2dplot_ReIm_170916.ipynb
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import sys
from pylab import rcParams

"""
v0.1 Sep. 16, 2017
   - show scatterplot of [number of iterations] of ADDA for various Re{m} and Im{m}
"""

# coding rule: PEP8

%matplotlib inline


rcParams['figure.figsize'] = 5, 5  # adjusted 
rcParams['figure.dpi'] = 150  # adjusted

INPFILE = "ReIm_170916.tbl"  # obtained using [read_numIter_170916_exec]

# 1. get data
dat = np.genfromtxt(INPFILE, delimiter=',')

xs, ys, nums = [], [], []
for elem in dat:
    ax, ay, anum = elem
    xs += [ax]
    ys += [ay]
    nums += [anum]

color = np.log(nums)  # taking log to enhance the contrast 
#color = nums

# 2. draw data
size = 60  # arbitrary
plt.scatter(xs, ys, size, color, cmap=cm.jet)
plt.xlabel('Re{m}')
plt.ylabel('Im{m}')
plt.ylim(0.0, 0.001)
cbar = plt.colorbar()
cbar.ax.set_ylabel('log(RE_XXX)')

```

### result

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c2d721b6-0b64-bd39-a359-5b893d2eff38.png)


## v0.2

Changed INPFILE.

### code 

```py:2dplot_ReIm_170916.ipynb
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import sys
from pylab import rcParams

"""
v0.2 Sep. 16, 2017
   - use different INPFILE
v0.1 Sep. 16, 2017
   - show scatterplot of [number of iterations] of ADDA for various Re{m} and Im{m}
"""

# coding rule: PEP8

%matplotlib inline


rcParams['figure.figsize'] = 5, 5  # adjusted 
rcParams['figure.dpi'] = 150  # adjusted

# obtained using [read_numIter_170916_exec]
#INPFILE = "ReIm_170916.tbl"   # ../CALC_1070819
INPFILE = "ReIm_run170916.Tbl"  # ../CALC_170916

# 1. get data
dat = np.genfromtxt(INPFILE, delimiter=',')

xs, ys, nums = [], [], []
for elem in dat:
    ax, ay, anum = elem
    xs += [ax]
    ys += [ay]
    nums += [anum]

color = np.log(nums)  # taking log to enhance the contrast 
#color = nums

# 2. draw data
size = 60  # arbitrary
plt.scatter(xs, ys, size, color, cmap=cm.jet)
plt.xlabel('Re{m}')
plt.ylabel('Im{m}')
plt.ylim(0.0, 0.001)
cbar = plt.colorbar()
cbar.ax.set_ylabel('log(RE_XXX)')

```

### run

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8475c73f-eff9-2479-b6d2-e4a5ac94a27a.png)
GPSカー　シュミレータ その4

#概要
GPSで自動走行する、コンテストがある。
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。
androidアプリの方をリリースする。配布します。

#実行環境
android 4.2.2

#配布物

[play](https://play.google.com/store/apps/details?id=com.ohisamallc.ohiapp145&hl=ja)
TensorFlowでkeras その8

#概要
TensorFlowでkerasやってみた。
catとdogを学習してみた。
binary_crossentropy 使ってみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード

```
import os
from tensorflow.contrib.keras.python.keras.models import Sequential, Model
from tensorflow.contrib.keras.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.contrib.keras.python.keras.layers.convolutional import Convolution2D
from tensorflow.contrib.keras.python.keras.layers import Dense, Dropout, Activation, MaxPooling2D, Flatten, Conv2D
from tensorflow.contrib.keras.python.keras.optimizers import Adam

pwd = os.getcwd()
img_width, img_height = 128, 128
train_data_dir = pwd + '/train'
validation_data_dir = pwd + '/validation'
nb_train_samples = 2000
nb_validation_samples = 800
nb_epoch = 10
batch_size = 64
result_dir = pwd

if __name__ == '__main__':
	train_datagen = ImageDataGenerator(rescale = 1.0 / 255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
	test_datagen = ImageDataGenerator(rescale = 1.0 / 255)
	train_generator = train_datagen.flow_from_directory(train_data_dir, target_size = (img_height, img_width), batch_size = batch_size, class_mode = 'binary')
	validation_generator = test_datagen.flow_from_directory(validation_data_dir, target_size = (img_height, img_width), batch_size = batch_size, class_mode = 'binary')
	model = Sequential()
	model.add(Conv2D(32, (3, 3), activation = 'relu', input_shape = (img_width, img_height, 3)))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Conv2D(32, (3, 3), activation = 'relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Conv2D(64, (3, 3), activation = 'relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Flatten())
	model.add(Dense(64, activation = 'relu'))
	model.add(Dropout(0.5))
	model.add(Dense(1, activation = 'sigmoid'))
	model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['accuracy'])
	model.fit_generator(train_generator, steps_per_epoch = 200, epochs = nb_epoch, validation_data = validation_generator, validation_steps = 2)
	print (model.evaluate_generator(validation_generator, nb_validation_samples / batch_size))
	model.save_weights(os.path.join(result_dir, 'cnn2.h5'))



```
ADDA > bash script > read_numIter_170916_exec > v0.1, v0.2 > to extract the number of iterations from log files

```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)
ADDA v.1.3b6
```

### About

Is used to extract followings from the 'log' files

- Re{m}: real part of refractive index
- Im{m}: imaginary part of refractive index
- number of iterations

### code v0.1

bash script

```bash
#!/usr/bin/env bash

#
# v0.1 Sep. 16, 2017
#   - extract number of iterations in ADDA log file
#   - extract Re{m} and Im{m}
#

LOGFILE="log"

#debug
#target="run845_sphere_g26_m1.5"

for target in $(ls | grep run):
do
	refrac=$(grep refrac $target/$LOGFILE | awk '{print $3}')
	arys=$(echo $refrac | sed 's/+/ /g' | sed 's/i//g')
	# set -x  # start debugging
	rem=$(echo $arys | awk '{print $1}')  # real part
	imm=$(echo $arys | awk '{print $2}')  # imaginary part

	num=$(grep RE_ $target/$LOGFILE | tail -n 1 | sed 's/_/ /g' | awk '{print $2}')

	echo "$rem,$imm,$num"
done

```

### run 

The code can be executed in the directory where you see ADDA output directories (e.g., run859_sphere_g26_m1.5).

```bash
$ ls | head
run425_sphere_g26_m1.4
run426_sphere_g26_m1.4
run427_sphere_g26_m1.4
run428_sphere_g26_m1.4
run429_sphere_g26_m1.4
run430_sphere_g26_m1.4
run431_sphere_g26_m1.4
run432_sphere_g26_m1.4
run433_sphere_g26_m1.4
run434_sphere_g26_m1.4
```

```bash
$ bash read_numIter_170916_exec > ReIm_170916.tbl
$ head ReIm_170916.tbl 
1.4,1e-05,038
1.4,1.3e-05,039
1.4,1.6e-05,039
1.4,2e-05,039
1.4,2.5e-05,039
1.4,3.2e-05,039
1.4,4e-05,039
1.4,5e-05,038
1.4,6.3e-05,039
1.4,7.9e-05,039
```

### code v0.2

To skip the directories having no [log file.

```bash
#!/usr/bin/env bash

#
# v0.2 Sep. 16, 2017
#   - check whether the log file exists or not
# v0.1 Sep. 16, 2017
#   - extract number of iterations in ADDA log file
#   - extract Re{m} and Im{m}
#

LOGFILE="log"

#debug
#target="run845_sphere_g26_m1.5"

for target in $(ls | grep run):
do
	if [ -e $target/$LOGFILE ]; then
		refrac=$(grep refrac $target/$LOGFILE | awk '{print $3}')
		arys=$(echo $refrac | sed 's/+/ /g' | sed 's/i//g')
		# set -x  # start debugging
		rem=$(echo $arys | awk '{print $1}')  # real part
		imm=$(echo $arys | awk '{print $2}')  # imaginary part

		num=$(grep RE_ $target/$LOGFILE | tail -n 1 | sed 's/_/ /g' | awk '{print $2}')

		echo "$rem,$imm,$num"
	fi
done
```
macOS SierraでのXGBoostインストール

macOS SierraでXGBoostインストールしたところエラーが出たため、
以下にインストールの方法と対処方法を記載する。

# 環境
```
% python -V                                                             
Python 3.6.2 :: Anaconda custom (x86_64)
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G29
```

# boneyard、llvm のインストール
```
brew tap homebrew/boneyard
brew install llvm 
```

# clang-ompのエイリアスの設定
自分は.zshrcに以下を設定した。
```
alias clang-omp='/usr/local/opt/llvm/bin/clang -fopenmp -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib'
alias clang-omp++='/usr/local/opt/llvm/bin/clang++ -fopenmp -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib’
```

# XGboostインストール
```
brew install gcc@5
pip install xgboost
```
gcc@5をインストールしないでxgboostをインストールしようとすると
以下のエラーとなった。
Command "python setup.py egg_info" failed with error code 1 in /private/tmp/pip-build-rz1rux_4/xgboost/
WordPressでプラグインを公式ディレクトリにアップ・更新する時のsvnコマンド

http://nuuno.net/note/wordpress-plugin-svn/

今の時代GitHubでコミットしたら自動的に.orgにアップされるようにしとけよって感じではありますが...

trunk ディレクトリで

~~~
$ svn commit -m "2.3.3"
$ cd ../
$ svn cp trunk tags/2.3.3"
$ svn ci -m "tagging version 2.3.3"
~~~
Pythonで作るHTTP分割ダウンロードするやつ

# きっかけ
- せっかく家の光回線の契約を1Gbpsにしたのにいざ大きなファイル（LinuxのISO）などをHTTPでダウンロードしようとすると速度が出ない

# なぜ?
- 単一のTCPコネクションで出せるスループットには限界値が決まっている
- Linuxの場合の~~TCP受信ウィンドウサイズ~~の確認方法（正確にはカーネルのバッファサイズ）

```
$cat /proc/sys/net/ipv4/tcp_rmem
4096    87380   6291456
``` 
左から[min, default, max]

つまり最大スループットは

```math
T_{max} = win / RTT
```
であるのでデフォルトの状態でRTT = 30msくらいのサーバーとの単一TCPコネクション通信ならば
~~およそ 87380[byte] * 8 / 30[ms] ≒ 23.3[Mbps]くらいしか出ない~~
実際は**輻輳がなければ**ウィンドウサイズがどんどん大きくなるのでもっと速度が出ます。

もちろん広帯域ネットワークに対応するためTCPにはウィンドウスケールオプションというものがあり、
1Gbyteまでウィンドウサイズを拡張できる（実際に利用されているかは不明）

複数コネクションなら理論的に言えばN本束ねれば帯域はN倍になる

# 既存のツール
コマンドラインから使えるツールとしてはwgetやcurlが有名
複数コネクション使えるものとしてはaria2などがある
[curlやwgetの数倍速い 爆速ダウンローダー aria2を使う - Qiita] (http://qiita.com/TokyoMickey/items/cb51805a19dcee416151)
複数コネクションを確立するときはくれぐれも相手のサーバーに負荷をかけすぎないように

# 本題のHTTPクライアント作成
HTTPにはRange Requestというものがある 
[RFC 7233 — HTTP/1.1: Range Requests （日本語訳）](https://triple-underscore.github.io/RFC7233-ja.html)
実装はとりあえず流行りのPythonで

## Range Requestについて
- 例えば1000バイトのファイルをリクエストすると仮定
    - GETリクエストを投げるときにヘッダーに'Range: bytes=0-499'とつけて送信すると、
    - レスポンスヘッダーに'Content-Range: bytes 0-499/1000'とつけてボディにはそのファイルの最初の500バイト分だけ入れて返してくれる
- ステータスコードは'206 Partial Content'

ただしサーバーがRangeヘッダーを受け付けないようにしている場合もある

この機能を利用して複数のTCPコネクションに同時にファイルの別々の部分をリクエストする

## 多重化
Pythonにはselectシステムコールを更に高水準に扱うことができるselectorsというモジュールがある（標準ライブラリに！）
[18.4. selectors — 高水準の I/O 多重化 — Python 3.6.1 ドキュメント](https://docs.python.jp/3/library/selectors.html)
こいつで複数のソケットを監視して多重化する
こんな感じで使う

```Python
# AとBの2つのTCPエコーサーバとの接続をイメージしてください
import selectors
import socket

# 中略
sel = selectors.DefaultSelectors()
sock_A = socket.create_connection(address_A)
sock_B = socket.create_connection(address_B)

sel.resister(sock_A, selectors.EVENT_READ)
sel.resister(sock_B, selectors.EVENT_READ)


sock_B.sendall('Hello'.encode()) # send something to A
sock_B.sendall('Hello'.encode()) # send something to B

while True:
    events = sel.select()
    for key, mask in events:
        message = key.fileobj.recv(512)
        print(message.decode())
```
# ポイント
- 別々に返ってくるファイルの断片をすべてメモリ上に保持しておくわけにはいかないので順番がそろったところから順次ファイルに書き込む。
- 性能の悪いTCPコネクションを使い続けるのはあまり良い判断とは言えないので、各コネクションを評価して性能の悪いコネクションは破棄し、新たなコネクションに置き換え、再度リクエストを送りなおす。

# 大雑把な流れ
1. HTTP HEAD リクエストを送信してファイルサイズを確認（ここは既存のHTTPライブラリを使用）
2. 総分割数や分割サイズなどを決定し、コネクションを確立
3. 初期リクエストを送る
4. 前述のselectorsでソケットを監視し、読み込み可能になったソケットから順次読み出してソケットごとに1次バッファに入れる
5. 1次バッファの中身ががHTTPレスポンスとして処理できる長さになったらヘッダーとボディに分割
6. ヘッダーからそのレスポンスがファイルのどの部分に当たるかを特定し、1次バッファから2次バッファへ移動
7. 2次バッファの中で順番がそろったものからファイルに書き込んだ後、2次バッファから削除
8. 各コネクションの評価値を更新し、性能が低いと判定されたコネクションは破棄し新たに確立したコネクションにリクエストを送りなおす
9. ファイル全体がそろうまで4~8を繰り返す


# 実装したもの
https://github.com/johejo/rangedl
まだいくつかバグあり

# 使い方
環境 Python 3.6.1

```bash
$ pip install git+http://github.com/johejo/rangedl.git
$ rangedl [URL] -n [NUM_OF_CONNECTION] -s [SPLIT_SIZE_MB]
```

- デフォルトだとtqdmでプログレスバーを表示。-pオプションをつけるとプログレスバーを表示しない。
- 安全のためコネクションの数は10以上にはならない。
- オプション指定の分割サイズが、'ファイルサイズ / コネクション数' の値よりも小さい場合は強制的に'ファイルサイズ / コネクション数' の値を分割サイズとする。

# 結果
- 回線のご機嫌によりますが200Mbpsぐらいでダウンロードができた。
- split_sizeを1MBにするとメモリの使用量も30~80MB程度になった。CPU使用率が高いのは仕方ないのか...
Atomでgo run出来るようにatom-runner.coffeeを修正

VSCodeよりAtomのほうがQiita上で情報が多かった。
VSCode用の設定手順は[こちら](http://qiita.com/tukiyo3/items/b0a199142348af73e771)

ubuntu 17.04にて作業

## Atomのインストール

* https://atom.io/

```sh:
sudo dpkg -i atom-amd64.deb

sudo apt install -y golang-go
```

```sh:~/.bashrc
export GOPATH=$HOME/go/
```

## Atom用追加パッケージインストール

```sh:apmパッケージ
apm install go-plus
apm install godef
```

Atom上で`control-,`を押すのも良いです。

![スクリーンショット_2017-09-16_04-40-14.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7f5184c5-98d1-cec5-a973-d5aa53f4c520.png)

## hello.go の編集

```go:hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello world!")
}
```

としたところ、画面右に追加機能をインストールするか確認が出た。
「Yes」を全て押す。

![スクリーンショット_2017-09-16_04-42-26.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3544cd25-6e52-4105-0cc5-cb27a765f055.png)

VSCode向けには手で取得する必要があったdelve(デバッグに使われる)も自動で取得してくれる。

![スクリーンショット_2017-09-16_04-46-58.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6be31139-7529-511d-5e87-fa0137643318.png)

## Atom-runnerの修正

![スクリーンショット_2017-09-16_05-03-25.png](https://qiita-image-store.s3.amazonaws.com/0/25728/407a5db8-7fd5-6cda-aaf4-0e8d0939bf5b.png)

atom-runner を入れると`Alt-Shift-R`で go runが出来るらしいが、
`go run: no go files listed`と表示され実行してくれない。

![err1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6f7301cd-605a-1f03-8b84-ceb04739dc8b.png)

152行目に以下修正 
参考: http://givememorelove.blogspot.jp/2016/06/golang-ide.html

```diff:~/.atom/packages/atom-runner/lib/atom-runner.coffee
    args = []
    if editor.getPath()
      editor.save()
      args.push(editor.getPath()) if !selection
    splitCmd = cmd.split(/\s+/)
    if splitCmd.length > 1
      cmd = splitCmd[0]
      args = splitCmd.slice(1).concat(args)
+   if editor.getPath()
+     editor.save()
+     args.push(editor.getPath())
    try
      dir = atom.project.getPaths()[0] || '.'
      try
        if not fs.statSync(dir).isDirectory()
          throw new Error("Bad dir")
```

![ok.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4f0010ce-ed90-5ddf-e493-2cbc05d08cf1.png)


## go-plus 下枠の移動

* 矢印押せば右/下に移動されるのが気に入った。

![スクリーンショット_2017-09-16_04-51-00.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6ff76526-d562-09bb-0f62-08ff47d7dfa0.png)
![スクリーンショット_2017-09-16_04-51-20.png](https://qiita-image-store.s3.amazonaws.com/0/25728/883be178-93e8-aef4-86b6-26592cc0006e.png)
サブドメインだけでmixhostを使用する方法

[mixhost](https://mixhost.jp/)で独自ドメインを使用するにはネームサーバーの変更が必要不可欠。
Aレコードをサーバーに向ければページは表示されるが、無料SSLが発行されない。

> ネームサーバー変更前のドメインにつきましては、SSL証明書が発行されません。
> 
> [無料独自SSLのご利用方法 | mixhostヘルプセンター](https://support.mixhost.jp/335)

というわけで、独自ドメインの登録にネームサーバー変更が必要なレンタルサーバーにサブドメインを登録する方法。

##NSレコードを使う
NSレコードというものを設定すれば良い。

NSレコードとは、ネームサーバの設定行のことで、この記述内容がネームサーバーの設定となる。

よって、ドメイン業者の管理パネルから行うネームサーバー変更は、このNSレコードを変更しているにすぎない。

NSレコードはサブドメインにも使用できるため、NSレコードをmixhostのネームサーバーに設定すれば解決する。

###blog.example.comをmixhostに割り当てる場合

| ホスト名            | タイプ | コンテンツ      |
|:-------------------|:------|:---------------|
| blog.example.com.  | NS    | ns1.mixhost.jp |
| blog.example.com.  | NS    | ns2.mixhost.jp |
| blog.example.com.  | NS    | ns3.mixhost.jp |
| blog.example.com.  | NS    | ns4.mixhost.jp |
| blog.example.com.  | NS    | ns5.mixhost.jp |

具体的な設定方法はサービスによって変わる。
Cloudflareの場合は下の操作を、ネームサーバーの番号を変えて5回繰り返す。

![alt](https://qiita-image.cloudremix.net/mixhost-SubDomain-SetUp.jpg)

###Cloudflareの設定例
![alt](https://qiita-image.cloudremix.net/mixhost-SubDomain-Setting.jpg)


なお、NSレコードが使えない業者を使っている場合は、この方法は使えない。

##追記
サポートに聞いたら

>Aレコードのみ向けて頂く形でもSSL証明書は発行されますが、
>動作を保証いたしかねます為、弊社サポートの対象外とさせていただいております。

って返答がきた...

##参考
[NSレコード｜レンタルサーバー用語集｜Zenlogic - ファーストサーバ株式会社](https://zenlogic.jp/words/record-ns.html)
[外部DNSでホストしたドメインのサブドメインの利用は可能ですか？ | クラウド・エヌ・インフォメーション](http://www.cloudn-service.com/faq/3425)
mixhostのDNSサーバをホストしているのはどこ？


ヘルプは場所まで

> ns1.mixhost.jp - 東京
> ns2.mixhost.jp - 九州
> ns3.mixhost.jp - 北海道
> ns4.mixhost.jp - 東京
> s5.mixhost.jp - 東京
> 
> [ネームサーバーは冗長化されていますか？ | mixhostヘルプセンター](https://support.mixhost.jp/263)


ドメインを正引き～

```:nslookup
ns1.mixhost.jp > 104.198.116.63
ns2.mixhost.jp > 210.152.15.180
ns3.mixhost.jp > 153.127.195.29
ns4.mixhost.jp > 54.65.133.78
ns5.mixhost.jp > 104.198.92.250
```

IPを逆引き～

```:nslookup
104.198.116.63 > 63.116.198.104.bc.googleusercontent.com
210.152.15.180 > 210-152-15-180.jp-west.compute.idcfcloud.com
153.127.195.29 > 153.127.195.29
54.65.133.78 > ec2-54-65-133-78.ap-northeast-1.compute.amazonaws.com
104.198.92.250 > 250.92.198.104.bc.googleusercontent.com
```

ns3 だけ逆引きが設定されていない。
北海道といえばさくらインターネットの石狩データセンター。
多分合ってるけど、一応traceroute

```traceroute
（略）
16	59.128.9.74		153.199											Japan
17	103.10.113.122	153.170		iskrt2s-rt4.bb.sakura.ad.jp			Japan
18	103.10.113.50	153.143		sac-is1b-rt1-rt101b.bb.sakura.ad.jp	Japan
19	153.127.195.29	153.053											Japan
```


##結果

- ns1.mixhost.jp - Google Cloud Platform
- ns2.mixhost.jp - IDCFクラウド
- ns3.mixhost.jp - さくらのクラウド
- ns4.mixhost.jp - AWS（Amazon Web Services）
- ns5.mixhost.jp - Google Cloud Platform
PHPでswitch文とstrpos関数を使うときの注意点

phpのswitch文は緩やかな比較なので、strpos関数を使うときは厳密な比較にする必要がある
（チェック文字列が1文字に含まれていると0＝falseと判定されてしまう）

```:ダメな例
$i='example';
switch (true) {
    case strpos($i, 'ex' ):
        echo "iはexを含む";
        break;
    default:
        echo "iはexを含まない";
}

// iはexを含まない
```


```:良い例
$i='example';
switch (true) {
    case strpos($i, 'ex' ) !==false:
        echo "iはexを含む";
        break;
    default:
        echo "iはexを含まない";
}

// iはexを含む
```

##参考
[【PHP】特定の文字列を含むかのチェック - Qiita](http://qiita.com/kazu56/items/2c72d187438de07c2503)
[PHP: PHP 型の比較表 - Manual](http://php.net/manual/ja/types.comparisons.php#types.comparisions-loose)
[PHP: switch - Manual](http://php.net/manual/ja/control-structures.switch.php)
[WP REST API v2] Pythonで画像をアップロード

WP REST API でメディアに画像をアップロードするときにハマったのでメモ。

```py3
import requests

user_id = ''
app_password = ''
end_point_url = 'http://example.com/wp-json/wp/v2/media'

image_path = '/path/to/image.jpg'
file_name = 'image.jpg'

headers = {
    'Content-Disposition': f'attachment; filename="{file_name}"'
}

# load image file
f = open(image_path, 'rb')
img_data = f.read()
f.close()

response = requests.post(end_point_url, data=img_data, headers=headers, auth=(user_id, app_password))

# media_id = response.json()['id']
```
Goのサーバーをソースを変更したら自動でリロードするMakefile

Goのサーバー開発中にはソースコードを変更したら自動でサーバーが再起動して最新のコードが反映されると素早い開発が可能になり便利です。
Javaのアプリケーション・サーバーなどによく実装されているオートリロードという奴です。サーバーのフレームワークによっては標準で用意されている場合もあるようですが、Goの多くのフレームワークではオートリロードは用意されていません。そこで、Makefileとfswatchでオートリロードを実現したものがこちらです。

fswatchがインストールされていなければbrewなどでインストールしてもらう必要があります。

こちらの記事のコードをベースに修正を加えたものです。
https://medium.com/@olebedev/live-code-reloading-for-golang-web-projects-in-19-lines-8b2e8777b1ea

```make
.PHONY: server restart kill clean

APP = bin/server
GO_FILES = $(wildcard **/*.go)
PID = /tmp/go-server.pid
MAIN = api/main.go

serve: restart
	@fswatch -e ".*" -i "\\.go$$" . | xargs -n1 -I{} make restart || make kill

restart: clean kill $(APP)
	@$(APP) & echo $$! > $(PID)

kill:
	@kill `cat $(PID)` 2> /dev/null || true

$(APP): $(GO_FILES)
	@echo "build..."
	@go build -o $@ $(MAIN)

clean:
	@rm $(APP) || true
```


と、ここまで書いておいてなんですが、下記のツールを使ったほうが早いかも。。。
あんまりメンテされていないではありますが色々設定できて便利そうです。

https://github.com/pilu/fresh
AWS Lambdaを使ってSlackにメッセージを送る

# はじめに
- この記事ではSlackのWebhookを利用して、AWS Lambda経由でメッセージを送るためのサンプルを記載します。

# 環境について
- ローカルの環境にはPython 3.6が導入済みであるものとします。
- また、対応するpipも導入されているものとします。

# 作成手順
## フォルダ構成

- 下記のようなフォルダ構成を前提とします。

```
- webhook
  - script.py
  - 必要なライブラリ類
```

## ライブラリの導入
- ライブラリとしてslackweb(https://pypi.python.org/pypi/slackweb)を利用します。
- lambdaで外部のライブラリを利用する場合、ソースコードと依存するライブラリを1つのzipにまとめる必要があります。
- そのため下記のように、これから書くソースコードと同じディレクトリにライブラリをインストールします。

```
$ pip3 install slackweb -t .
```

## ソースコードの作成
- 下記のような感じでコードを書きます。

```script.py
# slackwebをインポート
import slackweb

# lambdaの処理するhandlerを作成
def lambda_handler(event, context):

    # urlでは取得済みのWEBHOOK URLを入力
    slack = slackweb.Slack(url="YOUR WEBHOOK URL PUTS HERE")
    # メッセージは適当。チャンネル名、ユーザ名も適宜修正すること。
    slack.notify(text="Hello, World!!", channel="#YOUR CHANNEL HERE", username="USERNAME HERE", icon_emoji=":smiling_imp:")
    return "succeeded"
```

## zipの作成
- zipを作成するときは、親となるディレクトリを含んではいけない点に注意します。
- macであれば親ディレクトリでなく、全てのファイルを選択した状態で圧縮すればOKです。


## Lambdaのデプロイ
- 基本はそのまま進めていけば難しいことはありませんが、ハンドラのところはファイル名.ハンドラ名にする必要がありますので、今回であればscript.lambda_handlerを指定してください。
- ここまで終わればあとは実行するだけです！

# 終わりに
- ここまでできれば他のAWSサービスと組み合わせたり、コードを拡充するのは簡単ですね！
- これをベースにbotや処理ツールなどを作成し、素敵なslack生活を送りましょう！僕も頑張ります笑
Chrome Remote Desktop on XFCE4 on Ubuntu 17.04

.chrome-remote-desktop-session

```
export $(dbus-launch)
exec lightdm-session startxfce4
```

`export $(dbus-launch)`がないと Chrome Remote Desktop 内の Xsession も物理デスクトップと同じ dbus インスタンスに接続してしまい、 CHROME_REMOTE_DESKTOP 内向けの環境変数等も `systemd --user` 等に漏れ出てしまう。
PHPフレームワーク「Slim」でTwitter APIを使ってみる


## 概要
[前回の記事](http://qiita.com/juve_534/items/f4f78f5b3b2ab0c16e2a)から非常に間隔が空いてしまいましたが、
再びモチベーションが湧いてきたので、Slimについて触っていきます。

今回はSlimからTwitter APIを実行して、ツイートの検索を行っていきます。

## アプリケーションの登録
Twitter APIを使うためにはアプリケーションを登録して、アクセストークンなどを取得する必要があります。
アプリケーションの登録方法などはネットで検索すると結構出てくるので、[こちらの記事](http://qiita.com/juve_534/items/f4f78f5b3b2ab0c16e2a)などを参考にして試してみて下さい。

## Slimにtwitteroauthを導入
PHPでTwitter APIを操作するためのメジャーなライブラリとして「twitteroauth」というものがあります。
今回はこちらのライブラリを使って操作を行っていきます。

まずは、Slimにtwitteroauthを導入します。
composerでの導入が可能なので、Slimのディレクトリに入って下記コマンドを実行します。

```
composer require abraham/twitteroauth
```

インストール後はvendor配下にライブラリが配置されます。

## twitteroauthの読み込み設定
twitteroauthの導入が終わったので、今度は設定を行っていきます。
まずはindex.phpにtwitteroauthを記載します。

```php:public/index.php
require __DIR__ . '/../vendor/abraham/twitteroauth/autoload.php';
```
今回は汎用的に使うことを意識して、setttings.phpに設定を記載します。

```php:src/setttings.php
// TwitterAPI設定
'twitter' => [
    'consumer_key'         => 'consumer_key',
    'consumer_secreat'     => 'consumer_secreat',
    'access_token'         => 'access_token',
    'access_token_secreat' => 'access_token_secreat',
],
```
次に、オブジェクト生成を行います。

```php:src/dependencies.php
// twitterクライアント
use Abraham\TwitterOAuth\TwitterOAuth;
$container['twitter'] = function ($c) {
    $settings = $c->get('settings')['twitter'];
    return new TwitterOAuth($settings['consumer_key'], $settings['consumer_secreat'], 
        $settings['access_token'], $settings['access_token_secreat']);
};
```

これで使う準備は整ったので、APIを使って操作を行っていきます。

## Twitter APIで検索
準備が整ったらroutes.phpにコードを記載していきます。
今回は特定ワードで検索するルーティングとコードを記載します。
試しに「艦これ」というワードを検索してみます。

```php:src/routes.php
$app->get('/twitter/search/', function ($request, $response, $args) {
	// 艦これ
	$params = [
	    'q'     => '艦これ',
	    'count' => 5,
	];
	$tweet = $this->twitter->get('search/tweets', $params);    
	var_dump($tweet);
});
```

これで「艦これ」が含まれるツイートが5件取得できました。

## まとめ
今回でTwitter APIからツイートを取得出来るようになったので、次はこの結果を使って何かやっていきたいです。
今回作ったCodeは[こちら](https://github.com/juve534/PHPFramework/tree/master/slim-skeleton)に上げてみました。
参考までに。

この記事の内容は以上になります。
最後まで読んで頂きありがとうございました。
[JavaScript][ブックマークレット] 現在のページをTwitterにシェアする用のブックマークレットを作成

開いているページをツイッターに投稿したいけど、Chromeの拡張機能は怪しいのしかなくてあんまり使いたくない。

ということで、ブックマークレットで解決することにした。
実現方法としては、[以前作ったブックマークレット](http://qiita.com/koara-local/items/45dbc7fd5c9bb454274b) と同じような感じ。

# ソース

```js:
javascript: (
    function () {
        window.open(
            "https://twitter.com/intent/tweet?url=" + encodeURIComponent(location.href) + "&text=" + encodeURIComponent(document.title),
            "_blank", "width=600,height=300");
    }
)();
```

# 登録方法
新しいブックマークを作成してURLにブックマークレットを突っ込む。タイトルは任意（例はtweetThisPage）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/8980b220-d6f9-a899-6fa3-5e05d7ddfbd2.png)

# 使い方

登録したブックマークレットを押すと共有用の本文が入力された公式のツイート投稿ページが開く。（例はQiitaトップページ)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/6acfe1b7-b66f-4a7f-9f73-7974ed820e3c.png)

※window.openはどうもブラウザごとに挙動が微妙に違うのでポップアップか別タブかで開く様子。

# まとめ

ブックマークレットはとても便利。

# TODO
+ タイトル + URL で140文字を超えたときの挙動がどうなるかは未検証

# 関連
[Markdownのリンク形式で現在のページのタイトルとURLを表示するブックマークレットを登録(Qiitaの記事作成補助) - Qiita](http://qiita.com/koara-local/items/45dbc7fd5c9bb454274b)

# 参考
[Twitterに投稿する](http://www.shurey.com/js/samples/2_msg15.html)
[【ソーシャルサービス】シェアURLまとめ - Qiita](http://qiita.com/takuhito-h/items/891f3d53ad14a1182963)
Admobインストールうまく行かない

すみません。忘れないうちに描きたいのですが、気力がないので書き方が乱雑になるかもしれません。ごめんなさい。
さらにこの解決策が本当に妥当かはわかりません！！きっぱり。ですが、少しでも何かの参考になればいいと書かさせていただきます。

色々なことを行った上で参考にさせていただいたURLを貼らさせていただきます。

http://qiita.com/hotchpotch/items/12457815d5cee3723b97
http://qiita.com/s_terashita/items/f7985ba22c66ea6eeff8
http://qiita.com/ARTS_papa/items/6928b36bf08217846a3b
http://ikm.hatenablog.jp/entry/2014/11/07/163125
http://qiita.com/suzutan/items/44bcf20df711675c525c
http://qiita.com/d_nishiyama85/items/d63da1e50405abc0929c



[!] Error installing Firebase
[!] /sw/bin/curl -f -L -o 
……
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (77) SSL: can't load CA certificate file /etc/ssl/cert.pem

こんな感じのエラーが出ます。最初に行っとと参考にさせていただいた以下のコマンドが打てればいける気がします。

```
export SSL_CERT_FILE=$(brew --prefix)/etc/openssl/cert.pem
```

しかし私はcocoapodのインストールにはgitのバージョン古すぎるよ的な警告が出たので、

http://qiita.com/d_nishiyama85/items/d63da1e50405abc0929c

の記事を参考にgitを最新バージョンにしたりもしました。
最終的にここら辺でうまく行ったので書かさせていただきました。

さらに今の時点で/etc/ssl/cert.pem　の　cert.pemは存在していません。しかし上記のように証明書関連のことは行ったので確かに証明書の原因ではあるらしいです。

最後にきっとこれでもうまく行かない場合はきっと上のurlで自分の答えが見つけられたのではとかかさせていただいています。

もし間違ったりこんなこともあるよなどあったら教えていただいたり、指摘していただけたら嬉しいです。

少しでもこの記事が誰かのやくに立つことができますように。:shamrock:
SQL文初心者まとめ

データベース管理システムには、関係データベース管理システム（RDBMS）とNoSQLがある。RDBMSには、Oracle Database、IBM DB2、MySQL、PostgreSQLなどがある。ちなみに最後のPostgreSQLの読み方は`ポストグレスキューエル`である。何度読んでも覚えられない。

様々なRDBMSがあるが、一般的なSQL文を自分の学習のために書く。
大まかに４つの文で命令を下す。
SQL文によって、データベース上のデータの必要なものだけ取り出したり、更新したり、ソートしたりするなどが可能になる。

###検索
select hoge from fuga where piyo;

###追加
insert into hoge;

###更新
update hoge set fuga = 'piyo', hogera = 'moge' where moge='toto';

###削除
delete from hoge where fuga='hogera';

`*`：該当する全てのデータを選択
ESP32(Arduino)でBLEを使う

# はじめに
これだけ流行っているESP32なのに、肝心の新機能であるBLEを使うためのArduino Libraryを誰も作っていないので、
作ってみることにした

注意
・使用は自己責任でお願いします
・現在はサーバーのみです（クライアントは未実装）
・ServiceとCharacteristicは1つに限定してあります（気が向いたら拡張できるようにするかも）

# EPS32を使うためのArduinoIDEの設定
[本家readme](https://github.com/espressif/arduino-esp32/blob/master/README.md) のinstruction for xxxを参照

# ソースコード
https://github.com/shozaburo-shimada/Arduino-ESP-BLE

## インストール
一般的なArduino Libraryの配置方法と同じ
EspBLE.cppとEspBLE.hを適当な名前のフォルダに入れて、そのフォルダをArduinoのLibrariesフォルダに配置

## 使い方
基本はexamplesフォルダにあるGattServer.inoを参考にしてください
下記にも少しだけ補足します

### データ送信(Notify)

write()メソッドを使う

```c++:GattServer.ino

EspBLE esp;

//buffは適当な配列
esp.write(buff, sizeof(buff));

```

注意
・メソッド名（write）は、BLEとしてのNotify(Read)とは逆のネーミングになっていますが、ライブラリは「Arduinoから見てwrite：データ送信」という意味です


### データ受信(Write)

データを受信するとesp.available()で受信したデータサイズが分かります
その後esp.read()で１バイトずつ取り出します
(ArduinoのSerialライブラリと同じ使い勝手です)

```c++:GattServer.ino
EspBLE esp;

//データの受信を検出
if(len = esp.available()){
  Serial.print("Detect Write Request: ");
  for(int i = 0; i < len; i++){
    //受信データを１バイトずつ取り出す
    c = esp.read();
    Serial.print(c);
    Serial.print(" ");
  }
  Serial.println();    
}

```
注意
・メソッド名（read）は、BLEとしてのWriteとは逆のネーミングになっていますが、ライブラリは「Arduinoから見てread：データ受信」という意味です

# Tips
- コンパイルは成功しているのに、書き込みで失敗する
    - upload speedを921600から115200に落とす

# 参考
- http://asukiaaa.blogspot.jp/2017/04/esp32ble-gattnodejsnoble.html
- http://www.iotsharing.com/2017/07/how-to-use-ble-in-arduino-esp32.html
CrowiをCentOSにインストール

[Crowi](https://github.com/crowi/crowi)をサーバにインストールする。

今回はCrowiにElasticsearch付きでインストール。

## Environment
    $ cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core)

## Intall Node.js to CentOS7
    $ sudo yum install -y epel-release
    $ sudo yum group install "Development Tools"
    $ curl --fail -sSL -o setup-nodejs https://rpm.nodesource.com/setup_6.x
    $ sudo bash setup-nodejs
    
    
*https://www.phusionpassenger.com/library/walkthroughs/deploy/nodejs/ownserver/nginx/oss/install_language_runtime.html


## Install MongoDB to CentOS7
    $ sudo vim /etc/yumd.repos.d/mongodb.repo
    [mongodb-org-3.4]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x 86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
    $ sudo yum install -y mongodb-org
    $ sudo systemctl start mongod
    $ sudo systemctl enable mongod
    
*https://www.hugeserver.com/kb/install-mongodb-centos-6-7/

## Setup MongoDB
    $ mongo
    > use crowi 

## Install Elastic Search
    $ sudo yum install -y java-1.8.0-openjdk
    $ sudo vim /etc/yum.repos.d/elasticsearch.repo
    [elasticsearch-5.x]
    name=Elasticsearch repository for 5.x packages
    baseurl=https://artifacts.elastic.co/packages/5.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md

    $ sudo yum install -y elasticsearch
    $ sudo systemctl start elasticsearch
    $ sudo systemctl enable elasticsearch
    $ curl http://127.0.0.1:9200
    {
      "name" : "VSXONLm",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "Z8UM2VxsQPiIO_tde9-xHg",
      "version" : {
      "number" : "5.6.0",
      "build_hash" : "781a835",
      "build_date" : "2017-09-07T03:09:58.087Z",
      "build_snapshot" : false,
      "lucene_version" : "6.6.0"
      },
    "tagline" : "You Know, for Search"
    }
    $ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

\* https://www.server-world.info/en/note?os=CentOS_7&p=elasticstack&f=1

## Start crowi
    $ git clone https://github.com/crowi/crowi.git
    $ cd crowi
    $ git checkout v1.6.2
    $ PASSWORD_SEED=[seed] MONGO_URI=mongodb://localhost/crowi npm start