OmniAICreator/Qiita-1.07M huggingface dataset:
OpenStack Evacuate

どうもOpenStack界隈ではとあるホストで動いてるインスタンスを別ホストに動かすのはmigrate、壊れたり落ちたりしたホストで動いていたインスタンスを別ホストに動かすのはevacuateの模様。
壊れたノード上で動いていたインスタンスを別のホストに移動させてみた。
とあるホストが壊れたので、その場で実践してみたというのが正直なところ。

# 環境
Ubuntu14.04LTS amd64
OpenStack Kilo

#Evacuate対象を調べる

```
$ nova service-list |grep down
+-----+------------------+-------------------------+----------+---------+-------+----------------------------+-----------------+
| Id  | Binary           | Host                    | Zone     | Status  | State | Updated_at                 | Disabled Reason |
+-----+------------------+-------------------------+----------+---------+-------+----------------------------+-----------------+
| 73  | nova-compute     | hogehogeserver          | az1      | enabled | down  | 2015-09-15T00:47:46.000000 | -               |
```

hogehogeserverのStateがDown
そこでここに乗ってるインスタンスを救いたい。
別のホストで起動するようにevacuateする。

# インスタンスリストを調べる

```
$ nova list --all-tenants --host hogehogeserver
+--------------------------------------+--------------------+----------------------------------+---------+------------+-------------+-----------------------------------------------------------+
| ID                                   | Name               | Tenant ID                        | Status  | Task State | Power State | Networks                                                  |
+--------------------------------------+--------------------+----------------------------------+---------+------------+-------------+-----------------------------------------------------------+
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | test01             | abababababababababababababababab | ACTIVE  | -          | Running     | local_net=192.168.0.1; backend-net=10.1.1.1               |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | test01             | cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd | SHUTOFF | -          | Shutdown    | local_net=192.168.0.2; backend-net=10.1.1.2               |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | test01             | efefefefefefefefefefefefefefefef | ACTIVE  | -          | Running     | local_net=192.168.0.3; backend-net=10.1.1.3               |
+--------------------------------------+--------------------+----------------------------------+---------+------------+-------------+-----------------------------------------------------------+
```
２台は起動していて１台はシャットダウン。

# evacuate実行
今回のノードはすべてシェアードストレージにあったため、以下のように実施した。

```
$ nova evacuate instance_ID NEW_hostname --on-shared-storage
```
このようにインスタンスのIDと移動先のホストを指定するだけで良い。
Statusは前の状態を引き継ぐ。
ActiveならActiveに。
SHUTOFFならSHUTOFFになります。

シェアードストレージじゃない場合は、やったことないのでうまくいくかちょっとわからないです。


参考：
http://docs.openstack.org/ja/user-guide-admin/common/cli_nova_evacuate.html
https://ask.openstack.org/en/question/61208/evacuate-failure-with-sharedstorage-over-az/
Macを閉じてもスリープしないようにするには

``` text:4月18日追記
こちらのツールですが、macOS 10.13 ではうまく動かないようです。
```
## [InsomniaX](http://www.macupdate.com/app/mac/22211/insomniax)

### 概要
Macを閉じてもスリープしないようにするユーティリティです。
OS X 10.11.4 で動作確認済みです

### 使い方
- [Disable Lid Sleep]がディスプレイのスリープ設定、[Disable Idle Sleep]が本体のスリープ設定です。
- 電源をつないでいる時だけ各種スリープ設定をDisableにしたいので[〜 when on AC]にもチェックを入れています。
- 起動時に実行したいので[Start on Login]にもチェックを入れます。

