OmniAICreator/Qiita-1.07M huggingface dataset:
PhalconのORMにはDISTINCTが設定できない

# PhalconのORMにはDISTINCTが設定できない

そもそも、Form <-> Object <-> Database のように、FormからDatabaseまでを抽象化するのがORMだと思っていた。

# そもそも、Phalcon の ORM は使い難い

使い難いっす。

FindFirst した結果が Phalcon\Mvc\Model\Row で、
Find した結果が Phalcon\Mvc\Model\Resultset\Simple なのはどうしてなんだろう？

$obj->toArray() ができたりできなかったりして難儀だなぁと思った。
こういうのを統一するのが Framework の役目だと思っているんだけど、設計思想が違うのかな？

# Phalconは爆速か？

実運用中のサイトで比べた感じ、特に速いと思わない。
体感速度を一番決定するのは、バックボーンのネットワーク。
その次に体感速度を決定するのは、ホストサーバーのスペック。
AWS　や　VPS　で　Phalcon　使っても意味ないっすよ。
そもそもコアがバイナリでも、ビジネスロジックがスクリプトだしね。
ホスト上のボトルネックとなるのは、DBやストレージで、0.01秒の遅れを0.001秒で補っても影響は微々たるもんです。
実運用では *NoSQL* や *Memcache* の効率的な使い方が重要だと思う。
更に現在では、*Ajax* の合わせ技が入ってくるので、*Phalcon* で0.0001秒速くするより、ラピッドに安定的に開発できるフレームワークを選定する方が良いでしょう。

# Phalcon は究極か？！

いいえ。全く。
私の個人的な感想では、非常に無難なフレームワークです。
特に可もなく不可もなく。最善でも無いし、次善でも無い。
*Phalcon* に画期的な機能がないのは、バイナリ由来ゆえ、機能にイノベーションを盛り込むのが難しいんだと思う。
ちょっとした修正を確認したり、原因の分からないバグ修正が大変だと思うから、無難な機能の実装で終わっている感じがする。
開発効率は低いと言わざるえない。
雑だけど、cakephpのpassedArgsをmergeしてurlを返すメソッド書いた

もともとhelper用に書いてました。
非常にやりかたが雑です。

```php
/**
 * passedArgsをマージしてURLを返す
 * @param string $url 相対URLまたは絶対URL
 * @param array $merge_array 上書きするパラメータ(key=>value)
 * @return string
 */
public function merge_passed_args_url($url, $merge_array) {
    if(strpos($url, 'http://') !== FALSE) {
        $protocol = 'http://';
        $url = str_replace($protocol, '', $url);
    }
    if(strpos($url, 'https://') !== FALSE) {
        $protocol = 'https://';
        $url = str_replace($protocol, '', $url);
    }

    $segments = explode('/', $url);
    $passed_keys = array();
    foreach($segments as $key => $segment) {
        if(strpos($segment, ':') !== FALSE) {
            list($passed_key, $passed_value) = explode(':', $segment);
            $passed_keys[] = $passed_key;

            if(array_key_exists($passed_key, $merge_array)) {
                // 存在する場合は書き換える
                $segments[$key] = $passed_key.':'. $merge_array[$passed_key];
            }
        }
    }

    $url = rtrim(implode('/', $segments), '/'). '/';
    $no_added_keys = array_diff(array_keys($merge_array), $passed_keys);
    foreach($no_added_keys as $key) {
        $url .= $key. ':'. $merge_array[$key]. '/';
    }

    if(!empty($protocol)) {
        $url = $protocol . $url;
    }
    return $url;
}
```

## 例

```
merge_passed_args_url(Router::url(), array('key'=>'value'));
```

もっとめんどくさくない方法が欲しい。
使う人居ないと思うけど使う人はできればコメントしてくださいな
OpenViBEをUbuntu環境にインストール


OpenViBEの日本語ドキュメントが少なかったので書きました。
WindowsだとGUIのインストーラーですんなり入りますのでLinuxで試してみました

OpenViBEとは、Emotiv EPOCなどの脳波を読み取ることのできるデバイスから、脳波データを取得し、ブロックを組み合わせることで簡単に脳波データを扱うことができるアプリケーションです。

## インストール環境
Ubuntu14.10

## acquisition serverのLinux対応ドライバ

acquisition serverというものを使うことで簡単に脳波デバイスからデータを取得することができます

ただ、注意したいのがLinux版ではWindows版よりも対応デバイスが非常に少ないためドライバを自作するか、なんらかの方法でデータを取得
する環境を作る必要があります。

[対応状況](http://openvibe.inria.fr/supported-hardware/)

## OpenViBEをインストール

最新版をgitからcloneします

```
$ git clone git://scm.gforge.inria.fr/openvibe/openvibe.git ~/openvibe
```

linux用のインストールスクリプトを実行してbuildします
しばらく時間がかかりますので気長に待ちましょう

```
$ cd ~/openvibe/scripts
$ ./linux-install_dependencies
$ ./linux-build
```

なぜかここで、私の環境では一度buildエラーが出ましたが、再度実行したらインストール完了しました

## アプリケーションの起動

OpenViBEのルートディレクトリにdistディレクトリが生成されたかと思います

```
$ cd ~/openvibe/dist
```

このディレクトリの中にOpenViBEのアプリケーションが入っています
_openvibe-_で始まるshファイルが主に扱うアプリケーションです

試しに一番使うdesignerを起動してみます

```
$ ./openvibe-designer.sh
```

無事にGUIアプリケーションが起動すればインストール成功です
CakePHP2でフォーム送信前にJavaScript処理を走らせる方法


## 方法

フォームヘルパーのcreateでフォームを生成時に、onsubmitにJS関数を渡しておけばOK。

```
echo $this->Form->create('Post', array(
	'onsubmit' => 'doSomething()'
));
```

```javascript:
function doSomething() {
  //do something
}
```

### 例)確認メッセージを出したいとき
以下のようにすれば送信前に確認メッセージを出してくれる。

```
echo $this->Form->create('Post', array(
	'onsubmit' => 'return confirm('本当に送信しますか?')'
));
```
初心者のRubyist必見！


##配列とハッシュ
#####配列
配列とは他のオブジェクトへの参照を順番に並べたもの。

```rb
array = ["a","b","c"]   #配列を生成
p array #=>["a","b","c"]
p array[0] #=>"a"       #添え字は０から！

array[0] = "z"	 #添え字０の要素を変更
p array#=>["z","b","c"]
array.push(1) #配列末尾の追加
array << 100  #配列末尾の追加

```

######ハッシュ
ハッシュとはあるオブジェクトを他のオブジェクトへ対応させたもの
key => value という形になる。
ハッシュは以下の３通りで書き表せる。

```rb
hash1 = {"名前" =>"太郎"}
hash2 = {:種類=>:犬}
hash3 = {年齢: 19}
```



##メソッド
手続きをモジュール化し再利用するための仕組み

####関数的メソッド=非オブジェクト指向的に用いられるメソッド。

```rb
def functional(a,b)
	return [a,b,a+b]
end
functional(1,2)
```

####メソッドの定義
-def式で表す

```rb
def sum(x,y)
 x + y
end

sum(1,2) #=> 3

```

###ブロック付きメソッド

```rb
def foo_bar_baz
  yield "foo"
  yield "bar"
  yield "baz"
end

foo_bar_baz do |item|
  puts item
end
#=>foo
#=>bar
#=>baz
```

##オブジェクトとクラス

例)

```rb
class Animal		#クラス
	def initialize(name)
		@name = name
	end
	def name #getter
		return @name
	end
	def name=(new_name)   #setter
		@name = new_name
	end
end

class Dog < Animal #継承
	attr_accessor :cry #アクセサ
	def initialize(name) #initialize
		super
		@cry = cry
	end
	def self.hello
		puts "hello"
	end
end

tom = Dog.new("Tom")
```
#####クラスの定義

```rb
class Animal
	......
end
```

クラスを定義する際に名前の最初は大文字が基本。
クラス内では、計算や、ファイルの読み書きやエンドユーザーとのやりとりが可能。
ただし、多くはインスタンスメソッドで定義する。

#####インスタンスメソッド,インスタンス化

```
def ... end :　インスタンスメソッド定義
クラス名.new() : インスタンス化
@名前 : インスタンス変数
```

#####initialize
インスタンス化した直後に自動的に呼ばれる。
ここでは、初期化処理を行ったり、必要なリソースを確保したりする。

#####インスタンス変数,クラス変数

```
@名前:インスタンス変数
@@名前:クラス変数
```



#####継承
子クラスが親クラスの特性を引き継ぐ

```rb
class Dog < Animal #子クラス名 < 親クラス名 
 ....
end
```


######特異メソッド

```rb
def User.hello #クラス名.メソッド名
	........
end
```
######特異クラス
-ある特定のインスタンスのためだけにあるクラス

#####モジュール
モジュール=インスタンス化できないクラス
役割は２つ
######1.Mix-in=制限された多重継承
*クラスは１つしか継承できない
*モジュールという「クラスのようだがクラスではない」ものならば何個でも継承できる

######2.名前空間
名前の衝突を避けるための機能

```rb
class Service
	.......
end

module library
 class Service
  .....
 end
end
```

上側のServiceとmoduleの中にあるServiceは属している場所が違うので、衝突が起こりません。
トップレベルのServiceとLibraryのServiceとなります。
FactoryGirls を rails console から呼び出す

日常的に rails アプリを開発している時、「開発や動作の確認用にデータがたくさん欲しいな」と思うことがあるかと思います。

