OmniAICreator/Qiita-1.07M huggingface dataset:
Appcelerator Studio の install について

1) Appcelerator Studioは 32bit なので、PCが 64bit の Windows 7 の場合、JDK、nodejs を install しないまま install する方が安全だ。

2) install した後で、「完了」を押しても、PCが止まる場合もある。再起動して、Appcelerator Studio の dialog box が出て、「repair」を選択する。

3) 最初に Appcelerator Studio を起動する時、不審な error code が出る可能性があり、再び email (username) と password を入力して、再 login する。（勿論先に Appcelerator に user を新規登録が必要だ）

4) 長い dialog box が出る場合、mail で受け取った authorization code を入力する。

5) 成功に Appcelerator Studio を起動する時、Help > Check for Appcelerator SDK Updates を選択して、Titanium SDK 等の install を自動的に開始する。その後、Android SDK の install も自動的に開始する。（相当時間が掛かる。）

以上。
（気になる点があれば、常に更新する。）
Dockerコンテナでcron使おうとしてCannot make/remove an entry for the specified sessionと表示された際

Dockerでcronを動作せたい場合がある。

ただ、Dockerイメージのruby:2.2.2を使うとcronが動作しない。
具体的なエラーメッセージは下記

```
Cannot make/remove an entry for the specified session
```

そもそもruby:2.2.2を使うのはrailsを使いたいからなので、Dockerイメージとしてはubuntuを指定しapt-getでrubyなど必要なものを入れることにする。

```
FROM ubuntu:14.04

RUN apt-get update -qq && apt-get install -y git build-essential libpq-dev cron vim

# ruby
RUN apt-get install -y software-properties-common
RUN apt-add-repository ppa:brightbox/ruby-ng
RUN apt-get update
RUN apt-get install -y ruby2.2
RUN apt-get install -y ruby2.2-dev ruby-bundler

# このあとRailsのWebアプリをADDしたりbundle installしたり
```

- ubuntu:14.04ではapt-getしてもrubyが1.9系なのでリポジトリを登録してruby2.2.2を入れる
- ここには書いてないがsupervisorを入れてrailsとcronを動作するようにする
[C言語] 関数が定義されているか確認する


もしかしたらもっといい方法があるかもしれませんが、とりあえず以下の方法で確認できたのでメモ。

`dlfcn.h`と`dlsym`を使って判別します。

## ファイルの準備

