OmniAICreator/Qiita-1.07M huggingface dataset:
gitで特定のファイルの変更を無視する

Android StudioのPreview版を使っていると、
Instunt runを使うために

> Instant Run requires a newer version of the Gradle plugin.

と言われてアップデートしてねと言われてアップデートされる。
けども、まだalpha1とかなので、それはコミットしたくない。

そのまま使いながら開発してると、それがdiffとして出てきてしまうので、出さないようにしたかった。

参考
http://qiita.com/usamik26/items/56d0d3ba7a1300625f92

設定

```
git update-index --assume-unchanged build.gradle
git update-index --assume-unchanged app/build.gradle
```

解除

```
git update-index --no-assume-unchanged build.gradle
git update-index --no-assume-unchanged app/build.gradle
```

具体的にどのファイルをの更新を無視する必要があるのかは、環境によって違うかもしれない。

現在`assume-unchanged`なファイルがあるかどうかは以下で確認出来る

```
git ls-files -v | grep ^h
```

assume-unchangedとskip-worktreeの違いについて調べてみようとして、
実際に`build.gradle`が更新されるmergeを行ったのだけども、
どちらのケースも同じような以下のメッセージが出たので違いがよくわからなかった。
僕のテスト方法がダメだったのかもしれない。

```
error: Your local changes to the following files would be overwritten by checkout:
        build.gradle
Please, commit your changes or stash them before you can switch branches.
Aborting
```

まぁ、参考したqiitaの説明をよむ感じだと`assume-unchanged`を使っとくのが無難な気がするのでそうしとこうという感じ。

そして、たまにこの設定をしているのを忘れていて、build.gradleを修正したはずなのに、何でgit diffしても変更してない事になっているんだ！！！という事態になる事があるので注意。
画像にガウシアンノイズを加える with python2.7

#【環境】
windows8.1
Anaconda(python2.7)
あらかじめopencv3をインストールしておく必要があります。

#【概要】
指定したフォルダ内にある複数の画像データにランダムなガウシアンノイズを加えた画像データを作成して別の指定したフォルダに保存します。

```text:フォルダ構成
|---gaussian
　　　　|---before_images(ノイズを加える前の画像フォルダ)
　　　　|---before_images(ノイズを加えた後の画像フォルダ)
　　　　|---gaussian.py
```

```py:gaussian.py
# -*- coding: utf-8 -*-

import cv2
import numpy as np
import sys
import os
import glob

# ガウシアンノイズ
def addGaussianNoise(src):
    row,col,ch= src.shape
    mean = 0
    var = 0.1
    sigma = 15
    gauss = np.random.normal(mean,sigma,(row,col,ch))
    gauss = gauss.reshape(row,col,ch)
    noisy = src + gauss
    
    return noisy

# プログラムが存在するディレクトリの代入
current_dir = os.getcwd()
# 画像が存在するディレクトリの代入
before_images = glob.glob(current_dir + "\\before_images\\*") 

i = 0

for image in before_images:
    if image == current_dir + "\\before_images\\Thumbs.db":
        continue
    else:
        # 画像の読み込み
        img = cv2.imread(image)
        
        # ノイズ付加
        after_image = addGaussianNoise(img)
        
        # 画像保存   
        cv2.imwrite(current_dir + '\\after_images\\' + str(i) + '.jpg', after_image) 
        i += 1
```