そんな時は、コンソールからデータを作成してやるのが常套句ですが……

```shell-session
bundle exec rails console
[1] pry(main)> tweet = Tweet.new
[2] pry(main)> tweet.body = "Hello, My Twitter Clone!"
[3] pry(main)> twwet.save!
```

現実のデータって、こんなに優しくありませんよね？

* user_id が必要！？　ってことは、 `User` インスタンスも作らなくちゃ……
* `User` には認証方式も必要なのか？　何？　カテゴリも？
* 一体どれくらい依存関係があるんだ……

RSpec や Test::Unit で fixture を使っている時も同じような問題が起き、解決策として FactoryGirl が登場しました。
この FactoryGirl 、実はすごく簡単にコンソールから使用できるんです！

```shell-session
bundle exec rails console
[1] pry(main)> require "factory_girl_rails"
[2] pry(main)> FactoryGirl.create_list(:tweets)
```

そう。 `require` するだけ！
あとは簡単に、良い感じのデータを開発環境でどんどん作れます！

:point_down: こんな感じの spec を用意しておいて、factory を単体で動かせるように保っておけば、テストも開発もグンとしやすくなるかもしれませんね！

```rb
describe "FactoryGirl の factory" do
  FactoryGirl.factories.each do |factory|
    it "ファクトリ '#{factory.name}' は単体で呼び出したとき、データ整合性がバッチリ" do
      expect(FactoryGirl.build(factory.name.to_sym)).to be_valid
    end 
  end 
end
```
WindowsにPython2.7.9を入れてグラフを表示する

皆様ごきげんよう。Goodfindエンジニア事務局です。
Windowsユーザ向けにPythonセミナー用の事前準備をまとめました。

## python2.7.9をインストール

バージョン間違いのないようにお願いします。

1 インストーラーをダウンロードする
https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi
からファイルをダウンロードする。(PCが64ビット版の場合でも、後からインストールするライブラリとの兼ね合いがあるため、この版（32bit版）をインストールしてください)

リンク先が動作しない時は、
https://www.python.org/downloads/release/python-279/
にアクセスし、「Download Windows x86 MSI installer」を選択してダウンロードしてください。

2 ダウンロードしたファイルを実行し、インストールを実行
質問は全て「Yes」か「Next」でOKです


3 インストールを完了したらWindowsの設定からパスを設定する
**Windows7以前の方**
マイコンピュータ or コンピュータのアイコンを右クリックして、プロパティを開く
**Windows8の方**
Winボタン+Xでシステムダイアログを開く

**以降各Windowsバージョンで共通**