まずは共有ライブラリを作ります。
[共有ライブラリの作り方などはこちらを参照](http://qiita.com/edo_m18/items/b9765ff3313d5a13f82f)

```c:shared-lib.c
#include <stdio.h>

void targetFunc() {
	printf("target function.\n");
}
```

単純に`printf`するだけのライブラリです。
これを共有ライブラリとしてコンパイルします。

```console
$ gcc -dynamiclib -o shared-lib.dylib shared-lib.c
$ ls
shared-lib.c      shared-lib.dylib*
```

## main関数

そしてそれを使う部分です。
`main`関数内で動的に関数の参照を取得して、それが定義されているかを確認しています。

```c:main.c
#include <stdio.h>
#include <dlfcn.h>

typedef void (*checkFunc)(void);

int main() {
	checkFunc func = NULL;
	
	func = dlsym(RTLD_DEFAULT, "targetFunc");
	
	if (func == NULL) {
		printf("Not found a function.\n");
	}
	else {
		function();
	}
	
	return 0;
}
```

```console
$ gcc main.c shared-lib.dylib
$ ls
a.out*            main.c            shared-lib.c      shared-lib.dylib*
$ ./a.out
lib func.
```

実行すると定義が確認された場合はそれを実行します。
もし定義が見つからない場合は`printf`をして終了します。
Rails の例外処理を jQuery の done, fail, always のように書いてみた

# 概要

lock_version を使った楽観的ロックの機能を備えたモデルがあります。
そのレコードの更新時に競合が発生した際に発生する例外 [ActiveRecord::StaleObjectError](http://api.rubyonrails.org/classes/ActiveRecord/StaleObjectError.html) を
[rescue_from](http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html) や exceptions_app ではなく、各コントローラ単位で捕捉したいです。
そこで例外処理を jQuery の done, fail, always のように書ける Module を作ってみました。

# 具体例

```ruby:app/controllers/concerns/lockable.rb
module Lockable
  class Result
    def initialize(result)
      @result = result
    end

    def done(&block)
      block.call if @result
      self
    end

    def fail(&block)
      block.call unless @result
      self
    end

    def always(&block)
      block.call
      self
    end
  end

  def with_locking(&block)
    block.call
    Result.new(true)
  rescue ActiveRecord::StaleObjectError
    Result.new(false)
  end
end
```

```ruby:app/controllers/magical_girls_controller.rb
class MagicalGirlsController < ApplicationController
  include Lockable

  def update
    @magical_girl = MagicalGirl.find(params[:id])

    with_locking do
      @magical_girl.update!(update_params)
    end
      .done { redirect_to_index_with_success }
      .fail { redirect_to_index_with_error }
      .always { puts('僕と契約して、魔法少女になってよ！') }
  end

  private

  def update_params
    params.require(:magical_girl).permit(:name, :age, :color, :weapon)
  end

  def redirect_to_index_with_success
    redirect_to(magical_girls_path, notice: 'ウェヒヒヒ')
  end

  def redirect_to_index_with_error
    redirect_to(magical_girls_path, alert: 'あたしって、ほんとバカ')
  end
end
```

jQuery の書き方みたいでしょ :dancers: 

```js
$.ajax({
    url: 'magical_girls.html'
}).done(function (data) {
    alert('ウェヒヒヒ');
}).fail(function (data) {
    alert('あたしって、ほんとバカ');
}).always(function (data) {
    alert('僕と契約して、魔法少女になってよ！');
});
```

ただし、いかんせんこの記法、Rubocop 先生に "Avoid multi-line chains of blocks." と怒られます… :scream:
標準ライブラリ csv で読むCSV に「\"」 が紛れ込んでるとエラーになる


参考：標準ライブラリ csv に Missing or stray quote in line *** とか言われたら
http://qiita.com/yuya_takeyama/items/8f01c6c17103c5b2cb7e

１行ごとに文字を置換して対処。

```
open(path, open_mode, { :undef => :replace, :invalid => :replace } ) do |f|
  f.each_line.with_index do |line, j|
    line.gsub!('\"','""')
    CSV.parse(line) do |row|
      ...
```
Chromeのブックマークマネージャが使いづらいから元に戻す

# いきなりタイル式UIに。どうする？
実はブックマークマネージャの表示形式は、
右上のボタンからタイル式からリスト型にも変更できるので、
それで良ければいいのですが、やっぱり使いにくい。

ブックマークマネージャでやりたい、フォルダやブックマーク項目の並び替えがやりにくい状態。
前の方がずっと使いやすいですよね。

一番の問題はフォルダに入れてないブックマークを抽出する選択肢が無いことなんですが……。

# 元に戻す方法
1. Chromeで、「chrome://flags/#enhanced-bookmarks-experiment」にアクセス。
2. 「拡張ブックマークを有効にする」の項目を「無効」にする。
3. 下側に出てくる「今すぐ再起動」を押すと元に戻ります。

以上で幸せになりました。
[Node.js]Express4 + log4jsでロギング

# Express4 + log4jsでロギング

兎にも角にも「ログ」は大事。

Express4 + log4jsでロギングをつくっていく。
まずはlog4jsモジュールのインストール。

```bash
npm install log4js --save
```

用意するログの種類は以下の通りとする。

| category | 用途 |
|-----------|------|
| access | アクセスログ |
| error | エラーログ |
| system | 上記二つに当てはまらないもの |

各ログの設定を作るのだが、例によって環境によって動作を変えたいと思う。
例えば、本番環境ではデバッグ用のログは吐き出す必要はない。

環境ごとに設定をつくる方法は[Express4で環境ごとの設定をつくる](http://qiita.com/tnnsst35/items/6dbf7866d7c92384f925)に書いたので参考に。

```bash
vi config/development.json
{
  "log4js": {
    "appenders": [{
      "category": "access",
      "type": "dateFile",
      "filename": "/tmp/access.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {
      "category": "system",
      "type": "dateFile",
      "filename": "/tmp/system.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {
      "category": "error",
      "type": "dateFile",
      "filename": "/tmp/error.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {"type": "console"}],
    "levels": {
      "access": "ALL",
      "system": "ALL",
      "error": "ALL"
    }
  }
}
```

appendars要素にログの種類分の設定をしている。

| 要素 | 内容 |
|-----------|---------------------------|
| category | 種類を特定できる文字列 |
| type | console（コンソール） file（ファイル） dateFile（rotate付ファイル） |
| filename | 出力先ファイル名 |
| pattern | dateFileの場合のファイル末尾のパターン |
| backups | 過去分としてのこしておくログファイル数 |

appendars要素に {"type": "console"} も設定しておくと、ファイル書き出しと同時にコンソールにも表示してくれて便利。

levels要素は対象のログ種類で、どのレベル以上のログを書き出し可能かを制御できる。

| レベル | 内容 |
|--------|-------|
| ALL | 全てのログが書き出される |
| DEBUG | DEBUG以上のログが書き出される |
| INFO | INFO以上のログが書き出される |
| WARN | WARN以上のログが書き出される |
| ERROR | ERROR以上のログが書き出される |

設定を読み込んでロガーを初期化するコードを毎回書くのが面倒なので、モジュール化しておく。

```js
mkdir modules
vi modules/logger.js
var log4js = require('log4js');
var config = require('config');

log4js.configure(config.log4js);

module.exports = { 
  access: log4js.getLogger('access'),
  system: log4js.getLogger('system'),
  error: log4js.getLogger('error'),
  express: log4js.connectLogger(log4js.getLogger('access'), {level: log4js.levels.INFO})
};
```

最後にExpressのデフォルトロガーをlog4jsに変更する。

```js
vi app.js
...
...
// デフォルトはmorganというモジュールを使っているので、コメントアウトして作成したモジュールを使う。
//var logger = require('morgan');
var logger = require('./modules/logger');
...
...
// app.use(logger('dev'))している行をコメントアウトして、logger.expressをapp.useする
//app.use(logger('dev'));
app.use(logger.express);
```

ここまで出来ればあとは使うだけ。

```js
var logger  = require('./modules/logger');
logger.system.info({
  name: "tnnsst35",
  message: "byebye"
});
```
以上。
Notice: Undefined variable:

**Notice: Undefined variable:エラー**

案外遭遇するのでメモ。

どういうときに出てくるエラーなのかというと↓

```php:IndexController.php
$value = 5;

if($value == 12){
  $ans = "valueは、12です。";
}

$this -> view -> answer = $ans;
```

このとき $value は if の中を通らないので、

```php
$this -> view -> answer = $ans;
```
のところでエラーが出る。
「$ansって何やねん」ってことで、「Notice: Undefined variable:」なのね。

こう直してあげれば怒られないはず↓

```php:IndexController.php
$value = 5;
$ans = null;  //初期化してあげるとか。

if($value == 12){
  $ans = "valueは、12です。";
}else{
 $ans = "valueは12ではないです。";  //絶対値が入るようにしてあげるとか。
}

$this -> view -> answer = $ans;
```
tmuxで最後のwindowの最後のpaneであるときだけ確認メッセージを出して、それ以外はそのままkillする

## 導入

最近tmuxを使い始めました。xmonadも使っているので、その存在価値はあるのかとかも言われそうですが、僕は分割が使いたいんじゃなくて、カッコいいタブ(windowのこと)と、間違って消してしまっても死なない存在がほしいだけなんです。

![screen_003.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/5a682983-4519-adf4-fe11-a13281611bce.jpeg)


というわけで、表題の通り、これ書いとくと便利かもよという設定です。お役に立てれば幸いです。

## やりたいこと

一つのセッションの中の最後のwindowの中の最後のpaneであるときのみ、paneを消すときに確認メッセージを出すようにして、それ以外のときは確認せずにpaneを消すようなキーバインドがほしい。

## 方法

答えから言ってしまうと、


```conf
# if session has > 1 windows in current, kill-pane without confirmation.
# But confirm before killing pane when it is the last  pane in the last window.
bind -n M-x if "tmux display -p \"#{session_windows}\" | grep ^1\$ && tmux display -p \"#{window_panes}\" | grep ^1\$" \
    "confirm-before -p \"Kill the only pane in the only window? It will kill this session too. (y/n)\" kill-pane" \
    "kill-pane"
```

と書いてしまえばいいです。これで、メタキー(MacだとCommandキー、Windows、LinuxだとAltキー)を押しながら`x`キーを押すことで、それがそのセッションの最後のwindowの最後のpaneで無い限り、確認なしで`kill-pane`します。

## 解説

tmux.confの中ではif文を使用することができます。

```conf
if "特殊文字をエスケープさせたシェルコマンド" \
    ”tmux内のコマンド(返り値0で実行される)” \
    "tmux内のコマンド(それ以外のとき実行される)"
```

という形式で書くことができます。更にネストできるかどうかはやってないのでわかりませんが、多分できそうな気もします。

ちなみに、設定ファイルの中ではバックスラッシュでエスケープできるので、上のような書き方をしても大丈夫です。

やっていることは、`tmux display "#{session_window}"`で現在のセッションの持つwindowの数を出して、それが1であるときだけ次の条件を見ます。次は`tmux display -p "#{window_pane}"`で、そのwindow内のpaneの数を見て、それが1であるときとそうでない時に条件を分けます。これが真であるときには、確認メッセージを出し(`confirm-before -p "..." kill-pane`)、そうでない時は何も言わずに`kill-pane`することになります。

また、これと全く同じようにして、最後のwindowであるときにだけ確認して`kill-window`するように設定を書くことができて、

```conf
# if session has > 1 windows in current, kill-window without confirmation.
# But confirm before killing window when it is the last window in the session. 
bind -n M-X if "tmux display -p \"#{session_windows}\" | grep ^1\$"\
    "confirm-before -p \"Kill the only window in this session? It will kill the session too. (y/n)\" kill-window" \
    "kill-window"
```

のようにすればMetaキー+`X`にそのようにキーを割り当てることができます。

## まとめ

簡単な設定だけど、自分なりにはかなり便利になったと思います。他にもxmonadライクなキーバインドを設定しているので、よかったら自分の`tmux.conf`も見てやってください。

- [dotfiles/tmux.conf at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/tmux.conf)
iOS に不正な SMS メッセージでクラッシュする脆弱性

## 脆弱性の内容

iOS 機器（iPhone, iPad）の SMS や WtatsApp アプリに対して特定の Unicode テキストを送ることで DoS（Denial of Service; サービス拒否）を引き起こすことができる。最悪の場合，機器がリブートする。

## 影響度

[CVE-2015-1157] より

CVSS 基本値 7.8 (AV:N/AC:L/Au:N/C:N/I:N/A:C)

| 基本評価基準                            | 評価値            |
|----------------------------------------:|:------------------|
| 攻撃元区分（AV）                        | ネットワーク（N） |
| 攻撃条件の複雑さ（AC）                  | 低（L）           |
| 攻撃前の認証要否（Au）                  | 不要（N）         |
| 情報漏えいの可能性（機密性への影響, C） | なし（N）         |
| 情報改ざんの可能性（完全性への影響, I） | なし（N）         |
| 業務停止の可能性（可用性への影響, A）   | 全面的（C）       |

CVSS については[デモページ](http://www.baldanders.info/spiegel/archive/cvss/cvss2.html)を参照のこと。

[CVE-2015-1157]: https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-1157

## 影響を受ける実装

iOS 8.0 から 8.3。既に exploit が出回ってる模様。

- [▶ Effective Power Unicode iOS hack on iPhone 6 - YouTube](https://www.youtube.com/watch?v=q_l0F8matrk)
- [▶ Effective Power Unicode iOS hack vs Twitter - YouTube](https://www.youtube.com/watch?v=49V-Nab1OGI)

Apple Watch や Mac にも影響があるという報告もあるが詳細は不明。

## ブックマーク

- [iPhone text message bug can crash Apple Watch, iPad and Mac too | Technology | The Guardian](http://www.theguardian.com/technology/2015/may/28/iphone-text-message-bug-crash-apple-watch-ipad-mac)
- [エフセキュアブログ : SMSエクスプロイト](http://blog.f-secure.jp/archives/50749181.html)
ZoomdataをVagrantで動かしてみる

##前提条件
- Vagrantがインストール済み
- VirtualBoxがインストール済み
- Cygwin＋CygTermからVagrantの操作をする
- ZoomdataのRPMファイルをZoomdataからダウンロード済み
- インストールの手順は下記のページを参考に進める
    - RPM Installation Steps – Zoomdata Support http://support.zoomdata.com/hc/en-us/articles/204391217-RPM-Installation-Steps


##VagrantでCentOSをインストール

新しいboxファイルを取得
CentOS6.5系

```bash
$ vagrant init chef/centos-6.5; vagrant up --provider virtualbox
```
Vagrantファイルを変更して、メモリを4GBへ増やす。


##MongoDB[mongodb-org-3.0]をインストール
CentOS上で以下のインストール作業を実施。
Install MongoDB on Red Hat Enterprise or CentOS Linux — MongoDB Manual 3.0.3
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/#install-mongodb


##MongoDB起動
```bash
$ sudo service mongod start
Starting mongod:                                           [  OK  ]
$ sudo chkconfig mongod on
```

##Mongoユーザーの追加
```bash
$ mongo zoom --eval "db.createUser({user:'anadmin', pwd:'p0ssward2dataz00m',roles:['readWrite']});"
```

##ZoomDataインストール
```bash
$ sudo yum install zoomdata-1.5.0-sr1.x86_64.rpm
```


##ファイアーウォールの設定
```bash
$ sudo iptables -I INPUT 1 -i eth1 -p tcp --dport 8443 -j ACCEPT
$ sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to-destination :8443
$ sudo service iptables save
```
外からアクセスする際のCentOSで割り当てられたI/Fが、eth1 なので、上記の通り eth1 を指定。

##Zoomdataにログインしてみる
adminユーザーでログインし、ダッシュボードを開くと、画面がぐりぐりリアルタイムで更新される。
ほー、Tableauと違うね。

![Zoomdata_SampleDashboard.png](https://qiita-image-store.s3.amazonaws.com/2619/78481/cc8590fd-25e6-5c2c-62ab-9253bad5da31.png)

![Zoomdata_Bubbles.png](https://qiita-image-store.s3.amazonaws.com/2619/78481/769f5a2e-5c50-2346-b133-ff5a0a90ab70.png)

![Zoomdata.png](https://qiita-image-store.s3.amazonaws.com/2619/78481/2e7f1e4f-8543-0ca0-9e04-972b7a8c51bd.png)
【Python】wavファイルを解析してみる（追加プラグイン不要Ver）

Pythonに付いているデフォルトGUIキットである，
tkInterのcanvasを使って，無理矢理wavの波形を描画してみます．

追加で必要なプラグインなどは一切ありません．
Pythonと，再生したい音源を用意するだけです．
※音源は「test.wav」を解析するように，以下のプログラムは組んであります．

```lang:python
#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
import Tkinter
import wave
import numpy as np

window_width = 600
window_height = 500

root = Tkinter.Tk()
root.title(u"Software Title")
root.geometry(str(window_width) + "x" + str(window_height))

# wavデータの読み込み
wav = wave.open("./test.wav")

# オーディオ部分の先頭に移動
wav.rewind()

# バイナリ読み込み
wavdata = wav.readframes(wav.getnframes())

# intに変換
wavdata = np.frombuffer(wavdata,'int16')


#
# キャンバスエリア
#
canvas = Tkinter.Canvas(root, width = window_width, height = window_height)

# X軸のステップ数
step = float(window_width)/float(wav.getnframes())
x = 0			# X軸
b_i = 0			# 一つ前の値

for c,i in enumerate(wavdata):
	# 一つ前の座標をおいておく
	if (c%2 == 0):
		b_i = i
		x = x + step
		continue
	
	# 一つ前の座標と，今回の座標を使って，波形グラフを作成
	canvas.create_line(int(x), (b_i/window_height)+(window_height/2), int(x+step), (i/window_height)+(window_height/2), fill = "blue")
	
	# X座標をstep分進める
	x = x + step
	print "(x,y) = ("+ str(x) +","+ str(i) +")"

#中央線
canvas.create_line(0, window_height/2, window_width, window_height/2, fill = "black")


#
# キャンバスバインド
#
canvas.place(x=0,y=0)


#
# wavをクローズ
#
wav.close()

root.mainloop()
```

![スクリーンショット 2015-06-02 14.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/63338/a44a14c2-f4c2-648e-2f58-2d8c03737488.png)

雑では有りますが，こんな感じで出力されます．
Node.js + express4 + gulp 簡単にブラウザリロードを実装

Node.js始めて7日目。

[gulpを使って、サーバーの自動再起動](http://qiita.com/PianoScoreJP/items/1764854f91ac447bd7e1)まではできるようになりましたので、次はブラウザの読み込みも自動化してみたいと思います。

やり方はいろいろあるようですが、今回は[gulp-livereload](https://github.com/vohof/gulp-livereload)というモジュールを使ってみたいと思います。

#目的
私は現在express-generatorを使って作成したテンプレートをもとに学習しています。
この中の、viewsフォルダのjadeファイルと、publicフォルダ以下にあるjs,css,imgファイルが更新されたら、ブラウザが自動的に更新されるようにしたいと思います。

#インストール
これはいつもの通りのおまじないで
`npm install gulp-livereload`
これで問題ないと思います。

#gulpの設定
※ここではサーバーの起動は省いて説明します。

````gulpfile.js
var livereload = require('gulp-livereload');

gulp.task('reload',function(){
     gulp.src(['public/*/*','views/*.jade'])
     .pipe(livereload());  
})
gulp.task('watch',['reload'],function(){
        livereload.listen();
        gulp.watch(['public/*/*','views/*.jade'],['server']);
})
````

これだけです。
これでコンソールから、`gulp watch`として、起動します。
`liverreload.listen`により、livereloadサーバが35729ポートで立ち上がるはずです。
ブラウザで、localhost:35729にアクセスし、下記のように表示されればOKです

`{"tinylr":"Welcome","version":"0.1.5"}`

また、localhost:35729/livereload.jsをフロント側で読み込む必要がありますので、
view/layout.jadeに

````layout.jade
・・・
script(src='localhost:35729/livereload.js')
・・・
````

を書き加えておきます。
これで、監視対象にしたファイルの編集を行うと、ブラウザのリロードが自動で行われるはずです。

なお、expressを使ったサーバの再起動も含めると、以下のようになります。

````gulpfile.js
var gulp = require('gulp'),
spawn = require('child_process').spawn,
livereload = require('gulp-livereload'),
server;

gulp.task('server',function(){
    if(server){
         //サーバーが起動していたら終了
         server.kill('SIGKILL');
         server=undefined;
    }
     //サーバーを起動。npm startと同じ。私の環境がwindowsなのでこうしてる。
     server = spawn('node',['./bin/www']);
　　　//console.logとかをコンソールに表示
     server.stdout.setEncoding('utf8');
     server.stdout.on('data',function(data){
         console.log(data);
     });
     //エラーをコンソールに表示
     server.stderr.setEncoding('utf8');
     server.stderr.on('data',function(data){
         console.log(data);
     });
})
//livereloadサーバへ変更通知を行い、ブラウザのリロードを行う。
gulp.task('reload',function(){
     gulp.src(['public/*/*','views/*'])
             .pipe(livereload());  
})

gulp.task('watch',['server'],function(){
        livereload.listen();
        //サーバ再起動の対象にするファイル
        gulp.watch(['js/*.js','app.js','routes/*'],['server']);
        //ブラウザリロードの対象にするファイル
        gulp.watch(['public/*/*','views/*'],['reload']);
})


````

これで現在あるどのブラウザでも、少なくとも最新版であれば、リロードされると思います。IEもバージョン11で試しましたが、自動的にリロードされました。
BackgroundFetchの注意事項

iOS7から追加されたバックグラウンドフェッチに関して。

## バックグラウンドフェッチの間隔

基本的にバックグラウンドフェッチは開発者側で制御することができません。バックグラウンドフェッチの間隔を指定する定数が`UIApplicationBackgroundFetchIntervalMinimum`と`UIApplicationBackgroundFetchIntervalNever`のどちらかしか存在しません。

`UIApplicationBackgroundFetchIntervalMinimum`がシステムがサポートしている最小の間隔で、`UIApplicationBackgroundFetchIntervalNever`がフェッチ処理を行わないように設定するものらしいです。そんなわけで細かな間隔を制御することができません。

BackgroundFetchを実行させるにはXcodeで設定を行い、上記の`UIApplicationBackgroundFetchIntervalMinimum`をアプリに対して設定する必要がおあります。

```swift

UIApplication.sharedApplication.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
```

あとはAppDelegateに対して以下のデリゲートメソッドを実装すればOS側が良い感じでバックグラウンドフェッチを走らせてくれるみたいです。

```swift
optional func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
```


```objc
- (void)application:(UIApplication *)application
performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
```


## 注意点

`completionHandler()`をしっかりと呼び出すようにしましょう。以下は[`
- application:performFetchWithCompletionHandler:`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:performFetchWithCompletionHandler:)についてのドキュメントからの引用です。

> Implement this method if your app supports the fetch background mode. 

アプリがバックグラウンドフェッチをサポートする場合はこのメソッドを実装すること。

> When an opportunity arises to download data, the system calls this method to give your app a chance to download any data it needs. Your implementation of this method should download the data, prepare that data for use, and call the block in the completionHandler parameter.

データのダウンロードする機会が発生したとき、システムはこのメソッドを呼び出してアプリが必要なデータのダウンロードが出来るようにします。このメソッドの実装はデータのダウンロードにすべきで、使用するデータの準備をし、completionHandlerパラメータでブロックを呼び出します。

> When this method is called, your app has up to 30 seconds of wall-clock time to perform the download operation and call the specified completion handler block. 

このメソッドが呼ばれたとき、アプリは30秒間ダウンロードオペレーションを実行することができ、指定された完了時処理を呼び出します。

> In practice, your app should call the completion handler block as soon as possible after downloading the needed data. If you do not call the completion handler in time, your app is terminated. 

アプリはcompletion handlerブロックを必要なデータがダウンロードできたら可能な限り早く呼び出すようにすべきです。もしcompletion handlerを時間内に呼び出さなかった場合はアプリが終了されます。


> More importantly, the system uses the elapsed time to calculate power usage and data costs for your app’s background downloads. 

さらに重要なこととして、システムはアプリがバックグラウンドでのダウンロードにかかる電力使用とデータコストを計算するために経過時間を使用します。

> If your app takes a long time to call the completion handler, it may be given fewer future opportunities to fetch data in the future.

もしアプリがcompletion handlerを呼び出すまでに長い時間がかかった場合、将来的にデータのフェッチにより少ない機会しか与えられないかもしれません。

## まとめ
個人的には、これがすごく重要だなと思っています。

> More importantly, the system uses the elapsed time to calculate power usage and data costs for your app’s background downloads. 

サービスやデザインにもよりますが、なるべく少ない時間でダウンロード処理が終わるようにした方が良さそうですね。
そもそも呼び出し忘れとかは完全にNGです。。。
ある日突然ネット接続が死んだ怖い話

## はじまり

ある日「こちらのオフィスがインターネットにつながらなくなった」という連絡を受ける
すぐそこなので実際に行ってみて状況確認
大雑把な構成図はこのとおり

![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/31310/ee5803ad-600a-a9c0-0691-e74c3dae0fea.png)

すべてのPCがWindows 7 SP1(64bit)、ルータはNECのAtermシリーズ、ONUはNTTからのレンタルでBフレッツ網で外に出ていくという、まあどこにでもあるような形
ルータに近いAはルータのLANポートに直接有線で接続、B/Cのある場所は少し離れてるのでルータからはLANケーブルを伸ばしてスイッチングハブを1つ置き、そこにBとCを有線でつないでいる

## 状況

Aのタスクトレイに「インターネット接続なし」なる警告、確認したところBとCも同様
ちなみにすべての組み合わせでpingがまったく通らない

## 問い合わせ
NTTに問い合わせたところ、フレッツ網からONUまではちゃんと通ってるらしいので問題はONUから内側にある

## 直つなぎ
AとONUを直結し、プロバイダの認証情報を入れて直接つないでみるとブラウジングにも支障なくつながった
ということで、まずAとONUのLANポートは問題なしと判断

## ルータを疑う
ルータのどっかが死んでるのかな？と思い予備のルータに交換してみるも最初と現象は同じ
ちなみに旧ルータも新ルータもたまにつながるときもあるがWebサイトを2つぐらい巡回してると切れる

## 識別されていないネットワーク
ネットワークと共有センターで「ネットワークの場所」がいつもなら「社内」になってるところが「識別されていないネットワーク」なる表示が出てる

色々ぐぐってみたがNICをデバイスマネージャで削除して再起動して認識させなおすとかドライバを入れなおすというのがメーカーサポートやあちこちのブログで書かれている

とりあえずAでやってみたらうまくつながったみたいだ

## わけがわからないよ
Aは復旧という判断をして、BとCのあるスペースに行き、同じことをしようとしたが「識別されないネットワーク」のまま
しかも、A/B/Cのどれかがこの現象を発生させると全マシンがこうなって復旧したマシンも元に戻るという

**わけがわからない**

「識別されない～」が出るときはたいていDHCPでアドレスがうまくひろえてなかったりする場合もある
**拾えてても出るけどな**

DHCPのアドレスがとれてないからとルータのDHCPの範囲外に各マシンともIPアドレスを固定してもLAN内のpingすらとおらない
「識別されないネットワーク」とやらの制限なのか？

## 解決になってない解決

「識別されないネットワーク」のもぐら叩きになりそうだったのでさて・・・と思ったがここにあるすべてのPCとルータは無線に対応している
ひとまずルータの無線のAP情報を各PCに設定し、有線のNICを無効化、無線オンリーでつなぐように設定すると

**なぜか問題なくネットワークの場所を設定できるようになり通信も復旧**

# まとめ
**Windows 7のネットワークマジで意味不明**
Windows 10で改善されてることを祈ります
WordPressのログイン画面じゃなくて、言語選択画面が開いてしまいます。。

WordPressの環境設定についてのヘルプなのですが、

AWSサーバーからするときに、SourceTreeでブランチを切り、
WordPressの記事やオリジナルテンプレートが入ったファイルを
ローカルでも実行できるようにと、上司の方に”なんとか.sql”を頂き、
データベースにインポートしたのですが、、、、

タイトルの通り、ログイン画面が開くはずなのに、言語の設定画面が
開いてしまい、再インストールしなくちゃいけなくなってしまいます。

私は、ws-config.phpで

define('WP_SITEURL', 'http://localhost:8888/当該ファイル/');
define('WP_HOME', 'http://localhost:8888/当該ファイル/');

とMySQLで上記のURLに変更したのですが、問題が改善されません。
お力を頂けないでしょうか？
デキる人に見えるズルい仕事テクニック

エンジニアコミュニティで書く内容かなと思いつつ　何番煎じかなと思いつつも
仕事上でズルい小ワザを駆使するだけでデキル人に見せかけることができるテクニックをまとめてみた。
**ただし付け焼刃だよ！**

# どうでもいいことほど、早くやる
どうでもいいことは、みんなどうでもいいと思っているので、後回しにされがち。
どうでもいいことほど早くやると、他の人との差別化が出来るので、
「おっお前気が利くなぁ！」とか「おっお前仕事早えなぁ」みたいな反応をもらえる。
超メリットある。
どうでもいいことは大体、スキルがいらない仕事だったりする。誰でもできる。
内勤系の仕事は相対評価なので、所属集団よりちょっとデキると思われるとヒーローになれる。
正確に言うとヒーローにはなれないがヒーロー気分を味わいながら仕事できる。ストレスなく仕事が出来るって最高だと思うの。
所属集団の見極めは肝心。


# 人の頼みは、即対応
今すぐじゃなくていいよ、と言われても、**相手が期待するよりほんのちょっと早く**対応するだけで、
めっちゃ仕事出来るように見られる。
レスポンスが早くてマメな男が女にモテるように、レスポンス早くてマメな下っ端はモテる。
やりすぎると便利屋扱いになるので、下の方で書いた[人に頼る](http://qiita.com/t_saeko/items/201a3006579f21c47ef4#%E4%BA%BA%E3%81%AB%E9%A0%BC%E3%82%8B)を参考に、
貸しはちゃんと返してもらうこと。


# 思ってるよりもちょっと後の時間を言う
使い古されたテクニックだが、手垢がついてる分効果がある。

* 30分後に出してと言われたら20分で終わらせて10分チェックする。
* 1時間で出来る仕事だなと思ったら1時間半って言っとく。

あなたが集中してその仕事にだけ取り組めるとは限らない。
つまり、1日かかる仕事（つまり1人日）がスケジュール的に1日とは限らないように、
実稼働時間と適切なバッファを仕事で考えながら動くとスムーズ。
バッファ持ち過ぎはダメだよ。


# ビジネス的な言い回しをちゃんと使う
人への頼み方を覚える。一人で出来ない仕事だから、会社に来てる。
→コルタの メール研究室 [【やわら化言葉】](http://colta.jp/lab/mail_temp1_12.html)、[【結びの言葉】](http://colta.jp/lab/mail_temp1_06.html)、[【結びの言葉 その2】](http://colta.jp/lab/mail_temp1_17.html)は
超使えるフレーズが多くて今も愛用してます。

こういう、定番フレーズをさらっと使えるようになると、人に頼むときにもスムーズにいきやすい。

例えば、「よろしくお願いします」って多用しがちだけど、よろしくよろしくって言い過ぎると何様！って感じになる。
あとサセテイタダキマンも鬱陶しい。

<blockquote>お手数ですが
お手すきの時で結構ですので、
大変心苦しく存じますが、
何度も申し訳ございませんが
勝手を申し上げて恐縮ですが</blockquote>とかよく使ってます。

# 人に頼る
先輩なんだからやってくれよそれぐらい！！とか思うと思うが、
やってくれる人ばかりでないのもまた世の中なので、かわいくうまく頼むと良いと思う。

このあたりは人対人だからケースバイケースだけど、これなんかいい例だと思う。
→[新社会人の為のビジネスマナー通信](http://manner.niyon.com/archives/2005/10/post_96.html)

頼まれる方の気持ちに立って、「なんで頼んできたの？」って言うのが向こうに納得してもらえると、
すんなり頼まれてくれると思う。
こればっかりは相手によるので、トライ＆エラー。
策を弄せないタイプは正直に自分のままぶつかった方がいい結果が出やすい。素直な人は愛される。

# さいごに　本を読もう
こんなかんじで小手先テクニックを駆使するだけで、仕事がデキる人に見える…というか、
スムーズに仕事が回せるようになることがある。
ほんのちょっとの気遣い大事。

でも小手先は小手先だし、付け焼刃は長持ちしないので、
きちんと基礎体力になるテクニックを身に着けておくと、じわじわと持久走のように効いてくると思う。

人が一人として同じパターンにならないように、世の中に出てる色々なテクニックやコツも、
全員が必ず使えるものって、やっぱりない。
でもそれをいかにして自分の中に吸収していくか、その吸収の過程で自分だけのオリジナルの武器になっていくと思う。

そういう意味では、時の洗礼を受けて、知識を体系的にまとめてある、
いわゆる古典本は読んでおくと、とても良い。かならず何かのタイミングでふっと思い出す時が来る。

古典本を読もう！
こわがらずにね！（どっちかっていうと、逃げずにね……自戒を込めて！）

## 参考：今のところ私が活用出来ていると感じた本
グロービスに通っていたので、

* MBAクリティカル・シンキング
* MBAアカウンティング
* MBAマーケティング

それから、マーケの視点はディレクターに絶対必要だなっと思ったので

* コトラーのマーケティング・マネジメント

マネジメント・ディレクター方面では

* Webディレクション標準スキル152 企画・提案からプロジェクト管理、運用まで　←超良かった。
* 実務で役立つWBS入門
* Webデザイン受発注のセオリー デザインコントロールが身につく本

PMBOK系は色々読んだけどまだ活用できてるレベルにない。
あと人月の神話は概要だけ教えて貰った（そして実感している）が未読なのでこれから。
改めてObjective-C の言語を理解する(プロパティ編 その3)


# 前回の続きです
前回の実験コードで警告文が表示されていたため、その点について確認したいと思います。
"Writable atomic property 'name2' cannot pair a syncthesized getter with a user defined setter."
![スクリーンショット 2014-12-09 15.11.23.png](https://qiita-image-store.s3.amazonaws.com/0/25611/7a67b77a-74f3-59d7-c7c8-a1e3e2f68dda.png)

# 目的
初めてのプログラミング言語に苦戦されている方やこれから開発を行おうとしている方は、問題の解決方法を身につける必要があります。
インターネットで、その解決手段の説明ではなく答えが先に見つかることが多いので便利になりました。
しかし、必ずしも答えが用意されている訳ではないため、以下のような解決までのプロセスも含めて書いてみました。
いつものことではありますが、十分に推敲して書いている訳ではないため内容の信憑性などは他の記事よりは低めと思って頂ければと思います。
それでも宜しければ、以下の内容をどうぞ。

# エラー内容を読み取る
この世界のエラーメッセージは多くの場合は英語で表示されます。
そのため、英語を理解することでスムーズにエラーの内容を把握して正しく修正することが可能だと思います。
私の場合は英語の勉強を疎かにしてしまったため、このままでは単語しか分かりません。

しかし今までの経験からするとエラーメッセージレベルであれば、Google翻訳レベルの翻訳で伝えたいことを大まかに知ることが出来るので
かんたんな開発を行うのには問題ありません。

# 翻訳してみた
Google翻訳結果:
書き込み可能アトミックプロパティ 'NAME2」は、ユーザ定義のセッターでsyncthesizedゲッターをペアにすることはできません。

単語を拾ってみました
・書き込み可能なアトミックプロパティ
・ユーザ定義のセッター
・syncthesizedゲッター

### 書き込み可能なアトミックプロパティについて
「書き込み可能な」については、アクセス制御オプションのことを指していると予測。
　アクセス制御は以下の2つある。
　　・readonly
　　・readwrite

今回は指定していないため、デフォルトはreadwriteとなることから今のところは状況にマッチしています。

「アトミックプロパティ」については、スレッドセーフの保証可否オプションのことを指していると予測。
　アトミックの指定は以下の2つある。
　　・nonatomic
　　・atomic

今回は指定していないため、デフォルトはatomicとなることから今のところは状況にマッチしています。

### ユーザ定義のセッターについて
前回の確認でセッターを自分で定義していることを指していると思います。

```objc:
@property (setter=fullName:) NSString *name2;
```

### syncthesizedゲッターについて
プロパティ宣言したコードをビルドすると自動的にgetter/setterが生成されていて、今回の場合はsetterのみユーザ定義したので自動生成されたgetterとはペアにできませんよ　のようなことを言っていると感じ取りました。

# ここまでの情報で少し考えてみます
まず問題なのは、ユーザ定義のセッターと自動生成されるゲッターをペアに出来ない点ということがわかりました。
解決方法の仮説を以下のような考えました。
・書き込み可能なアトミックプロパティ以外なら可能かもしれない
・ユーザ定義のセッターを用意した場合は、ゲッターをユーザ定義してやる必要があるかもしれない

# 検証開始
・書き込み可能なアトミックプロパティ以外なら可能かもしれない
まずは書き込み可能ではないパターンを考えてみました。
もちろん考えなくても直感的に気づいてはいるのですがsetterを明示的に指定しておきながら、readonlyオプションを指定することが出来ないのでこのパターンは成立しません。

次にアトミックプロパティではないパターンを考えてみました。
結果的にこのパターンは警告は表示されなくなりました。

```objc:
@property (nonatomic, setter=fullName:) NSString *name2;
```

・ユーザ定義のセッターを用意した場合は、ゲッターをユーザ定義してやる必要があるかもしれない
試しにgetterをユーザ定義して追加しました。
結果を先に書いておきますが、以下のコードだとコンパイルエラーとなります。

```objc:
@property (getter=name, setter=fullName:) NSString *name2;
```

```objc:
-(void)fullName:(NSString*)value {
    //self.name2 = value;  : NG 無限ループします
    _name2 = value;
}

-(NSString*)name {
    return _name2;
}
```

エラーメッセージ : "Use of undeclared identifier '_name2'"
![スクリーンショット 2014-12-10 10.33.20.png](https://qiita-image-store.s3.amazonaws.com/0/25611/bb30d0fe-e29d-0747-b655-474bfea22bc6.png)

エラー内容としては、_name2は宣言されていませんという内容です。
getter、setterの両方をユーザ定義するとどうやらビルド時に自動生成されていた_name2メンバー変数が作成されないようです。
自動生成されないのであれば、自分でコーディングしてやれば問題ないのでは? と考えてみたのでまずはコーディングしてみました。

```objc:
// Person.h
@interface Person : NSObject
{
    NSString *_name2;
}
```

結果は、コンパイルエラー、警告の両方が表示されなくなりました。

# まとめ
解決まではあえて記載していません。(途中で時間がなくなっただけですが・・・)
流れとしてはこのように推測して試すという方法を書いてみましたが、情報が見つからない場合はという前提条件があります。
まずはリファレンスなどを確認するのが、無難な方法だと思います。
今回は以上です。
IT勉強会を探すために捗るサイトまとめ【9選】

#はじめに
IT勉強会に興味があり、
色々調べてたら役立ちそうなサイトをいくつか見つけたのでまとめました。

#勉強会サイト
[connpass](http://connpass.com/)
複数のイベントを、1つにまとめるグループ機能があります。
TwitterやFacebookと連携すると、友達がイベントを公開したり参加したときに知らせてくれる。

[ATND](https://atnd.org/events)
飲み会から勉強会まで様々なイベントの告知・運営管理がすべて無料で可能。
有名・人気な勉強会がたくさん載っている感じがします。

[Doorkeeper](https://www.doorkeeper.jp/)
継続的にイベントを開催するなら、ここがオススメらしいです。
参加者がイベントに申し込むとそのイベントのコミュニティメンバーとして登録されます。

[TECH PLAY](https://techplay.jp)
IT勉強会・セミナーなどエンジニアのためのイベント情報検索サービスです。
IT系イベントに絞った情報収集をするなら結構おすすめです。
旧dots.

[Study Mail](http://www.study-mail.info/)
自分の気になるキーワードを登録すると、そのキーワードを含んだ勉強会が対応サイトで告知された時メールでお知らせするサービスです。
ATND、zussar、connpass、peatix、こくちーず、paratake、doorkeeperの7つのサイトに対応

[AZusaar!!](http://azusaar.appspot.com/)
ATND、Zusaar、こくちーず、PARTAKE、connpass、doorkeeperのイベントと会場周辺のホテルを検索します。

[openCU](http://www.opencu.com/)
クリエイティブなイベントが多く、セミナーが多いです。

[ストリートアカデミー](https://www.street-academy.com/)
東京を中心に、
ビジネス・ITスキルから趣味・習い事まで、個人が主催する講座・教室・レッスン・ワークショップを探せます。

#参考サイト
・一度は行っておきたい！「IT勉強会のススメ」
URL: http://blog.codecamp.jp/study-group/
・IT勉強会を探そう - IT勉強会カレンダー以降をこの先生きのこるためには
URL: http://kamatamadai.hatenablog.com/entry/2015/02/02/015811
・これは便利！IT系勉強会を検索できるサービス10選
URL: http://paiza.hatenablog.com/entry/2014/12/08/%E3%81%93%E3%82%8C%E3%81%AF%E4%BE%BF%E5%88%A9%EF%BC%81IT%E7%B3%BB%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B910%E9%81%B8
Mecanimに設定しているアニメーションクリップを動的に差し替える

# 要件
*Mecanim* で制御しているキャラクターの *AnimationClip* を動的に変更したい。
変更したい箇所は複数存在し、各種10種類以上あることが予想される。
ステートマシンは使いたいので *LegacyAnimation* を使う選択肢はない。

## AnimatorOverrideControllerを使ってみる
*AnimatorOverrideController* を差し替えたいClipの分作成する。
![override.png](https://qiita-image-store.s3.amazonaws.com/0/41904/ce88aee0-f5c6-9b99-7e6c-93edf1c79d8c.png)

### 問題点
変更箇所の組み合わせが複雑になると正直全部作ってられない。
どちらにしろ分岐かかなきゃいけないし、そもそも管理しきれない。

## スクリプトで制御する
動的に *AnimatorOverrideController* を作成して、
必要な個所だけ差し替えたものをアタッチしなおす。
 
```
// 新しいOverrideControllerを作成する
AnimatorOverrideController newAnime = new AnimatorOverrideController();

// 上書きしたいAnimatorを代入
newAnime.runtimeAnimatorController = GetComponent<Animator>().runtimeAnimatorController;

// ClipPairの差し替えたいクリップに対して処理を施す
AnimationClipPair[] clipPairs = newAnime.clips;
for( int i = 0; i < newAnime.clips.Length; i++ )
{
  // 今回はオリジナルクリップを名前で判別して差し替える
  if( newAnime.clips[i].originalClip.name.IndexOf("DamageAnim") >= 0 )
  {
    clipPairs[i].overrideClip = newClip; // newClipはInspector側でアタッチしてる前提
  }
}
newAnime.clips = clipPairs;

// 差し替えたOverrideControllerをAnimatorに代入して完了
GetComponent<Animator>().runtimeAnimatorController = newAnime;
```
必要な *AnimationClip* のみを動的にロードして、上書きできるので無駄が少ない。

# 他の方法はあるのか
そもそもこのやり方としてあってるのか謎・・・。
*StateMachineBehaviour* を有効に使えば簡単に実装できるのか・・・？
composer実行時にディレクトリも作成する

composerを実行すると同時にディレクトリの作成までやりたかったので、調べたら以下のようにすることでできました

1. [fbourigault/composer-mkdir](https://github.com/fbourigault/composer-mkdir)をrequireに入れます使います
2. scriptsを追加します
3. extraに作りたいディレクトリ名を書きます

```json:composer.json
{
    "require": {
        "fbourigault/composer-mkdir": "~1.0"
    },
    "scripts": {
        "post-install-cmd": [
            "Fbourigault\\ComposerMkdir\\ScriptHandler::mkdirs"
        ],
        "post-update-cmd": [
            "Fbourigault\\ComposerMkdir\\ScriptHandler::mkdirs"
        ]
    },
    "extra": {
        "fbourigault-composer-mkdir": [
            "dir1",
            "dir2"
        ]
    }
}
```
scriptsでは、コマンドの実行もできるので、簡単にやりたければ

```json:composer.json
{
    "scripts": {
        "post-install-cmd": [
            "mkdir dir1",
            "mkdir dir2"
        ],
        "post-update-cmd": [
            "mkdir dir1",
            "mkdir dir2"
        ]
    }
}
```

でも良いかもしれません
OpenStreetMapの写経マッピングで、複数のデータソースから新しいデータを判定する

OpenStreetMapのデータ作成も、[Bingの航空写真](https://www.bing.com/maps/?v=2&cp=34.677502~135.512894&lvl=5&sty=h&form=LMLTCC)や[地理院地図](http://maps.gsi.go.jp/#5/35.362222/138.731389)等、写経元にライセンスが認められた地図が増えて、街歩きでGPSログなどを貯めなくても作れるデータが増えてきました。

が、たまに出くわすのが、2つのデータソース間でデータが異なって、これどっちが新しいの？と迷ってしまうケースです。
例えば、この奈良の一地域。
![Bing航空写真](https://qiita-image-store.s3.amazonaws.com/0/10108/25e7b54f-8023-f739-d27b-b593e37ed308.png)(Bing航空写真より引用)
Bing航空写真だと、池の横には上記のように大きな施設（家？だと豪邸だなあ...）が建っていますが、地理院地図だと、
![地理院地図](https://qiita-image-store.s3.amazonaws.com/0/10108/f01de2cb-5201-5ab8-6208-ef6211240c73.png)(地理院地図より引用)
地理院地図だと、小さな家の寄せ集まりになっています。

なんとなく、大きな施設になる方が、新しい気がしますが、でも老朽化した施設が壊されて宅地分譲されるようなケースもあるので、必ずしも大きな施設になった方が新しいという保証はありません。

こんな時どっちを採用するか悩むことが多かったのですが、よい方法を先日思いつきました。
よほど変化の激しい地域であるならともかく、古い方の状態はより古い地図/航空写真にも載っているはずなので、明らかに古いと分かっているデータと比較すればいいのです。

たとえば古い航空写真は、国土地理院のタイルデータで国土画像情報が第1期から第4期まで提供されていますが、この地域では第3期のデータがあるので表示してみると、
![国土画像情報第3期](https://qiita-image-store.s3.amazonaws.com/0/10108/44260da6-7fcb-5ed3-c57e-d293263acd98.png)(国土画像情報第3期より引用)
明らかに現行地理院地図と同じ、小さな家の寄せ集まりが写っています。
よって、この地域の新しいデータは、Bingの航空写真の方であると判定できました。

このように、古い地図や航空写真との比較で、現行の写経可能なデータソースのうち新しい方を判定する方法を思いついたので、記事にしてみました。
SlackのIncoming Webhooksのメッセージをカスタマイズ

# はじめに
* SlackではIntegrationの一つに[Incoming Webhooks](https://api.slack.com/incoming-webhooks)があり、Incoming Webhooksを使うと、特定のChannelに外部からメッセージを送信できます
* 送信するメッセージは、次のようなJSONになります

```json
{
    "text": "This is a line of text.\nAnd this is another one."
}
```

# 簡易的なカスタマイズ

* `username`, `icon_url`, `icon_emoji`をJSONに指定することで、メッセージの送信者名、アバター画像をカスタマイズできます。

たとえば、次のJSONを送信すると、

```json

{
  "text": "I found a MONSTER! ",
  "channel": "#incoming-test",
  "username": "Baymax",
  "icon_emoji": ":baymax:"
}
```

このようにタイムラインに表示されます。

![スクリーンショット 2015-05-18 13.29.27.png](https://qiita-image-store.s3.amazonaws.com/1041/49300/63e08356-9600-291e-d2cc-99168341f05d.png)

## メンションをリンクにしたい場合

`@name`をリンクにしたい場合

```
"link_names": 1
```

を付ける。

# リッチなフォーマット
* リッチなフォーマットで表示させたい場合は、Attachmentsの書式に従ってJSONを作成します
* 詳しくは [Attachments](https://api.slack.com/docs/attachments) を参照してください

たとえば、次のJSONを送信すると、

```json

{
  "channel": "#incoming-test",
  "username": "Baymax",
  "icon_emoji": ":baymax:",
  "text": "I found a MONSTER! ",
  "attachments": [
    {
      "color": "#36a64f",
      "image_url": "http://xxx/uploads/monster/image/3/thumb_thany1.jpg",
      "fields": [
                {
                    "title": "Priority",
                    "value": "High",
                    "short": false
                }
            ]
    },
    {
      "color": "danger",
      "image_url": "http://xxx/uploads/monster/image/3/thumb_thany1.jpg"
    }
  ]
}
```

このようにタイムラインに表示されます。

![スクリーンショット 2015-05-18 13.18.57.png](https://qiita-image-store.s3.amazonaws.com/1041/49300/9715cace-7af6-ab43-97da-834a834e6e24.png)


# JSONを送信する場合のTips

curlコマンドのパラメータに`-d @xxxx.json`をつけると、`xxxx.json`ファイルを渡せます。

```
$ curl -X POST http://localhost:4567/message -d @message.json
```

```
$ cat message.json

{
  "text": "I found a MONSTER! ",
  "channel": "#incoming-test",
  "username": "Baymax",
  "icon_emoji": ":baymax:"
}

```
htmlファイルにphpを導入させる方法

導入したいディレクトリに.htaccessを作り、
`AddType application/x-httpd-php .html`
サーバによっては、
`AddHandler application/x-httpd-php .php .html`
の場合もある？

https://www.suzukikenichi.com/blog/how-to-run-php-in-html-by-htaccess/

htmlソースによっては、これだけだと
Parse error: parse error, unexpected T_STRING in ～（ファイル名） on line 1
といったエラーが出る。
これは
<?xml version="1.0" encoding="utf-8"?>
が書かれていると、"<?"がphpだと認識してしまうため。
よって、.htaccessに
`php_flag short_open_tag Off`
という記述を追加する。

http://go4it.seesaa.net/article/113717303.html

追記：

.htaccessに`php_flag short_open_tag Off`と書くより、
`<?xml version="1.0" encoding="utf-8"?>`
を
`<?php echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; ?>`
と書くほうが確実そう。

http://www.tagindex.com/kakolog/q2bbs/601/810.html
Xcode の Size Class で自由にレイアウトを作成する方法


こんにちは。エクセルソフトの田淵です。

最終目的は Xamarin.iOS で Size Class を使って全デバイスに対応した画面を用意することなんですが、まずは Xcode でやってみました。

> 追記： Xamarin.iOS での使用方法は以下をご参照ください。
[Xamarin Studio の Size Class で自由にレイアウトを作成する方法 - Qiita](http://qiita.com/ytabuchi/items/bdfeef6b1565d1409f83)

最終形がこれです。 

<img src="https://qiita-image-store.s3.amazonaws.com/0/32453/e82a7eb8-e234-fc94-aa52-187a0a3b1e92.png" width="450" />


# 配置する

サンプルなので動きも何も付けずに View を配置していきます。
上に２つ、真ん中に３つ、下に１つです。配置の手法としては、

- 各 View を端に固定します
- View 間の間隔だけを固定します
- (この例では)各 View の Width, Height をイコールにします

だけで、View のサイズが勝手に調整されます。

# 設定方法

### 端っこの Constraints を固定

View を選択して、右下の３つのアイコンの真ん中をクリックし、上の矢印の I をクリックして赤くします。これでオンになります。その後、``Add n Constraints`` をクリックです。各 View に対して実施します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/32453/595f92ba-7814-3af4-4cb9-b32cef72fdf5.png" width="450" />

### Width, Height をイコールに

例えば高さを同じにしたい View を全部 Command ボタン (⌘) で複数選択し、同様に真ん中のアイコンから ``Equal Heights`` をチェックして ``Add n Constraints`` をクリックです。各 View の右とか下に = 付きの線が沢山並びますｗ

<img src="https://qiita-image-store.s3.amazonaws.com/0/32453/d79604f5-1a5b-7815-ab17-ec2614811c9c.png" width="450" />


# Preview 便利

Assistant View を開いてファイルリストから ``Preview > Storyboard ファイル`` を開きます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/32453/bcd775c7-3951-7d96-c489-1656f14d5b9d.png" width="300" />

最初は iPhone 4-inch だけなので左下の＋ボタンから iPhone 5.5-inch や iPad などを選択するとよいでしょう。

# 参考資料

- [Xcode 6 Tutorial for iOS 8: Universal Storyboard - YouTube](https://www.youtube.com/watch?v=p5wD8dvSDbM)
レイアウトによってパーツを配置する、しない、などはこちらを。

- [IOS8 Constraints and Size Classes - YouTube](https://www.youtube.com/watch?v=IwSTXY0awng&index=1&list=FLGb5t_jmI1LV_vy9Ml7xS3Q)
今回のサンプルはこれと同じです。

- [iOS - Xcode6 Storyboardサイズクラスにより使用するContstraintsを切り替えるには【メモ】 - Qiita](http://qiita.com/moonkids/items/13aa35822a8e6e140d4c)
- [iOS - Xcode 6 時代のマルチデバイス対応 ～Size Classとベクター画像～ - Qiita](http://qiita.com/shu223/items/b4fad50a35183fbda3af)

では、これから Xamarin で同じ設定をやってみたいと思います！

# Xamarin 気になった方は

是非 [ダウンロード(直接)](http://xamarin.com/download) / [ダウンロード(弊社経由)](https://www.xlsoft.com/jp/products/download/index.html?option=Xamarin&r=ytqiita) して触ってみてください。
[学習用リソース](http://ytabuchi.hatenablog.com/entry/2014/08/26/191759) や [JXUG リンクページ](http://jxug.org/links.html) に参考資料を纏めてますので併せてどうぞ。

<a href="http://blog.hatena.ne.jp/ytabuchi/ytabuchi.hatenablog.com/subscribe">Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。</a>

以上です。
VirtualBoxでCentOS6.6をminimalインストールしたときのネットワーク設定メモ

### やりたいこと

* ゲストはホスト経由で外部（WEB）、ホスト側のLANと通信できる
* ホストからゲストにSSHでアクセスできる※ポートフォワード経由
* ゲスト間で通信できる

### 環境

* ホスト
 * VirtualBox 4.3.28
* ゲストCD
 * CentOS-6.6-x86_64-minimal.iso

### VirtualBoxのネットワーク設定

||アダプター1|アダプター2|
|---|---|---|
|割り当て|NATネットワーク|ホストオンリーアダプター|
|/etc/sysconfig/network-scripts/|ifcfg-eth0|ifcfg-eth1|

### アダプター設定時のメモ

* 「HWADDR」はVMコピーや初期化などで変更した場合忘れず変更する
* 「GATEWAY」は両方に設定しない
* 「DNS1=8.8.8.8」はgoogleのパブリックDNS

### アダプター1の設定

~~~ bash:コマンド
vi /etc/sysconfig/network-scripts/ifcfg-eth0
~~~

~~~ bash:変更前
DEVICE=eth0
HWADDR=08:00:27:05:DB:16
TYPE=Ethernet
UUID=0a5bfbaa-116b-4e48-88c0-e3d5255e324c
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp
~~~

~~~ bash:変更後
DEVICE=eth0
HWADDR=08:00:27:05:DB:16
TYPE=Ethernet
UUID=0a5bfbaa-116b-4e48-88c0-e3d5255e324c
#ONBOOT=no
ONBOOT=yes
NM_CONTROLLED=yes
#BOOTPROTO=dhcp
BOOTPROTO=none
IPADDR=192.168.5.108
PREFIX=24
GATEWAY=192.168.5.1
DNS1=8.8.8.8
~~~

### アダプター2の設定

~~~ bash:コマンド
vi /etc/sysconfig/network-scripts/ifcfg-eth1
~~~

~~~ bash:変更前
DEVICE=eth1
HWADDR=08:00:27:C8:13:0C
TYPE=Ethernet
UUID=e0c89a68-26e8-4548-8479-d663a63b55e3
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp
~~~

~~~ bash:変更後
DEVICE=eth1
HWADDR=08:00:27:C8:13:0C
TYPE=Ethernet
UUID=e0c89a68-26e8-4548-8479-d663a63b55e3
#ONBOOT=no
ONBOOT=yes
NM_CONTROLLED=yes
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=192.168.56.108
NETMASK=255.255.255.0
~~~

### 設定反映

~~~ bash:コマンド※MACアドレスを変更「しない」場合
service network restart
~~~

~~~ bash:コマンド※MACアドレスを変更「した」場合
rm /etc/udev/rules.d/70-persistent-net.rules     
reboot
~~~

### 設定確認

~~~ bash:ゲスト
ip a

# 「192.168.xxx.xxx」はホストのIP
ping 192.168.xxx.xxx

# 外部にアクセスできているか
ping google.com

~~~

~~~ bash:ホストからゲスト
ip a

# 「192.168.xxx.xxx」はホストのIP
# 「NNNNN」はポートフォワードで設定したポート
ssh root@192.168.xxx.xxx -p XXXXX
~~~

~~~ bash:他のゲストから
ip a

# ポートフォワードは不要
ssh root@192.168.5.108 -p 22
~~~
RHmmをインストールする

# もうCRANからは手に入らないっぽい
というわけでアーカイブから最新版をダウンロードして、それをインストールしましょう。
ちなみに、僕はMacのOSX10, Yosemiteで作業しています。

http://cran.r-project.org/src/contrib/Archive/RHmm/

2013年4月が最終版になっているようですね。
ダウンロードしたら、Rを開いて、

```r
install.packages("ダウンロードしたtar.gzファイルのパス", repos = NULL, type = "source")
```

これでRHmmを使えます。

ちなみに、僕は下記のエラーが出ました

```
ld: warning: directory not found for option '-L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2'
ld: library not found for -lquadmath
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [RHmm.so] Error 1
ERROR: compilation failed for package ‘RHmm’
```
下記のサイトを参考にして解決しました。
gfortranのバージョンが古いとかなんとからしいです

http://www.thecoatlessprofessor.com/programming/rcpp-rcpparmadillo-and-os-x-mavericks-lgfortran-and-lquadmath-error

以下の2行をターミナルで実行すればOK

```
curl -O http://r.research.att.com/libs/gfortran-4.8.2-darwin13.tar.bz2
sudo tar fvxz gfortran-4.8.2-darwin13.tar.bz2 -C /
```

あと、`library(RHmm)`で使おうと思ったらMASSとnlme`が入っていないよと怒られたので、これら2つのライブラリも追加してやりました

```R
install.packages('MASS')
install.packages('nlme')
```
[Blockly Hacks]ToolboxのFlyoutをブロックをドラッグした後も開きっぱなしにしたい


Blocklyを使っていて「ツールボックスからブロックをドラッグした後もフライアウトを表示させたままにしたい！」と思った場合は以下のようにすると開きっぱなしにできます。基本的には個人的な備忘録なのでお試しは自己責任でお願いします。

## 前提条件
今から説明する方法はBlocklyがビルドできる状態である必要があります。ビルド環境はBlockly公式ドキュメントか[以前の投稿](http://qiita.com/heyhachi/items/f422ffefd959a673ca7b)にて確認してください。

## 目標
標準ではToolboxからブロックをドラッグするとフライアウトが閉じます。これを自動で閉じないようにしたいと思います。つまり、以下のような表示を維持する事が目標です。
![フライアウト展開中](https://developers.google.com/blockly/installation/toolbox-categories.png)

## Let's hack
目的のソースコードは"/blockly/core/flyout.js"です。このファイルの100行目あたりに臭うコードがあります。

```Javascript:flyout.js
/**
 * Does the flyout automatically close when a block is created?
 * @type {boolean}
 */
Blockly.Flyout.prototype.autoClose = true;
```

コメントには「ブロックが作られた時にフライアウトを自動的に閉じるかい？」って書かれています。こいつをfalseにしてやりましょう。

ビルドして動作確認すると、ブロックをドラッグしてもフライアウトが閉じなくなりました。
でも…閉じない…閉じたいんですけど！ってときはツールボックスの選択中のカテゴリをクリックすると閉じます。上図の場合であれば"Logic"をクリックすると閉じます。

## まとめ
本来であればユーザーが自由に設定を切り替えられるのが理想でしょう。フラグをon/offできるViewを作ればビルドせずとも動的に切り替えられる…かもしれません。すみません、試してません…。
[Node.js]Express4で環境ごとの設定をつくる

# Express4で環境ごとの設定をつくる
## 基礎知識
Express4では環境変数「NODE_ENV」によって環境を定義することができる。
例えば、開発環境（development）、ステージ環境（stage）、本番環境（production）のような設定。
NODE_ENVの指定は起動時に指定したりする。
指定しなければdevelopmentになる。

```bash
NODE_ENV=stage npm start
```

プログラム中に今どの環境向けに動作しているのかを知りたい場合は以下のようなコード書こう。

```js
var app = require('app');    // ルートのapp.jsをrequireする
var env = app.get('env');    // envに入っている
or
var env = process.env.NODE_ENV;    // 環境変数にアクセスできる
```

環境ごとに処理したい場合、Express3ではapp.configureメソッドを使えていたが、Express4でこのメソッドは廃止されていることに注意する。

```js
var app = require('app');    // ルートのapp.jsをrequireする

// Express3
app.configure('development', function () {
    // 開発環境のみ
});
app.configure('stage', function () {
    // ステージ環境のみ
});

// Express4
var env = app.get('env');
if (env == 'development') {
    // 開発環境のみ
}
if (env == 'stage') {
    // ステージ環境のみ
}
```

##  環境ごとの設定をつくる
本題。

「環境ごとにデータベースの接続先が違うから各環境ごとに設定ファイルを用意して、データベース接続する際は裏側で勝手に設定ファイルよんで接続して欲しい。」ということは良くある。

configモジュールを使う。

```bash
npm install config --save
```

configディレクトリを作成して、default.jsonをつくれと書いてあるので従う。

```bash
mkdir config
vi config/default.json
{
    "db": {
        "master": {
            "host": "127.0.0.1",
            "user": "usr",
            "password": "pass",
            "database": "mydatabase"
        },
        "slave": {
            "host": "127.0.0.1",
            "user": "usr",
            "password": "pass",
            "database": "mydatabase"
        }
    }
}
```

例えば、開発環境向け専用の設定ファイルを作成する場合は「config/NODE_ENVに設定した値.json」を用意しておけば、そちらに書かれている内容で上書きされるみたい。

プログラムから設定を読み込むには以下のようにする。

```js
var config = require('config');
conole.log(config.db.master.host);    // 127.0.0.1と表示される
```

これでソースコード上からは今どの環境向けに動作しているかを気にしなくてよくなった。
カッコ悪いボタンを作らないために(マウスオーバー篇)

いまさらながら初投稿のQiita
年間100本ノックということでの第一弾。

*カッコ悪いボタンを作らないために*

jQueryのanimateを使ってボタンに触ったら(mouseover)大きくしたいとか背景色を変えたいとかあるかとおもいます。
ざっくりとボタンを大きくしたい場合は下記のようになりますね。

```js
(function() {
	$(function() {
		var $button = $("#button");

		$button.on("mouseover", function() {

			$button.animate({
				width: 400,
				height: 200
			}, 1000)
		})

		$button.on("mouseout", function() {

			$button.animate({
				width: 200,
				height: 100
			}, 1000)
		})
	})
})();
```

これを実行するとおかしなことになります。
アニメーションが終わらないうちにmouseoverとmouseoutを何度か繰り返してみてください。マウスがボタンに触れていないのにずっと拡大縮小を続けます。
そうです。繰り返した回数分animateが実行されてアニメーションが繰り返されてしまうのです。

どうやったら解決するのか？
animate()の前にstopをつけてあげるとそれまで動いていたアニメーションを一旦止めてくれるのでアニメーションが繰り返されることはなくなります。

```js
$button.stop().animate()
```
コンソールでよく使うLinuxコマンドメモ

投稿テストがてら、自分用のメモです。

# Linux
## 管理系
インストール済みのソフト一覧表示

```
yum list installed
```

パッチ適用履歴を確認する  

```
rpm -q --changelog openssl  
```

サービス起動停止

```
systemctl stop httpd
systemctl start httpd
```

## 検索系
拡張子を指定してYYYY-MM-DDの日付を取りたい

```
find -type f -name "*.sh" | xargs -I{} ls -l --time-style=+%Y-%m-%d\ %H:%M:%S {} ls -l {}
find -type f | xargs -I{} ls -l --time-style=+%Y-%m-%d\ %H:%M:%S {} | awk '{print $6 " "  $8 }'
```

今いるディレクトリ内の、ファイルの中身を検索して、行数を出したい。

```
find -type f | xargs grep -Hn "hoge"
```

拡張子ごとに集計してソート

```
find . -type f -print | sed -e 's/^.*\///' | grep '\.' | sed -e 's/^.*\.//' | sort | uniq -c | sort -nr
```

SVNコマンドに流し込みたい

```
find -type f | xargs -I{} svn propset svn:needs-lock "*" {}
```

## NW系
sshでホストチェックを外す

```
ssh -oStrictHostKeyChecking=no ec2-uesr@192.168.0.X
```

OpenSSLで繋いで使用されているプロトコル等確認

```
openssl s_client -connect www.targeturl.com:443
```

DBとの接続数をカウント

```
netstat -tanp | grep ${DB_PORT} | grep ESTABLISHED
```

ポート利用状況確認

```
lsof -i -n -P | grep ${PORT}
netstat -ant | grep ${PORT}
```

netcatで疎通確認

```
nc -vn 192.168.0.X ${PORT}
```


## その他よく使う
### date
コンソールというか、スクリプトで使う度に調べてるので。。。とりあえず例だけ記載。

```
date "+%Y-%m-%d_%H-%M-%S.%N"
```

### diff
再帰的に比較して、差異がでたファイルのみ表示
一部比較したくないディレクトリは除外する。

```
diff -r -x 'log' /path/to/target1 /path/to/target2
```

## ちょいスクリプト編
**For文**
色んな所にものをばらまく。

```
ALL_HOST=(192.168.0.X 192.168.0.XX);
for h in \${ALL_HOST[@]}; do
 scp -rp Test.sh ec2-user@${h}:/home/ec2-user/
done; echo "Done";
```

**if文**
いろいろ一行で。。。

```
[ -f \$target ] && rm -f $target
```

```
[ \$hoge = \$foo ] && echo "true" || echo "false"
```

# Zabbix
疎通確認(ntpのプロセス数を取ってます)

```
zabbix_get -s 192.168.0.X -k proc.num[ntpd]
```

# PostgreSQL
psqlコマンドでつなぐ

```
psql -h ${TARGET_HOST} -U ${DB_USER} -d ${DB_NAME} -p ${DB_PORT}
```

# AWS系

バケットにあるものをすべてカレントディレクトリにダウンロード

```
TRG=$(aws s3 ls s3://mybucket/path/to/ --recursive | awk '{print $4}')
for ITEM in $TRG; do
 aws s3 cp s3://mybucket/$ITEM .;
done
```
dropbox-sdk gem で指定ファイルを読み込む方法

`~/Dropbox/a.txt` に相当するファイルを、APIを使って読み出す手順です。

1. https://www.dropbox.com/developers/apps にアクセスして create app クリック
1. dropbox API app 選択
1. Can your app be limited to its own folder? (アプリ専用フォルダを作るか？) → No
1. What type of files does your app need access to? (アクセスしたいファイル) → All file types
1. アプリ名入力
1. create クリック
1. OAuth2 の Generate access token の Generate をクリックして表示されたのをコピー
1. `gem install dropbox-sdk` 実行 (dropbox-sdkは公式のgem)
1. 以下実行

```ruby
require "dropbox_sdk"
client = DropboxClient.new("7でコピーしたトークン")
p client.get_file("/a.txt")
```
AD参加時の注意

はまったことなので、メモ書き。

AD参加時にDNSが設定していない場合、下記エラーがを出力する。

「
ドメイン"<ドメイン名>"に参加中に次のエラーが発生しました。
指定されたドメインがないか、またはアクセスできません。
」

なので、ドメイン参加をする場合はDNS設定をみましょう。
background: url(path);にダブルクォーテーションがつく

Stylusでbackground: url(path)書くと勝手にダブルクォーテーションつくヤツ。
個人的にパスを記述するときにダブルクォーテーションで囲うようにしてなかったので、なんとなく気持ち悪い。

```lang:stylus
#qiita
  background url(img/qiita.png)
```

```lang:css
/*出力結果*/
#qiita {
  background: url("img/qiita.png");
}
```

公式のドキュメントを見ても特になさそうだったけど、[前回（StylusでOldなIEにも対応したOpacity）](http://qiita.com/loop0429/items/16d6db655ec19eb4e46b)の応用で出来た。

```lang:stylus
bgImageURL(src)
  unquote('url(' + s + ')')

#qiita
  background bgImageURL(img/qiita.png)
```

```lang:css
/*出力結果*/
#qiita {
  background: url(img/qiita.png);
}
```
PHP5でsegmentation faultが発生するバグ

php-src のmasterのログを見ていたら今日こんなバグ修正が入っていました。

https://github.com/php/php-src/commit/9031a902e3393ff7dc8a02615430a7d894c740fa

今日(2015/6/2)コミットされていたので、現時点で世の中で出回ってる全てのPHPインタープリタにはこのバグがあるかと思われます。

# 再現方法

```php
<?php
class wpq {
    private $unreferenced;

    public function __get($name) {
        return $this->$name . "XXX";
    }
}

function ret_assoc() {
    $x = "XXX";
    return array('foo' => 'bar', $x);
}

$wpq = new wpq;
$wpq->interesting =& ret_assoc();
$x = $wpq->interesting;
printf("%s\n", $x);
```

これを実行するとsegmentation faultがおきます。

```
$  /usr/bin/php ~/php/a.php
[1]    787 segmentation fault  /usr/bin/php ~/php/a.php
```

手元のPHP5.5.20, PHP5.6.9で確かに再現しました。

特に真新しい機能を使ってるわけでもなく、PHP5.1あたりでも動きそうな何の変哲もないコードなのに、こんなとこでsegmentation faultが発生したりするんですね。
興味深い。

次のパッチリリースで直っていることでしょう。