![スクリーンショット 2015-09-15 17.38.46.png](https://qiita-image-store.s3.amazonaws.com/0/20792/94751c06-1a39-c634-f8da-226bfbfc4126.png)

### 参考
[こりゃ便利!!【Mac】を閉じてもスリープせず通信を続けてくれる『InsomniaX』は必須！](http://sitemiru.com/2014/02/12/mac-insomnia-x/)
雑多。

SS(すごく私用/いちいちエントリ立てるのめんどいものをひとまとめ）
-Evernote
ノートをクリックしてもプレビューが他の物のままで切り替わらない。ノートのタイトルや日時は変わる。
→ノートが多すぎると起きる？ググったけどわからず。いったん再起動が最強だった…

-Slack
![WS000014.png](https://qiita-image-store.s3.amazonaws.com/0/59364/2048ff4f-119d-6c92-161d-cd9619749c82.png)
インストールエラー「エントリポイントが見つかりません」
Vista機に、Win7から使えるよ～ってクライアントをDLしてきたからdllに必要な物が足りないとか、そういうのなんだろうか。
他にもWebブラウザ版やスマホアプリがあるのでそちらを使用することに。
これがそれっぽい：
[タスクトレイアイコンの実装：OSのバージョンによる互換性の問題](http://www.planetleaf.com/wp3/software-development/%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%88%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%AE%E5%AE%9F%E8%A3%85%EF%BC%9Aos%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AB%E3%82%88.html)
WorldSpaceにおけるカメラの方向(UnityShader)


カメラ空間への変換行列から取得できる
-

- カメラ右方向: `UNITY_MATRIX_V[0].xyz`
- カメラ上方向: `UNITY_MATRIX_V[1].xyz`
- カメラ前方向: `-UNITY_MATRIX_V[2].xyz`

情報源
-

i-saintさんのブログ記事です(._.)
http://i-saint.hatenablog.com/entry/2015/03/18/194818

使用例
-

ビルボードの法線はカメラの方向を向いていることから、ビルボードのライティングに利用。
https://github.com/sugi-cho/BillboardStandardLit

![Billboards.png](https://qiita-image-store.s3.amazonaws.com/0/12156/ea42c91e-297b-656f-0d70-0c7806c1cfd1.png "Billboards.png")
Cent OSの時計がずれた場合にntpを入れて同期する


VagrantにSent OS (Scientific Linux) 入れたらntp入ってなかったので時計が自動で同期されなかった。結果時計が遅れ、GitHubのコミットログがカオスった。


とりあえず時間を見てみる

```
$ date
2015年  9月 7日 火曜日 14:16:09 JST
```

一応localtimeをJapanにする

```
$ sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
```

ntpをyumで入れる

```
$  sudo yum -y install ntp
インストール処理の設定をしています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package ntp.x86_64 0:4.2.6p5-5.el6 will be インストール
--> 依存性の処理をしています: ntpdate = 4.2.6p5-5.el6 のパッケージ: ntp-4.2.6p5-5.el6.x86_64
--> トランザクションの確認を実行しています。
---> Package ntpdate.x86_64 0:4.2.6p5-5.el6 will be インストール
--> 依存性解決を終了しました。

依存性を解決しました

...

合計                                                                                                                                                                                                           69 kB/s | 670 kB     00:09
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
  インストールしています  : ntpdate-4.2.6p5-5.el6.x86_64                                                                                                                                                                                  1/2
  インストールしています  : ntp-4.2.6p5-5.el6.x86_64                                                                                                                                                                                      2/2
  Verifying               : ntp-4.2.6p5-5.el6.x86_64                                                                                                                                                                                      1/2
  Verifying               : ntpdate-4.2.6p5-5.el6.x86_64                                                                                                                                                                                  2/2

インストール:
  ntp.x86_64 0:4.2.6p5-5.el6

依存性関連をインストールしました:
  ntpdate.x86_64 0:4.2.6p5-5.el6

完了しました!
```

同期する

```
$ sudo ntpdate ntp.nict.jp
15 Sep 14:16:07 ntpdate[20504]: step time server 133.243.238.244 offset 641189.612730 sec

$ date
2015年  9月 15日 火曜日 14:16:09 JST
```

できた。

ntpdを走らせて勝手に同期するようにする。

```
$ sudo service ntpd start
Starting ntpd:                                             [  OK  ]
```
FirefoxでのQiitaタグ補完機能動作 + オートコンプリートを無効にするユーザースクリプト

# 環境

Windows 7 64bit
Firefox 38.0.5 セーフモード:アドオンを無効にして再起動

# 起きること

Qiitaのタグ補完機能がFirefoxのAutocompleteの下に出て、上下キーの選択はQiitaの方を指している。
一番近い候補ほど隠れるのが辛い。

![補完.png](https://qiita-image-store.s3.amazonaws.com/0/62354/8d41aae3-30b7-93af-5b8e-688d7b69e372.png)



Qiitaの補完機能で選択した後も、Autocompleteは残る。
ただし、エンターでの選択は出来ず、Tabキーで履歴を入力することができる。

補完もAutocompleteも両方使いたいので何がいいかはわからないが、
レイアウトをずらすか、Autocompleteのエンター入力は許して欲しいかも。

Autocomplete出現後、左右キーで移動すれば、Autocompleteは消せる。Qiitaの補完はカーソル位置で変わるので、右キーが無難？

逆にAutocompleteを使いたい場合はEscでQiitaの補完が消え、Autocompleteだけが残るが、Qiitaの補完を適当に選んでもAutocompleteの候補は変わらないので、あんまり意味は無い。

いつもAutocompleteはエンターで入力している。
Qiitaでは効かないのでマウスクリックで選択してイライラしていたので、Tabでもいいよーとか1キー入力で消せるよーということをメモ。


***

同じような投稿がすでにあるよ
[qiita > タグの候補が二重に出る @ chrome > スペース入力すればいい > ダメだった > 解決方法: 1文字入力, Esc入力]
ブラウザの問題というよりはオートコンプリートの問題か

# オマケ:タグのオートコンプリートを無効にするユーザースクリプト

動作検証もあまりせずにサクっと。
するほどのものでもないですしね。

[Qiita_tag_disable_autocomplete.user.js]

```js:Qiita_tag_disable_autocomplete.user.js

// ==UserScript==
// @name        Qiita tag disable autocomplete
// @namespace   khsk
// @description タグの入力時にブラウザのオートコンプリート機能を無効化する
// @include     http://qiita.com/drafts/*
// @version     1
// @grant       none
// ==/UserScript==

document.getElementById('draft_item_tag_notation').autocomplete = 'off'

```

[Qiita_tag_disable_autocomplete.user.js]:https://gist.github.com/khsk/05bd8fc3abbdb209f9cc/raw/489f7e082aa69df150e86a7eda8aca5eb0f49638/Qiita_tag_disable_autocomplete.user.js

[qiita > タグの候補が二重に出る @ chrome > スペース入力すればいい > ダメだった > 解決方法: 1文字入力, Esc入力]:http://qiita.com/7of9/items/c944c462b34146b838fb
i18n

## モデルのi18n
Hoge_Hogeクラス（fooカラムを持つ）

```
ja:
  activerecord:
    models:
      hoge_hoge: ほげ

    attributes:
      hoge_hoge:
        foo: ふうー
```

## form系 i18n
### label
`<%= f.label :foo %>`
こんな感じでlabelにattributeの名前教えてあげれば自動でi18nされる。

### submit
```
ja:
  helpers:
    submit:
      create: さくせーい
      submit: ほぞーん
      update: あげー
```

としておけば、

```
<%= f.submit %>
```

で自動でi18nされる。

### カラムにないやつのlabel

```
ja:
  helpers:
    submit:
      create: さくせーい
      submit: ほぞーん
      update: あげー
    label:
      hoge_hoge:
        bar: ばー
```

こんな感じでYAMLにlabelと使いたいクラスとラベル名を付け足す。


## layouts/application.html.erb

http://stackoverflow.com/questions/14108688/rails-internationalization-i18n-everything-translating-except-layouts-applica

```
ja:
  layouts:
    application:
      blablabla: ぶらぶらぶらー 
```
でもまあ

```
<%= t('layouts.application.blablabla') %>
```

こう書いて表示するからあんまり自動感はない。
【PHP】qdmailで改行なし文字を並べられた場合文字化けする事象

PHPのメール送信ライブラリであるqdmailを使ってメール送信する際、テキストエリア（恐らくボックスも）に改行なしの文字をずらっと並べつつメール送信すると文字化けしたものが送られるという事象がありましたので共有します。

#原因

どうにもSMTPプロトコルでは1行1024文字と定められているようで、sendmailなどの送信サーバのデフォルト設定では
1024文字で自動改行が入ることが多いらしいですが、Qdmailでは回避不可能ってことだったようです。。

#対処

だがしかしQdmailにはインテリジェントワードラップてのがあって特定文字列幅で折り返しをしてくれる機能があるらしい、
実際に見てみると確かにソレっぽい記述がありました。

```
//---------
// wordwrap
//---------
var	$wordwrap_allow	= false;
var	$wrap_prohibit_allow	= false;
var $wordwrap_length= 45 ;
```

デフォルトではfalseだったっぽいですね。。
さらに４５文字。。

こちらを

```
//---------
// wordwrap
//---------
var	$wordwrap_allow	= true;
var	$wrap_prohibit_allow	= false;
var $wordwrap_length= 45;
```

にしたら文字化けなく送信されました、
もちろん上記で設定した文字数で折り返しはされます。
ただ、折り返すのは**メール自体全て**になります。
項目毎ではないです。
なので、極端な話、数値を１０などとしたメールは

```
あああ様

この度はXXXへのお
問い合せありがとうご
ざいました。
内容を確認後、担当者
よりご連絡させていた
だきます。

テスト文言テスト文言
テスト文言
-------------------
------
※このメールには返信
できません。
```

ってのがきます。
勘違いせぬよう。

基本こいつある程度の長さでtrueにしててもいいんじゃないですかね。
[Elixir]キーワードリストのkeyによって処理を変える一例

#Goal
キーワードリストのkeyによって処理を変える一例。

#Dev-Environment
OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4

#Body
ブログからの転載です。

キーワードリストを再帰で処理して、keyによってマッチする関数が変わるものを作成します。
たまには頭を使わないといけませんね。(この程度とか言わないで・・・)

Example:

```elixir
defmodule ArgumentsSample do

  @spec sample(Keyword.t) :: any
  def sample(kw) do
    keys = Keyword.keys(kw)
    values = Keyword.values(kw)

    IO.puts "Start..."
    sample(keys, values)
  end

  @match1 [:hoge, :huge]
  @match2 [:foo, :bar]

  defp sample([key|keys_tail], [value|values_tail]) when key in @match1 do
    IO.puts "@match1 match"
    IO.puts "#{key} = #{value}"
    sample(keys_tail, values_tail)
  end

  defp sample([key|keys_tail], [value|values_tail]) when key in @match2 do
    IO.puts "@match2 match"
    IO.puts "#{key} = #{value}"
    sample(keys_tail, values_tail)
  end

  defp sample(key, value) do
    IO.puts "...End"
  end
end
```

Note:
キーワードリストのkey / value部分のみを抽出するには...

```elixir
iex> Keyword.keys([hoge: 1, foo: 2, bar: 3, hoge: 4, huge: 5])
[:hoge, :foo, :bar, :hoge, :huge]
iex> Keyword.values([hoge: 1, foo: 2, bar: 3, hoge: 4, huge: 5])
[1, 2, 3, 4, 5]
```

Caution:
:hoge、:huge、:foo、:barにマッチしない場合の処理は書いていません。
現在のままだとマッチしないキーが来たら、そこで処理が終わります。

さて、実行してみましょう。

Result:

```elixir
iex> ArgumentsSample.sample hoge: 1, foo: 2, bar: 3, hoge: 4, huge: 5
Start...
@match1 match
hoge = 1
@match2 match
foo = 2
@match2 match
bar = 3
@match1 match
hoge = 4
@match1 match
huge = 5
...End
:ok
```

順番に実行の流れを見てみましょう。

```elixir
1:
# sample(kw)を実行
sample([hoge: 1, foo: 2, bar: 3, hoge: 4, huge: 5])

# keysとvaluesの内容
keys: [:hoge, :foo, :bar, :hoge, :huge]
values: [1, 2, 3, 4, 5]

# マッチさせる内容
@match1 [:hoge, :huge]
@match2 [:foo, :bar]

2:
# when key in @match1にマッチ
sample([:hoge|[:foo, :bar, :hoge, :huge]], [1|[2, 3, 4, 5]])

3:
# when key in @match2にマッチ
sample([:foo|[:bar, :hoge, :huge]], [2|[3, 4, 5]])

4:
# when key in @match2にマッチ
sample([:bar|[:hoge, :huge]], [3|[4, 5]])

5:
# when key in @match1にマッチ
sample([:hoge|[:huge]], [4|[5]])

6:
# when key in @match1にマッチ
sample([:huge|[]], [5|[]])

7:
# sample(key, value)にマッチ
sample([], [])

```

こうすれば、キーによって処理を変えることができる。
Ectoでfromを処理する時にやっていると聞いたので、気になって作ってみた。

#Bibliography
[hexdocs - v1.0.5 Elixir Kernel.Typespec](http://elixir-lang.org/docs/v1.0/elixir/Kernel.Typespec.html)
[elixir-lang - Typespecs and behaviours](http://elixir-lang.jp/getting-started/typespecs-and-behaviours.html)
[hexdocs - v1.0.5 Elixir Keyword](http://elixir-lang.org/docs/v1.0/elixir/Keyword.html)
[Github - v0.16.0 Ecto(query.ex#L241)](https://github.com/elixir-lang/ecto/blob/v0.16.0/lib/ecto/query.ex#L241)
tagが作られたタイミングで、CircleCIがGitHubにreleaseする


## やりたいこと

GitHub上でtagを作ると、apkファイルがreleaseとしてアップロードされる。
apkを作成する人がいなくても、コード修正できて、GitHubでタグ作れればapkが取得できる。
イメージとしては下記のような感じ。

![Kobito.r3kPin.png](https://qiita-image-store.s3.amazonaws.com/0/8708/5b419a2f-88e6-e316-6b47-d23e5c642d00.png "Kobito.r3kPin.png")

## 手順

### `circle.yml`にtagの設定を追加する

GitHubの推奨に従って、タグ名は`v1.0.9`といった形を想定しています。

```yaml:circle.yml
deployment:
  release:
    tag: /v[0-9]+(\.[0-9]+)*/
    commands:
      - ./gradlew assemble -PdisablePreDex
      - ./scripts/release.sh app/build/outputs/apk/app-debug.apk app-debug.apk
      - ./scripts/release.sh app/build/outputs/apk/app-release.apk app-release.apk
```

### `script/release.sh`を作成する

CircleCI上に、`GITHUB_ACCESS_TOKEN`という名称で、GitHubのPersonal access tokenを設定しておく必要があります。
`$1`はファイルパス、`$2`にGitHub上で表示されるファイル名が設定される前提です。

```bash:script/release.sh
#!/usr/bin/env bash

sudo apt-get install jq

UPLOAD_URL=`curl -H "Authorization: token $GITHUB_ACCESS_TOKEN" https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/releases/tags/$CIRCLE_TAG | jq '.upload_url'`
UPLOAD_URL=`echo $UPLOAD_URL | sed -e 's/{?name,label}/?name=/g' | sed -e 's/"//g'`

curl --data-binary @$1 -H "Content-Type: application/zip" -H "Authorization: token $GITHUB_ACCESS_TOKEN" $UPLOAD_URL$2
```

## まとめ

これで、またビルド職人の作業が減らせると思います。
シェルスクリプトの内容もそんなに凝ったものではないので、属人性も少ないと思います。
【Choregraphe】任意のメッセージをChatWorkに投稿できるボックスを作った件

#はじめに

PepperからChatWorkにメッセージを投稿できるように、Python Scriptで自作のボックスを作成したので、ご紹介します。このボックスを使うことで、アプリケーション内にChatWorkに任意のメッセージデータを送信するような仕組みを入れることができます。

例えば、Pepperを受付で活用しているとして、アポを取っている人間を選ぶとチャットワークにその人間宛のメッセージが流れたり、ソリタリー状態で一定間隔に、Pepperのぼやきをチャットワークに流したりといったような、様々な用途が考えれます。


#使い方

最下部にリンクを用意して、サンプルアプリとボックスをGithub上で公開していますので、そちらを参考にしてください。
ここに載せませんが、ボックスのコード自体は非常にシンプルなものになってます。（どうぞご自由に拡張してください）

##用意するもの

* Choregraohe
* ChatWork POST用ボックス（最下部でダウンロード可能）
* ChatWorkのアカウントとAPIトークン

##サンプルのボックス構成

![スクリーンショット 2015-09-15 12.58.43.png](https://qiita-image-store.s3.amazonaws.com/0/67591/0d52fcda-0e83-e35b-b71e-6f23c2874d6b.png)

####入力

* onStart

####出力

* onStopped → 終了へ
* onFailed → エラー内容読み上げ


「Text Edit」に任意の文字列を入力して、その値を「ChatWork POST」というボックスに送ります。あとは受け取った側のそのボックスからurllib2というPythonのモジュールを使って、ヘッダ情報とデータを設定してリクエスト送信します。

exceptで例外を処理。

エンドポイントなどChatWork APIの細かい情報に関しては、こちらのドキュメントを参考にしてください。

[ChatWorkAPI ドキュメント](http://developer.chatwork.com/ja/index.html)

特別変わったことをしている訳では無いので、GETや他の公開されているWeb APIでも型にはまる形だとは思います。


##ボックスのパラメータ

送信の際に、エンドポイントとAPIトークンを設定しておかなければいけない訳ですが、こちらはボックスの「変数」としてダイアログ入力ができるようにしています。
ボックスのスパナのアイコンをクリックしてそれぞれ入力してください。

![スクリーンショット 2015-09-15 13.59.07.png](https://qiita-image-store.s3.amazonaws.com/0/67591/73bd3627-75c5-09ad-ae9d-eda9440da47a.png)

|name  |type  |detail  |
|---|---|---|
|Room  |String  |ルームID  |
|API-Token  |String  |認証に使用  |


APIトークンの取得の方法についても、「ChatWorkAPI ドキュメント」を参考にしてください。
ルームIDはチャット部屋ごとに一意の値が設定されています。

#実行

整いましたところで実行です。

![スクリーンショット 2015-09-15 14.40.51.png](https://qiita-image-store.s3.amazonaws.com/0/67591/c04be865-89d7-fdfe-149c-2e07be352498.png)

**「TextEdit」から文字列が流れ〜の**

![スクリーンショット 2015-09-15 14.54.27.png](https://qiita-image-store.s3.amazonaws.com/0/67591/d3c9e260-5ef9-e7d7-19a6-18930e4d30d9.png)

**「ChatWork」に投稿され〜の**

![スクリーンショット 2015-09-15 14.41.58.png](https://qiita-image-store.s3.amazonaws.com/0/67591/4223a711-1cb8-e4ff-3ea9-079e78d570ac.png)

**以下のJSON形式でレスポンスが返され〜の**

```json

{
  "message_id": 1234
}

```

**終わり〜の**


#サンプルプロジェクト

https://github.com/king-panda/chatwork_post
※ ボックス単体のファイル(.cbl)も格納しています。

#動作確認環境

* Mac OS X v10.8.5
* Choregraphe v2.1.2.17

※ Windowsは動作確認していません。
PostgreSQL9.4のJSONBの演算子について

`json` 及び `jsonb` のデータ型を取り扱うにあたって、使用できるオペレーターと関数は、[公式サイト（英語）](http://www.postgresql.org/docs/9.4/static/functions-json.html)（→[日本語版](https://www.postgresql.jp/document/9.4/html/functions-json.html)）ある通りである。

演算子についてちょっと書いてみる。

## 「例」の見方

演算子や関数の説明表にある「例」の

```sql
'{"a": 0, "b": 1}'::jsonb
```

↑こういうのは `{"a": 0, "b": 1}`の値を持つ`jsonb型`の**カラム**ですよ、ということを表す。

実際SQLを書くときは、`tags`カラムが`jsonb型`であるとき、

```sql
select * from tags ? 'b';
```

のように書く。

## 各演算子

各演算子の説明は公式ドキュメントが十分に詳しいので割愛。

### PHPで使う際の注意点

これらの演算子は`2015年9月15日現在`はPHPから**使えない**
PDOのドライバーが対応していないのだ。
じゃあどうするかというと、演算子を**JSON/JSONB関数**に置き換えればよい。
PostgreSQLの演算子は必ず対応した`関数`が用意されている。
演算子に対応する関数は以下のSQLで確認できる。

```sql
postgres=> SELECT oprname, oprcode FROM pg_operator WHERE oprname = '?';

 oprname |   oprcode
---------+--------------
 ?       | jsonb_exists
(1 row)
```

演算子 `?` は `jsonb_exists関数`が対応していることがわかる。

```sql
'{"a": 0, "b", 1}'::jsonb ? 'b'
```

は

```sql
jsonb_exist('{"a": 0, "b", 1}'::jsonb, 'b')
```

と書き直せる。

関数で代替する際も、`$pdo->prepare()`でステートメントを用意することができない（正常にエスケープ処理が行われない）ので、生のSQLを発行する必要がある。その際はもちろん、**エスケープ処理には細心の注意を払うことが必要**。

### jsonb_exits (?演算子) の罠

jsonb型で数値配列を格納していて、その中のある数値を検索したい、という場合に、

```sql
select * from posts where '[0,1,2,3]::jsonb' ? 2 ;
```

これができない。
jsonb_exitsの第2引数は`文字列型`じゃないとダメ。
かといって、

```sql
select * from posts where '[0,1,2,3]::jsonb' ? '2' ;
```

こうしてシングルクォーテーションで括っても結果は０件になる。
方法が他にあるのかわからないけど、私は諦めた。

#### 代替手段

代わりに `jsonb_contains ( @> 演算子)` を使う。
jsonbカラムのうち、検索値（jsonb）が含まれるかどうかを調べるものなので、
入力した数値をjson配列に書き直し、jsonbにキャストしてあげれば、比較ができるようになる。

```sql
例） 0が検索値
select * from "users" where jsonb_contains('[0,1,2,3]'::jsonb, '[0]'::jsonb);
```

## jsonb型の部分更新

できない。。`9.4`でできるのは**検索**のみ。
でも`9.5`で部分更新が追加されるようていだそうだ。

- [PostgreSQL 9.5のJSONBの部分更新 — | サイオスOSS | サイオステクノロジー](https://oss.sios.com/yorozu-blog/postgresql95-jsonb?fb_action_ids=901714373253834&fb_action_types=og.likes)

楽しみ。
Jadeでtextarea要素にデフォルト値を与える方法


タイトルそのままですけど、Jadeでtextarea要素にデフォルト値を設定する方法についてです。
Jadeでプレーンテキストを埋め込むにはいくつかの方法があって、それによってどのように出力結果が変わるかを試してみた感じ。

- パイプで埋め込む
- ドットで埋め込む
- 変数にキャッシュして埋め込む

結論から言うと、文字列を変数にキャッシュしてから埋め込むのが良さそう。
パイプとドットの場合では、Jadeの構文としてインデントしたタブやスペースがHTMLに出力されてしまい、textarea要素の値として余計な文字列が紛れ込んでしまいます。

以下、CodePenでレンダリング結果見られます ＆ それぞれの方法のソースです。

<p data-height="600" data-theme-id="0" data-slug-hash="QjyOxK" data-default-tab="result" data-user="haribote" class='codepen'>See the Pen <a href='http://codepen.io/haribote/pen/QjyOxK/'>How to add the default value to textarea on Jade</a> by KIMURA Tetsuro (<a href='http://codepen.io/haribote'>@haribote</a>) on <a href='http://codepen.io'>CodePen</a>.</p>
<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

## パイプで埋め込む
```jade
textarea(rows=3)
  | hoge
  | fuga
  | piyo
```

## ドットで埋め込む
```jade
textarea(rows=3).
  hoge
  fuga
  piyo
```

## 変数にキャッシュして埋め込む
```jade
- var text = "hoge\npiyo\nfuga"
textarea(rows=3)= text
```
※ 改行は`\n`で表現する
今度こそ壊れない！丈夫なCardBoardの作り方（3号機）

# はじめに
* 前回丈夫なCardBoardとして段ボールの強化版を作成したのですが、まだ気になる点がいくつか残りました。（ピントが調整できない、ガムテープくさいｗ、など）
    * 前回ホームページ
        * http://qiita.com/maruo2/items/ab4cd2b45cc6cd4a02ce
* 今回ふとした経緯でレーザーカッターを使用できることになり、今度こそ壊れないCardBoardを作成しようと考えました！

# コンセプト
* 壊れない
* 持ち運び可能（分解できる）
* ピント調整もできるようにする

# レーザーカッターについて
* 講習で教わった内容です。
    * それ以上のことも可能かと思いますがこの範囲で実施する予定です。
* 教わった内容
    * レーザーカッターが実現できるのは切断と彫りの2種類。
        * 線の色で対応づける（切断：赤色、彫り：黒色）
    * レーザーカッターには、PDFファイルで線データを引き渡す。
    * PDFファイルの作成には、Inkscape（フリーソフト）を使用する。
    * 使用する素材は、MDFボード（中密度繊維板）
        * 塩ビ以外は、アクリル、皮、段ボールなど大体切れるそうです
 
# 実施作業
* CardBoardの図面からサイズを取得
    * ![01-scan-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/76cdae5d-7993-8907-5155-84ddf4692a49.jpeg)


* Inkscapeで作図
    * MDFボードは段ボールと違い曲がらないので、内側のパーツから順番に作図しました。最も内側のレンズ設置部分を作成して、その外周パーツはその図面を元に収まる形に作図。
    * 作図時の主な変更点
        * レンズ設置部分を前後に稼働できるようにした
        * 分解・再作成しやすいように接合部のほぞの長さ長めにした（2.5mm->3.0mm）
    * ![02-1-eye-area-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/4196b196-8175-7faf-3a14-f759fdb67289.jpeg)
    * ![02-3-side-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/60e01541-44dc-d5be-f40b-22be38ffd382.jpeg)

* 切断
    * MDFボード（30x45x2.5）を使用して切断しました。今のところ1枚で収まってます。
        * ![03-cut-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/7a4afcff-47fe-8167-9915-6e5195385ac9.jpeg)

* 組み立て
    * レンズ設置部分はレンズを中央に納めて結束バンドで結合
    * 他のパーツはそのまま組み合わせます
        * ![04-1-build-start-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/49eb7c5d-86ac-1c5b-eb6b-c96ea6644c1d.jpeg)

        * ![04-2-build-end-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/111c55cb-7614-9afc-f4ad-59bb9767f343.jpeg)


# 課題
* ほぞがすかすかになった（ゆるくて動いてしまうため輪ゴムで固定）
    * 抜けなくなると思って0.5mmずつ広げてた分隙間になった
        * -> 隙間は不要（焼ける分で十分）
* ほぞが邪魔
    * 抜き差ししやすいようにしたが不要
        * -> 余分な長さは不要
* ピントが合わない
    * 元の図面をベースにしたためスマホとの距離が短くなり過ぎた
        * -> 図面を起こし直し

# まとめ
* 元の図面のままでは曲がらないので組み立てられないが、きちんと作図すれば作成可能なことが分かりました。
* 改善ポイントを抑えて次回こそ良いものにします！
NAOからUSB内のデータ参照



#前書き
NAOにUSBをつないで、USB内のデータが取れたら嬉しいな―！なんて思って色々いじってみた。

#開発環境
機種名 : MacBook Pro
OS : Yosemite 10.10.5
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB
Choreographe : 2.1.3
NAO : 2.1.3

#本題
まずはUSBがNAOに正しく認識されているか確認

```bash
nao[0] ~ $ lsusb #USB接続前
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0cf3:9374 Atheros Communications, Inc.
Bus 003 Device 002: ID ffff:0006
snow [0] ~ $ lsusb #USB接続後
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0cf3:9374 Atheros Communications, Inc.
Bus 003 Device 002: ID ffff:0006
Bus 001 Device 005: ID 18a5:0302 Verbatim, Ltd #この行が増えた
```

一応つながっていることは確認できた。

こちらのサイトさんを参考に、USBをマウントして、ファイルの中身を確認してみた。
>http://www.linux-beginner.com/linux_kihon68.html

```bash
nao[0] ~ $ su #root権を取ります
password: #pwはroot
#以下root
mkdir /mnt/usb #ディレクトリを作成
mount -t vfat /dev/sdb /mnt/usb/ #/dev/sdbを/mnt/usbにマウント
ls /mnt/usb/
	test_ryo_hello.txt
```

書いてある内容

```test_ryo_hello.txt
テスト
こんにちわ

りょうです

1234567890
abcdefghijklmnopqrstuvwxyz

testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
```

実際にlessコマンドで表示された内容
>"/mnt/usb/test_ryo_hello.txt" may be a binary file.  See it anyway?
>バイナリファイルかもしれません、見ますか？

```test_ryo_hello.txt
<E3><83><86><E3><82><B9><E3><83><88>
<E3><81><93><E3><82><93><E3><81><AB><E3><81><A1><E3><82><8F>

<E3><82><8A><E3><82><87><E3><81><86><E3><81><A7><E3><81><99>

1234567890
abcdefghijklmnopqrstuvwxyz

testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
```

日本語表示できないんですね＞＜

はてさて、ひとまず、目的は達成したのでここまで。

#感想
そのうち、ChoreographeアプリからUSB内のデータを取得して、喋らせたり、音楽を流したりしてみたいです。


#関連URL
>Linux初心者の基礎知識 -68.USBメモリのマウント-
>http://www.linux-beginner.com/linux_kihon68.html
Raspberry PiとAsteriskでIP電話システムの構築(その2)

Raspberry PiとAsteriskを使用して自宅の電話をIP電話化したときのメモ
ここでは、電話番号取得から電話着信までに関する内容を記述します。

##【用意】
- Raspberry Pi Model B
- microSD 16G class10
- microSD->SD変換アダプタ
- LANケーブル
- auの充電器
- 適当なWindowsマシン

※HDMIケーブルが無い為、sshで接続

##【構築環境】

- Raspbian (Kernel version 3.18)
- Asterisk 13.5.0

##【手順】

### IP電話番号取得

仕事でお世話になっているのと、安さと、即時に番号が発行される点で
[FUSION IP-Phone SMART](http://ip-phone-smart.jp/)で電話番号を取得しました。

### 設定ファイルの変更

参考：[Asterisk FUSION VOIP-Info.jp](http://www.voip-info.jp/index.php/Asterisk_FUSION)

```sip.conf
[general]
port=5060
language=ja
disallow=all
allow=ulaw
allow=alaw
allowguest=no
nat=force_rport,comedia
qualify=3000
context=public
　・
　・
　・
;fusionアカウント
register => ＜SIPアカウント＞:＜SIPアカウントパスワード＞@fusion/＜SIPアカウント＞

[fusion]
type=friend
username=＜SIPアカウント＞
fromuser=＜SIPアカウント＞
secret=＜SIPアカウントパスワード＞
host=＜ドメイン＞
fromdomain=＜ドメイン＞
context=default
insecure=port,invite
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
dtmfmode=inband
qualify=yes

;SIPユーザー
[ast_user201]
type=friend
defaultuser=ast_user201
secret=passwordha201
context=default
canreinvite=no
host=dynamic
dtmfmode=rfc2833

```

```extensions.conf

[default]
;
; By default we include the demo.  In a production system, you
; probably don't want to have the demo there.
;
include => demo

exten => ＜SIPアカウント＞,1,Dial(SIP/ast_user201,20,rt)

```

AsteriskのCLIを起動して、sip.confとextensions.confの設定を再読み込みします。

    root@(none):/home/pi# asterisk -r vvvvvc
    (none)*CLI> sip reload
    (none)*CLI> dialplan reload

fusionのアカウントがREGIST(接続)できているかを確認します。
Stateが Registered 表示であれば接続成功です。

    root@(none):/home/pi# asterisk -r vvvvvc
    (none)*CLI> sip show registry
    Host                                    dnsmgr Username       Refresh State                        Reg.Time
    fusion:5060                             N      ＜SIPアカウント＞  105 Registered           Tue, 08 Sep 2015 20:05:42
    1 SIP registrations.

### 電話着信

SIPソフトフォンにSIPユーザーをREGIST(接続)します。
SIPユーザーの接続に関する内容は[Raspberry PiとAsteriskでIP電話システムの構築(その1)](http://qiita.com/hasudon7171/items/925b9512f81cee46fbe3)を参照してください。

fusionから発行された電話番号に発信して
SIPソフトフォンに着信がかかり通話ができれば成功です。

 
### 課題
- セキュリティ面の強化。ファイヤウォールの導入やextensions.confを再検討
- 自宅のWifi環境下ならソフトフォンのREGISTができるが、外からはREGISTできなくなるのでグルーバルIPアドレスを割り当てようか。。でもセキュリティが…
node-fetchでPOSTがうまくできなかった記録


# 背景

[ I always use http://github.com/github/fetch  for browser and node-fetch for node](https://twitter.com/VictorBjelkholm/status/642622458114256896) ができるといいな、と思って、[node-fetch](https://github.com/bitinn/node-fetch)を試してみました。

# 結論

サーバーによって上手く行ったり行かなかったりします。

# node-fetchのサンプルコード
宛先は http://httpbin.org/ です。
httpbinは/POSTにデータを送ると、そのまま送り返えしてきます。

```js:node_fetch_example.js
var fetch = require('node-fetch');

fetch('http://httpbin.org/post', {
    method: 'POST',
    body: 'a=1'
  })
  .then(function(res) {
    return res.json();
  }).then(function(json) {
    console.log(json);
  });
```

## 実行例
```
node node_fetch_example.js
{ args: {},
  data: 'a=1',
  files: {},
  form: {},
  headers:
   { Accept: '*/*',
     'Accept-Encoding': 'gzip,deflate',
     'Content-Length': '3',
     Host: 'httpbin.org',
     'User-Agent': 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)' },
  json: null,
  origin: '126.186.244.59',
  url: 'http://httpbin.org/post' }
```

dataが`a=1`で、送信できています。

# RequestBin
[RequestBin](http://requestb.in/)は、HTTPリクエストの中身を調査するための送り先URLを作成してくれるサービスです。こちらで用意したURLに送ってみます。

```js:request_bin_example.js
var fetch = require('node-fetch');

fetch('http://requestb.in/y5m0fiy5', {
    method: 'POST',
    body: 'a=1'
  });
```

## 実行結果

![スクリーンショット 2015-09-15 11.39.08.png](https://qiita-image-store.s3.amazonaws.com/0/15964/1b59ed5f-34b6-fff9-bc67-9617e7380929.png "スクリーンショット 2015-09-15 11.39.08.png")

Bodyは`None`と表示されます。

# echoサーバー

試しに自分でechoサーバーを動かしてみます。

```js:echoServer.js
var http = require('http');

http
  .createServer(function(req, res) {
    req.pipe(res);
  })
  .listen(3000);
```

クライアントのレスポンス処理を`res.json`を`res.txet`に変更します。

```js
var fetch = require('node-fetch');

fetch('http://localhost:3000', {
    method: 'POST',
    body: 'a=1'
  })
  .then(function(res) {
    return res.text();
  }).then(function(json) {
    console.log(json);
  });
```

## 実行結果
```
~ node example3.js
a=1
```

## 補足

`res.json`を使う時は、送信側も`JSON.stringify`を使います。

```js
var fetch = require('node-fetch');

fetch('http://localhost:3000', {
    method: 'POST',
    body: JSON.stringify('a=1')
  })
  .then(function(res) {
    return res.json();
  }).then(function(json) {
    console.log(json);
  });
```

# 感想
自分でサーバーを書かかない時は、[superagent](https://github.com/visionmedia/superagent)使うのが無難と思います。


# 参考
- [RequestBin使ってみた](http://freedom-man.com/blog/requestbin/)
- [POST requests not working · Issue #16 · bitinn/node-fetch](https://github.com/bitinn/node-fetch/issues/16) postcatcher.in というサービスでも上手くいかないらしい
- [JavaScript-Plugin-Architecture/connect-echo-example.js at master · azu/JavaScript-Plugin-Architecture](JavaScript-Plugin-Architecture/connect-echo-example.js at master · azu/JavaScript-Plugin-Architecture) node-fetchと対応しているサーバーのサンプル
- [Fetch API 解説、または Web において "Fetch する" とは何か？ - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/whatwg-fetch)
- [Fetch Standard](https://fetch.spec.whatwg.org/) Fetch APIの仕様
- [Fetch Standard （日本語訳）](http://www.hcn.zaq.ne.jp/___/WEB/Fetch-ja.html)
embulk-output-influxdbを書いた

最近、データ分析と可視化の基盤構築をやってる関係で、GrafanaとinfluxDBについて調査してみようと思ったので、そのついでにRedshiftからinfluxDBにサマリーテーブルのデータを突っ込む際にembulkを使ってみようと思った。
既にあると思ってたinfluxDBへのアウトプット用プラグインが無かったので自分で書いた。
やっぱ、まだ新しいプロダクトだから色々と貢献の余地があるのは良い。

https://github.com/joker1007/embulk-output-influxdb

redshiftからinfluxDBへのデータ転送は手元で動作確認済みですが、とりあえず自分が今必要な機能だけ雑に実装したので、tagsを投入できなかったりエラー処理が適当だったりする。
(メトリクス収集とかじゃなくて、単純なサマリーを保存してるだけなので必要無かった)
落ち着いたらやるけど、必要な人はさっさと書いてプルリクしてくれる方が早いと思う。

jrubyでサクっと書けるのはありがたい。しかし、起動が遅いのでいちいちシンタックスチェックに時間かかったりrbenvのzshフックがもたついてストレスフルなのがjrubyの良くない所。
Ruby: 絶対パスでメソッドを呼び出す。

メソッドの呼び出し。

```rb
Book.example
```

絶対パスだと、次のように書ける。

```rb
::Book.example
```

---

たとえばモジュールの内部から、同名のクラスを呼び出す場合に役立つ。

```rb:book.rb
class Book
  def self.example
    p 'Class'
  end
end

module Example
  class Book
    #このモジュールの example を呼ぶ
    def self.call_module_method
      Book.example
    end

    # 普通のClass の example を呼ぶ
    def self.call_class_method
      ::Book.example
    end

    def self.example
      p 'Module'
    end
  end
end

Example::Book.call_module_method
Example::Book.call_class_method
```

実行結果

```
"Module"
"Class"
```

----

- 「絶対パス」という呼び方が正しいかどうか分からないが、ググるときにキーワードが分からなくて苦労したのでメモ。
- `Class::Book.example` でも呼べるかと思ったが違った。( Class の部分が無視される )



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Xcode 7 でビルドしたアプリが起動直後に Assertion failure

# 事象
デバッグビルドをすると下記のエラーを出力してアプリがクラッシュする。

# 出力されるエラー
*** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.16.3/UIApplication.m:3294

# 原因
```objc:UIApplication.h
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
```
上記メソッド内で keyWindow に rootViewController が設定されていない。

# 対策
原因の通り、本事象の発生したアプリでは -application:didFinishLaunchingWithOptions: 内では keyWindow の生成を行いつつも rootViewController の設定をせず、別の場所での処理の後に rootViewController を設定していた。

ここに仮の rootViewController を設定することで解決となった。
VRまつり2015夏（唐揚げVR祭り）に行ってきました

# はじめに
* 2015/08/24 (月)に秋葉原で開催していた、「【250人に増員!!】HMDもからあげもバカ盛り！ VRまつり2015夏 Powerd by Epic Games」に参加してきました
    * ホームページ
        * https://atnd.org/events/68569

# 開催風景
* オープニング
    * ![01-オープニング.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/d5f19cd5-8b21-3a9a-370a-d0e4be396950.jpeg)

* メインテーマ（唐揚げ）
    * ![02-唐揚げ.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/44656281-6998-0e8e-3ddf-174c30d7fb7f.jpeg)


# 出展していたもの（クリエイターゾーン）

* THETAカエル
    * THETAの全手球画像を利用してカエルのようにジャンプ体験ができるHMD。ガジェット祭り、メーカーフェア、と続いてこちらでもTHETAカエルとお会いすることができました。一緒に出展のお手伝いをしていました。
        * ![03-THETAかえる.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/33235d52-7bbc-3c50-ee5b-07df60f33bf3.jpeg)

* HMDとの連携アプリ
    * HMDを使用したunityアプリを作成していました。コントローラーを組み合わせるとHMDを付けたままで周りを気にせず遊べました。 
* ？？？
    * 一番見学者が出ていた出展物。内容は、、、よくわかりませんでしたｗ
        * ![04-HIMITSU.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/95b4e326-1718-6f25-3320-e99cbdf0fa29.jpeg)


# まとめ
* 小さいスペースにも関わらず200人を超えるVR好きの方々が集まっていて、ものすごいパワーを感じました。これからVRが標準になる時代が来ると思います。時代の流れに置いて行かれないように勉強していきたいと思いました。
* 唐揚げ食べたかったです。
QGIS入門-0

#コンセプト

GIS未経験者の方向けのQGIS入門。
身近な題材をもとにQGISを用いて手を動かしながらGISの学習ができればと思っています。ひとまずQGISを動かしてみよう。ということで、初回と第2回では、地図にオープンデータをプロットすることをご紹介します。

##GISとは
[esriジャパン]さんの定義によると、
_GIS とは、Geographic Information System の略で、『ジーアイエス』または『地理情報システム』と呼ばれています。地理情報（Geographic Information）という、位置に関連づけられた様々な情報を、作成、加工、管理、分析、可視化、共有するための情報技術（IT：Information Technology）です。_
[esriジャパン]:http://www.esrij.com/getting-started/what-is-gis/

空間やその属性データから有益な情報を生み出す技術といったところでしょうか。今回は、実際に手を動かしながらGISについて理解を深めたいと思います。



##QGIS
この入門では、QGIS(Quantum GIS)を使用します。QGISは、GISの閲覧や、編集、分析ができるオープンソースソフトウェアです。QGISインストールは[こちら]から。以下、この記事では、MacOSにインストールしたQGIS 2.8 を使っています。

参考:[QGISインストール方法]
[こちら]:https://www.qgis.org/ja/site/forusers/download.html
[QGISインストール方法]:http://www.geopacific.org/opensourcegis/qgis/qgis_install

##オープンデータの取得
[国土数値情報ダウンロードサービス]でデータをダウンロードして、日本地図上にプロットしていきます。
「国土数値情報」とは、国土に関する基礎的な空間データセットです。また、この国土数値情報は、以下の大きく4つの分野をカバーしています。

|カテゴリ|内容|
|:--|:--|
|1.国土(水・土地)|わが国の国土の輪郭である「海岸線」や「土地利用」例)海岸線、川、土地利用、森林など|
|2.政策区域|法律や一定の目的で区分けされているエリアのデータ    例)役場、公共施設、世界自然遺産の場所など
|3.地域|各地にある公共施設や観光資源などのデータ|
|4.交通|道路・鉄道・空港・港湾など交通に関するデータ|
[国土数値情報ダウンロードサービス]:http://nlftp.mlit.go.jp/ksj/index.html

今回は、それぞれのカテゴリからデータを取得して、日本地図上にプロットしてみます。以下からデータをダウンロードしてください。尚、「それぞれダウンロードするデータの選択」は、「神奈川」を選択してください。

1.[国土数値情報 河川データ]
2.[国土数値情報 人口集中地区データ]
3.[国土数値情報 警察署データ]
4.[国土数値情報 鉄道データ]

[国土数値情報 河川データ]:http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-W05.html
[国土数値情報 人口集中地区データ]:http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A16.html
[国土数値情報 警察署データ]:http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P18.html
[国土数値情報 鉄道データ]:http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v2_2.html

これで準備が整いました、QGISを立ち上げてデータを表示してみましょう。
MacでWindows用のキーボードを使う時の設定


# MacでWindows用のキーボードを使う時の設定
- 私が使ってる設定をメモしておきます。  
この設定だとWindowsキーが付いているキーボード全般に適用が可能です。  
私はFILCOの「Majestouch 2 赤軸」を使っています。  
OSX 10.11 まで動作確認しています。

## システム環境設定
- デフォルトのキー配置を変更します
 
### 設定方法
- [キーボード]から[修飾キー...]を開き、キー配置を変更する
![スクリーンショット 2015-09-15 13.51.26.png](https://qiita-image-store.s3.amazonaws.com/0/20792/0924629c-2970-ef5a-6b96-80c8fe486931.png)

## [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)  
- 高機能で安定性も極めて高いOS X用のキーボードカスタマイズツール

### 設定方法
- [For PC Users]と[For Japanese]の2つだけenableにする
![スクリーンショット 2015-09-15 13.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/20792/1bccbd25-78a0-00c4-2d4a-d53003e946b1.png)

## [Seil](https://pqrs.org/osx/karabiner/seil.html.ja)
- caps lockキーと、PCキーボードの「無変換」「変換」「ひらがな」キーのためのユーティリティ

### 設定方法
- [For Japanese]をenableにする
![スクリーンショット 2015-09-15 13.41.17.png](https://qiita-image-store.s3.amazonaws.com/0/20792/5eec24c6-7676-f9f2-3127-3e5d4c57f4c2.png)

## 参考
- [seil と Karabiner で日本語入力をカスタマイズする - Qiita](http://qiita.com/bibio/items/b45faf78eeae5ab163d6)
メーカーフェア2015に行ってきました

# はじめに
* 2015年08月01日(土)～02(日)に東京ビックサイトで開催していたメーカーフェア2015に行ってきました
    * ホームページ
        * http://makezine.jp/event/mft2015/


# 出展していたもので印象に残ったもの
* 段ボールロボット（腕）
    * 段ボールでここまで精巧に動くものが作れるとは思いませんでした。他にもグローブのセンサと連動して動く腕なども出展していました。
    * ![01-段ボールロボ（腕）.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/7bbf901e-4f2e-d3ff-8dcd-34c43615ee38.jpeg)

* マトリクス風動画撮影セット
    * マトリクスのように視点を途中で切り替えられる動画を撮影できるセットだそうです。よく見ると私の自宅にもあるWEBカメラを流用しているので驚きました。
    * ![02-マトリクス風カメラ撮影.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/4481ca2f-93b4-cda1-8e25-b688a01ef4f0.jpeg)

* ドローンとHMDの連携システム
    * ドローンに取り付けたカメラをHMD（Oculus DK2）の向きと連動させられるシステムです。撮影しながら視点を自分の見たい方向にできます。カメラもステレオカメラになっていて立体視できるようになっています。
    * ![03-ドローンとHMDのれん系.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/e0ea07ca-785c-735a-34ac-653e189cbe72.jpeg)

* 自分の見ているものを投稿するシステム
    * 胸元にカメラを付けてフットスイッチを踏むとカメラで撮影した画像をTwitterに投稿するシステムです。Raspberry Piを使用してシステムを小さくまとめているのが印象的でした。
    * ![04-ラズパイ連携Twitter.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/5fc41c8f-5ba1-f48f-da89-ee2179342488.jpeg)

* 将棋指しロボ
    * 見た時は動いてませんでしたが、パッ見た通り将棋をアームで動かすもののようです。将棋に緑のシールが付いていてカメラやセンサで対応出来るようになっているようです。実際にコマを手で動かすというアナログな部分が含まれているのがよいです。
    * ![05-将棋指しロボ.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/8d3bf10d-4d07-1365-6ab0-f9d11fb03f38.jpeg)

* 特殊な3Dプリンタ
    * 説明をど忘れしてしまいましたが、通常の3Dプリンタとは違う形式で作成できるもの、だそうです。形状も独特でカッコ良かったです。
    * ![06-立体型３Dプリンタ？.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/38c825d0-be75-472e-aa86-bf3132d80be0.jpeg)

* ぴたごら風のキット
    * 昔、こういうおもちゃあったな～と思いつつ精巧な動きに見入ってしまいました。実売もしていたのですが高くて手が出ませんでした。
    * ![07-ぴたごら風のなにか.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/3a5a062e-815a-bc2d-01af-60eb3687f1fb.jpeg)

* THETA関連（懐中電灯／VR HMD）、脳波センサ？
    * THETA関連ということで知り合いの方が出展していました。THETAの全天球画像を生かしたものと脳波（？）を検知してLEDが様々な形式に点灯するものがありました。
    * ![08-THETA関連.jpg](https://qiita-image-store.s3.amazonaws.com/0/44076/e4c25c47-c9d7-e4c4-dee6-a55309be2107.jpeg)


# まとめ
* ジャンルを問わず様々なガジェットやロボットが見れて楽しかったです。私たちも翌年は何か作って出展したいと思います。
hubotでデプロイ用のpull requestを作るプラグイン、hubot-deploy-builderを作成しました

## はじめに

Hubotでデプロイ用のpull requestを作るプラグイン、hubot-deploy-builderというものを作成しました。

https://github.com/rockuapps/hubot-deploy-builder

弊社では、以下のようなルールで開発を行っています。

* masterにマージが行われたことをトリガーとして本番デプロイが走る
* masterへのマージは、原則的にdevelopブランチからのみ行われる(developブランチが各開発者の開発したものをマージして、ステージング環境にデプロイしてテストするためのブランチ）

デプロイ時に毎回develop => masterへのpull requestを作るのが面倒だったので、chatops化しました。

## やってくれること
* developからmasterへのpull requestを作成する
* developにマージされたpull requestのサマリをdescriptionに書く

## コマンド

`hubot deploy #{repo名}` で、そのリポジトリのdevelopからmasterへのpull requestを作成します。すでにそのpull requestが存在している場合、上書きしてサマリを作り直します。差分が存在しない場合はエラーを表示します。

## 使用イメージ

* 成功

![150914-0009.png](https://qiita-image-store.s3.amazonaws.com/0/5551/b38af779-3dcc-ae58-17d1-41c1e28b2b6c.png "150914-0009.png")

↓ GitHub上では

![150914-0010.png](https://qiita-image-store.s3.amazonaws.com/0/5551/74242ced-93e9-0e04-c866-bd1d510e2f16.png "150914-0010.png")

* 失敗

![150914-0008.png](https://qiita-image-store.s3.amazonaws.com/0/5551/66935dbe-242f-598b-1161-8467009d92cd.png "150914-0008.png")


※ tonjiruはbotの名前です

## インストール

READMEどおり、以下のように追記してください。

```package.json
"dependencies": {
  "hubot-deploy-builder": ">=0.1.0"
}
```

```external-scripts.json
["hubot-deploy-builder"]
```

以下の環境変数が必須なので入れてください。

* HUBOT_GITHUB_TOKEN

GitHubのアクセストークン

* HUBOT_GITHUB_USER

上記アクセストークンと紐づくGitHubのユーザ名

* HUBOT_GITHUB_ORG

GitHub組織名


## カスタマイズ

以下の内容を環境変数でカスタマイズできます。

* HUBOT_DEPLOY_MESSAGE

pull request作成時のメッセージ。デフォルトは"Let's deploy it!"

* HUBOT_NO_DIFFERENCE_MESSAGE

pull request作成時に、2つのブランチ間に差分がなかった時のメッセージ。
デフォルトは"There is no difference between two branches :("

* HUBOT_PR_EXISTS_MESSAGE

pull request作成時に、該当のpull requestが既にあった場合のメッセージ。
デフォルトは"This pull request already exists."

* HUBOT_BRANCH_FROM

pull requestのマージされる側となるブランチ。デフォルトはdevelop

* HUBOT_BRANCH_TO

pull requestの取り込みを行う側のブランチ。デフォルトはmaster


## プラグインを作るのに参考にさせていただいたサイト
* hubot-scriptを公開する方法（npm編） - Make 鮫 noise http://saihoooooooo.hatenablog.com/entry/2013/12/07/052150
* Node.js - node-inspector で hubot をデバッグする - Qiita http://qiita.com/hori@github/items/5a566237a66237e70d37
サーバー: Node.js クライアント: RubyでSSL通信

## 準備

秘密鍵(server-key.pem)と自己署名証明書(server-cert.pem)を作ります

```sh
$ openssl genrsa -out server-key.pem 1024
$ openssl req -new -key server-key.pem -out server-csr.pem
$ openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem
```

## サーバー側
```js:server.js
var tls = require('tls');
var fs = require('fs');

var options = {
	key: fs.readFileSync('server-key.pem'),
	cert: fs.readFileSync('server-cert.pem')
};

tls.createServer(options, function (socket) {
	socket.write("welcome!\n");
	socket.on('data', function(data){
		console.log(data);
		console.log(data.toString());
	});
}).listen(8000);
```

## クライアント側

```rb:client.rb
require "openssl"
require "socket"

tcp_socket = TCPSocket.new("127.0.0.1", 8000)
ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket)

ssl_socket.connect

puts ssl_socket.gets
ssl_socket.write "hello, world from client"

ssl_socket.close
tcp_socket.close
```

## 実行

 クライアント側

```sh
$ ruby client.rb 
welcome!
$ 
```

サーバー側

```sh
$ node server.js
<Buffer 68 65 6c 6c 6f 2c 20 77 6f 72 6c 64 20 66 72 6f 6d 20 63 6c 69 65 6e 74>
hello, world from client


```

## 参考
- http://nodejs.jp/nodejs.org_ja/api/tls.html
- https://nodejs.org/api/tls.html
- http://nodejs.jp/nodejs.org_ja/docs/v0.4/api/tls.html#s_tls.connect
- http://docs.ruby-lang.org/ja/1.9.3/class/OpenSSL=3a=3aSSL=3a=3aSSLSocket.html
Android5.0でのSoundPoolバグ対策

Android5.0でSoundPoolを使うと恐ろしいほど起動が遅くなることがあります。

Threadを使って回避する方法が手っ取り早かったが
バックグラウンドから復帰後にしばらくカクつく現象がおきたので他の方法を試してみた。

#改善策
Android5.0だと6件目以降のロードに時間がかかるようなので
SoundPoolを配列化して1つのSoundPoolにつき6件以下のロードとなるようにすることで
動作に支障が出ない程度にパフォーマンスを出すことができました。

#サンプルコード

```java:HogeActivity.java
private final int MAX_STREAM = 5;
protected List<SoundPool> mSoundPools;
/** SoundPoolでロードした時のID */
protected int[] mSoundIds;
/** ロード対象のリソースID */
protected int[] mResouceIds; // R.javaで定義された再生対象のID入れてください

@Override
protected void onResume() {
    super.onResume();
    
    mSoundPools = new ArrayList<SoundPool>();
    mSoundIds = new int[mResouceIds.length];
    SoundPool soundPool = null;
    for (int i = 0; i < mResouceIds.length; i++) {
        if (i % MAX_STREAM == 0) {
	    soundPool = new SoundPool(MAX_STREAM, AudioManager.STREAM_MUSIC, 0);
            mSoundPools.add(soundPool);
        }
        mSoundIds[i] = soundPool.load(getApplicationContext(), mResouceIds[i], 1);
    }
}

@Override
protected void onPause() {
    for (int i = 0; i < mSoundPools.size(); i++) {
        mSoundPools.get(i).realse();
    }
    mSoundPools = null;

    super.onPause();
}

public void soundPlay(int soundId) {
    SoundPool soundPool = mSoundPools.get(soundId / MAX_STREAM);
    soundPool.play(mResources[soundId], 1.0f, 1.0f, 0, 0, 1.0f);
}
```
CakePHP3でのcacheやlogにマスク

bakeした後にまたbakeしようとしたら怒られたので。  
備忘録  

## cacheのマスク  
config/app.php

```php
    /**
     * Configure the cache adapters.
     */
    'Cache' => [
        'default' => [
            'className' => 'File',
            'path' => CACHE,
        ],

        /**
         * Configure the cache used for general framework caching. Path information,
         * object listings, and translation cache files are stored with this
         * configuration.
         */
        '_cake_core_' => [
            'className' => 'File',
            'prefix' => 'myapp_cake_core_',
            'path' => CACHE . 'persistent/',
            'serialize' => true,
            'duration' => '+2 minutes',
            'mask' => 0666 //←こいつ
        ],

        /**
         * Configure the cache for model and datasource caches. This cache
         * configuration is used to store schema descriptions, and table listings
         * in connections.
         */
        '_cake_model_' => [
            'className' => 'File',
            'prefix' => 'myapp_cake_model_',
            'path' => CACHE . 'models/',
            'serialize' => true,
            'duration' => '+2 minutes',
            'mask' => 0666  //←こいつ
        ],
    ],
```

## ついでにlogも
config/app.php

```php
    /**
     * Configures logging options
     */
    'Log' => [
        'debug' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'file' => 'debug',
            'levels' => ['notice', 'info', 'debug'],
            'mask' => 0666  //←こいつ
        ],
        'error' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'file' => 'error',
            'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
            'mask' => 0666  //←こいつ
        ],
    ],
```
Unity API作成の便利ページ　メモ

■Jsonを整形してくれるページ

　http://www.ctrlshift.net/jsonprettyprinter/

■整形JsonからC#クラスを作成してくれるページ

　http://json2csharp.com/

■Excelの数式を使ってスネークケースをキャメルケースに変換

　●参考ページ
　http://chiroito.blogspot.jp/2011/03/excel.html

　A1セルにAAA_BBB_CCCという文字列が入力されている場合

　アッパーキャメルケース(パスカルケース)
　**式：=SUBSTITUTE(PROPER(A1),"_","")**

　ローワーキャメルケース
　**式：=LOWER(LEFT(A1,1))&MID(SUBSTITUTE(PROPER(A1),"_",""),2,LEN(A1))**
記事一覧を取得する時、現在のページを含ませないように条件で指定する

##記事の個別ページに関連する記事を紐付けたい場合を想定。
###関連する記事一覧を取得する時、現在のページを含ませないように条件で指定する。
$postIdには現在のページの記事IDが入るとする。

```
public function detail($postId = null) {
    $relatedPost = $this->Post->find('all', array(
            'fields' => 'Post.post_date, Post.title',
            'conditions' => array('Post.id !=' => $postId),
    ));

```
c++ builder > ソフト操作 > notepad を開いて、ステータスバーを表示 / 非表示 > Alt+V, S の送信

```txt:動作確認
Windows 7Pro 32bit
```

C++ Builderから別ソフトを操作するための方法。

試しにnotepadを表示して、[表示(V)]->[ステータスバー(S)]を実行してみる。

参考1: http://www.gesource.jp/weblog/?p=5143

```sample.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	STARTUPINFO si = {};
	si.cb = sizeof(si);
	PROCESS_INFORMATION pi = {};

	CreateProcess(NULL, L"notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

	WaitForInputIdle(pi.hProcess, INFINITE);
	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);

	HWND hwnd = GetDesktopWindow();
	hwnd = FindWindowEx(hwnd, NULL, L"Notepad", NULL);

	SetForegroundWindow(hwnd);

	for(int loop=0; loop<3; loop++) {
		Sleep(3000);
		keybd_event(VK_MENU, 0, 0, 0); // Altキー
		keybd_event('V', 0, 0, 0);
		keybd_event('S', 0, 0, 0);
		keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); // これがないとAltを押したままになる
	}

	keybd_event(VK_RETURN, 0, 0, 0);

}
```

KEYEVENTF_KEYUPは大切。これがないとAltが押しっぱなしになり、何度かやってしまって、不自由になり、Windowsをログアウトした。

#ひっかかり

`.`についてはそのまま送のではなくVK_DECIMALを送らないといけない。
http://homepage3.nifty.com/ic/help/rmfunc/vkey.htm

IPアドレスを送るときに失敗した。
[CakePHP3] Plugin::loadAll()でdebug_kitが動かないとき  

CakePHP3のPlugin::loadAll()でちょっぴりはまった備忘録
## Plugin::load

```php
 Plugin::load('DebugKit');
```

これじゃあ、debug_kitは動かない

```php
 Plugin::load('DebugKit', ['bootstrap' => true]);
```

これだと動く
第二引数で明示的にDebugKitのbootstrapを読み込むようにしないといけない模様

## Plugin::loadAll

```php
 Plugin::loadAll();
```
これじゃあ、debug_kitは動かない
全部読み込んでるんじゃないんかい。bootstrap読み込まないけんのか。

```php
 Plugin::loadAll(['bootstrap' => true]);
```

これでも動かない。おとなしくコアを読んでみる。

```php
    public static function loadAll(array $options = [])
    {
        static::_loadConfig();
        $plugins = [];
        foreach (App::path('Plugin') as $path) {
            if (!is_dir($path)) {
                continue;
            }
            $dir = new DirectoryIterator($path);
            foreach ($dir as $path) {
                if ($path->isDir() && !$path->isDot()) {
                    $plugins[] = $path->getBaseName();
                }
            }
        }
        if (Configure::check('plugins')) {
            $plugins = array_merge($plugins, array_keys(Configure::read('plugins')));
            $plugins = array_unique($plugins);
        }

        foreach ($plugins as $p) {
            $opts = isset($options[$p]) ? $options[$p] : null;
            if ($opts === null && isset($options[0])) {
                $opts = $options[0];
            }
            if (isset(static::$_plugins[$p])) {
                continue;
            }
            static::load($p, (array)$opts);
        }
    }
```

なるほど、じゃあこれで。

```php
Plugin::loadAll([
    'DebugKit'=>['bootstrap' => true]
]);
```

動いた。
ちゃんと明示的に宣言しなきゃ駄目みたい。
config.x を利用して、Rails.configurationにユーザ定義値をセットする

Rails Guide http://guides.rubyonrails.org/configuring.html#custom-configuration によると、Rails.configuration(=config/application.rb中で参照されているconfig)にユーザ定義のカスタム値を設定できるとあるのだが、

in config/application.rb:

```
config.hello = 'world'
```

というように、config直下に指定するのはできるものの、

```
config.hello.world = 'oyster'
```

というように階層化したりするのはエラーになる。

Hashを渡すなどすれば使えないことはないので、それほど困ることはないが、

<blockquote cite="http://www.richardhsu.me/posts/2015/04/02/rails-4-custom-configurations.html">
Realize that this is specifically the x namespace and you cannot rename it! I originally got tripped up by it because I thought you could use whatever you want as per the documentation was not super specific on the x portion. But as per the 4.2 release notes it clearly states that they "Introduced the x namespace for defining custom configuration options".
<br>
<a href="http://www.richardhsu.me/posts/2015/04/02/rails-4-custom-configurations.html">Rails 4 Custom Configurations : http://www.richardhsu.me/posts/2015/04/02/rails-4-custom-configurations.html</a>
</blockquote>

という記事を発見。これによるとRails4.2では、

```
config.x
```

というのが公式のカスタムネームスペースになっていて、その下に定義しろ、ということらしい。こちらだと、ピリオドで階層化した設定も問題なくできた。

```
config.x.hello.world = 'oyster'
Rails.configuration.x.hello.world # -> 'oyster'
```