#【参考URL】
https://github.com/bohemian916/deeplearning_tool/blob/master/increase_picture.py
[opencv3のインストール](http://opencv.blog.jp/python/ver3_install)
SpriteKit を用いてローラを遠くに飛ばす feat. Playground

# やりたいこと / 結果

- ボールが遠くに飛んでいるアニメーションを表現したい。
- ちょっと試したが結構難しいことが分かった

# コードを書く前にやったこと

- 実際に紙を丸めて投げてみて、観察してみる
  - あまり 横幅が変わらないことが分かった
- デザイナの @d-mikita に相談して以下のアドバイスを貰った
  - 「例えばゆらしてみるとかブレるアニメがいいのでは？」 とか
  - 「ボールを投げる距離によって自ずと変わってくるのでは？」 とか

# Gifアニメ
  
![ローラ.gif](https://qiita-image-store.s3.amazonaws.com/0/46303/2064bfbe-0c6d-7f5b-e2dd-871dfe530461.gif)

# コード

```swift:ローラ.swift
import SpriteKit
import XCPlayground


let sceneWidth = 500
let sceneHeight = 500

func shootRola(scene: SKScene) -> Void {
    let roLa = SKSpriteNode(imageNamed: "OK")
    let throwAnim = SKAction.moveBy(CGVector(dx: 0.0, dy: 400), duration: 0.5)
    let scaleDownAnim = SKAction.scaleTo(0.75, duration: 0.5)
    let roLathrowGroup = SKAction.group([throwAnim, scaleDownAnim])
    
    roLa.position = CGPoint(x: 280, y: 0)
    roLa.runAction(roLathrowGroup)
    scene.addChild(roLa)
}

let skView = SKView(frame: CGRect(x: 0, y: 0, width: sceneWidth, height: sceneHeight))
let skScene = SKScene(size: CGSize(width: sceneWidth, height: sceneHeight))

shootRola(skScene)
skView.presentScene(skScene)

XCPShowView("Live SKView : Rola", view: skView)
```

# ポイント

- `X幅を小さくしつつ、Y軸を変化させる` という２つのアニメーションアニメーションを使うには、`SKAction.group` の API を用いる
- 上記コードで言うと、以下がポイントになる

```swift:ローラ.swift
// y 座標を400移動しつつ、0.5ずつつ、変更してみる
let throwAnim = SKAction.moveBy(CGVector(dx: 0.0, dy: 400), duration: 0.5)
// 0.75 倍の大きさに0.5秒で作る
let scaleDownAnim = SKAction.scaleTo(0.75, duration: 0.5)
// 上記２つの処理を並列で実行する
let roLathrowGroup = SKAction.group([throwAnim, scaleDownAnim])
```

# Improvement

- もうちょっと複雑なアニメーションを表現する必要がある
- ブレるアニメーションをいかにして表現するか

# Reference

- [SpriteKitではじめる2Dゲームプログラミング Swift対応](https://www.amazon.co.jp/SpriteKit%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B2D%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Swift%E5%AF%BE%E5%BF%9C-%E6%9D%91%E7%94%B0-%E7%9F%A5%E5%B8%B8-ebook/dp/B00U24P6OE)
gem install --no-ri --no-rdoc は gem install -N にした方が良い

`gem install` のドキュメントをインストールしないオプジョン `--no-ri` と `--no-rdoc` は、[deprecated](http://guides.rubygems.org/command-reference/#gem-install)になっています。

そこで、`--no-document` を使おうという[記事](http://qiita.com/kei_q/items/d13235157fcfc435489d)が多いのですが、Rubygemsの[Command Reference](http://guides.rubygems.org/command-reference/#gem-install)を見ると、`-N` でも良いと書かれていました。
（`-n` ではありません）

`--no-document` より簡潔なので、`-N` を使うようにしました。
ブラウザを表示しなくて、capybaraテストできる

# 背景
* [ubuntuにプロキシサーバーを構築](http://qiita.com/alingogo/items/9c216bb7edc2d94d192e)
* [認証付きプロキシを超えるようにcapybaraでブラウザ自動テストを実装](http://qiita.com/alingogo/items/92ef263bae8f1081127f)
* しかし、capybaraでブラウザ自動テストの時に、ブラウザがそのまま表示されてしまう

# 目的
* ブラウザを表示しないくても、自動テスト実行できる


# 経過
### vxfbのインストール
* sudo apt-get install xvfb

### コード実装

```
require 'headless'

describe "google" do
  before do
    headless = Headless.new
    headless.start

    visit '/'
  end

  context "トップページ" do
    it { expect(page).to have_content('Google') }
  end
end
```

# 確認
* ブラウザが表示しなくて、テストが成功になること

# 参照
* http://qiita.com/ayayan-z/items/583f59799be310dd0e57#xvfb%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B
【アプリ開発者に朗報！】わずか数行のコードで、アプリユーザとチャットする


[Meyasubaco](https://meyasuba.co)というサービスを使うとコード数行・時間も数分程度で、すぐにアプリユーザとのチャット機能を入れられます。
困ったことにすぐに答えられたり、ユーザと仲良くなったり(笑)、使いみちは色々です！

1. https://meyasuba.co からユーザ登録・アプリ登録する（今なら３ヶ月無料！）
2. Android / iOSのSDKがあるので導入する
  * iOSなら`pod 'Meyasubaco'`
  * Androidなら`compile 'co.meyasuba.android.sdk:meyasubaco-sdk:0.8.0'`
3. コードを入れる
  * 準備コード : `Meyasubaco.setApiKey`
  * チャット画面へ : `Meyasubaco.showComment~~`
4. 完了！楽チン！返信はWeb画面からできます。


![スクリーンショット 2016-05-19 10.03.47.png](https://qiita-image-store.s3.amazonaws.com/0/6061/c35a584a-8e49-db02-7a97-8325c703af32.png "スクリーンショット 2016-05-19 10.03.47.png")
Vagrantで使用しているプライベートIPアドレスをリストアップする方法


## 前提
* /path/to/vagrant/boxes 以下に、各Vagrant機たちを配置している

## 方法
* 全Vagrant機のVagrantファイルを読み込んで、ipアドレスが書いてる行だけ抜き出して並べ替える。

	```
	cat /path/to/vagrant/boxes/*/Vagrantfile | grep 'ip:' | sort
	```

## 結果
* 実行結果

	```
	$ cat /path/to/vagrant/boxes/*/Vagrantfile | grep 'ip:' | sort
		config.vm.network "private_network", ip: "192.168.33.100"
		config.vm.network "private_network", ip: "192.168.33.101"
		config.vm.network "private_network", ip: "192.168.33.103"
		config.vm.network "private_network", ip: "192.168.33.105"
		config.vm.network "private_network", ip: "192.168.33.106"
		config.vm.network "private_network", ip: "192.168.33.107"
		config.vm.network "private_network", ip: "192.168.33.108"
		config.vm.network "private_network", ip: "192.168.33.109"
		config.vm.network "private_network", ip: "192.168.33.200"
		config.vm.network "private_network", ip: "192.168.33.29"
	```


* 綺麗に書いていれば、こういう風に表示させることもできるね。

	```
	$ cat /path/to/vagrant/boxes/*/Vagrantfile | grep 'ip:' | sort | awk '{print $4}'
	"192.168.33.100"
	"192.168.33.101"
	"192.168.33.103"
	"192.168.33.105"
	"192.168.33.106"
	"192.168.33.107"
	"192.168.33.108"
	"192.168.33.109"
	"192.168.33.200"
	"192.168.33.29"
	```
【初心者向け】5分でできる!!かもしれない。herokuを使って楽々アプリ公開!!(Rails編)


何かアイデアを思いついて、そこから最初にサーバーの準備を行うのはとても面倒くさいですよね  
例えばハッカソン等の短い時間の間で、デモ環境を公開するのにインフラ周りで時間をつぶしてしまうのはとてももったいないです。  
herokuというサービスを使えば、誰でも簡単に、しかもある程度の利用なら無料で利用することができます。  

ここではRails newした直後のアプリケーションを公開してみます。  

##  事前準備
必要なものは以下の2つです。

* gitコマンドが使える
* railsコマンドが使える

gitコマンドが使えるかどうかはターミナル上で

```
% git --version
git version 2.7.4 (Apple Git-66)
```

railsコマンドが使えるかどうかは

```
% rails -v
Rails 4.1.4
```

コマンドを叩いてみてバージョン情報が出力されるかどうか確認してください

## 各種アカウント登録
herokuでアカウントを作成します。  
https://www.heroku.com/home
「Welcome to Heroku」と表示されればアカウント登録完了です。  
※ログイン情報は後ほど使うので覚えておいてください

次にターミナル上でherokuコマンドを使えるようにするために、ファイルをダウンロードします。  
https://toolbelt.heroku.com/

上記のサイトからheroku toolbeltをダウンロードします。  
ダウンロードしたpkgファイルを開いてインストール完了まで設定を行ってください。  

インストールできたら以下のコマンドで確認を行います。  

```
% heroku version
heroku-toolbelt/3.43.2 (x86_64-darwin10.8.0) ruby/1.9.3
heroku-cli/5.1.8-52a89fa (darwin-amd64) go1.6.2
```

以上で事前準備は完了です。  

## Railsアプリの準備

```
% rails new simple_my_app
% cd simple_my_app
% bundle exec rails g controller welcome index
```

config/routes.rbを開いて以下を追記

```
root "welcomes#index"
```

動作確認してみましょう

```
% bundle exec rails s
```

ブラウザでlocalhost:3000と入力し、以下のようなページが表示されればOKです。  

![スクリーンショット 2016-05-19 9.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/74197/83863e7d-b805-6021-34cf-b5c09f945491.png "スクリーンショット 2016-05-19 9.24.17.png")


動作確認ができましたら、herokuへ公開するための下準備を行います。  
Gemfileを編集してください。  

```
上の方の行にあるsqlite3をコメントして以下の行を追記してください。

group :development do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end
```

続いてconfig/database.ymlを編集します。

productionの部分を以下のように変更します。  

```
production:
  url: <%= ENV['DATABASE_URL'] %>
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
```

編集が終わった後、bundle installコマンドを叩きます。  

以上でRailsアプリの準備は完了です。

## いよいよパブリックな環境へ公開!!
ターミナル上で

```
% heroku login
```
を入力してください。
先ほど作成したherokuのアカウントのメールアドレスとパスワードが聞かれるので入力します。  
logged in as <your_mail_address>
が表示されたらOKです。  

アプリケーションをgitで管理するための初期化を行います。  

```
% git init
```

続いて最初のコミットを作成します。  

```
% git add -A
% git commit -m "first commit"
```

上記をおこなった後にgit logコマンドを叩いて、
commit 1234474234098
Author: yourname <address>
Date:   Wed May 18 07:42:48 2016 +0900

    first commit

と出力されればOKです。  

Herokuアプリを公開するためのリポジトリを作成します。  

```
% heroku create simple-my-app
```
simple-という部分はアプリ名で、世界中のどこでも使われてない名前が必要です。被ったらエラーになるので最初は好きな名前で登録してみてください。

ここまでできたらコードをherokuに反映します。  

```
% git push heroku master
```

これで公開している環境にコードを反映することができました。  

最後にデータベースのマイグレーションを行います。

```
% heroku run rake db:migrate
```

コードに変更があった際は、基本的にgit addの部分からmigrateまでを行い公開ページへの反映を行います。  

以上でHerokuへRailsアプリを公開するまでの手順は終了です。  

## まとめ
今回はHerokuを使ってアプリを公開するまでの手順をまとめてみました。  
自分でほとんど環境設定を行わずに、pushするだけでアプリが公開できるなんてホント最高ですね!!  
herokuさんに感謝!!
日本の行政機関が公開しているAPIについてのまとめ（2016年5月19日暫定版）

この記事は下記のURLにある自分が管理するブログの記事の転載です。

南関東開発機構 : 日本の行政機関が公開しているAPIについてのまとめ（2016年5月19日暫定版）
http://blog.livedoor.jp/south_kanto_dm/archives/52134323.html

先日、経済産業省がIoT、ビッグデータ、ロボット、人工知能等の技術革新を的確に捉え、第4次産業革命の波の乗って、日本の成長戦略を描くという方針の元、今後の日本政府の戦略として、『「新産業構造ビジョン」～第4次産業革命をリードする日本の戦略～産業構造審議会 中間整理』という資料を公開しました。
それを読んだ所、「行政機関（政府、自治体）が保有するデータについての網羅的な調査を実施。それらを積極的に 公開し、民間活用を促進（行政システムのAPI整備の徹底）」という記述があり、今後、日本の行政機関はこれから手元にある情報の民間連携を積極的に進め、その一環として、行政機関の持つ情報をAPIという形で民間でも活用できるようにする方針が示されました。
今回は、私が調べた範囲で現時点で公開されている行政機関のAPIについて、探したものをご紹介いたします。
この記事はあくまでも暫定版であり、私が知り得る範囲で集めた情報を列挙したものに過ぎない事にご留意下さい。恐らくは漏れや抜けがあると思われます。
以上の点をご留意の上、記事をお読みいただければ幸いです。記述が不正確であったり、漏れ、抜けなどがあれば、コメント欄やTwitterなどでご指摘いただければ、幸いです。

**政府統計の総合窓口(e-Stat)−API機能**
http://www.e-stat.go.jp/api/

政府統計の総合窓口(e-Stat)で提供している統計データを取得するAPI。
事前に利用登録を行い、アプリケーションIDを取得する事で利用できる。
HTTPのGETメソッドなどで情報を取得する。APIからはXML、またはJSON、JSONPでデータを取得する事が可能。

**位置参照情報ダウンロードサービス**
http://nlftp.mlit.go.jp/isj/index.html
http://nlftp.mlit.go.jp/isj/data.html
http://nlftp.mlit.go.jp/isj/about_api.html

国土交通省の位置参照情報を取得できるAPI。街区レベル、大字・町丁目レベルの情報を取得できる。
HTTPのGETメソッドなどで情報を取得する。APIからはXMLでデータを取得する事が可能。
2016年5月19日現在は試行版であり、今後、正式な形で公開される物と思われる。

**国土数値情報ダウンロードサービス**
http://nlftp.mlit.go.jp/ksj/index.html
http://nlftp.mlit.go.jp/ksj/api/about_api.html

国土交通省国土政策局がGISで利用可能な国土数値情報を取得できるAPI。
HTTPのGETメソッドなどで情報を取得する。APIからはXMLでデータを取得する事が可能。
2016年5月19日現在は試行版であり、今後、正式な形で公開される物と思われる。

**e-Gov電子申請システム｜電子政府の総合窓口e-Gov イーガブ**
http://www.e-gov.go.jp/shinsei/index.html
http://www.e-gov.go.jp/shinsei/interface_api/index.html

各省庁への申請や届出などの行政手続をインターネットを通じて行う事が出来る。
2016年5月19日現在、電子申請可能な行政手続の約90%を厚生労働省が占める。
API利用の申請は法人のみが行える模様。

**国税庁法人番号公表サイト**
http://www.houjin-bangou.nta.go.jp/
http://www.houjin-bangou.nta.go.jp/webapi/

国税庁が提供する法人番号に紐付けられた団体の商号又は名称、本店又は主たる事務所の所在地及び法人番号及び付随する情報を取得できるAPI。
HTTPのGETメソッドなどで情報を取得する。APIからはXML、またはCSV(文字コードはShift-JIS(JIS 第一及び第二水準)、Unicode(JIS 第一水準から第四水準)の2種類)でデータを取得する事が可能。
事前に利用登録を行い、アプリケーションIDを取得する事で利用できる。

今回、紹介するAPIは以上です。今後も調査を実施し、追記があれば記事の訂正、追加等を行います。
以上、よろしくお願い致します。 

**参考資料**
産業構造審議会 新産業構造部会（第8回）‐配布資料（METI/経済産業省）
http://www.meti.go.jp/committee/sankoushin/shin_sangyoukouzou/008_haifu.html
Installing pyenv on ubuntu 16.04

# Why?

- I really wanted to get things done without installing stuff using sudo as much as possible.
    - All I want is to get mkdocs/sphinx
- Fear of contaminating the system specified python version
- From times to times, would like to switch python versions.

# How?

- Fork the github repo. https://github.com/yyuu/pyenv and follow the instructions in the Readme
    - Added the configuration to .zshrc () instead of the mentioned .bash_profile
- Restart the shell or 'source ~/.zshrc'
- pyenv install x.x.x
- Get an error message saying libraries are missing.
- Refer to https://github.com/yyuu/pyenv/wiki/Common-build-problems. Install the stuff with sudo.
- pyenv install again, and it should work.
- Switch the python version with pyenv global 2.7.8.

# Result?
Happiness :)
管理画面を作るときに使うとヨサソウなGem


環境（2016/5/19時点）

- Ruby 2.3.1
- Rails 5.0.0.rc1
- omniauth-google-oauth2 (0.4.0)
- banken (1.0.2)
- paper_trail (5.0.1)


# Gem

## omniauth-google-oauth2

Googleアカウントで認証できるやつです。
Googleアカウントを発行する組織は多いと思うので、使うと良いと思います。
メンバー管理もGoogleアカウントで管理すると楽そうです。
アクセス制限などをかけると思いますが、念のためアドレスのドメインも判定しておくと、プライベートGoogleアカウントを防げて良いと思います。

```
  def email_check(email)
    email.split('@', 2).last == 'hoge.co.jp'
  end
```


## banken

権限管理ができます。
`Controller` の `action` 単位で権限が制御できるので便利です。  また、`Rails4.1` から導入された `Enum` を組み合わせるともっと便利です。
　　　


## paper_trail

バージョン（モデルの変更）管理できます。
DBを操作するようなものを作るときは、履歴を残すことができるので便利かつ安全です。
最新のバージョンでは、デフォルトでは、 `whodunnit` (モデル操作した current_user.id が入っていた)
の値は更新されなくなっていたので、使いたい場合は `ApplicationController` に追記が必要です。

> https://github.com/airblade/paper_trail/commit/3ce2b34b98345cad736f64a3a5e1374f40adc652


```ApplicationContloller.rb

class ApplicationController
  before_action :set_paper_trail_whodunnit
end
```


# 実装

## current_user に気をつける

`banken` も `paper_trail` も `ApplicationController` などに `current_user` という名前でログインしているユーザを判定できるメソッドを定義しておく必要があります。もし、名前の違うものを使いたかったら、 `alias_method` を使って `current_user` を呼び出せるようにしておくと良いと思います。

```ApplicationContloller.rb

  # 通常は current_user でヨサソウ
  def current_operator
    @current_operator ||= Operator.find_by(id: session[:operator_id])
  end

  # View からも呼び出せるように
  helper_method :current_operator
  
  # 名前が違うときは current_user で呼び出せるように
  alias_method :current_user, :current_operator
```

※ `paper_trail` は、`user_for_paper_trail` を上書きしてもヨサソウです。


# REF

- https://github.com/zquestz/omniauth-google-oauth2
- https://github.com/kyuden/banken
- https://github.com/airblade/paper_trail
【Google Maps JavaScript API v3】地図をオリジナルデザインにカスタマイズ【StyledMapType】


デモ：http://mo49.tokyo/qiita/20160517/featureOpts.html

```javascript
var customMapTypeId = 'custom_style';
var mapOptions = {
  zoom: 12,
  center: {lat: 40.674, lng: -73.946},  // Brooklyn.
  scaleControl: true,
  mapTypeControlOptions: {
    mapTypeIds: [google.maps.MapTypeId.ROADMAP, customMapTypeId]
  },
  mapTypeId: customMapTypeId
};
// オリジナルデザイン
var featureOpts = [
  {
    stylers: [
      { hue: '#FFF700' },
      { visibility: 'simplified' },
      { gamma: 0.5 },
      { weight: 0.5 }
    ]
  },
  {
    elementType: 'labels',
    stylers: [
      { visibility: 'simplified' }
    ]
  },
  {
    featureType: 'road.local',
    stylers: [
      { color: '#FFF700' }
    ]
  }
];
// オリジナルデザインの名前
var styledMapOptions = {
    name: "My Style"
};

// オリジナルデザインをセット
var map = new google.maps.Map(document.getElementById('map'), mapOptions);
var customMapType = new google.maps.StyledMapType(featureOpts, styledMapOptions);
map.mapTypes.set(customMapTypeId, customMapType);
map.setMapTypeId(customMapTypeId);
```

ジェネレーターでつくるのが良い
[Google Maps Colorizr](http://software.stadtwerk.org/google_maps_colorizr/)

> 参考
[Simple styled maps](https://developers.google.com/maps/documentation/javascript/examples/maptype-styled-simple?hl=ja)
[スタイル化されたマップ](https://developers.google.com/maps/documentation/javascript/styling?hl=ja#overview)
[Googleマップをイラストマップみたいにしたい。](http://lopan.jp/google-map-customize/)
Watson IoT Platform - Node-RED - フローをコピーする方法

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

#Node-REDのフローをコピーします
Node-REDでは簡単にフローをコピーすることが可能です。
1. Node-REDの画面で、ワークプレースを選択して[Cntl]+[A]で全ノードを選択します。各ノードが黄色い線で囲われます。
2. 画面右上の三本線をクリックし、 「Export」から「Clipboard」を選択します。
![スクリーンショット 2016-05-19 8.50.25.png](https://qiita-image-store.s3.amazonaws.com/0/125842/5e2c8adc-fda5-6755-f17f-d81ca46183e6.png)

3. ウィンドウにフローの定義情報が表示されているので、[Cntl]+[C]でクリップボードへコピーします。
![スクリーンショット 2016-05-19 8.50.25.png](https://qiita-image-store.s3.amazonaws.com/0/125842/fb73bcc4-deab-2b06-d77e-6be62f457f80.png)

4. Node-RED画面のワークプレースの右上の「＋」ボタンを押して、新しいワークプレースを開きます。「Flow 2」といった名前になります。
5. 新しいワークプレース画面の右上の三本線を開いて「Import」から「Clipboard」を選択します。
![スクリーンショット 2016-05-19 8.56.24.png](https://qiita-image-store.s3.amazonaws.com/0/125842/adc6cbed-bf75-8d0e-bdd2-4408196d6410.png)

6. 開かれたウィンドウにクリップボードの内容を[Cntl]+[V]で貼付け、「OK」を押します。
![スクリーンショット 2016-05-19 8.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/125842/455941f0-9f70-a847-7aa7-539460a95bd8.png)

7. クリップボードに保存されていたフローの定義がコピーされるので、見やすい位置までドラッグしてきて[Enter]で確定します。
![スクリーンショット 2016-05-19 8.59.20.png](https://qiita-image-store.s3.amazonaws.com/0/125842/4c801393-1b3c-3e03-a648-d1008c66e4b6.png)

8. Deployを押してクラウド上のアプリへ反映します。
複数パッケージのGoプロジェクトのビルドとテスト方法

[Goのプログラミングパターンの記事](https://www.infoq.com/jp/news/2016/03/go-patterns)では、gbの利用が勧められていたが、外部パッケージがなくても、ディレクトリ配下のすべてのプロジェクトをビルドとテストが実施できることがわかった。

```
export GOPATH=your_project_gopath
cd your_project_path
go build ./...
```

`./...`でディレクトリ配下の全てのパッケージを示すらしい。

テストも以下でできる

```
export GOPATH=your_project_gopath
cd your_project_path
go test -cover ./...
```

gbがWindows&msysで動かなかったり、カバレッジに未対応だったりしたので、このようにしている。

あと、プロジェクトごとにGOPATHを切り直し、プロジェクトが終わるとそれごと削除するようにすると、なかなか便利です。

参考: http://stackoverflow.com/questions/17913715/three-dots-directory-traversal-with-mv
Watson IoT Platform - 温湿度計シミュレーターをフローに繋いでみる

[Watson IoT Platform - 温湿度計シミュレーターを用意します](http://qiita.com/egplnt/items/e1cf075c56ae83addbd9)で温湿度計シミュレーターを準備しました。

#温湿度計シミュレーターをNode-REDのフローに接続します
温湿度計シミュレーターをNode-REDのフローへ繋いで、IoTアプリを体験します。
1. [Watson IoT Platform - 温湿度計シミュレーターを用意します](http://qiita.com/egplnt/items/e1cf075c56ae83addbd9)で用意した温湿度計シミュレーターのMACアドレス（12桁の英数字）を確認します。Quickstartの入力欄からコピーすると便利です。
2. ブラウザーの別タブでNode-REDのフローを開きます。
3. Node-REDのフローの左端の青い「IBM IoT-In」をダブルクリックして開きます。
![スクリーンショット 2016-05-18 14.28.30.png](https://qiita-image-store.s3.amazonaws.com/0/125842/d6656f7f-8374-e2c0-577a-3fb8eac87e84.png)
4. 「Authentication」が「Quickstart」になっている事を確認し、「Device Id」欄に用意したMACアドレス（１２桁の英数字）をコピペします。
5. ウィンドウ下部の「OK」を押し、画面右上の赤い「Deploy」ボタンを押して変更内容をクラウド上のアプリへ反映します。
6. Debugタブを開き、温湿度計シミュレーターからの出力が表示される事を確認します。うまく出力されない場合

- Debugノード（緑色）の右側のタブが選択されているかを確認してみましょう
- Deployボタン（赤）でクラウド上のアプリへ反映されているかを確認してみましょう
- FirefoxもしくはChromeもしくはSafariを使用しているかを確認してみましょう（Internet Explorerではうまく稼働しません）
- 企業内ネットワークなどからアクセスしている場合、インターネットとの接続でファイアウォールがwebsocketを許可していない場合があります。お手持ちのスマートフォンやタブレット端末のブラウザで同じURL（”xxxxx.mybluemix.net"）へアクセスし、上記のDebug出力を確認してみましょう。端末を外部のネットワーク（例：コーヒーショップのWifi環境など）から試してみるのも有効と思います。
![スクリーンショット 2016-05-19 8.32.22.png](https://qiita-image-store.s3.amazonaws.com/0/125842/f3a24084-2acf-973d-0a28-00774de53c56.png)
はじめての マインクラフトPE マルチプレイサーバー セットアップ時のメモ

マインクラフトPEのマルチプレイサーバーのセットアップに挑戦し、一応うまく動きました。
英語の情報はあまり見れてませんが、少なくとも日本語ではまとまった最新情報が見つけらなかったということもあり、結構時間がかかってしまいました。
まだまだよくわかっていないことも多いですが、とりあえずメモ残しておきます。


#環境
- さくらのクラウド
- CentOS 7

#メモ
- CentOS 6 だと、 glibc のバージョンが古いみたい。今回は CentOS 7 でしのいだ
- マインクラフトPEのPEとは、Pocket Editionの略。簡単に言うとスマホ（iPhone, Android）版のこと。
- PEと、PC版と、コンシューマーゲーム機版（プレステ版など）は、基本的に互換性がない。
- PEのマルチプレイサーバーのソフトは、PocketMine-MPというソフト。（公式が提供するものではない？他にもあるかも？）
- ~~もしかして、Wi-Fi環境じゃないとうまくつながらない？~~ → そんなことはなかった
- pharファイルというファイルを、最新のものをダウンロードして置き換えることが必要。（プレイしているクライアントのバージョンよりも低いバージョン用のサーバではマズいみたい）

#コマンドメモ
```
#root ユーザー以外のユーザーを作ってセットアップするのが原則
useradd hoge
passwd hoge

#前提パッケージのインストール（すでに入っているかも？）
yum install perl gcc make automake libtool autoconf m4

#現在公開されているものは最新バージョン用にまとまっておらず、いくつか追加の手順が必要
#PHPのバージョンが古いので、ベットダウンロードしてきて、bin ディレクトリ毎入れ替える
#上記手順なので、PHP を yum でインストールしたりはしなくても大丈夫
wget https://bintray.com/pocketmine/PocketMine/download_file?file_path=PHP_7.0.3_x86-64_Linux.tar.gz

#phar ファイル（プラグインパック？）の新しいのをダウンロードして、ファイルを入れ替えることが必要
wget https://bintray.com/pocketmine/PocketMine/download_file?file_path=PocketMine-MP_1.6dev-24_ac482621_API-2.0.0.phar

#CentOS7の firewalld の使い方をまだ学んでいないため、今回は iptables をセットアップしてしのいだ
#UDP の 19132 ポートをデフォルトで使用するのでそのポートをオープンにすることが必要
yum install iptables.services
vi /etc/sysconfig/iptables
systemctl enable iptables
systemctl status iptables

```

#iptables設定ファイル(/etc/sysconfig/iptables)の例
```
*filter
:INPUT   DROP   [0:0]
:FORWARD DROP   [0:0]
:OUTPUT  ACCEPT [0:0]

-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --dport 19132 -j ACCEPT
-A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

COMMIT
```

#参考にさせていただいた主なページ。感謝 :pray: 
- [Pocketmine（マインクラフトPEのサーバソフト）](http://www.pocketmine.net/?lang=ja)
- [【さくらのクラウド】Minecraftサーバをコマンド操作なしで簡単構築](http://hogesuke.hateblo.jp/entry/2015/06/15/041355) … PC版
- [yumでCentOS6.7にPHP7をインストールする方法とハマった点 | Lancork](https://www.lancork.net/2016/05/yum-centos67-php7-install/)
- (http://norimakich.doorblog.jp/archives/43970064.html)
- (http://knowledge.sakura.ad.jp/beginner/4048/)
- (http://pocketmine-mp.readthedocs.io/en/latest/update.html)
- (http://mosuke5.hateblo.jp/entry/2014/09/20/180326)
- (http://qiita.com/sawa-zen/items/fe51bd76331b487e2978)
Octotree で Github 上のファイル移動を楽にする

以前、便利な Chrome Extension として、GitHub Boxcutter を紹介する記事を書いたのですが、

> [【これは便利！】Gemfile や package.json に書かれたライブラリの Github ページに飛べるようにする Extension](http://qiita.com/pekepek/items/777ad1c0b677b1d971a6)

[Octotree](https://github.com/buunguyen/octotree) も便利だったので、ご紹介します。
Chrome 以外にも Firefox, Opera, Safari に対応しているようです!

# 何をする Extension か？

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/0952ce43-7db0-8d41-1d78-ae7f93b97470.png)

画像のように左側に、Github にあるリポジトリの Tree 構造を表示してくれます。

そして、ディレクトリをクリックすると

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/6746c441-1cbb-5725-c031-907706238242.png)

こんな感じでページ遷移無しでディレクトリの中身を表示してくれるので、ファイルの中身を見るのがだいぶ楽です！

また、邪魔な時は `cmd + Shift + s` で簡単に隠せます

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/11b75925-2734-970e-7ba0-ecb07f568f75.png)

便利！

# 使い方

Chrome であれば、[Store にいって](https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc)インストールするだけ！

インストール後は基本、設定無しで使えます！
ただし、プライベートリポジトリなどを見る場合は GitHub の Access Token が必要になります。また、GitLab にも対応しているようです。

是非使ってみて下さい！
CakePhp3のComponentの作り方まとめ

#作り方
##Componentの生成
プロジェクトのbinフォルダに移動し、以下のコマンドを実行。
```
cake bake component コンポーネント名
```
ここで、`cake bake component TestComponent`のように、Componentという単語を含めると精製されるファイルがTestComponentComponentとなってしまうので、`cake bake component Test`のようにComponentの前の部分だけを指定する。

##初期処理
Componentが生成される時に、initializeメソッドが呼ばれる。
initializeメソッドは配列1つを引数に取る(Component読み込み時の引数が入る)。

```php:TestComponent.php

class TestComponent extends Component{
	public function initialize(array $config) {
		/*初期処理*/
	}
}

```

###テーブルの読み込み
DBを扱うためには、テーブルの読み込みが必要となるが、コントローラのように`loadModel`を使って読み込むことができない。
そのため、`TableRegistry::get`を使う。
`TableRegistry::get`はモデル名を入れると、テーブルオブジェクトが得られる。
`loadModel`を使ったときと同じように使いたいなら、`$this->モデル名`のフィールドに格納しておくといい。

```php
public function initialize(array $config) {
	$this->Test = TableRegistry::get("TestModel");
}

public function test() {
	$this->Test
	     ->find()
	     ->all();
}

```

###コントローラを扱う
Componentの中で呼び出し元のコントローラを参照することもできる。
`$this->_registry->getController()`でコントローラが取得できる。
これを使うと、テーブルの読み込みなども`loadModel`で扱うこともできる。

```php
public function initialize(array $config) {
	$this->controler = $this->_registry->getController();
}

public function test() {
	$this->controller->loadModel("TestModel");
	$this->controller
	     ->TestModel
	     ->find()
	     ->all();
}
```

ただし、これだとコントローラに処理が依存してしまうため、Shellで使うことができないので、非推奨。

#使い方
[CakePhp3のComponentの使い方まとめ](http://qiita.com/frost_star/items/0921da2e4973b637a2b2)を参照。
自作のコンポーネントも既存のコンポーネントと同じように読み込み、使うことができる。
Zybo > Chronicles blog 16 > watchdog使用例

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-SoC-s-Private-Watchdog-Adam-Taylor-s-MicroZed/ba-p/405273

watchdogを使う処理の主な部分。

```.c
#include "xscuwdt.h"

//define private watchdog
#define WDT_DEVICE_ID         XPAR_SCUWDT_0_DEVICE_ID
#define INTC_DEVICE_ID        XPAR_SCUGIC_SINGLE_DEVICE_ID
#define WDT_IRPT_INTR         XPAR_SCUWDT_INTR
#define WDT_LOAD_VALUE        0xFF
 
//watchdog configuration
WCHConfigPtr = XScuWdt_LookupConfig(WDT_DEVICE_ID);
XScuWdt_CfgInitialize(&WdtInstance, WCHConfigPtr,WCHConfigPtr->BaseAddr);
XScuWdt_LoadWdt(&WdtInstance, WDT_LOAD_VALUE);
XScuWdt_Start(&WdtInstance);
 
//set up the watchdog
XScuGic_Connect(GicInstancePtr, WdtIntrId,(Xil_ExceptionHandler)WdtIntrHandler,
(void *)WdtInstancePtr);
 
//setup the watchdog
XScuWdt_SetWdMode(WdtInstancePtr);

// 
XScuWdt_SetTimerMode()
  
//
XScuWdt_IsWdtExpired(InstancePtr)
```

動作するソースコードはブログに掲載されている。
Zybo > Chronicles blog 16 > watchdog関連のレジスタ > Watchdog Load Register / Watchdog Counter Register / Watchdog Control Register / Watchdog Interrupt Status Register / Watchdog Reset Status Register / Watchdog Disable Register

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-SoC-s-Private-Watchdog-Adam-Taylor-s-MicroZed/ba-p/405273

> Each of the two ARM Cortex-A9 processors within the Zynq SoC has a private watchdog timer. These private watchdogs can be used as either a timer like the private timer (discussed in the previous blog post in this series) or as a watchdog.

...

> The Zynq watchdog timer is controlled via six registers:

> - Watchdog Load Register: Holds the value which the watchdog timer counts down from. In auto-reload mode, the watchdog counter resets to the value stored in this register. Writes to this register will result in the watchdog counter register being reset to this value.
- Watchdog Counter Register: This is the watchdog counter itself. It’s decrementing counter. Depending upon the watchdog mode, writing to this register reloads the counter. In watchdog mode, this register can only be updated by writing to the Watchdog Load Register.
- Watchdog Control Register: This register controls the configuration of the watchdog (timer or watchdog), the pre-scaler setting, the interrupt enable, auto-reload mode, and the enabling of the watchdog in its currently configured mode.
- Watchdog Interrupt Status Register: Contains a single event flag that shows when the counter has reached zero. Writing to this register resets it.
- Watchdog Reset Status Register: This register contains a single bit that is only cleared by power-on reset (not a watchdog-triggered reset). It can also be cleared by a software application. The reset status bit allows the software to determine whether or not the reason for a reboot was caused by a watchdog timeout.
- Watchdog Disable Register: This register requires two specific patterns to be written to it to enable the watchdog mode bit within the Watchdog Control Register when the watchdog is set to timer mode.
Zybo > Chronicles blog 15 > privater timer使用例

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Implementing-the-Zynq-SoC-s-Private-Timer-Adam-Taylor-s-MicroZed/ba-p/402203

例として以下の振舞いを実装しようとしている

> In this example, the timer will be loaded and will start running when the button is pressed. (Note: the timer will not be run in auto-reload mode). The timer will generate an interrupt when the preset timer countdown value reaches zero. The resulting interrupt triggers output of a message out over STDOUT and the interrupt will then be cleared to await the next button press.
 

関連する部分が以下のようだ。

```.c
#define TIMER_LOAD_VALUE      0xFFFFFFFF

...
  
//timer initialization
TMRConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
XScuTimer_CfgInitialize(&Timer, TMRConfigPtr,TMRConfigPtr->BaseAddr);
XScuTimer_SelfTest(&Timer);
//load the timer
XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VALUE);

...
 
//set up the timer interrupt
XScuGic_Connect(GicInstancePtr, TimerIntrId,
               (Xil_ExceptionHandler)TimerIntrHandler,
               (void *)TimerInstancePtr);
//enable the interrupt for the Timer at GIC
XScuGic_Enable(GicInstancePtr, TimerIntrId);
//enable interrupt on the timer
XScuTimer_EnableInterrupt(TimerInstancePtr);

...

static void TimerIntrHandler(void *CallBackRef)
{
 
      XScuTimer *TimerInstancePtr = (XScuTimer *) CallBackRef;
      XScuTimer_ClearInterruptStatus(TimerInstancePtr);
      printf("****Timer Event!!!!!!!!!!!!!****\n\r");
     
}

...

//load timer
XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VALUE);
//start timer
XScuTimer_Start(&Timer);

```

上記のうちでわからなかったもののうち、ブログに掲載されている（おそらく動くであろうソースコード）から以下のように整理した。

- TIMER_DEVICE_ID
  - #define TIMER_DEVICE_ID XPAR_XSCUTIMER_0_DEVICE_ID
- & TimerのTimer
  - static XScuTimer Timer;//timer
- GicInstancePtr
  - static XScuGic Intc; //GIC
  - static void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio, u16 GpioIntrId, ...
  - SetupInterruptSystem(&Intc, &Gpio, ...
- TimerIntrId
  - #define TIMER_IRPT_INTR XPAR_SCUTIMER_INTR
- TimerInstancePtr
  - &Timer
  - static XScuTimer Timer;//timer
WebAPI学習ソースまとめ

これからWebAPIを学習したい方や、WebAPIの設計に悩んでいる方向けのリンク集です。
他に良い情報ソースをご存知の方、ぜひコメントをお願いします。

# 入門

『Web APIとは何なのか』（Qiita）
http://qiita.com/ARS_2000/items/df4c8455ab527aeacf02

『Web API入門』（SlideShare）
http://www.slideshare.net/tmasao/web-api-49080729

『[Web] HTTPリクエストの中身を学んでみた。』（YoheiM.NET）
http://www.yoheim.net/blog.php?q=20120611


# 設計ノウハウ関連

『5分で絶対に分かるAPI設計の考え方とポイント』（@IT）
http://www.atmarkit.co.jp/ait/articles/1511/19/news022.html

『Web API設計指針を考えた』（MMMブログ）
http://blog.mmmcorp.co.jp/blog/2015/07/01/web_api_guideline/index.html

『技術/HTTP/REST設計思想の "Stateless" との付き合い方』（msakamoto-sf氏のブログ）
http://www.glamenv-septzen.net/view/1350


# 認証関連

 『認証を含む API 開発で検討すべきこと』（ボクココ）
http://goo.gl/t6kblP

『Web API認証について』（ぶいてく）
http://blog.virtual-tech.net/2014/01/web-api.html

『モバイルアプリのユーザ認証方法についてまとめてみた』（Qiita）
http://qiita.com/ledmonster/items/0ee1e757af231aa927b1


# 書籍
『Web API: The Good Parts』（オライリージャパン）
https://www.oreilly.co.jp/books/9784873116860/

忙しくて読めない方のためのまとめ↓
『今さらだけど「Web API: The Good Parts」 を読んだので自分なりにまとめてみる』（Qiita）
http://qiita.com/naoki_koreeda/items/a3c4b61d5ae2105df8fa
複数のWordPressでユーザーを共有する

既にWordPressでブログを構築しており、同じサーバ内にもう一つWordPressを追加したい。
そんなときに、既存のWordPressのユーザー情報やログイン情報を新規にインストールするWordPressと共有する方法です。

#新しいWordPressのインストール前の準備
サーバにある既存のWordPress（以下、既存WP）とは別のフォルダをつくり、新しくインストールするWordPress（以下、新WP）をアップロードします。（同じバージョンを推奨）
新WPをインストールする前に以下の作業をします。

既存WPのwp-config.phpを、新WPにコピーして開きます。
新しいwp-config.phpでは、$table_prefix の値のみを変更して、あとは
`/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */`<br>の上あたりに以下のコードを記述

```php:wp-config.php
define('CUSTOM_USER_TABLE','wp_users');
define('CUSTOM_USER_META_TABLE','wp_usermeta');
```
※既存WPのデータベース接頭辞に注意してください！　wp_　以外を設定している場合は適宜上記の[wp_]の部分を書換えてください。

# 新WordPressのインストール
1. 上記が終わったら新WPのURLにアクセスしてインストールを開始します。
2. そうすると、いつもはユーザー名とかを入力する画面で、「既にユーザが存在しています」みたいなメッセージが表示されて、メールアドレスだけを入力する画面が表示されます。
3. ここで入力するメールアドレスは、既存WPでは使っていないものにしてください。
4. 上記でしていしたメールアドレスをつかって管理者ユーザーが自動的につくられます。パスワードが表示されるのでメモしてください。
5. あとはいつもの流れでインストール<br>もちろん新WPの接頭辞は既存WPのとは別にしてくださいね。

# 新WordPressのインストール後作業
1. 上記のインストールの時につくられたユーザーで新WPにログイン
2. ダッシュボードのユーザー一覧を見ると既存WPのユーザーが表示されていますが、「権限なし」になっているので、権限を与えましょう。
3. 既存のユーザーに管理者権限を付与した後は、新WPが自動的に追加した管理者ユーザーは削除しても構わないと思います。

以上で終了。
ユーザー情報が複数のWordPressで共有されます。

DBをのぞいてみると、新DBのテーブルの　userとusermetaは作られていないのが確認出来ると思います。


#この情報に至った経緯
WordPressで複数のブログを運用したいときにはマルチサイトという便利な方法がありますが、既に構築＆運用後にWordPressをマルチサイト化しようとすると「サブドメイン型」でしかマルチサイト化できません。
今回は、「サブディレクトリ型」でのマルチサイト化がしたかったのですが、諦めてもう一つWordPressをインストールすることにしました。
そこで、考えたのがユーザー情報が共有できないか？ということです。同じユーザーで２つのブログを管理できたらマルチサイトとまでとはいかないけど全くべつのブログを運用するよりは少しは便利になりそうです。
それっぽい情報がCodexにあったのでやってみました。という訳でした。

#参照したサイト
[WordPress Codex日本語版](http://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86#.E3.82.AB.E3.82.B9.E3.82.BF.E3.83.A0_User_.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB.E3.81.A8.E3.82.AB.E3.82.B9.E3.82.BF.E3.83.A0_Usermeta_.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB)
（Codexです。ほかにもいろいろマニアックな設定がのっていて参考になりました）

http://justintadlock.com/archives/2008/09/20/installing-two-wordpress-blogs-with-the-same-users
（具体的なやり方がかいてあって参考になりました。ほぼこのままやりました）
技術英語 > Not a huge difference [on the face of it] / superficially

http://www.scientificamerican.com/podcast/episode/superfast-computer-chip-transmits-data-with-light/

新規開発のコンピュータがデータ転送を銅線使用からから光転送に変更したことに関して

> A metal pin on the memory chip in your computer might transmit at 1.6 gigabits per second. Sun's optical connection <font color=red>ups</font> that rate to 2.5 gigabits per second. Not a huge difference <font color=red>on the face of it</font>.

http://eow.alc.co.jp/search?q=on+the+face+of+it&ref=sa
> 見た［一見した］ところ、表面上（は）、表面的には

upを動詞として使うのも初めてみた。

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=superficially
> 皮相的に、一見、表面的に
型キャストと??の組み合わせ、そこをなんとか頼みたい

イマドキならさ、

```php
$hogehoge = $_GET['hogehoge'] ?? 'unless';
```

ってしたいじゃない？（えっ、$_GETに気軽に触ってイイのは小学生までだって？）

```php
$hogehoge = (string)$_GET['hogehoge'] ?? 'unless';
```

でも、色々考えると、こうしたいなって思う事あるじゃない？


「ところが残念！Undefined indexです！！！」

```php
$hogehoge = (string)($_GET['hogehoge'] ?? 'unless');
```

しかたなくこうなるじゃん？


「それは型指定ではない、キャストだ、そうなるのは当たり前だうつけめ」

…という声は聞こえてきますが、そこをなんとか頼む…という気分になっています。

眠いのでそろそろ寝ます
Vagrant Ansible Provisionerでdry run = ansible.raw_arguments。

# 「--checkオプション渡したい！！」
あります。

`vagrant provison`コマンドにオプションを渡すことはできないが、`Vagrantfile`にて`ansible-playbook`用オプションを書き加えることができる。

```lang:Vagrantfile
...
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "site.yml"
    # 以下でオプション追加できる
    ansible.raw_arguments = ['--check']
  end
...
```

ansibleタスクをVagrant上で制作する際に便利。
もちろん、`'--syntax-check'`も設定できます。

## 参考
https://www.vagrantup.com/docs/provisioning/ansible_common.html
npmモジュールなどのOSS選定をサポートしてくれるWebサービスまとめ

さいきん個人でNode.jsを使って、ちょっとしたWebツールを作っているのですが、作るものがそこそこの規模になってくると、どんどん依存するnpmモジュールが増えていきます。
([npmのモジュール粒度問題みたいな形で、少し前に話題にもなりました](http://yosuke-furukawa.hatenablog.com/entry/2016/03/27/152500))

加えて、これまた最近話題になっていましたが、[Webフロントエンドにはライブラリやツールが乱立している](http://qiita.com/kikurage/items/bd198c4ce22b48ae56c1)、ということで、Web開発をしていると、何を使うべきかの判断に迫られる場面が数多く発生するように思います。
READMEを読んだり、実際に使ってみたり、コードを読む等して、一つ一つ判断していけると良いのですが、npmのような粒度で依存モジュールが増えていくと、中々にしんどいものがあります。個人で気楽に作っているツールなら尚更です。

手っ取り早く確認できそうな指標としては、DL数やGitHubのスター数、誰(どこ)が作っているのか、誰(どこ)が使っているのか、メンテされているか、バージョンは1以上か、OSSライセンス等など、いろいろと挙げられそうですが、それすらも一つ一つ確認するのは、やはり面倒です。

そこで↑の作業をサポートしてくれるツールみたいなものを作ろうと思ったのですが、ちょっと調べてみると既に幾つかあったので、まとめてみることにしました。

※ これから紹介するサービスでわかるのは、あくまでも表面的な指標のみです。それらの指標を足がかりとして、深掘りしていくのが良いと思います。

## [npm trends](http://www.npmtrends.com/)
![スクリーンショット 2016-05-19 2.13.10.png](https://qiita-image-store.s3.amazonaws.com/0/47437/11b5de55-0eb3-53aa-7a86-50a2a51f28d8.png)
http://www.npmtrends.com/

[npm trends](http://www.npmtrends.com/)は

```
Compare npm package download counts over time
```
とあるように、npmパッケージのDL数やGitHubスター数を比較できるサービスです。
デザインがシンプルで見やすいです。

## [NPMCompare](https://npmcompare.com)
![スクリーンショット 2016-05-19 1.25.57.png](https://qiita-image-store.s3.amazonaws.com/0/47437/a8338ba2-63bb-a398-6141-701a859b628d.png)
https://npmcompare.com

[NPMCompare](https://npmcompare.com)も[npm trends](http://www.npmtrends.com/)と同じくnpmパッケージ間で比較ができるサービスですが、こちらはDL数やGitHubスター数だけでなく、最終更新日やOSSライセンス、fork数や平均バージョン更新間隔など、情報量が多いです。

## [Libraries.io](https://libraries.io)
![スクリーンショット 2016-05-19 1.30.19.png](https://qiita-image-store.s3.amazonaws.com/0/47437/f31349a8-6467-020a-73f1-7b1ef67810e9.png)
https://libraries.io

[Libraries.io](https://libraries.io)は

```
Libraries.io monitors 1,456,935 open source libraries across 32 different package managers. You can discover new libraries to use in your software projects as well as be notified of new releases to keep your applications secure and up to date. Find out more
```
とあるように、npmだけでなく、RubygemsやMavenなど32のパッケージマネージャーで公開されているOSSを横断して検索できるサービスです。
↑２つのサービスのように、サイト上でOSS間の比較はできないですが、[Libraries.io](https://libraries.io)もライセンスやGiHubスター数、最終更新日などを表示してくれます。
さらに[Libraries.io](https://libraries.io)は、幾つかのメトリクス(GitHubのスター数など)に基づき独自にスコアリングもしてくれます。

## [Google トレンド](https://www.google.co.jp/trends/)
![スクリーンショット 2016-05-19 1.36.04.png](https://qiita-image-store.s3.amazonaws.com/0/47437/d4614645-9d8a-2f99-84b3-65cbdc727b04.png)
https://www.google.co.jp/trends/

盛り上がりを可視化するのであれば、[Google トレンド](https://www.google.co.jp/trends/)も便利です。
ただ、モジュール名によっては結構ノイズが入るので、あくまでも参考値程度に留めておくと良さそうです。

## さいごに 
あと、今回紹介したサービスでは確認できない指標ですが、npmモジュールの場合、npmサイト上での検索結果ページに表示されるスター数が意外と参考になるらしいです。
（npmのスター機能は、ほとんど使われていないため、本当に良いと思ったものにしかスターがつかない）

↑の件は確か、[CodeLunch.fmのThe Node.js Futureという回](http://codelunch.fm/19/)で話題に挙がっていた気がします。
(再度確認しようと思ったのですが、音声を聞くことができませんでした、、)

ただ、ぱっと見たところ、Node.jsが話題になり出した頃からあるような、息の長いモジュールにスターが多めについているような印象でした。
（以前はnpmのスター機能がそこそこ使われていた？）
LINE BOT APIでおうむ返ししてみる

LINE BOT API Trial Accountの追加募集してたので、遅ればせながら、おうむ返しbotをつくってみました。

# 1. 準備しよう
## 1-1. LINE BOT API Trial Accountの申し込みをする

まだ申し込んでない場合は、[LINE BUSINESS CENTER](https://business.line.me/ja/)のBOT API Trial Accountのリンクから、利用開始をします。

いくつかの必要項目を入力すると、Channel ID, Channel Secret, MIDが割り当てられます。（Channel SecretはSHOWボタンを押すと表示されます。）

![IDs.png](https://qiita-image-store.s3.amazonaws.com/0/61150/5d09086e-7ac5-44a0-63df-65a02b17e1ec.png)

これらの値は後で必要になります。

# 2. プログラムを書く

[GitHub](https://github.com/k1koyama/line_echo_bot)にソースを置いたので自由にしてください。ここでは、ポイントになりそうな部分のみ書きます。

# 2-1 シグネチャ検証しよう

作成したbotアカウントと友達になったり、メッセージが届いたりすると、LINEのサーバーから、後で指定するCallback URLにPOSTリクエストが届きます。このとき、リクエストボディと自分のSecretを使って計算されたダイジェストがシグネチャとしてリクエストヘッダ(X-Line-ChannelsSignature)で渡されるので、リクエストを処理する前に次のような計算をして検証すると吉です。

```js
function check_signature(sign, body) {
    var hash = crypto.createHmac('sha256', LINE_SECRET)
                     .update(body, 'utf8')
                     .digest('base64');

    return sign === hash;
}
```

# 2-2 リクエストは配列だそうです

LINEサーバーからのPOSTは、1つのリクエストに複数のメッセージ（またはオペレーション）が配列で入っているらしいので考慮してあげます。また、各配列要素がメッセージ（テキストやスタンプなどのいわゆるメッセージ）かオペレーション（友達になったりブロックされたりしたときの通知）かの判定は、eventTypeプロパティで判断できるみたいです。

```js
                if (Array.isArray(body.result)) {
                    body.result.forEach(function (m) {
                        switch (m.eventType) {
                        case LINE_ETYPE_MESSAGE:
                            process_message(m);
                            break;
                        case LINE_ETYPE_OPERATION:
                            process_operation(m);
                            break;
                        default:
                            console.log('unknown event type:', m.eventType);
                            break;
                        }
                    });
                }
```

# 2-3 テキストメッセージを見つけておうむ返ししよう

受け取ったメッセージはcontentTypeプロパティを調べることで、テキスト、スタンプ、etc.の区別ができるそうです。今回はテキストメッセージが届いたらおうむ返ししています。

```js
function process_message(m) {
    switch (m.content.contentType) {
    case LINE_CTYPE_TEXT:
        console.log('text message (%s) received from (%s)',
                        m.content.text, m.content.from);

        send_a_message(m.content.from, m.content.text);

        break;
    default:
        console.log('unknown content type(%d):',
                        m.content.contentType, m.content);

        send_a_message(m.content.from,
                        'ごめんなさい。何を言っているのかよくわかりません。');

        break;
    }
}
```

# 3. デプロイする

今回作成したプログラムは、herokuにデプロイできるようなっています。ご自分のherokuアカウントにデプロイしてみてください。

## 3-1 configを設定する

デプロイできたら、最初に取得したChannel ID, Channel Secret, MIDの値をconfigに設定をします。

![heroku_config.png](https://qiita-image-store.s3.amazonaws.com/0/61150/dc1de4db-20c4-a546-290b-e5f48399ef54.png)

## 3-2 Callback URLを設定する

LINE developersの画面に戻って、Callback URLを設定しましょう。

herokuの場合は、`https://アプリケーション名.herokuapp.com:443/`こんな感じのURLになるんじゃないかと思います。ポート番号は書かないと怒られます。

# 4. 動かしてみる

あとは、作ったbotアカウントと友達になって、なんかメッセージを送るとこんな感じで動きました。

![line.png](https://qiita-image-store.s3.amazonaws.com/0/61150/10ee848b-1dee-d215-4f66-b70f2328b600.png)

ではまたね。
[Java] ファイルをダウンロードして保存する（Apache HttpComponents HttpClient 4.5.2使用）

割と基本的な処理なのにあんまりサンプルコード無いですね…。

```xml:pom.xml
<!-- 省略 -->
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5.2</version>
    </dependency>
<!-- 省略 -->
```

```java:Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class Main {
	public static void main(final String[] args) throws IOException {
		try (final CloseableHttpClient client = HttpClients.createDefault();
				final CloseableHttpResponse response = client.execute(new HttpGet("http://example.com/file"))) {
			final int status = response.getStatusLine().getStatusCode();
			if (status >= 200 && status < 300) {
				final HttpEntity entity = response.getEntity();
				Files.write(Paths.get("path/to/file"), entity == null ? new byte[0] : EntityUtils.toByteArray(entity));
			} else {
				throw new ClientProtocolException("Unexpected response status: " + status);
			}
		}
	}
}
```

# 参考リンク
[Apache HttpComponents - HttpComponents HttpClient Examples](http://hc.apache.org/httpcomponents-client-ga/examples.html)
applyメソッドを持つオブジェクトは、それ自身がメソッドであるかのように呼び出せるのです

## はじめに

『Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関数型徹底ガイド』に表題のような文章を見つけ、少し疑問を持ったので確認してみました。

疑問はここでいうオブジェクトって何だろう？という小さな疑問です。`object Foo { def apply() = "foo" }`で定義したオブジェクトなのか、あるいは`class Bar { def apply() = "bar" }`で定義してインスタンス化したオブジェクトなのか？

## objectキーワードの場合

まずはobjectキーワードで定義したオブジェクトを確認してみます。

次のように確認しました:

```scala
object Foo { def apply() = "foo" } // defined module Foo
Foo() // String = foo
```

確かにオブジェクト自身がメソッドであるかのようです。。。
ところで、moduleはオブジェクトなのか？
新たな疑問を持ってしまいました。。。

### moduleはオブジェクトなのか？

こういう疑問は早めに片付けてしまいましょう。

次のように確認しました:

```scala
Foo.isInstanceOf[Foo.type] // Boolean = true
```

moduleはオブジェクトのようです。

調べてみると、メンバーに名前空間を割り当てることを主な目的とするオブジェクトをモジュールと呼ぶようです。

## classキーワードの場合

次はclassキーワードで定義してインスタンス化したオブジェクトを確認してみます。

次のように確認しました:

```scala
class Bar { def apply() = "bar" } // defined class Bar
val bar = new Bar // bar: Bar = Bar@67667caa
bar() // String = bar
```

確かにオブジェクト自身がメソッドであるかのようです。

## case classキーワードの場合

念のためcase classの場合も確認してみます。

次のように確認しました:

```scala
case class Baz() { def apply() = "baz" } // defined class Baz
val baz = Baz() // baz: Baz = Baz()
baz() // String = baz
```

確かにオブジェクト自身がメソッドであるかのようですが、Baz()はシングルトンなのか？
また、新たな疑問を持ってしまいました。。。

### Baz()はシングルトンなのか？

Baz()の()の部分が怪しいので、メンバーを追加して確認してみます。

次のように確認しました:

```scala
case class Baz(name: String) { def apply() = "baz" } // defined class Baz
val one = Baz("One") // one: Baz = Baz(One)
val two = Baz("Two") // two: Baz = Baz(Two)

class Bar(name: String) { def apply() = "bar" } // defined class Bar
val bar = new Bar("Bar") // bar: Bar = Bar@2a71e0c2
val barr = new Bar("Bar") // barr: Bar = Bar@6422f1ce
```

シングルトンではないようです。

しかし、メンバーの値とオブジェクトが1対1対応しているように見えます。

## Function0の場合

念のため関数オブジェクトの場合も確認してみます。

次のように確認しました:

```scala
val f = new Function0[String] { def apply() = "function0" } // f: () => String = <function0>
f() // String = function0
```

確かにオブジェクト自身がメソッドであるかのようです :smile:
Kotlinでkotlin-android-extensionsをFragmentでも使いたい

#kotlin-android-extensions

KotlinでAndroidアプリ書いているとき、layoutファイルに

```xml
<TextView
    android:id="@+id/textview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
```
こんなん書いてたとしたら、このPlugin利用すると***Activity***中に

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    setContentView(R.layout.activity_main)
    textview.text = "hogehoge"
}
```

とidが変数名となって利用できますよね？とても便利です

#Fragmentでの利用

この*kotlin-android-extensions*を***Fragment***でもつかいたいなぁと思った時、最初こう書きました

```kotlin
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater!!.inflate(R.layout.fragment_main, container, false)
    textview.text = "hogehoge"
    return view
}
```

コンパイルは通りましたが、実行したら*NullPointerException*で落ちました…

これはまた`view.findViewById(ResourceID)`の嵐かと思いましたが、調べたらありました！

```kotlin
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater!!.inflate(R.layout.fragment_main, container, false)
    return view
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    textview.text = "hogehoge"
}
```

`onViewCreated`でインスタンスを取得できました！ありがたや～

参考までに書いてみました丿
SQLServar 64bit版でmdbをリンクサーバーで接続したい

#はじめに
結論から言うとSQLServer32bit版インストールし
mdb→SQLServer(32bit)→SQLServer(64bit)
※→はリンクサーバーです。
にする事が一番手っ取り早いと思われる。

また、[レジストリの変更、強制インストールする](http://plus-sys.jugem.jp/?eid=446 "【SQLServer】（自己責任で）32bitOffice環境で64bitMicrosoft.ACE.OLEDB.12.0プロバイダを導入する方法。")必要がないので、検証環境で問題なかったとしても政治的理由でNGを食らう事が少ない。
この方法のメリットは本番・開発環境問わず同じ構成にできるという点だと思う。

#環境
本番環境
WindowsServer(64bit)
SQLServer(64bit)

開発環境
Windows10(64bit)
SQLServer(64bit)

##サーバー側にoffice製品が未インストール、またはoffice製品(64bit)がインストールされている場合。
Accessがインストールされていない場合、[Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント](https://www.microsoft.com/ja-jp/download/details.aspx?id=13255 "Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント")を利用しmdbをリンクサーバーで接続する(理想)

![0.png](https://qiita-image-store.s3.amazonaws.com/0/119455/8fab553c-82a5-7a35-1118-4271736992fa.png)

##サーバー側にoffice製品32bit版が入っている場合
[レジストリの変更、強制インストールで導入する方法](http://plus-sys.jugem.jp/?eid=446 "【SQLServer】（自己責任で）32bitOffice環境で64bitMicrosoft.ACE.OLEDB.12.0プロバイダを導入する方法。")が紹介されているが、この内容をクライアント、社内で了承してもらうには厳しい。

###参考
[Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント](https://www.microsoft.com/ja-jp/download/details.aspx?id=13255 "Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント")
[【SQLServer】（自己責任で）32bitOffice環境で64bitMicrosoft.ACE.OLEDB.12.0プロバイダを導入する方法。](http://plus-sys.jugem.jp/?eid=446 "【SQLServer】（自己責任で）32bitOffice環境で64bitMicrosoft.ACE.OLEDB.12.0プロバイダを導入する方法。")
MacにQuestion2Answerをインストールしてみた

業務で[Question2Answer](http://www.question2answer.org/)を使いたかったので、
勉強がてら私物PCにインストールした際のメモ。

# 環境
    * OS X 10.11.4
    * MAMP　3.5
        * Apache 2.4.18
        * MySQL 5.5.42
        * PHP 5.5.31

※ MAMPのインストールはこちらを参考にさせて頂きました。
　http://pc-karuma.net/mamp-install-mac/

---

# インストール

* MySQLにDB作成

```
$/Applications/MAMP/Library/bin/mysql -u hoge -p
mysql>create database q2a;
mysql>grant all privileges on q2a.* to 'hoge'@'localhost' identified by 'hogehoge';
```

* Question2Answerのインストール  
https://github.com/q2a/question2answer/releases
から最新版をDL。執筆当時の最新バージョンは1.7.4。

```
$unzip question2answer-1.7.4.zip
$mv question2answer-1.7.4 /Applications/MAMP/htdocs/question2answer
$cd /Applications/MAMP/htdocs/question2answer
$cp qa-config-example.php qa-config.php
```

* MySQLの設定情報を反映

```
$vi qa-config.php
define('QA_MYSQL_HOSTNAME', 'localhost');
define('QA_MYSQL_USERNAME', 'hoge');
define('QA_MYSQL_PASSWORD', 'hogehoge');
define('QA_MYSQL_DATABASE', 'q2a');
```

* 日本語化  
https://github.com/naga0ka/Q2A-Japanese
から日本語化ファイルをDL。

```
$unzip Q2A-Japanese-master.zip  
$mv Q2A-Japanese-master/ja/ /Applications/MAMP/htdocs/question2answer/qa-lang/
```

あとはブラウザから http://localhost/question2answer にアクセスすればインストールが始まる。

# 所感
特に詰まるところもなくすんなりインストールできた。
業務で使ってるUbuntuマシンでも同様の手順でいけた。
cssでdiv要素内の要素を縦方向に中央揃えをしたい時

vertical-align:middle;をそのまま適用しても出来ない。
何故ならvertical-alignはインライン要素かテーブルセルにしか効かないから。
対策としてdiv要素にdisplay:inline;を適用したら、divのheightが変わってしまった。
そのため、div要素にdisplay:table-cellを適用したら出来た！
http://unitopi.com/css-vertical-align/
yumでのpostgresqlインストール

`yum install postgresql94-server.x86_64`

`su postgres -l`

`initdb94 --no-locale`

`#/etc/init.d/postgresql94 start`

`su postgres -l`
`createuser -a -d -U postgres -P hogehoge`
`createdb -E UTF8 -O hogehoge-U hogehoge-T template0 hogehoge`



chkconfig --level 345 postgresql94 on