* 左側のメニューから「システムの詳細設定」を選択
* 詳細タブの下の方にある環境変数ボタンをクリックします
* ダイアログの下側の「システム環境変数」から変数の欄がPathとなっている箇所を選択し、「編集」を選択
![システム設定 (1).png](https://qiita-image-store.s3.amazonaws.com/0/60405/2c0af074-9dfe-8f40-281c-918dc4369487.png)

* 現在の変数値の末尾に";"を記載し、その後ろに「C:¥Python27;C:¥Python27¥Scripts」を追加する
![Pathの追加.png](https://qiita-image-store.s3.amazonaws.com/0/60405/8186c58d-354f-7389-72a4-bfd74868d106.png)


4 Pythonの動作確認

- コマンドプロンプトを管理者権限で起動する

この後行うインストールでは管理者権限が必要なので、管理者権限で起動する。
**Windows8**
管理者としてコマンドプロンプトを起動 - Windows8
http://pc-karuma.net/administrator-command-prompt-windows8/
を参照

**Windows7以前**
「スタート」->「アクセサリ」->「コマンドプロンプト」を右クリックし、管理者として実行を選択する。


- コマンドプロンプトが起動したら **python**　と入力して、Python 2.7.9 ... のメッセージが表示されれば、インストール完了
- コマンドプロンプトに **exit()** と入力してpythonを終了する

## numpyをインストール
1 ファイルをダウンロード
http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/numpy-1.9.2-win32-superpack-python2.7.exe/download

2 ダウンロードしたファイルを実行しnumpyをインストール
numpy-1.9.2-win32-superpack-python2.7.exe
を実行し、インストールを実行する。質問は全て「Yes」か「Next」でOKです

## matplotlibをインストール
1 ファイルをダウンロード
https://downloads.sourceforge.net/project/matplotlib/matplotlib/matplotlib-1.4.3/windows/matplotlib-1.4.3.win32-py2.7.exe
からファイルをダウンロード

2 ダウンロードしたファイルを実行しmatplotlibをインストール
matplotlib-1.4.3.win32-py2.7.exe
を実行し、インストールを実行する。質問は全て「Yes」か「Next」でOKです

## その他、必要なライブラリをインストール
コマンドプロンプト(管理者権限で立ち上げること！)から
**pip install six**
**pip install python-dateutil**
**pip install pyparsing**
を実行する

### 注意 (2015.9.28追記)
本手順では、pipがインストールされておらずに動作しないケースがあるようです。
pip install xxxで「pipコマンドがわからない」系のエラーが出た場合は、以下を実行してください

- https://pypi.python.org/pypi/setuptools へ移動し「ez_setup.py」をダウンロード
    - 「Installation Instructions」の項にez_setup.pyのリンクがあるので、リンク先を保存してください。
- コマンドプロンプトを起動し、ez_setup.pyを格納したフォルダへ移動
- コマンドプロンプトで[python ez_setup.py]を実行
- コマンドプロンプトで[eazy_install pip]を実行
- pipのインストールが完了したら、本ページの「その他、必要なライブラリをインストール」 に戻る

## 確認
新規ファイルgraph_example.py をテキストエディタで開き、内容を以下のようにする

```graph_example.py
from numpy import *
import pylab as plt

x = linspace(-10, 10, 100)
y = x

plt.plot(x,y)
plt.show()
```

作成したgraph_example.pyを実行（ダブルクリック）して、グラフが表示されることを確認する。

![スクリーンショット 2015-04-15 13.27.14.png](https://qiita-image-store.s3.amazonaws.com/0/60405/99c65c37-3cc2-ba35-b303-99dbebd166d6.png)
Go言語のgoauth2を準公式のoauth2に変更

Go言語でOAuth2を使うためのライブラリ goauth2 が deprecated になっていて、準公式の oauth2 に変更したときのメモ。

JWTを使った認証を例にしています。

## import

変更前

```go
import "code.google.com/p/goauth2/oauth/jwt"
```

変更後

```go
import "golang.org/x/net/context"
import "golang.org/x/oauth2/jwt"
```

context.Context が必要になる。

## http.Client 取得


変更前

```go
token := jwt.NewToken(email, scope, pem)
transport, err := jwt.NewTransport(token)
if err != nil {
	return err
}
client := transport.Client()
```

変更後

```go
cfg := jwt.Config{
	Email:      email,
	PrivateKey: pem,
	Scopes:     []string{scope},
	TokenURL:   tokenURL,
}
ctx := context.Background()
client := cfg.Client(ctx)
```

TokenURLは、Googleなら`https://accounts.google.com/o/oauth2/token`
Slackのプライベートグループは削除できない

Slackのプライベートグループ名とチャンネル名とユーザー名は、重複が許されない
しかも、プライベートグループは削除できない
archiveはできるけど削除はできない

なので、

* hogeというプライベートグループが存在すると、#hogeというチャンネルは作れない
* 同様にhogeというユーザーが作れない

詰んだ！
と思ったけど、プライベートグループ名のrenameをすれば解決した

グループ名の右の下三角を押して、**Advanced options**を選択

![スクリーンショット 2015-04-15 12.16.24.png](https://qiita-image-store.s3.amazonaws.com/0/75486/c4066f29-be30-e325-3981-7385e94b8adf.png)

**Rename this group**で名前を変えることができます

![スクリーンショット 2015-04-15 12.17.20.png](https://qiita-image-store.s3.amazonaws.com/0/75486/5cce1c6b-a283-724b-15a0-547bc052920a.png)
OWASP ZAP 2.4を起動したらメニューの日本語が文字化け

# OWASP ZAP 2.4.0
脆弱性診断ツールとして活用可能なローカルプロキシーツール「OWASP ZAP」のバージョン2.4.0が2015年4月14日にリリースされました。

[OWASP Zed Attack Proxy Project - OWASP](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project#News)

# Ubuntu 14.04 LTSにインストール＆実行
## Java8(JDK) インストール
OWASP ZAPはJava7以上で動作しますが、バージョン７は2015年4月以降サポートされない予定です。
[Java 7のパブリック・アップデートの終了](https://java.com/ja/download/faq/java_7.xml)

下記サイトを参考にJava8をインストールしましょう。
[Java - ubuntuでoracle-jdk8をインストールしておく - Qiita](http://qiita.com/civic/items/daefe465600ca45d6c11)

## OWASP ZAP インストール
1. [Downloads - zaproxy - OWASP ZAP](https://code.google.com/p/zaproxy/wiki/Downloads?tm=2)の「Linux / cross platform」用のリンク「Download now」をクリック
2. ダウンロードした圧縮ファイルを任意の場所に解凍
3. 解凍後に生成された「ZAP_2.4.0」ディレクトリ内にある「zap.sh」を実行

# メニューの日本語が文字化け！
![ZAP24.mojibake.png](https://qiita-image-store.s3.amazonaws.com/0/28161/3f963766-2756-608f-f28b-c04c6da0b69f.png)

ところどころ化けている……
全部じゃないのが逆に不安に……

# 文字化け解消方法
## 本来の「ツール」→「オプション...」メニュー選択
メニューの右から3番目をクリックして、一番下の項目をクリックします。

![ZAP24.menu-01-b.png](https://qiita-image-store.s3.amazonaws.com/0/28161/d7f8b45c-4ca5-77c9-b014-efe7e421f29d.png)

## 本来の「表示」オプションで設定
表示された「オプション」ダイアログの左ペインにて下から5番目の項目をクリックします。
次に「Font Name:」プルダウンリストで日本語表示用フォントを指定して【OK】ボタンをクリックします。

![ZAP24.menu-02-b.png](https://qiita-image-store.s3.amazonaws.com/0/28161/d3320755-1325-14fb-22d5-1ab649c03777.png)


# ZAP再起動
ZAPを再起動するとメニューの文字化けが解消していることを確認できます。
![ZAP24.mojibake-kaisho.png](https://qiita-image-store.s3.amazonaws.com/0/28161/d513212f-efc4-74da-8b29-02fd5681311c.png)
Ansibleでサーバ一括再起動

### Ansibleでサーバ一括起動し、SSHログインできるまで待つ

```
---
# reboot.yml

- name: reboot all hosts and wait it come back in port 22
  hosts: all
  remote_user: ec2-user
  sudo: yes


  tasks:
    - name: hostname
      command: uname -n
      register: hostname
    - debug: msg="{{hostname.stdout_lines}}"

    - name: Restart server
      command: shutdown -r now "Reboot triggered by Ansible"
      async: 0
      poll: 0
      ignore_errors: true
      notify: Wait for server to restart

  handlers:
    - name: Wait for server to restart
      local_action:
        module: wait_for
          host={{ inventory_hostname }}
          port=22
          delay=1
          timeout=300
        #sudo: false

```
古典的オブザーバパターンをいまさら基礎からみる【デザインパターン】

## はじめに
* 色々なサイトに散らばっている情報を整理しただけ。一部Unityぽい。
* Rx流行ってるけど、そもそも根底のオブザーバパターンを理解しよう。

## オブザーバパターンを使うと何が嬉しいのか？
* Observer側もObservable側も相手のクラスの内部設計を把握しなくて良い。
* 「データが変更されたらUIに反映する」というシナリオにおいて、 `Model -> View` という直接の依存関係を無くせる。

#### オブザーバパターンに頼らない場合

```csharp
class Model
{
	// データ変更時に呼ばれる
	void DataChanged() {
		// 変更後のデータを取得
		var newData = this.GetData();
		// ModelからViewを直接変更（MVC原則に違反しています！）
		FooView.Update(newData);
	}
}
```

* GUIクラス（View）の追加が発生した時に、データ処理クラス（Model）にも変更が発生してしまう。
* Viewは見栄えをよくしたり、ちょっとしたカスタマイズをしたくなることが多い。それだけ、変更が発生しやすい部分といえる。そのためViewクラスとModelクラスは、なるべく結合度を弱めておく必要がある。 [^2]

#### オブザーバパターンを使ったミニマルな例 [^3]

```csharp
/**
 * UI側の内部実装を知らなくても、 Update() というインターフェースだけ合意がとれていれば実装可
 * Oveservable側は、誰に観察されているかは知らなくて良い
 * ただ、観察されているという事実と、自分の状態に変化があった場合に、NotifyObservers()を
 * 呼び出して、すべてのObserverのUpdate()を呼び出してやるだけ
 */
class Model : Oveservable
{
	// サボってpublic
	public string Foo;

	void DataChanged() {
		Foo = this.GetData();
		// 変更を監視者（Observer）へ通知
		this.NotifyObservers();
	}
}

// Observableのどの状態が変更されたのか、問い合わせるだけで良い
//（後述のPush型ならば引数から取れる）
class View : IObserver
{
	public UILabel Label;
	private Model dataSource;

	public Model DataSource
	{
		set
		{
			// Subscribe, Add, RegisterObserver などメソッド名は色々
			value.AddObserver(this);
			dataSource = value;
		}
	}

	// Pull型の場合 (Unityの場合この名前じゃ駄目だけど)
	void Update()
	{
		Label.text = dataSource.Foo;
	}
}

class Program
{
	public Model Model;
	public View View;

	void Start()
	{
		View.DataSource = Model;
		// ... modelのデータを変更するような処理 ...
	}
}
```
* GUIクラスが追加されてもデータ処理クラス側では一切変更の必要はなくなる

## Push型とPull型 [^1]
オブザーバパターンでは，タイミングの **通知** を主に置いているため，それ以上の情報を受け渡すには工夫がいります。この問題に対処するには伝統的に2つの方法があります。

一つは、updateの引数に変更された状態を渡すことで、Observerに通知する「 **push** 」型。
もう一つは、updateを呼び出されたタイミングでObserverがObservableに状態を問い合わせる「 **pull** 」型です。

### push型の特徴

push型は、ObserverがObservableのどの状態が変更されたのかを直接知ることができるのが特徴です。updateの引数で渡されてきたものが、変更された状態だからです。短所は、updateメソッドに引数をとる形でインターフェースを定義しなければならないので、一般化に向かない点です。

```csharp
// Push型の場合、Interfaceで型を指定しなければならない。
// 故に、全てのObserverクラスで型を一致させる必要がある。
// 一方で用途が限定されているときはシンプルに書ける
interface IObserver
{
	void Update(String value);
}

// IObserverを実装した例（先のミニマルな例と見比べると違いがわかる）
void Update(string text)
{
	Label.text = text;
}
```

### pull型の特徴

pull型は、一般化した形でupdateメソッドを定義できます。しかし、Observableのどの状態が変更されたのかをObservableに問い合わせなければなりません。Observableに状態が非常にたくさんある場合は、なんらかの方法を使わなければ、複雑になってしまいます。

### pushとpullの使い分け

「push型」と「pull型」のどちらを使うかは、単純にObservableの状態の複雑さで決めればいいと思います。Observableの状態が単純でならばpull型。Observableの状態が複雑で、多くのフィールドを持つような場合はpush型にするといいと思います。

## 参考資料
* [実践デザパタ-その14:Observerパターン](http://hamasyou.com/blog/2004/07/25/observer/)
* [事例で学ぶデザインパターン  第５回 Observer パターン ](https://www.ogis-ri.co.jp/otc/hiroba/technical/DesignPatternsWithExample/chapter05.html)
* [[C#][Design Pattern] C# による Observer パターンの実装](http://blog.shos.info/archives/2012/12/csharp_observerpattern1.html)

## おわりに
* 勉強がてら書いているので何か間違いがあった場合、ご指摘下さると幸いです。

[^1]: [実践デザパタ-その14:Observerパターン](http://hamasyou.com/blog/2004/07/25/observer/)より。一部改変
[^2]: [事例で学ぶデザインパターン  第５回 Observer パターン ](https://www.ogis-ri.co.jp/otc/hiroba/technical/DesignPatternsWithExample/chapter05.html)より
[^3]: フレームワーク部は省略。参考資料を参照されたい
Apache2.4のhttpd.confに設定するルートサーバーのパス

Jsoupでパースプログラムを作成中
肝心のPOST先がまだできていないので自分でapacheでローカルサーバ立てて、
ハリボテhtmlファイル置いてそいつにPOSTすることにした
（この対策が正解かはわからない）

Apache2.4のconfファイル設定後、httpdコマンド実行しても動かなかった
（ここまでの設定方法はAdminWebを参照 AdminWeb:http://www.adminweb.jp/apache/）

結局confに設定するルートサーバのパス設定が悪かったみたい

誤：ServerRoot "c:\Program Files\Apache Group\Apache24"

一応パスをダブルクォート(")で囲っているから、ブランクが入っているパスでも
行けるのかと思ったらダメだった
なのでこんな風に変えた

正：ServerRoot "C:\PGFiles\Apache\Apache24"

なんでインストールする時のデフォルトフォルダ(Program Files)のパスにブランクがはいっているのか～
という件については議論され尽くしていると思うので割愛
FBX更新後にPrefabを再作成すべきか？

#概要
FBXデータで構成されたPrefabがあったとして、
FBXデータを更新、リインポートした場合にPrefabを再作成すべきなのか？
その判断基準を調べました。

#再作成が必要なケース
##オブジェクト数が増減した時
FBX内部のオブジェクトが増えたり減ったりした場合、
FBXをリインポートしただけではPrefab側には反映されません。
例えば下記のようなケースで再作成が必要。

* 複数のメッシュをマージして１オブジェクトに修正した
* メッシュを分割して２オブジェクトに修正した

##オブジェクトのTransformが変わった時
FBX内部のオブジェクトTransfromが変わった場合、
Prefab側のTransformへは反映されません。
例えば下記のようなケースで再作成が必要。

* オブジェクトの位置を動かした

##アサインしているマテリアルが変わった時
FBXをリインポートした結果、これまでとは別のマテリアルを参照することになった場合、
Prefab側のRendererはリインポート前のマテリアル参照状態のままです。
例えば下記のようなケースで再作成が必要。

* アサインしているマテリアル名を変更した
* メッシュに別名のマテリアルをアサインした

##BoxCollider用オブジェクトの形状を修正した時
もしFBXデータ内のメッシュからBoxColliderを生成している場合、
対象メッシュ形状を修正した場合もPrefabの再作成が必要な可能性があります。
BoxColliderはMeshColliderと違い、MeshFilterでメッシュを参照していないため。

#再作成が不要なケース
##既存メッシュの頂点編集やUV編集などを行った時
Prefabに格納されたGameObjectは直接メッシュを内包しておらず、
GameObjectに付与されたMeshFilterコンポーネントでメッシュを参照しています。
その為、メッシュへの修正はリインポート時点でPrefabに反映されます。

#Prefab再作成の影響
意識しておくべき再作成の影響
* ライトマップが外れる可能性がある（再作成のやり方によってオブジェクトIDが変わるため）
* ライトマップのリビルドが必要な場合がある（メッシュ形状変化などは当然必要９
リフレクションで親クラスのprivate変数を取得する方法

リフレクションで親クラスのprivate変数が取得したかったのに上手くいかなくて少しだけ調査してしまったので結果だけペタリ。

あまりいい例が思いつかなかった。

```php:Ranko.php

class Human {
	private $realSerif = "こんにちは";
}

class Ranko extends Human {
	private $serif = "煩わしい太陽ね";

	public function hello()
	{
		echo $this->serif;
	}
}
```

この状態で親のprivateSerifを取ろうとしてもExceptionになる。

```php:実行
$ranko = new Ranko();
$reflectionClass = new ReflectionClass(get_class($ranko));

echo $reflectionClass->getProperty('realSerif');

```

```php:出力結果
#1 /htdocs/index.php:18
   ReflectionClass::getProperty($string1)
#2 /htdocs/index.php:18
   UNCAUGHT EXCEPTION: ReflectionException (Property realSerif does not exist)


$string1:
string(9) "realSerif"
```

単純に親を取得してからアクセスしてあげればよかった。

```php:実行
$ranko = new Ranko();
$reflectionClass = new ReflectionClass(get_class($ranko));

echo $reflectionClass->getParentClass()->getProperty('realSerif');
```

```php:出力結果
Property [ private $realSerif ]
array(1) {
  [0]=>
  &object(ReflectionProperty)#4 (2) {
    ["name"]=>
    string(9) "realSerif"
    ["class"]=>
    string(5) "Human"
  }
}
```
Objective-Cで絵文字入りの文字列の長さを取得する

# はじめに

Objective-Cでは文字列は`NSString`を利用し、その長さを取得するには`length`メソッドを使うのが一般的です。
ですが、これだと昨今頻繁に使われている絵文字などが混在した場合に"見た目通りの"長さが取得できません。

```objc
NSString *text = @"あ🌟い🐶う🐱え✪お☆";
NSLog(@"length: %@", @(text.length));
//=> length: 13
```

# 絵文字入りの場合はenumerateSubstringsInRangeを使う

絵文字が混在している場合は`enumerateSubstringsInRange`を`NSStringEnumerationByComposedCharacterSequences`オプションで利用することで"見た目通りの"長さが取得できます。

`NSString`のカテゴリとしてメソッドとプロパティを定義してあげると使いやすいと思います。

```objc:ヘッダー
#import <Foundation/Foundation.h>

@interface NSString (GraphemeLength)

/**
 *  人間の見た目通りの文字数を返す。
 *  絵文字などNSStringのlengthでは2文字扱いになってしまう文字を含む文字列向け。
 */
@property (assign, nonatomic, readonly) NSInteger graphemeLength;

/**
 *  人間の見た目通りの文字数を返す。
 *  絵文字などNSStringのlengthでは2文字扱いになってしまう文字を含む文字列向け。
 *
 *  @return 見た目通りの文字数
 */
- (NSInteger)graphemeLength;

@end
```

```objc:実装
#import "NSString+GraphemeLength.h"

@implementation NSString (GraphemeLength)

- (NSInteger)getGraphemeLength {
    return [self graphemeLength];
}

- (NSInteger)graphemeLength {
    __block NSInteger length = 0;
    
    [self enumerateSubstringsInRange:NSMakeRange(0, [self length])
                               options:NSStringEnumerationByComposedCharacterSequences
                            usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {
                                length++;
                            }];
    
    return length;
}

@end
```

## 使用例
```objc
NSString *text = @"あ🌟い🐶う🐱え✪お☆";
NSLog(@"length: %@", @(text.graphemeLength));
//=> length: 10
```

## 追記
コメント欄にてご指摘がありました。
`NSStringEnumerationByComposedCharacterSequences` は一部の絵文字（国旗の絵文字（🇯🇵など））は2文字としてカウントしてしまうため、上記の方法では完全にSwiftの`count`メソッド（Swift1.1では`countElements`関数、Swift1.2では`count`関数）と同等の結果は得られないようです。

## 追記（2016/11/18）
こちらの記事を読んでいて気づいたのですが、現状仕様が変わっているようです。

[Swift3.0で絵文字かどうかを判定するスマートな方法を考えた](http://qiita.com/takabosoft/items/e8d99b2c5899616517d8)

`NSStringEnumerationByComposedCharacterSequences` を利用した場合、🇯🇵や👩‍👩‍👧‍👦なども1文字としてカウントするようになっていました。

また、当時試していなかったのですが、少なくともSwift 3.0では、👩‍👩‍👧‍👦は `characters.count` で4文字とカウントされるようです。

# おまけ

~~Swiftでは`countElements`や`count`で一発です・ω・~~
追記したとおり、👩‍👩‍👧‍👦など、1文字としてカウントされない絵文字があります。

```Swift:Swift1.1
let text = "あ🌟い🐶う🐱え✪お☆";
println("length: \(countElements(text))")
//=> length: 10
```
```Swift:Swift1.2
let text = "あ🌟い🐶う🐱え✪お☆";
println("length: \(count(text))")
//=> length: 10
```
```Swift:Swift2.1
let text = "あ🌟い🐶う🐱え✪お☆";
print("length: \(text.characters.count)")
//=> length: 10
```
jQueryでメニュー等の領域外をクリックした時に閉じるようにする

#思ったこと
jQueryを使ってメニュー等の表示、非表示を切り替えるときにtoggleClass()とCSSを使ってメニューを隠したり隠さなかったりするというやり方はシンプルだけど、メニューの外をクリックした時もメニューが消えずにうっとおしかった。

#ググった結果
何やらややこしいやり方しか書いてなかった。

#やったこと
領域外クリックの検知
jQuery側
`$(document).click(function() {　$('#menu').hide();　});`


これだけ。
#問題点
このままでは表示した要素内をクリックするとその要素自体も消えてしまう。もともと非表示のメニュー等、消えても問題のない場合もあるが、殆どの場合は要素内をクリックして消えられては困る。

#解決策
`$('#menu').click(function() {　event.stopPropagation();　});`
の一行を追加。

これで親要素にイベントが伝わらなくなるので要素内をクリックしても消えなくなる。

#結論
これが最適なのかはわからないけどとりあえず動いた〜！と言った感じ。
"そんなもん当たり前や！"とか"文章がわかりづらい"とか思われたらすみません。
独学で勉強を始めたばかりなので間違っていることとかもっと効率のいい方法とかいったようなことがあればご教示ください。
slackのユーザー名を日本語表示にする方法

slackのユーザー名を日本語表示にする方法

#結果
![slack タイムラインUsername表示.png](https://qiita-image-store.s3.amazonaws.com/0/49562/d2c44c86-a9fd-7c3c-95b9-145184bf7cb1.png)
　　↓
![slackタイムライン日本語になった.png](https://qiita-image-store.s3.amazonaws.com/0/49562/4c878676-629a-ff89-5281-054f507cdc20.png)

日本人にはこっちのほうがなじみやすいですね。

#設定方法

1. プロファイルに、日本語の名前を設定
1. Preferencesで、フルネームを表示する設定に変更

##プロファイルに、日本語の名前を設定

https://{チーム名}.slack.com/account/profile で、First & Last Nameを設定する。

![slack名前設定.png](https://qiita-image-store.s3.amazonaws.com/0/49562/1a1730fd-9791-2cb8-c0d7-6e8300faf93d.png)

##Preferencesで、フルネームを表示する設定に変更

・Preferencesの画面を出す

![slack Prefernces出し方.png](https://qiita-image-store.s3.amazonaws.com/0/49562/9abfca2a-cf9e-49fd-67ab-3b85f543237f.png)

・フルネームを表示する設定

![slackフルネーム表示にする設定.png](https://qiita-image-store.s3.amazonaws.com/0/49562/9e0abc5e-6dc7-bdc0-3ad1-a0ff90fe230b.png)

以上です。
関数のデコレーターを作る


以下の様に関数の前/後処理をするデコレーター (tag付き) を作って使い回したい.

```python
>>> @MyDecorator('any-tag')
... def foo():
...     print u'foo'
... 
>>> foo():

pre-action. tag=any-tag.
foo
post-action. tag=any-tag.
```

この様にして作る.

```python
class MyDecorator(object):
    
    def __init__(self, tag):
        self._tag = tag
    
    def __call__(self, f0):
        def decorated(*args, **kwargs):
            print u'pre-action. tag=' + self._tag
            ret = f0(*args, **kwargs)
            print u'post-action. tag=' + self._tag
            return ret
        return decorated
```

functools.wrapsを使った版.

> @termoshtt さん、ありがとうございます （＾◇＾）

```python
from functools import wraps

def MyDecorator(tag):
    def dec(f0):
        @wraps(f0)
        def decorated(*args, **kwargs):
            print u'pre-action. tag=' + tag
            ret = f0(*args, **kwargs)
            print u'post-action. tag=' + tag
            return ret
        return decorated
    return dec
```
【PHP】curlでproxyを通した場合、余分なヘッダーが付くときの対処法

レスポンスのbodyを以下のようなコードで取得する場合

```php:index.php
list($header, $body) = split("(\r\n){2}", $resp);
```
PROXYを通すとヘッダーに
HTTP/1.0 200 Connection established
がついてしまい、上手く取得できない。

* 対処法
 
以下を追加する

```php:index.php
if (false !== stripos($resp, "HTTP/1.0 200 Connection established\r\n\r\n")) {
$resp= str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '',  $resp);
}
```
sublime text 3 > ConvertToUTFの不具合 > sublime text2に変更した

```txt:動作確認
Windows 8.1 Pro
```

Sublime text 3にてShift_JISを使うためConvertToUTFをインストールした。

いくつかのファイルでは日本語が正常に表示されたが、日本語が文字化けするファイルもあった。
原因はわからなかった。

結局のところ、Sublime Text 2をインストールしなおしたところ、こちらではすべてファイルで日本語文字化けは発生しなくなった。
問題はSublime Text2ではFortranのsyntax ハイライト関係で固まる点。

<hr>
(追記 2017/03/22)

以下に書いている方法で対応できるかもしれない。~~未確認。~~
http://qiita.com/yuji0602/items/8b317680231060db20b8

Windows 7(32bit)環境でSublime Text3をインストールし、Package Controlをインストールした。
Codecs33というパッケージは見つからず。
NavigationDrawerのアイコン色を変更する

Androidアプリのホーム画面によく使用する、NavigationDrawerの三本線アイコン（ハンバーグアイコン）の色を変更する方法です。

![DrawerToggle.png](https://qiita-image-store.s3.amazonaws.com/0/57610/1491f5cc-c6e3-1c9e-2d59-775524944e45.png)


## カスタムテーマを作成する
アイコン色の設定はここで行います。drawerArrowStyle属性で設定するので、下記のように記述します。
既に使用しているテーマがある場合は、drawerArrowStyeを追記する。

```xml:styles.xml
    <style name="MyCustomTheme" parent="@style/Theme.AppCompat.Light">
        <item name="drawerArrowStyle">@style/CustomDrawerArrowStyle</item>
    </style>
    
    <style name="CustomDrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="color">#0000ff</item>
    </style>
```

## カスタムテーマを使用するようにAndroidManifestに記述する
applicationタグの属性に追記。既にテーマを指定している場合は設定不要です。

```xml:AndroidManifest.xml
   <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MyCustomTheme">
        
       ~~~
        
    </application>       
```

おわり！


![DrawerToggle2.png](https://qiita-image-store.s3.amazonaws.com/0/57610/3d54359b-1c69-2c9f-3236-3c6bb6112f84.png)
CakePHP3からAmazon SESを使ってメールを送る

# SESの設定

SESの初期設定は、すでにQiitaにたくさん情報があるので、そちらを参考に
http://qiita.com/search?utf8=✓&sort=rel&q=SES&sort=rel

「Create My SMTP Credentials」を実行し、**SMTP Username**と**SMTP Password**を取得します
さらに、Amazon SESのダッシュボードに記載されている**Server Name**も必要です

Fromで使うメールアドレス、Toで使うメールアドレスともに、
「Verified Senders」＞「Email Addresses」から「Verify a New Email Address」でVerifyしておきましょう

# CakePHP

config/app.phpに、SESの設定を投入します

```php:config/app.php
    'EmailTransport' => [
        'default' => [
            変更なし
        ],
        'ses' => [
            'className' => 'Smtp',
            'host' => '<Server Name>',
            'port' => 587,
            'timeout' => 30,
            'username' => '<SMTP Username>',
            'password' => '<SMTP Password>',
            'tls' => true,
        ]
    ],
```

実際に送信する処理

```php
$email = new Email('default');
if (!$debug) {
    $email->transport('ses');
    $email->returnPath($from);
} else {
    $email->transport()->config(['additionalParameters' => '-f ' . $from]);
}
$isCli = php_sapi_name() === 'cli';
if ($isCli) {
    // CLIからの送信の場合はdomainメソッドを呼ぶ
    // http://book.cakephp.org/3.0/en/core-libraries/email.html#sending-emails-from-cli
    preg_match('/@(.*)$/', $from, $matches);
    $domain = $matches[1];
    $email->domain($domain);
}
$email->from($from);
$email->subject($subject);
$email->to($to);
$email->send($body);
```

こんな感じで送信します
メールが届くことが確認できたら、プロダクションアクセスを申請しましょう

# 注意点

SESのプロダクションアクセスを手に入れるまでは、送信元のメールアドレスはもちろん、送信先のメールアドレスも承認されたものでないとなりません
忘れずにVerifyしておきましょう
AWSに環境展開する際のネットワークセキュリティについて


* とてもベーシックレイヤーなところの話しです
* 方々で語られている内容なので、目新しさはなーんにもありません
* AWS触り始めたのが最近なので、Classic環境ではなくVPC環境しか知りませんのであしからず
* IAMなにがし、とか、そういうのはまた別の機会にて

## Security GroupとNetwork ACL

* ネットワークレベルでのアクセス制限を設定する道具として、AWSには以下の2種類のテクノロジがあります
	* Security Group
	* Network ACL
* Security GroupとNetwork ACLは同時利用可能
* 評価は両方の条件で判定を OR して、どちらかが拒否した場合、その通信は拒否されます（拒否が優先条件）

### それぞれの特徴

#### Network ACL

* InboundとOutboundの通信についてプロトコル、アドレス、（TCP/UDPの場合）ポートを指定して許可・拒否を設定出来る
* Inboundを許可したトラフィックに対応するOutboundを自動的に許可すると言うようなステートフル動作はせず、ステートレス動作です
* ステートレスである為、任意の通信を許可しようとした場合、Outboundについてはかなり広いポート範囲を通信許可する必要があります
* 通信元や通信先はネットワークアドレスで指定します
* ルールセット内で評価順序を設定出来ます
* ルールセット内の評価順序が早い（強い）所に許可がある場合、後に拒否があっても、その通信は許可されます
* ルールセットはサブネットに割り付けます

#### Security Group

* InboundとOutboundの通信についてプロトコル、アドレス、（TCP/UDPの場合）ポートを指定して許可を設定出来る
* Secutiry Groupに書かれていない条件は拒否扱い（逆説的に、明示的拒否は設定出来ない）
* Inboundを許可したトラフィックに対応するOutboundを自動的に許可できる（逆も同様）ステートフル動作をします
* 通信元や通信先はネットワークアドレスだけでなく、セキュリティグループのIDを指定する事も可能
* ルールセットはインスタンスに割り付けます（実際にはユーザーが作ったEC2インスタンスだけでなく、色々なAWSリソースに割り付けるシーンがあります）

### Network ACLの扱いにくい点

Network ACLを使うと、一般的な構成の利用をした場合、Outboundについて広く許可しないと通信不能になります（送信元ポートを限定する設定が可能であれば別の話ですが…そういう物はあまり見たことがない）。
例えば、Webサーバーの場合、以下のようにInboundに対してOutboundを非常に大きく開く必要があります（参考例です。Outbound側はOSやプログラムによって利用されるポート範囲が異なりますので、利用するOS・プログラムのドキュメント参照のこと）。

| 方向 | ポート/プロトコル | アドレス | 可否 |
| :-----: | :----- | :-----: | :-----: | :-----: |
| Inbound | 80/tcp | 0.0.0.0/0 | Allow |
| Outbound | 1024-65535/tcp | 0.0.0.0/0 | Allow |

また、Inboundに対応したOutboundが動的に許可されているわけではなく、静的に開いた状態にする必要がある為、対応するInboundトラフィックが存在しないOutboundトラフィックを発生することが可能となってしまうという問題もありますので、ネットワークレベルでのアクセス制限を実現する為には、Security Groupとの併用が望ましいと考えられます。

## Route Table

1. ルーティングの設定をサブネットごとに割り付けするテーブルです
2. 複数作成出来ますが、サブネットにアサイン出来るのは1つのテーブルのみです
3. ルーティングする対象ネットワークのネットワークアドレスと、送信先のゲートウェイを記述します
4. ゲートウェイはIPアドレスまたは、インスタンスID（ENIのID）を書く事が出来ます
5. VPCのネットワークアドレスはデフォルトで記述されて、かつ、ローカルに存在すると定義されています（かつ、削除出来ません）
6. ↑の仕様があるので、ルーティングベースでサブネット間の通信を遮断するのは困難であり、Network ACLやSecurity Groupを利用して遮断を試みる必要があります（裏技的に、ブラックホールルーターを作り出して、そこにルーティングさせてしまうという手もありますが…）

## S3エンドポイント

* つい最近追加された機能で、VPCの内側にS3へのアクセスエンドポイントを生成できる機能です
* IGWを設置せずともS3へアクセス出来る様になる為、S3へのアクセス目的でIGWの設置やNATの設置をしていた場合、これらを外す事が可能になります
* VPC内からインターネットに接続させる必要はないが、S3は使いたい為、やむを得ずIGWやNATを設置していたというパターンにおいて、これらを外せる大きなメリットがあります
* S3自体はパブリック空間に存在する為、アクセス制限の設定を誤ると、外部にデータ公開してしまうリスクはそのままです
* エンドポイントを作っただけでは利用出来ず、ルーティングテーブルへの追加（S3エンドポイントへのルーティングが自動で追加されます）と、エンドポイントへのアクセス許可（エンドポイントのIDに向けたOutboundトラフィック）を設定する必要があります
* Network ACLでアクセス先（Outboundトラフィック）を絞った設定をしている場合、相性が悪い可能性があります（エンドポイントのアドレスがはっきり為ず、IDでの表現になる為）
* Security GroupのOutboundに制限設定をしている場合（0.0.0.0/0に対する許可をしていないなど）、エンドポイントIDを対象としたOutbund HTTP/HTTPSのトラフィックを許可する必要があります（HTTPSのみでアクセスする場合は、HTTPは不要）
knife solo data bag


## 目的
* chefのdata bagを利用して、ID/PWといった秘匿すべき情報をrecipeに含める。
* knife soloから暗号化されたdata bag を利用するため、knife-solo_data_bagを利用する。

## 実行

### 準備

* knife solo で利用できるencrypted databagの設定が別途必要。gemをつかってknife-solo_data_bagをインストールする。

```Bash
$ gem install knife-solo_data_bag
```

* 秘密鍵の作成と設定を行う。

```Bash
$ mkdir data_bag_key
$ cd data_bag_key
$ openssl rand -base64 512 > secret_key

## 作成したkeyは他の場所に保管しておくこと
```

```ruby:.chef/knife.rb
cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
encrypted_data_bag_secret "data_bag_key/secret_key" // これを追加

knife[:berkshelf_path] = "cookbooks"
```

* knife soloのEDITORを設定する。

```Bash
$ export EDITOR=emacs # 適当なEDITORを指定しておく
```

### data bag の作成

* data bagの編集を開始。今回は"passwords"の"wordpress"を作成。編集時は平文だが、保存したファイルにはencryptedなデータが保存される。生成されるdata bagファイルは直接編集できないことに注意。更新もknife soloからとなる。

```Bash
# 下記コマンドの実行で指定のEDITORがOpen

$ knife solo data bag create passwords wordpress # 作成

$ knife solo data bag edit passwords wordpress # 編集の場合こちら

```

```wordpress.json_opened_by_EDITOR
{
  "id": "wordpress",
  "user": "your name",
  "password": "your password"
}
```

### data bagの利用

* 以下のようにrecipesなどから定義したdata bagを利用する（１行目で取り出し→その後は利用例）。

```ex)attribute/default.rb
wordpress = Chef::EncryptedDataBagItem.load("passwords", "wordpress")

override['wordpress']['db']['name'] = "wordpress"
override['wordpress']['db']['user'] = wordpress['user']
override['wordpress']['db']['pass'] = wordpress['password']
```
技術英語 > give or take ... > It will take an hour, [give or take] a few minutes.

きっかりした値でなく、「プラスマイナスxxx」という時に
give or take
を使う。

「1時間プラスマイナス2,3分」という時、以下のように使う。
It will take an hour, [give or take] a few minutes.

<hr>
(追記 2017/04/28)

@ 映画「マイティ・ソー/ダーク・ワールド」

人間の女性へ恋に落ちたThor。
5000歳までの年齢を持つThorに対して、100歳程度しかない人間についてオーディンが言及すると、Thorが

> Give or take a few thousand years

スケールが違う。
RaspbianでPython 3からpython-smbusを使う

python-smbusを使用すると、PythonコードからI2Cバスにアクセスできます。しかし、2015/04/15時点のRaspbianパッケージのリポジトリには、Python 2に対応したpython-smbusしかありません。また、python-smbusを含む[i2c-tools](http://www.lm-sensors.org/wiki/I2CTools)の最新版（3.1.1）も、Python 3に対応していません。しかし、開発版をダウンロードしてビルドすることで、Python 3からpython-smbusを使用できます。なお、開発版はPython 3に対応していることから、i2c-tools 3.1.1の次バージョンではPython 3に対応するものと思います。

方法は下記の通りです。なお、「$」はプロンプトを表します。

0. ビルドに必要なライブラリのダウンロード
1. i2c-toolsの開発版のダウンロード
2. i2c-toolsのビルド、インストール
3. python-smbusのインストール

# ビルドに必要なライブラリのダウンロード

下記の通りlibi2c-devをインストールします。

```shell-session
$ sudo apt-get install libi2c-dev
```

# i2c-toolsの開発版のダウンロード

Subversionがインストール済みであれば、下記の通り[i2c-tools](http://www.lm-sensors.org/wiki/I2CTools)の開発版をダウンロードします。

```shell-session
$ svn export http://lm-sensors.org/svn/i2c-tools/trunk i2c-tools
```

Subversionが未インストールの場合は、下記の通りインストールします。

```shell-session
$ sudo apt-get install subversion
```

# i2c-toolsのビルド、インストール

python-smbusをインストールする前に、i2c-toolsのビルドとインストールを行います。

```shell-session
$ cd i2c-tools
$ sudo make install
```

# python-smbusのインストール

i2c-toolsのインストールを終えたら、Python 3にpython-smbusをインストールします。

```shell-session
$ cd py-smbus
$ sudo python3 setup.py install
```
Memo: Windows Qt5.4.1-mingwからR 3.1.3を使う(ただしRserve経由)


## 経緯
0. C++から、Rを操作したい
0. [`Rinside`](http://cran.r-project.org/web/packages/RInside/index.html) というのがある。
0. [`Rtools`](http://cran.r-project.org/bin/windows/Rtools/)をいれて、その環境からだとできた。
0. Qtから使いたい。Qt-5.4.1 mingw491_32(dwarf2?) と　Rtoolsのgcc-4.6.x(sjlj?)では、リンクできない。 ググると同じもの使え、とでてくる。
0. [`Qt64-NG`](http://sourceforge.net/projects/qt64ng/) で、`qt-5.4.1-x64-mingw492r1-sjlj-rev1.exe (832.0 MB)`ってのが配布されてる。**-sjlj-**　... しかし、×。 
0. Rtoolsのコンパイラで、Qtをビルドしないといけない？？ ... めんどい
0. [`Rserve`](http://cran.r-project.org/web/packages/Rserve/index.html) というので、cxxのクライアントサンプルがついてくる。 ... 簡単にQtから呼び出せた。

## 準備
0. Rを立ち上げて、
0. > `install.packages("Rserve")`   ## 初回のみ
0. > `library(Rserve)`
0. > `Rserve()`


## サンプルのビルド
C:/\_R\_のフォルダ__/library/Rserve/client/cxx/ にサンプルコード。
`sisocks.h`の `#define ECONNREFUSED WSAECONNREFUSED` ～ 再定義されてるというwarningがでるので、その周辺をコメントアウト。

## 簡単な例

#### プロジェクト準備
0. QtCreatorで、新規プロジェクト。
0. ヘッダ類`Rconnection.h`, `Rsrv.h`, `sisocks.h`と `RConnection.cc`をこぴる。
0. .proのに↓のようなのを追加

```mf:xxx.pro
..
DEFINES += Win32
LIBS+=-lwsock32
HEADERS += \
    $$PWD/Rconnection.h \
    $$PWD/Rsrv.h \
    $$PWD/sisocks.h

SOURCES += \
    $$PWD/Rconnection.cc
```

#### メイン

```cpp:main.cpp
...
#include <QDebug>

#define MAIN         // we are the main program, we need to define this
#include "sisocks.h"
#include "Rconnection.h"

int main(int argc, char *argv[])
{
...
    initsocks(); // this is needed for Win32 - it does nothing on unix
    Rconnection *rc = new Rconnection();
    int i=rc->connect(); // 0じゃなかったらエラー

    qDebug() << ((Rdouble*)rc->eval("sum(2.2,3.3)"))->doubleAt(0);
    qDebug() << ((Rstrings*)rc->eval("as.character(sum(3.3,4.4))"))->stringAt(0);

    Rexp *xp = rc->eval("sum(4.4,5.5)");
    qDebug() << "type=" << xp->type 
             << ", len=" << xp->len 
             << ", result:" << ((Rdouble*)xp)->doubleAt(0);
    // >> type= 33
    //Rsrv.h - #define XT_ARRAY_DOUBLE  33 /* P  data: [n*8]double,double,.. */

...
}
```
#### 結果

```
Debugging starts
5.5
7.7
type= 33 , len= 8 , result: 9.9 
Debugging has finished
```
開眼！JavaScriptの2.9のまとめ　ホストオブジェクト

開眼！JavaScriptの2.9のまとめです。

##2.9　ホストオブジェクト
*WebブラウザなどのJavaScript実行環境は「ホストオブジェクト」と呼ばれる複数のオブジェクトを持っている。例えばWebブラウザ環境ではwindowオブジェクトと、windowオブジェクトに保持されているすべてのオブジェクトがホストオブジェクトとされている。またJavaScript言語仕様とホストオブジェクトとの間には何も関係がない（ECMAScript標準の一部ではない）が、実行時に利用することができる。*

ホストオブジェクトはJavaScript実行環境（Webブラウザなど）が提供するものなので、下記を実行するとIEとChromeでは結果が異なります。

```
for (x in window) {
    console.log(x);
}
```
開発時にログを見るならtailよりもless！！

アプリの開発をしていると、アプリが吐き出すのログを見ることが多いと思います。
以前会社の同僚に教えてもらったので、自分で考えをまとめるために記事にします。

背景
-------------------------
僕の場合Railsで開発することが多く、development.logなどを見ることが多いです。
ログを垂れ流して見る場合ターミナルで `tailf` コマンドや `tail -f` を使っていて、
必要があれば `Ctrl-c` で止めてターミナルをスクロールしてログを見ていました。
あとはターミナルの検索機能で文字列検索したり。。。などなど

そんな人に **tail** ではなく **less** を使うとちょっと便利だよという内容です。

lessの基本
-----------------------

Unix関連のOSには多分デフォルトでインストールされていると思います。
コマンドの引数にファイル名を指定して起動します。
操作感は **more** や **vi** と似ています。
**vi** とは違い起動時にファイルの中身をすべて読み込むわけではないのでとても起動が早いです。<=ここが魅力
すごい容量のファイルでも起動待ちなく開くことができます。

```
less ファイル名
```

lessでログを見る （-F オプションを使ってログを垂れ流す）
----------------------

ここが一番言いたいことです。
lessでファイルを開いた後、 **`F` (shift-f)** を押すことで画像のような `Waiting for....` という表示がされると、ファイル末尾を `tail -f` と同じような感じでモニターできる。
![スクリーンショット 2015-04-15 7.27.24.png](https://qiita-image-store.s3.amazonaws.com/0/6038/d5aacc48-a4d3-f74d-0b33-08826f4cd910.png)

止めたいときは、 `Ctrl-c` で通常の **less** に戻る。そこで普通に `/` (スラッシュ)とかで検索ができたりする。
`tail -f` よりも少し便利。 **less** の状態を抜けることなく一気通貫でログの閲覧ができます。

lessのおすすめオプション
----------------------

lessを起動するときに僕が利用しているオプションです。

```
less -qR ファイル名
```

- -q  
  ベルを鳴らさない。スクロールしていて末尾に辿り着いた時に音が「ポンッポンッ」ってなるのを止めたかった。
- -R  
  ANSIカラーのエスケープシーケンス `ESC [ ... m` が含まれていると、ちゃんとカラーで表示してくれる。  
  Railsのdevelopment.logとかだいたいANSIカラーのエスケープされているため。


aliasを設定するといい感じです。

```.bashrcとか
alias less='less -qR'
```

上記書いたことのほとんどはManページに書かれています。ご参考までに。
[Man page of LESS](http://linuxjm.sourceforge.jp/html/GNU_less/man1/less.1.html)


余談、、
lessだいぶいいと思いながらも、、手癖が染み付いていて、無意識に `tail -f` を打っちゃうのを治したい orz
Moment.jsを使ってUNIXタイムスタンプをISO 8601表記に変換する

ISO 8601のUTCタイムゾーンでtimestampが保存されたMongoDBがあります。レンジクエリを書くときにISO 8601で引数を渡していますが、UNIXタイムスタンプを使ってクエリできないか調べました。[Moment.js](http://momentjs.com/)を使うといろいろな表記の日付をパースしたりフォーマットすることができます。


## テスト用のDockerコンテナ

Dockerイメージをビルドするプロジェクトを作成します。

``` bash
$ mkdir -p ~/node_apps/moment-spike
$ cd !$
```

```json:~/node_apps/moment-spike/package.json
{
    "name": "moment-spike",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
       "moment": "~2.8.1"
    },
    "scripts": {"start": "node"}
}
```

Dockerfileを作成してイメージをビルドします。ベースイメージは[google/nodejs-runtime](https://registry.hub.docker.com/u/google/nodejs-runtime/)を使います。

``` bash
$ echo FROM google/nodejs-runtime > Dockerfile
$ docker pull google/nodejs-runtime
$ docker build -t moment-spike .
```

## 使い方

使い捨てのDockerコンテナを起動します。

``` bash
$ docker run --rm -it moment-spike 

> moment-spike@0.0.1 start /app
> node

>
```

### moment(timestamp * 1000)

UNIXタイムスタンプの作成は`moment().unix()`を使います。

``` js
> var moment = require('moment')
undefined
> start = moment().unix()
1428393579
```

UNIXタイムスタンプをフォーマットするときは``X``を指定します。単位が秒のまま引数に渡すとパースできません。

``` js
> moment(start).format()
'1970-01-17T12:46:33+00:00'
> moment(start,'X').format();
'2015-04-07T07:59:39+00:00'
```

[Unix Offset (milliseconds)](http://momentjs.com/docs/#/parsing/unix-offset/)にあるように、`moment(Number);`のNumberはJavaScriptの`new Date(Number)`と同様にミリ秒です。`moment(timestamp * 1000)`のように1000倍にしてもパースできます。

``` js
> moment(start*1000).format()
'2015-04-07T07:59:39+00:00'
```

### ISO 8601表記にする

Moment.jsで作成した日付をISO 8601表記にする場合は[Date.prototype.toISOString](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)関数を使います。

``` js
> moment(start*1000).toISOString();
'2015-04-07T07:59:39.000Z'
```
平成27年度防災アプリ公募で国土地理院が提供する防災地理情報

http://www.gsi.go.jp/common/000102476.pdf からの抜き書き。勉強用。ベクトルタイルがたくさん、特に土地条件図ベクトルタイルや明治前期の低湿地ベクトルタイルが出ますよ。あと、ハザード情報APIというものも出るそうです。詳しくは、上記PDFをご参考に。

## 実証実験地域（鎌倉市）に関するもの
- 津波浸水予想データ画像タイル（神奈川県）
- 津波浸水予想データベクトルタイル（神奈川県）
- 津波到着予想時間データベクトルタイル（神奈川県）
- 震度予想データ画像タイル（神奈川県）
- 震度予想データベクトルタイル（神奈川県）
- 液状化予想データ画像タイル（神奈川県）
- 洪水浸水想定区域データ画像タイル（神奈川県）
- 土砂災害危険区域データ画像タイル（神奈川県）
- 土砂災害危険区域データベクトルタイル（神奈川県）
- 避難所ベクトルタイル（鎌倉市）
- 避難施設ベクトルタイル（鎌倉市）
- 道路中心線ベクトルタイル（国土地理院）

## 全国レベルで提供しているもの
- 土地条件図画像タイル（国土地理院）
- 土地条件図ベクトルタイル（国土地理院）
- 明治前期の低湿地画像タイル（国土地理院）
- 明治前期の低湿地ベクトルタイル（国土地理院）
- 標高タイル（国土地理院）
- 標準地図（国土地理院）
- 淡色地図（国土地理院）
- オルソ画像（国土地理院）

## API
- 標高API（国土地理院）
- 測量計算API（国土地理院）
- ハザード情報API（神奈川県＋国土地理院）
Installerあれこれ

インストーラのメモ。なぜメモるかというと、正直どうでもいいことなのですぐ忘れるからだ。

# InstallShield

## 長年の所感
* ライセンス高すぎ。
* MSIエンジン or InstallShield独自エンジンでインストーラ作れる
* Install Shield Script はうんこだ。でもWin32API呼んでゴリゴリ書くとちょっと楽しい。
* 買収か社名変更か知らんが、InstallShield -> Macrovision -> Acresso -> Flexera と替わりすぎ。
* InstallSite最強。困ったらここに行けばいい。本当にありがとう。 (http://www.installsite.org/)

## tips
* デバッガ
 
インストールした先からデバッガのexeをコピーしてレジストリ登録すれば、Install Shield入っていなくてもデバッギングできるぜ。

```bat
copy c:\path\to\installpath\system\ISDbg.exe .
copy c:\path\to\installpath\system\SciLexer.dll .
ISDbg.exe /REGSERVER
setup.exe /d 
```

http://helpnet.flexerasoftware.com/installshield17helplib/mergedprojects/installshield17isdbg/DebuggingInstall-AnyComputer.htm

# Visual Studio Installer (VS Setup Installer)

## 所感
* VS2010とかについてるやつ
* GUIでMSIを簡単に作れる
* ゴリゴリなインストーラは苦手だと思う。

# WiX Toolset

## 所感
* MS製のOSS
* XMLベース
* ネーミングセンスがいい。コンパイルはcandle、リンカはlight、デコンパイルはdark
* Visual Studio 2012 で標準装備されたらしいけど、まだ使ってない。
* WIXというかMSIはトランザクションの機能があるので、途中でこけても元に戻してくれる
* WIXというかMSI機能豊富だけど正直重い。なんであんなに遅いんだ。
* XML嫌い。
* ここはすごく丁寧に説明している。感謝。http://wix.softark.net/

## tips
あまりしらない。拡張子がwxsのものをgithubあたりで手当たりしだい探すのが楽。

# InnoSetup

##所感
* 1番お気に入り、っていうか超便利。
* Pascalでゴリゴリいける
* 困ってもStackOverflowいけば大抵は回答がある
* もっと困ったらGithubで拡張子issを探す

##tips

とりあえず、レジストリキーの末尾が "_is1" となっているものは InnoSetup でインストール作っている奴。

`HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall`


#NSIS

##所感
* 有名だけど使ったことがない
* クロスコンパイルできるみたい
* スクリプトが好みじゃない

#InstallBuilder

## 所感
* Bitnamiの配布してるインストーラはこれ
* マルチプラットフォームで Linux/Win/AIX/HP-UXでもインストーラ作成できる

#Advanced Installer

##所感
* チュートリアルをみるとすごく便利そう
* EmEditorのインストーラはこれ
* MSIエンジンみたい
* 簡単に使った感じではこれはこれは便利。
* ゴリゴリなカスタマイズしないものであれば最有力だ
* 個人的にはInnoSetup > Advanced Installer > Install Shield > VIX > NSIS でしょうか。
capistranoでデプロイ出来ない (fatal: reference is not a tree: xxx)



## 概要
capistranoでデプロイできなかったとき
↓こんなエラーが出た時の対応

```
$ cap deploy production

...

fatal: reference is not a tree: xxx
refs/head/xxx
```


## 環境
- capistrano2


## 対応

```
$ vim config/deploy/production.rb

# ↓コメントアウト
# set :git_shallow_clone, 1
```

```
$ vim deploy.rb

# ↓コメントアウト
# set :deploy_via, :remote_cache
```
MySQLダンプ、リストア


本番環境のDBをテスト環境に移行する必要があった為、メモ。

DBをダンプする。
`mysqldump -u root DBname > dumpfilename.sql`

ダンプ先を指定する場合は
`mysqldump -u root DBname > /mnt/sdd/tmp/dumpfilename.sql`


かなりのデータ量だったので一応zip圧縮
`zip ./zipfiliname ./dumpfile.sql`

本当はscpコマンドでサーバー間のファイル移動をしたかったが、面倒臭がってFTPで移動させた。

移動先のサーバーで移動させたzipを解凍。
`unzip　zipfilename`

予め移動先のMySQLにリストアさせるDBを作成。
`mysql > CREATE DATABASE DBname`

リストア
`mysql -u username -ppassword -D DBname < dumpfilename.sql`


途中、サーバーのディスク容量が足りずハマったりでディスクの容量を増やしたり設定という作業があったが、それは別メモ。
SpriteKitを試してみる7 swift1.2での変更点(init)


swift1.2になったら文法が色々変更されましたが、中でもSKSpriteNodeのサブクラスでのinitの宣言の変更点はちょっと特徴的です。

```1.2以前
class A: SKSpriteNode {
    
}

class B: A {
    override init(){
    	let texture = SKTexture(imageNamed: "sample.png")
    	super.init(texture: texture, color: nil, size: texture.size())
    }
    
        required override init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
```


```1.2
class A: SKSpriteNode {
    
}

class B: A {
    init(){ //<- overrideが不要
    	let texture = SKTexture(imageNamed: "sample.png")
    	super.init(texture: texture, color: nil, size: texture.size())
    }
    
    required  init(coder aDecoder: NSCoder) { //<- overrideが不要
        fatalError("init(coder:) has not been implemented")
    }
}
```

親クラスでinitを宣言してない場合、override修飾子が不要になったようです。
ちなみにこれはSKSpriteNodeだけなのでUIViewのサブクラスでは必要。
どうしてこうなったのかまではまだ分かりません。
いずれ分かればこちらに追記したいと思います。
[Rails]わざわざJSTにしたTimezone設定をUTCに戻すよ on AWS


日本のサービスだし運用の都合がいいJSTに全て変換しよう！というのはよくあると思うんですが、

「あれやっぱりグローバル対応を見据えてUTCに..」
「ほかがUTCだから揃えたい..」

っていう展開になったときに戻す手順です。

# 1. EC2インスタンスのタイムゾーンをUTCに。

## 1-1. まずはインスタンスのTimezone設定を戻す。

```
ls -al /etc/localtime
# cp
sudo cp /usr/share/zoneinfo/UTC /etc/localtime 
# ln -s
sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime 
```

 注意：
 必ずls -alして現状を確認しましょう。
 記事によってはシンボリックリンクでやるやり方があるが、そこをcpで上書きしてしまうと、大本の/usr/share/zoneinfo/Japanを上書きしてしまい、戻すのはできますが面倒です（戻すはめになった経験あり）。
 
##【追記】1-2.　サーバーの再起動

timezoneを変更した場合、全てのプロセスに変更を反映させるために、サーバーの再起動が必要です。（hirot78さん、ご指摘ありがとうございます！）

```
$ sudo reboot
```


# 2. active_recordのtimezoneをデフォルトのUTCに。

active recordの設定がlocalになっている場合は戻しましょう。デフォルトはUTCになります。

```ruby
    config.time_zone = 'Tokyo'
-   config.active_record.default_timezone = :local
+   # config.active_record.default_timezone = :local
```


# 3. Time.now, DateTime.now、Date.todayをTime.zoneで置き換え

JSTを意図して書いていたTme,DateTime,Dateを書き換えます。timezone設定を変えたことで意図した時間にならないケースがあるためです。

よくあるのは以下のようなケースでしょうか。

```ruby
Time.now => Time.zone.now
DateTime.now => Time.zone.now
Date.today => Time.zone.now.to_date or Time.current.to_date
```

TimeとTime.zoneの違いは、config.time_zone = 'Tokyo' で指定したタイムゾーンかどうかです。

```ruby
# timezoneがTokyoの場合
> Time.now
=> 2015-04-14 14:37:19 +0000 #UTC
> Time.zone.now
=> Tue, 14 Apr 2015 23:37:25 JST +09:00
> Time.current
=> Tue, 14 Apr 2015 23:37:29 JST +09:00
> Time.current.to_date
=> Tue, 14 Apr 2015
> Date.today
=> Tue, 14 Apr 2015 # defaultのタイムゾーンでのdateとなってしまうので注意。

```

ポイントはなるべくTime.zoneを使うことです。Dateもつかってもいいですが、Date.todayなどはUTC時間で呼ばるため注意。timezoneのtodayがほしいときはTime.current.to_dateがスマート。


以上。


参考

* [UTCなサーバーとMySQLとで使うRailsの時間の扱いについて調べた | kanonjiのブログ](http://kanonji.info/blog/2014/08/12/utc%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8mysql%E3%81%A8%E3%81%A7%E4%BD%BF%E3%81%86rails%E3%81%AE%E6%99%82%E9%96%93%E3%81%AE%E6%89%B1%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
* [Rails 3: How to get today's date in specific timezone? - Stack Overflow](http://stackoverflow.com/questions/6060436/rails-3-how-to-get-todays-date-in-specific-timezone)
* [Ruby - Railsのタイムゾーンの闇(1) 比較クエリにはちゃんとタイムゾーンのついた値を渡そう - Qiita](http://qiita.com/sylph01/items/925107037e97265cdd40)
* [Ruby - Railsのタイムゾーンの闇(2) 設定ファイルの書き方 - Qiita](http://qiita.com/sylph01/items/8a010dda2e2ddcfdfea0)
Raspberry PIで温度と湿度を測定する


## 使ったもの

- [Raspberry PI2 Model B](http://jp.rs-online.com/web/p/processor-microcontroller-development-kits/8326274/)
    - PI3、PI zeroでも使えます
- [USBRH](http://strawberry-linux.com/catalog/items?code=52001)
- [Toshiba microSDHC UHS-I 16GB EXCERIA](http://www.amazon.co.jp/%E6%9D%B1%E8%8A%9D-Toshiba-microSDHC-EXCERIA%E8%B6%85%E9%AB%98%E9%80%9F95MB-%E6%97%A5%E6%9C%AC%E8%A3%BD%E3%80%81%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E5%93%81/dp/B00C67VPGI/ref=sr_1_1?s=computers&ie=UTF8&qid=1425170651&sr=1-1&keywords=microsd+16gb+uhs)
- [GW-USNANO2A](http://www.amazon.co.jp/gp/product/B00ESA34GA?psc=1&redirect=true&ref_=oh_aui_detailpage_o03_s00)


## 設定手順
OSのインストール、ネットワークの設定は割愛します。

### 1. USBRHをRaspberryに差し込む

<pre>
>$ dmesg
[省略]
[    3.742108] usb 1-1.3: Manufacturer: Strawberry Linux Co.,Ltd.
</pre>

### 2. ライブラリのインストール

<pre>
>$ sudo apt-get install gcc libusb-dev
</pre>


[USBRH](USBRH on Linux)からドライバを取得します。

<pre>
>$ /tmp/
>$ wget http://ftp.nsysu.edu.tw/FreeBSD/ports/local-distfiles/sanpei/usbrh-0.05.tar.gz
>$ tar xvfz usbrh-0.05.tar.gz
>$ sudo cp -rf usbrh-0.05 /usr/local/src/usbrh-0.05
</pre>

``` C:/usr/local/src/usbrh-0.05/usbrh_main.c
if((rc = usb_set_configuration(dh, dev->config->bConfigurationValue))<0){
    if( rc = usb_detach_kernel_driver_np(dh, dev->config->interface->altsetting->bInterfaceNumber)<0 ){ # ここが追加
        puts("usb_set_configuration error");
        usb_close(dh);
        exit(3);
    } # ここが追加
}
```

修正が終わったら、makeを実行する。

<pre>
>$ cd usbrh-0.05
>$ sudo make
</pre>

<pre>
>$ sudo chown root:root usbrh
>$ sudo chmod u+s usbrh
>$ sudo mv -i usbrh /usr/local/bin/
</pre>

#### 試しに動かしてみる

<pre>
>$ usbrh
24.34 21.81
</pre>
image-modeでぬるぬるスクロール

GUIのEmacsで画像ファイルを開くときのメジャーモードが`image-mode`です。

Macのトラックパッドでもぬるぬる。OS XのEmacs 24.5で動いた。なんでデフォルト設定に入ってないんだろう…

```el
;; image-mode
(progn
  (define-key image-mode-map (kbd "<wheel-up>")    'image-previous-line)
  (define-key image-mode-map (kbd "<wheel-down>")  'image-next-line)
  (define-key image-mode-map (kbd "<wheel-right>") 'image-forward-hscroll)
  (define-key image-mode-map (kbd "<wheel-left>")  'image-backward-hscroll))
```

[bind-key.el](https://github.com/jwiegley/use-package/blob/master/bind-key.el)を使ってるなら、以下のようにも書ける。

```el
;; image-mode
(progn
  (bind-key "<wheel-up>"    'image-previous-line    image-mode-map)
  (bind-key "<wheel-down>"  'image-next-line        image-mode-map)
  (bind-key "<wheel-right>" 'image-forward-hscroll  image-mode-map)
  (bind-key "<wheel-left>"  'image-backward-hscroll image-mode-map))
```

ちなみに私が端末ではなくGUIのEmacsからTRAMPを使ってリモートサーバーを利用する強い理由のひとつがimage-mode。画像を目視確認したいがためにめんどくさいことはしたくないでござる。