OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのクラスメソッドとインスタンスメソッドの例

## <i class="fa fa-history" style="font-size:1em;"></i> 経緯
何人かの方にRubyを教える機会があり、クラスメソッドとインスタンスメソッドの使い分けが
書籍などの例だけだと分かりにくい、という相談を受けました。
そのため記事にまとめることにしました。
## <i class="fa fa-user" style="font-size:1em;"></i> 対象読者
オブジェクト言語の学習経験が無く、入門書を読んでいる最中。
クラス、インスタンス、メソッドの概念については

* 鯛焼きの型と中身
* 動物クラスと犬クラス、猫クラス

そんな説明を読んで、ぼんやりとイメージがつかめている、
という想定です。

## <i class="fa fa-code" style="font-size:1em;"></i> クラスメソッドとインスタンスメソッド
### <i class="fa fa-users" style="font-size:1em;"></i> クラスメソッド
クラスオブジェクトから実行可能なメソッドです。

* `def self.method_name` でクラスメソッドを定義

~~~ruby
class Hoge
  def self.hoge
    puts "hoge"
  end
end
Hoge.hoge # => hoge
~~~

※`self`は`Hoge`でもよい

* `class << self` 内でクラスメソッドを定義

~~~ruby
class Hoge
  class << self
    def hoge
      puts "hoge"
    end
  end
end
Hoge.hoge # => hoge
~~~

※`self`は`Hoge`でもよい

### <i class="fa fa-user" style="font-size:1em;"></i> インスタンスメソッド
インスタンスオブジェクトから実行可能なメソッドです。

~~~ruby
class Hoge
  def hoge
    puts "hoge"
  end
end
Hoge.new.hoge # => hoge
~~~

## <i class="fa fa-hand-o-right" style="font-size:1em;"></i> クラスメソッドとインスタンスメソッドの使い分け
### <i class="fa fa-file-text" style="font-size:1em;"></i> 仕様
* Personクラスを定義する
* Personは名前、年齢、性別を持つ
* Personは人数を保持、取得できる（インスタンスの数をカウントし、外部から確認するためのインターフェースを持つ）
* Personのインスタンスは三つの作成方法がある
    * Person.new
        * 名前・年齢・性別を指定して初期化
    * Person.male
        * 名前・年齢を指定し、内部的に男性として初期化
    * Person.female
        * 名前・年齢を指定し、内部的に女性として初期化
* Personのインスタンスは挨拶をする
    * Person#hello を定義

### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
class Person
  @@size = 0
  FEMALE = :female
  MALE = :male

  def self.male(name, age)
    new(name, age, MALE)
  end

  def self.female(name, age)
    new(name, age, FEMALE)
  end

  def self.size
    @@size
  end

  def initialize(name, age, sex)
    @@size += 1
    @name, @age, @sex = name, age, sex
  end

  def hello
    puts <<-EOS
こんにちわ。
私は #{@name} です。
年齢は #{@age} です。
性別は #{@sex} です。
    EOS
  end
end

people = [
  Person.new('tanaka', 34, Person::MALE), 
  Person.new('suzuki', 23, Person::FEMALE), 
  Person.male('sato', 45), 
  Person.female('honda', 65)
]

people.each { |person|person.hello }

puts "#{Person.size}人います"
~~~

### <i class="fa fa-file-text-o" style="font-size:1em;"></i> 出力

~~~
こんにちわ。
私は tanaka です。
年齢は 34 です。
性別は male です。
こんにちわ。
私は suzuki です。
年齢は 23 です。
性別は female です。
こんにちわ。
私は sato です。
年齢は 45 です。
性別は male です。
こんにちわ。
私は honda です。
年齢は 65 です。
性別は female です。
4人います
~~~

### <i class="fa fa-check-circle" style="font-size:1em;"></i> まとめ
クラスに属するメソッド＝クラスメソッドはPerson自身に関する情報の
変更や参照の役割をもっています。
今回だと `Person.male`や`Person.female`や`Person.size`です。

インスタンスに属するメソッドは、個別のインスタンスに関する情報の
変更や参照の役割りを持っています。
今回だと `Person#hello`です。
BrowserStack + facebook/php-webdriver で、ブラウザごとのテストを自動化する


## はじめに
みなさん、Webサービス開発していて、少なからずブラウザとの戦いがあると思いますが、ブラウザごとのリグレッションテストなど、どのように対応されていますでしょうか？
仕方なくチェックリストを作成して、人海戦術で対応しているプロジェクトも少なからずあるのではないでしょうか？
残念ながら弊社もそのように対応してきました。
しかし、プロジェクトが大きくなっていくにつれて、テストにかかるコストも目立つようになってきましたので、重要課題として、この問題の解決に着手しました。
着手して、すぐに、BrowserStack + facebook/php-webdriver の組み合わせが非常に強力で便利なことに気付きましたので、ここでご紹介したいと思います。

## BrowserStackとは
BrowserStackそのものについては、[本家サイト](https://www.browserstack.com/)と[Innovaさんのブログ記事](http://tech.innova-jp.com/browserstack-screenshot/)に詳しく出ていますので、ここでは割愛します。

## やりたくないこと、やりたいこと
非効率なので、以下のようなことはやりたくありません。

- 毎回同じ内容を毎回人間がテストする
- テスト環境を構築するために、ローカルに色々セットアップしなければいけない
- 工数がかかる割に、見返りが少ない（かといってやらないわけにはいかない）

どんなツールやサービスでもいいのですが、やりたいことは以下のとおりです。

- ブラウザごとのリグレッションテストを自動化する
- テスト環境をなるべく構築しない
- 誰がやっても同じテスト結果になる（属人化、職人芸化させない）

## セットアップ

### phpunitのインストール

```bash
$ composer require phpunit/phpunit
```

### facebook/php-webdriverのインストール

```bash
$ composer require facebook/webdriver
```

### TestCaseの作成

あとは、[本家のドキュメント](https://www.browserstack.com/automate/php)や、[facebook/php-webdriver](https://github.com/facebook/php-webdriver)を参考にして、TestCaseを作成します。

手っ取り早く動作確認したい方のために、[サンプルコード](https://github.com/imunew/php-browserstack-example)を作りましたので、お試しください。

## 実行結果サンプル

Windows7 + IE9 にて、

- google.co.jp にアクセス
- スクリーンショット取得
- タイルメニューを表示（メニューのアイコンをクリック）
- スクリーンショット取得
- gmailのアイコンをクリック
- スクリーンショット取得

すると、下記のように、BrowserStackのサイト上で結果を確認することができます。

![browserstack_automate.png](https://qiita-image-store.s3.amazonaws.com/0/26422/0ae76147-ef4d-c7a2-09d0-af72dc5371f6.png "browserstack_automate.png")

## おわりに
具体的な活用事例は、まだまだ少ないように感じますので、まずは有償プランを契約して、実戦で活用してみて、便利な使い方など発見したら、どんどん投稿しようと思います。
OSX版 Wekaをutf-8で使うには


Weka
http://www.cs.waikato.ac.nz/ml/weka/

Windows版においてutf-8を使う方法は比較的色んなところでみかけますが、Mac（OSX）版において、あまり見つからなかったのでメモ。

1. Weka.appを右クリックし「パッケージの内容を表示」を選択し、パッケージの中身を表示する。
2. Contents/Info.plist をエディタで開く。
3. "VMOptions"というkeyのvalueを“-Xmx1Gb”から“-Xmx1Gb -Dfile.encoding=utf-8”へ変更し、保存する。
4. アプリを再起動する。

参考
http://www.qingpei.me/posts/how-to-open-utf-8-encoded-data-files-in-weka-for-os-x/
iOS で WebP を扱う

## iOS で WebP を扱う上での注意点

iOS アプリ開発の仕事で WebP を使うことがあったのだが、そのときの体験談を話す。
そのアプリは画像ビュワーのようなもので、大量の（高解像度）画像をダウンロードして見るものである。

大量の画像（WebP）をダウンロードして一度にエンコードすると CPU 使用率がひどいことになるので、一度ディスクにWebPの形式のままキャッシュしておくのがよい。

必要に応じてエンコードするためにその画像データが WebP の形式かどうかを判定する方法がないかと模索したが、バイナリの先頭を見ることにした。画像フォーマットなんて決まってるしこれでいいですかね？
 

```swift
func isWebP(data: NSData) -> Bool {
    var buffer = [UInt8](count: 4, repeatedValue: 0x00)
    data.getBytes(&buffer, length: 4)
    return buffer == [82, 73, 70, 70] ? true : false
}
```

画像のダウンローダーは [SDWebImage](https://github.com/rs/SDWebImage) を使用したが、

- ダウンロードと同時にエンコードが走る
- ダウンロード後にディスクだけに保存ができない（メモリとディスク両方なら可能）

この二つの理由から SDWebImage は WebP エンコードのためだけに使用し [Alamofire](https://github.com/Alamofire/Alamofire) をダウンローダーとして使った。

```swift
Alamofire.request(.GET, url).response { (request, response, data, error) in
    if error != nil {
        var imageData = data as? NSData
        // 一度にエンコードすると重くなる
        // var image = UIImage.sd_imageWithWebPData(imageData)

        // save to disk code
    }
}
```

## まとめ

- 高解像度画像を一気にダウンロードしてエンコードすると CPU 使用率が高くなる
- SDWebImage（WebP 対応の画像ダウンローダー） は意外と融通が効かないので、一部自分で実装もしくは他のライブラリの力を借りた方が良い場合もある
Yosemite+python+pyquery

# Yosemite で PyQuery のインストール

pip install pyquery で以下のエラーが出た場合

```
#include "libxml/xmlversion.h"
             ^
    1 error generated.
    /usr/local/opt/pyenv/versions/3.4.3/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'bugtrack_url'
      warnings.warn(msg)
    error: command 'clang' failed with exit status 1
```

以下のコマンドで Xcode Command Line Tools をインストールしてから pip install するとインストールできます。

```
% xcode-select --install
% pip install pyquery
```
Java DecimalFormatを用いたゼロ埋め

ある値をゼロ埋めしたいとき、さらに条件によって桁数を変えたいときはNumberFormatのサブクラスである
DecimalFormatを用いると簡単です。

```java:Sample
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * DecimalFormatを用いたゼロ埋め
 * @author owner
 *
 */
public class Sample {
	public static void main(String[] args) {

		DecimalFormat format = new DecimalFormat("#.#");

		// 小数点以下の最小値
		format.setMinimumFractionDigits(2);
		// 小数点以下の最大値
		format.setMaximumFractionDigits(2);

		BigDecimal number = new BigDecimal(1000);

		System.out.println(format.format(number));
	}
}
```

上記のサンプルでは小数点以下の表示する桁数を2桁に指定しています。
結果は下記のとおりです。

```lang:結果
1000.00
```

setMinimumFractionDigitsとsetMaximumFractionDigitsの引数に表示したい桁数を入力するだけです。
ちなみに値は自由に変更することができます。


```java:小数点以下をの表示桁数を10に変更
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * DecimalFormatを用いたゼロ埋め
 * @author owner
 *
 */
public class Sample {
	public static void main(String[] args) {

		DecimalFormat format = new DecimalFormat("#.#");

		// 小数点以下の最小値
		format.setMinimumFractionDigits(10);
		// 小数点以下の最大値
		format.setMaximumFractionDigits(10);

		BigDecimal number = new BigDecimal(1000);

		System.out.println(format.format(number));
	}
}
```

```lang:結果
1000.0000000000
```

##あらかじめ小数点が表示されている場合
あらかじめ小数点が表示されている場合でもそれを含めた桁数が指定した値になります。

```Java:あらかじめ小数点が表示されている場合
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * DecimalFormatを用いたゼロ埋め
 * @author owner
 *
 */
public class Sample {
	public static void main(String[] args) {

		DecimalFormat format = new DecimalFormat("#.#");

		// 小数点以下の最小値
		format.setMinimumFractionDigits(5);
		// 小数点以下の最大値
		format.setMaximumFractionDigits(5);

		BigDecimal number = new BigDecimal(1000.05);

		System.out.println(format.format(number));
	}
}
```

```lang:結果
1000.05000
```

##小数点以下以外のゼロ埋め
小数点以下の桁数ではなく、整数値部分でもゼロ埋めをすることが可能です。
小数点以下の桁数の指定はsetMinimumFractionDigits()とsetMaximumFractionDigits()を使用しましたが
整数値部分の指定はsetMinimumIntegerDigits()とsetMaximumIntegerDigits()の引数に表示したい桁数を入力します。

```lang:指定方法
小数点以下の桁数の指定
setMinimumFractionDigits(最小値)
setMaximumFractionDigits(最大値)

整数値部分の桁数の指定
setMinimumIntegerDigits(最小値)
setMaximumIntegerDigits(最大値)
```


```java:Sample
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * DecimalFormatを用いたゼロ埋め
 * @author owner
 *
 */
public class Sample {
	public static void main(String[] args) {

		DecimalFormat format = new DecimalFormat("#.#");

		// 小数点以下の最小値
		format.setMinimumFractionDigits(5);
		// 小数点以下の最大値
		format.setMaximumFractionDigits(5);
		// 整数値の最小値
		format.setMinimumIntegerDigits(5);
		// 整数値の最大値
		format.setMaximumIntegerDigits(5);

		BigDecimal number = new BigDecimal(1000.05);

		System.out.println(format.format(number));
	}
}
```

```lang:結果
01000.05000
```

DecimalFormatを使うとユーザが指定した形にフォーマットが出来る！
iptablesで特定のipからのアクセスを破棄しました。

iptablesで特定のipからのアクセスを拒否しました。環境はCentOSです。

# iptablesの設定を確認
iptablesの設定を確認します。

```bash
iptables -L

略 
```

# 拒否するipを追加する
ipを追加します。

```bash:
iptables -I INPUT -s 93.174.93.117 -j DROP
```

# iptablesの設定を保存する
saveします。

```bash:
/etc/init.d/iptables save
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]
```

# iptablesを再起動して確認
iptablesを再起動します。

```
/etc/init.d/iptables restart

ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中filter                   [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]
```

```bash
iptables -L

略

DROP       all  --  93.174.93.117        anywhere
```
DROPという行が追加されました。

# 参考
http://d.hatena.ne.jp/hidde/20080716/1216193290
PNG画像の圧縮について

HTTP配信するWebサイトを作る上で、画像の最適化は手間に対してサイズの削減効果が大きいものです。ここでは、PNG画像について、ファイルフォーマットについて触れながら、いくつかある圧縮手法について解説していきます。

# PNGフォーマット
## チャンク
PNGファイルは、ファイル種別識別用の冒頭部のヘッダを除くと、いくつかの**チャンク**（データブロック）に分かれています。画像を構成する上で重要なチャンクは、以下のようなものがあります。

* **IHDR**…画像の寸法、色数などが入ったヘッダー部分
* **PLTE**…カラーパレット（インデックスカラーの場合のみ）
* **IDAT**…画像データ（Deflate圧縮済み）
* **IEND**…終端マーク
* **tRNS**…透過色の設定

なお、チャンク名は4文字ですが、画像表示に必須なものは1文字目が大文字、なくても表示可能なものは1文字目が小文字となっています。これ以外にも各種のチャンクが定義されています。

## カラータイプ
PNGのカラータイプとしては、いくつかのものが定義されています。

|タイプ値|概要|詳細|tRNSチャンク|
|----|:----|:----|:----|
|0|グレイスケール|最大256段階までの白黒の濃淡、パレットは不可|1色透過|
|2|RGB|24ビットカラー、パレットはなくてOK|1色透過|
|3|パレットカラー|24（32）ビット中256色|色ごとにアルファチャンネルを指定可|
|4|グレイスケール＋アルファチャンネル|濃度8ビット＋アルファチャンネル8ビット|なし|
|6|RGB＋アルファチャンネル|RGB24ビット＋アルファチャンネル8ビット|なし|

## 画像データについて
画像本体のIDATチャンクは、複数に分けて生成することもできますが、容量は大きくなります。また、圧縮前に「フィルター」という処理をかけることができて、横の行単位で記録する値を「上のピクセルとの差分」や「左のピクセルとの差分」のように選ぶことができます（なお、フィルターは圧縮率を高めるためのもので、データは省略しない**可逆なもの**です）。

そうして記録したビットデータは、Deflateというアルゴリズム（gzipと基本的には同じもの）で可逆圧縮して、ファイルに書き出します。

# 各種の圧縮手法
このように、いろいろなものから構成されているPNGファイルですが、（Webで使うことを前提に）圧縮するにも、いろんな手段があります。

## 不要なチャンクの削除
上で省略したPNGのチャンクの中には、テキストデータを保存するものなど、画像にまったく影響を与えないものもいくつかあります。また、カラープロファイルやガンマ値補正など、ブラウザで表示するだけにしては高度すぎる機能もあるので、そういったものを削除することで容量を削減することができます。

* 画質への影響…無〜低
* 効果…ファイルによりけり

## IDATの連結
PNGファイルを書きだす環境によっては、処理の都合か、IDATを分割して出力していることがあります。これらをつないで1つにすることで、余計なヘッダは削減できますし、一回に圧縮する区間が長くなって、圧縮率が向上することもあります。

* 画質への影響…無
* 効果…無〜低

## Deflateの効率化
PNGファイルを書きだす環境によっては、速度を優先して圧縮率の低い状態でDeflate圧縮を行なっていることがあります。圧縮率を優先して再度圧縮を行うことで、サイズが小さくなることもあります。

* 画質への影響…無（Deflateは可逆圧縮です）
* 効果…無〜中

## フィルターの最適化
ちょっとした画像でも、行ごとに最適なフィルターの組み合わせを完璧に求めるには組み合わせが多すぎます。とはいえ、いろいろ試行錯誤して最適に近いフィルターを選んでくれるツールもあります。

* 画質への影響…無
* 効果…無〜低

## 減色
24ビットカラーの不要な画像について、256色に落としてしまうことで、画像のデータ量そのものを削減する方法です。なお、PNGでは上にあるようにパレットカラーでも実質アルファチャンネル付きの32ビットカラーを使用可能ですので、透明・半透明画像でもその表現を保ったまま256色にできます。

色を落としたらどういう見え方をするかですが、もともと色の少ないイラストはもちろんのこと、**画像単位で**256色ということで、写真などでも意外と目立たないものです。とはいえ、人工的なグラデーションがある画像や、あまり関連しない画像を混ぜたようなスプライトでは、色化けが目立ってしまうこともあります。理想論を言えば、1つ1つ確認すべきでしょう。

なお、ツールによっては、本当に256色以下しかない画像について、自動でパレットカラーに変換する例があります。この場合は、画質に影響はありません。

* 画質への影響…低〜高
* 効果…中〜高

# 圧縮ツール
## PNGGauntlet
PNGを圧縮するためのコマンドラインツールはいくつかありますが、それぞれ取る戦略が違います。[PNGGauntlet](http://pnggauntlet.com/)は、4つぐらいのPNG圧縮ツールで試行錯誤を行なって、さらにはGUIフロントエンドを付けた、Windows向けのツールです。画質に影響しない可逆圧縮しか行いませんが（色数の少ない画像がパレットカラーに変換されることはあります）、ものによってはこれだけでもかなり圧縮できることがあります。

なお、いくつかのツールを内部で併用するという性質上、同じファイルを2度3度圧縮にかけると、そのたびにサイズが縮小する、ということもときおり発生します。

## TinyPNG
[TinyPNG](https://tinypng.com/)は、PNGファイルを256色に減色する圧縮ツールですが、特徴として透過・半透過を扱えるということがあります。パレットカラーのアルファチャンネルまで入れられるツールはそう多くないので、重宝しています。

# 参考URL
* [わかりやすいPNG](http://mikeneko.creator.club.ne.jp/~lab/grp/png/p3.html)
* [PNGファイルフォーマット](http://homepage2.nifty.com/sophia0/png.html)
AndroidでrailsのDateTimeをパースし、ローカルロケール時刻テキストに変換


RailsのDateTimeをandroidローカル時間のテキストに変換するコード。
RailsでDateTimeとして保存している場合、そのまま出力した場合、"2015-06-30T13:00:50.000Z"のように出力される。


```
public final static String TIME_FORMAT = "yy/MM/dd HH:mm:ss";

//UTC標準時刻をローカル時間のテキストに変換する。
public String toLocalTime(String utcTime) {
	
	try {
		Time t = new Time();
    	t.parse3339(utcTime);
    	long msec = t.normalize(false);
    	Date d = new Date( msec );
    	SimpleDateFormat df = new SimpleDateFormat();

		return  df.format(d);
	} catch (TimeFormatException e) {
  		return null;
    }
}
```
エラー　Error parsing XML:junk after document element

#今日の課題
コードを書き終えて実行したい

#問題
runするとエラーが出る

`Error parsing XML:junk after document element`

#解決
`<LinearLayout`
部分の最後が
`/>`
となっていたのでスラッシュ消したら解決しました

#感想
LinearLayoutの最後は>で、TextViewは/>で終わるという違いがあるのに気が付きました
まだまだ簡単な所でつまづいてます
WordPressの一般設定から間違ってWordPress アドレス (URL) とサイトアドレス (URL)を入力した場合の２つの解決方法。

WordPressの一般設定から、**WordPress アドレス (URL)** と **サイトアドレス (URL)**を間違えて入力してしまいました(;´༎ຶω༎ຶ`)。

# 間違えて入力したことにより生じる問題
## URLを変更できなくなる
**WordPress アドレス (URL)**と**サイトアドレス (URL)**を間違えてしまうと、リダイレクトされてWordPressの管理画面に入れないため、**WordPress アドレス (URL)**と**サイトアドレス (URL)**が変更できなくなってしまいます＼(^o^)／

<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/3de97e1d-5c73-89e7-c329-a7e13c116bad.png" width="300" />
一般設定でのURLで`http://local.pugiemonn.com`と指定をミスしました。

## そもそもアクセスできなくなる
WordPressが置いてあるIPを間違って設定した場合、IPが違うためにWordPressにアクセスできなくなるなどの問題が発生します。

# 解決方法は２つ
この問題の解決方法は２通りあります。

* 定数を定義する
* MySQLのデータを書き換える

上記どちらかの方法でURLを上書きすることによって問題を解決できます。

# 解決方法１．定数を書き換える
間違って設定した変数は、WordPressに定数として定義されています。こちらを書き換えることで**WordPress アドレス (URL)**と**サイトアドレス (URL)**をプログラム上で上書きできます。

WordPressに `wp-config.php` というファイルがあるので、ファイルの一番下に`define`を書いてください。

```php:定数を定義
define('WP_HOME','正しいURL');
define('WP_SITEURL','正しいURL');
```
例えば、今回では "http://pugiemonn.com" が正しいURLなので以下のように記述します。

```php:定数を定義
define('WP_HOME','http://pugiemonn.com');
define('WP_SITEURL','http://pugiemonn.com');
```
wp-config.phpを保存して、から管理画面に移動すると管理画面が表示できるようになっていると思います。

この手順では、管理画面に移動した後に、**WordPress アドレス (URL)**と**サイトアドレス (URL)**を正しいURLに変更してください。

その後、先ほどwp-config.phpに上書きした定数は不要になりますので削除します。

```php:定数を定義
#define('WP_HOME','http://pugiemonn.com');
#define('WP_SITEURL','http://pugiemonn.com');
```
先ほどの`define`定義を削除して、wp-config.phpを保存してください。


# 解決方法２．MySQLのデータを書き換える
MySQLのデータを直接書き換えることでも対応可能です。

## wp_optionsテーブルの値を調べる
wp_optionsテーブルにWordPressの設定が入っていたので調べました。

```mysql:
select * from wp_options where option_name = "siteurl";
+-----------+-------------+----------------------------+----------+
| option_id | option_name | option_value               | autoload |
+-----------+-------------+----------------------------+----------+
|         1 | siteurl     | http://local.pugiemonn.com | yes      |
+-----------+-------------+----------------------------+----------+

select * from wp_options where option_name = "home";
+-----------+-------------+----------------------------+----------+
| option_id | option_name | option_value               | autoload |
+-----------+-------------+----------------------------+----------+
|        36 | home        | http://local.pugiemonn.com | yes      |
+-----------+-------------+----------------------------+----------+
```
option_nameが`siteurl`と`home`のところが該当箇所のようです。

## wp_optionsテーブルの`siteurl`と`home`を更新
update文を使って修正することにしました。

```mysql:
update wp_options SET option_value = "http://pugiemonn.com" where option_id = 1 OR option_id = 36;
Query OK, 2 rows affected (0.00 sec)
```
解決方法２では、データを直接書き換えますので、管理画面にログインして**WordPress アドレス (URL)**と**サイトアドレス (URL)**を書き換えるフローは不要です。

## WordPressの管理画面にログイン出来るかを確認
ちゃんと管理画面にログインできるようになれば解決です。

# まとめ
この解決方法により**WordPress アドレス (URL)**と**サイトアドレス (URL)**を間違えて保存した場合も、後からURLを変更することができます。

URLを間違えて保存してしまった際にお試しください＼(^o^)／
Ruby on Rails + Reactのベストプラクティスを模索してみる



「rails react」でググると、react-railsは真っ先に見つかるんですが、まだ使い慣れてないとgemにお任せはちょっと不安だし、情弱なだけで実はもっといい方法あるんじゃないかと思い、いろいろ探してみました。

調べているとこんな記事あり、だいたい三つの方法があるとのこと。

[3 ways to integrate Ruby on Rails + React + Flux | Open Minded Innovations](http://www.openmindedinnovations.com/blogs/3-ways-to-integrate-ruby-on-rails-react-flux)


1. react-railsを使う
2. frontend/backendを切り離してあつかう
3. RailsをAPIサーバーとして使い、API server と React+Flux Front end Appとして切り離してあつかう

そのほかも調べてみましたが、だいたいはどれかに当てはまる気がしました。


## 1.react-railsを使う
### Method 1: Use React inside of Rails with react-rails

react-railsのgemを使う。一番simpleで導入しやすい方法です。

## 2.frontend/backendを切り離してあつかう

### Method 2: React/Flux front end app within Rails


サンプル
[react-webpack-rails-tutorial/client at master · justin808/react-webpack-rails-tutorial](https://github.com/justin808/react-webpack-rails-tutorial/tree/master/client)
解説blog
[Fast Rich Client Rails Development With Webpack and the ES6 Transpiler - Rails on Maui](http://www.railsonmaui.com/blog/2014/10/02/integrating-webpack-and-the-es6-transpiler-into-an-existing-rails-project/)

ざっくり言うと、frontendは完全にrailsに依存せず、webpackと呼ばれるcompileをしてbuildされたassetsをrails側が読み込む、というもの。

1.との大きな違いは、assetsまわりをrails asset pipelineに任せず独立させているところでしょうか。そのメリットとして以下のようなものが上げられます。

- Modulesを使える
- npmのpackage managerを使える
- ES6仕様で書ける

このあたりはアプリケーションの規模と、1.でどれだけ不便が生じるかもう少し検証してみる必要がありそうですが、commonJsのモジュール仕様で書けるのは個人的にはわかりやすくかけて便利だなと思います。railsでなく他のbackendとreactを使っていた人にとっては、このあたりをすでに前提でやっていることもあると思います。

webpackまでいかなくても [RailsでReactを動かしてみる (browserify + watchify + reactify) - Qiita](http://qiita.com/ysm001/items/d07c4dcfe88793cd55b6) の記事のようにjs部分はrailsから独立してcompileさせる方法をとるのもここに入るかと思います。



## 3. RailsをAPIサーバーとして使い、API server / React/Flux Front end Appとして切り離す

### Method 3: Separated Rails API and React/Flux front end app


[React + Flux backed by Rails API - Part 1 | Fancy Pixel](http://fancypixel.github.io/blog/2015/01/28/react-plus-flux-backed-by-rails-api/)

2.と同じようにサーバーと分離していますが、こちらはrailsを完全にAPIサーバーとして扱い、よりfrontendAppとして独立しています。server renderingが必要ないならこっちのほうがよいっぽい。具体的にはもっと上のサンプルをいじってみる必要あり。
EventEmitterの継承方法 (ES5,ES6)

EventEmitterの継承方法の備忘録。ES5の場合。

## ES5の場合

```js:ES5継承(util.inherits使用)
var util = require("util");
var EventEmitter = require("events").EventEmitter;

function MyClass() {
    EventEmitter.call(this);
}

util.inherits(MyClass, EventEmitter);

MyClass.prototype.doSomething = function(data) {
    this.emit("doSomething", data);
}
```

```js:ES5継承(util.inherits未使用)
var EventEmitter = require("events").EventEmitter;

function MyClass() {
    EventEmitter.call(this);
}

MyClass.prototype = Object.create(EventEmitter.prototype);

MyClass.prototype.doSomething = function(data) {
    this.emit("doSomething", data);
}
```

## ES6の場合

```js:ES6継承
var EventEmitter = require("events").EventEmitter;
class MyClass extends EventEmitter
{
    // 省略可
    constructor(){
        super();
    }

    doSomething(data){
        this.emit("doSomething", data);
    }
}
```

ES6は便利だな。。
Ubuntu - エラー「E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)」

ubuntuで「apt-get update」した時のエラー

#### エラー出力
```
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/
```

#### 原因
```
他のプロセスがaptを使用しているため
```

#### 対応
##### 1.使用しているプロセスの特定
```
ps aux | grep apt | grep -v 'grep'
```

##### 2.特定したプロセスをkill
```
sudo kill <PID>
```
MongoDB - Mongo Shellのfindクエリの表示件数の変更方法

mongo shellから実行するfindクエリのデフォルトの表示件数は20件で変更方法のメモ

#### 100件に変更する場合
mongo shellで接続して以下のコマンドを実行

```
DBQuery.shellBatchSize = 100;
```

これは便利！

#### ※参考
http://makaaso.hatenablog.com/entry/2015/04/20/223334
超初心者向け・Herokuの無料プランのみでアプリを立ち上げるまで（1）-Heroku登録

目次

*  [超初心者向け・Herokuの無料プランのみでアプリを立ち上げるまで（1）](http://qiita.com/ya-mada/items/535eeece44f780af5375)
Heroku登録
* [超初心者向け・Herokuの無料プランのみでアプリを立ち上げるまで（2）](http://qiita.com/ya-mada/items/ee3882ae0786af94f317)
Dyno立ち上げ
* [超初心者向け・Herokuの無料プランのみでアプリを立ち上げるまで（3）](http://qiita.com/ya-mada/items/2af2a0fc06b4ef429bf1)
ADDONの機能・料金

# Herokuを使うまで
何はともあれSign Up
companyは必須じゃありません。
https://signup.heroku.com/login
![1.png](https://qiita-image-store.s3.amazonaws.com/0/84539/1be20b88-8e96-8a0b-dcbd-16652be8e838.png)

アクティベーションして終了!
![3.png](https://qiita-image-store.s3.amazonaws.com/0/84539/623300a4-f05d-40bd-3c5d-2e6a3e558829.png)

# アプリ登録
アクティベーションするとアプリ登録しろといわれるのですが、とりあえず初回投稿で画像がアップロード出来ないので中身空っぽですがあとは(2)に回します。。。

これからの流れ
1. アプリケーション登録＋dynoタイプ選択・dynoの種類・dynoとworker dynoの意味
2. 主要なアドオンの紹介と料金体系のまとめ・使い方
3. アプリケーション登録して動かしてみる
Google App Engine/Go

####シェルまたは Terminal で次のコマンドを実行して、Google Cloud SDK をダウンロードし、インストールします:

    curl https://sdk.cloud.google.com/ | bash
Follow the prompts to install the Go App Engine package.

####~/.bashrc ファイル（または他の適切なシェル起動ファイル）を編集して、goapp コマンドのエイリアスを設定します:

    alias goapp=~/google-cloud-sdk/platform/google_appengine/goapp
シェルまたは Terminal を再起動して、環境の変更を反映させます。

####次のコマンドを使用して Google Cloud Platform にログインします:

    gcloud auth login
####次のコマンドを使って Go 用 App Engine パッケージをインストールします:

    gcloud components update gae-go

####次のコマンドを使用して、ローカルの開発環境からアプリをデプロイします:

    goapp deploy -oauth -application family1st-contact appengine-try-go

####開発環境の起動

app.yamlのあるディレクトリに移動して

    goapp serve
AirDropで.app（のtarball）を送信すると送り先で起動できない件

## 経緯

Eclipes Marsがリリースされたので、さっそく端末Aにダウンロードし、いろいろセッティングしてEclipse.appをtarballに固めた（注1）。

このtarballを端末Aから端末BにAirDropで送信したところ、端末Bでtarballから展開したEclipse.appが起動できなかった。起動した時のエラーダイアログは下図のとおり。

![01_check.png](https://qiita-image-store.s3.amazonaws.com/0/8064/a3a44f91-9063-7a48-5894-e1c611231d2b.png)
　　　　↓
![02_trash.png](https://qiita-image-store.s3.amazonaws.com/0/8064/e5acf0c8-3880-664c-f450-1a8a80f02645.png)


送信前・送信元のファイルのハッシュも一致しており、**AirDropではなくscpを使って送信した場合は再現しなかった**。


## 原因

AirDropの時だけなんでよーと呟いていたら、

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/gishi_yama">@gishi_yama</a> com.apple.quarantineの関係とかかな？</p>&mdash; madogiwa (@madogiwa) <a href="https://twitter.com/madogiwa/status/615736277132906496">2015, 6月 30</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
と助言をいただいた。

まずは `com.apple.quarantine` を調査。

[メモ：com.apple.quarantine 拡張属性（考える日常）](http://kazutomi.blogspot.jp/2013/12/comapplequarantine.html) や [未知のファイルを隔離するEAの仕組みと謎（ザリガニが見ていた...。）](http://d.hatena.ne.jp/zariganitosh/20140312/com_apple_quarantine_mtstery) によれば、 `xattr` コマンドでEA:Extended Attributesの状況が確認できる。

そこで、端末BがAirDrop, scpで受信したtarballと、それぞれを展開した.appの `com.apple.quarantine` を確認してみた。

(1) scpで受信したtarball

![03_scp-tar.png](https://qiita-image-store.s3.amazonaws.com/0/8064/c78b8b82-96e9-5c14-7f98-c5975863ab55.png)

(2) (1) を展開した.app

![04_scp-app.png](https://qiita-image-store.s3.amazonaws.com/0/8064/8966e788-ea28-87c9-e961-b9f37c21e9ea.png)

(3) AirDropで受信したtarball

![05_ad-tar.png](https://qiita-image-store.s3.amazonaws.com/0/8064/f99364d3-1299-6fd3-15c2-e93a6983ab57.png)

(4) (3) を展開した.app

![06-ad-app.png](https://qiita-image-store.s3.amazonaws.com/0/8064/b7d5ce33-c993-2ffe-7a05-2c1d8b7c0e86.png)

どうやら、AirDropを経由したファイルには `com.apple.quarantine` が設定され、それが少なくともtarballの場合、展開したファイルにも設定されるようだ。

これは、AirDropで第三者から受け取ったファイルを「セキュリティとプライバシー」の機能と連係させる（不用意に怪しい.appを開かせない）ためだと推測できる。結果、壊れていると表示されるのはちょっとアレな気もするけど。

## 解決方法

けれども今回は、素性が明らかな端末からのファイル受信なので、これを開かせるようにしたい。先述のサイトによれば、`xattr -d` コマンドでEAを解除できるようなので、`com.apple.quarantine` を解除してみた。

```sh
xattr -d com.apple.quarantine Eclipse_mars.app
```

解除の後、.appは正常に起動できた。

------

<dl>
<dt>注1:</dt>
<dd>端末は両方ともOSX Yosemite 10.10.3。Eclipse.appはRenameしてEclipse_mars.appとした。そもそもEclipse Marsからトップディレクトリが.appになったことに驚いたりした。</dd>
</dl>
TestFlight Beta Testing (External) で気をつけるべきこと

長期外部βテストをやる事例がそれほど共有されていないのもあって、思った以上にトラップ引っかかった。

# 1. 30日を超えるとインストール済みアプリも利用できなくなる
> The build will be available to them for 30 days after the invitations are sent.
[iTunes Connect Developer Guide](https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/BetaTestingTheApp.html)

を読んで新しくインストールができなくなるだけかな？と思っていたら、インストール済みアプリに対しても「データの使用期限が切れた」と表示され利用できなくなる。継続利用するためには、30日周期でバージョンを上げて再申請・再招待する必要がある。

# 2. プロビ有効期限が切れてもアプリが利用できなくなる
プロビ有効期限が切れたβテストアプリの場合は、「【アプリ名】ベータの使用期限がきれました」と表示され起動できなくなる。TestFlightから再インストールしようとすると、「Could not install 【アプリ名】」「TestFlight is currently unavailable. Try again later.」というアラートが表示される。プロビを更新し、再審査申請する必要がある。


# 3. βテスト審査申請するためには古いバージョンのβテストを無効にする必要がある
新しいバージョンを審査しようとすると古いバージョンのβテストは無効になる旨が表示され、同意して進めると招待含め無効になる。審査が通り再招待するまでは外部テスターがインストールできる手段がなくなる。
さくらインターネットでPythonを使う

さくらインターネットでPythonスクリプトを走らせようということでやってみました。
Herokuがデプロイ出来るのにアプリケーションエラーが発生したので、まぁレンタルサーバーでなんとかなるように勉強しておくのもいいなという安易な発想です。

ローカルでは動くのにHerokuでは動かない、などという時にレンタルサーバーで動かせれば楽チン。最初はbottleをそのまま使おうとしたのににっちもさっちもいきませんでした。


で、相当に躓いたので覚書も兼ねて。

必ず入れておきたいおまじない

```
#!/usr/local/bin/python
print "Content-Type: text/html\n"
```

結局PythonスクリプトがCGIで動くということで、アップロード後.cgiに書き換えが必須。で、最初はbottleを何とか動かそうとしたわけですがルーティングがうまくいかない。もう腹がたったので全部一から書いてやりました。index.pyの中がprintだらけになりましたとさ。

さくらでbottleを上手く動かす方法があったら詳しく教えて下さい。

botlleだったら数十行なのに。
フレームワークの便利さを痛感しますねこれは。

というわけでローカル環境での開発はcgiモジュールを使う。
アップロードした時にそのままアップロードできるし迷いがない。

![dir.jpg](https://qiita-image-store.s3.amazonaws.com/0/71585/ef052a8c-1b3a-b926-1bc3-300ff3e21c0d.jpeg)

こんな感じの階層にして製作開始。
アップロード時はcgiserver.py以外を全部アップロード。

home/user/www/ 以下であればどこでも問題無いです。

index.pyはアップロード後にindex.cgiに書き換えてパーミッションを705にしておくこと。


で成果物はこちら。もっと色々実装したかったんですけど力尽きました。
http://app.jiriki.co.jp/rakuten-creater/index.html



***

さくらのレンタルサーバーでbottleが動いたお話を書きました。

http://qiita.com/Gen6/items/3238b3b5c7501e36f6d3
Bean Validation始めましょう。


[第1回 Java勉強会 in 秋葉原](https://javaintokyo.doorkeeper.jp/events/2706)用の殴り書きです。 

## 対象
Java経験が多少ある人向け

## Bean Validationってなに？　
フィールド、メソッドにアノテーションをつけることで、特定のチェックルールのバリデーションを実行するための仕組み。

## 使うと何が嬉しいの？
nullチェックとかif文を量産せずにすむので、疲弊が少なく済む(はず)。
また、アノテーションで定義することで、そのままフィールドバリデーションのルールをJavadocに出せる。


## JSR Spec
[JSR 303: Bean Validation](https://jcp.org/en/jsr/detail?id=303)
[JSR 349: Bean Validation 1.1](https://jcp.org/en/jsr/detail?id=349)

## 参照実装
[Hibernate Validator](http://hibernate.org/validator/)

## 対応フレームワーク
[Spring Framework](http://spring.io/)

他にもありますが・・・

## 今までのバリデーション


```SampleBean.java

public class SampleBean {
   private String name;
   private int age;
   
   // getter, setter
}
```

```Check.java

// 略 

public void sayHello(SampleBean bean) {
    if (bean == null) {
        throw new IllegalArgumentException("からやねん！");
    } 
    
    if (bean.getName() == null && bean.getName().equals("")) { 
        throw new IllegalArgumentException("nameからやねん！");
    } 
    
    if (bean.getAge < 0) {
        throw new IllegalArgumentException("ageおかしいねん！");
    } 

    System.out.println(bean.getName() + "(" + bean.getAge() + ")さんこんにちは！" );
}


```


## Bean Validationを使うと


```SampleBean.java

public class SampleBean {
   @NotEmpty
   private String name;
   @Min(0)
   private int age;
   
   // getter, setter
}
```

以下、対応フレームワークを利用

```Check.java

// 略 

public void sayHello(@Valid SampleBean bean) {
    System.out.println(bean.getName() + "(" + bean.getAge() + ")さんこんにちは！" );
}

```


## 実装例はこちら
https://github.com/nakamurakj/bean-validation
NetworkImageViewをフェードインアニメーションで表示する

Androidの通信ライブラリVolleyに含まれている、画像を表示するためのNetworkImageViewは便利なのですが、表示時が味気ないので、アニメーションを追加して少しリッチに表示する方法です。

NetworkImageViewのsetImageBitmapをOverrideして、下記のように追記したViewクラスを作成することで実現できます。

```java:TransitionNetworkImageView.java

public class TransitionNetworkImageView extends NetworkImageView {

    @Override
    public void setImageBitmap(Bitmap bm) {
        // 表示時のアニメーション追加
        TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[] {
                new ColorDrawable(android.R.color.transparent),
                new BitmapDrawable(getContext().getResources(), bm)
        });
        setImageDrawable(transitionDrawable);
        transitionDrawable.startTransition(500);
    }

}
```

あとはNetworkImageViewを使用していた箇所を置き換えるだけ。
cocos2d-x/ScrollViewの上にButtonを配置するには

ScrollViewの上にButtonを配置すると、Buttonの上からタッチ開始すると、スクロールできない。

やることは、
・ボタンのタッチ飲み込みを無効にする。
・ボタンが動いた時は、クリックでない。

```cpp:FooScene.cpp
auto btn = (ui::Button*)n->getChildByName("button");
btn->setSwallowTouches(false);
btn->addClickEventListener([=](Ref* ref){
  auto btn = (ui::Button*)ref;
  float distance = btn->getTouchBeganPosition().distance(btn->getTouchEndPosition());
  if( 10 > distance ){
    // クリック
   }
});

```

プレス時の表示をなんとかしたかったけど、見つからなかった。

```cpp:FooScene.cpp
btn->addTouchEventListener([=](Ref* ref, ui::Widget::TouchEventType type){
  if( type == ui::Widget::TouchEventType::MOVED ){
    // ここで何したらいいんだろ？
  }
});
```
コマンドライン上からmailを送信する場合の方法とその解説


色々な単語の説明もしていく。


macのターミナルからメールを送るにはデフォルトでインストールされているpostfixというソフトを使う。

	postfixとは
	postfixはフリーのMTAである。	MTAとはメール転送エージェントの略でメール送信サーバーのことである。

postfixを使ってgmail経由でメールを送信する。
なぜgmail経由でメールを送るのかというと、OP25Bの問題があるから。

	OP25B(Outbound Port 25 Blocking)とは
	通常電子メール送信には25番ポートを使用する（受信は110番）。メールはSMTPプロトコルを使用して送信するが、SMTPプロトコルは簡単にメールを送ることができるように設計されている。これを悪用し、迷惑メールを送る業者などが増えたため、それを防止するための措置として、OP25Bが導入された。	
	

これは自分が利用しているプロバイダ外のメールサーバー宛に送る場合で、25番ポートを使って送信している利用者の通信を遮断するもの。

例えば、迷惑メール送信者が25番ポートを使用し、契約しているISP(プロバイダ)ではなく（これは身元の特定等の危険があるため）別に用意してあるメールサーバーからメールを転送するといった場合に、これを遮断する。

迷惑メールを送っていた業者もプロバイダ経由でメールを送らなくてはならなくなり、迷惑メールを送りづらくなった。

ただ、25番ポートの通信を遮断してしまうと、正規のユーザーが外出先のネットワークからメールを送りたい場合、外出先ネットワークが自分の利用しているISPではない場合に遮断されてしまう。

それを解決するために登場するのが、サブミッションポートである。

	サブミッションポート(587番)
	このポートの特徴はSMTP-AUTHという認証機能を搭載しているところである。これはメールを送信する際にユーザーIDとパスワードを要求する機能で、STMPサーバーとユーザーとの間で認証が通った場合のみメールを送信するというもの。
	
	
今回メール送信の設定をするにあたって考える必要があるのがこの問題である。
例えば、試験的にメールの送信を行いたいとか、業務上の理由でプロバイダのメールサーバーではなく、自前でサーバーを用意したいといった場合、一旦サブミッションポートを使ってメールを外部のSTMPサーバーにリレーしてもらう(今回はgmailを使う)に送る。gmailから転送するメールはOP25Bの影響を受けないため、メールの送信が可能になる。

では設定の説明。

MACにデフォルトで入っているpostfixは

	/etc/postfix

にある。

このディレクトリ内に
	
	/etc/postfix/sasl_passwd
	
というファイルを作成し、そこにgmailのパスワードを入力する。

	smtp.gmail.com:587 自分のアドレス@gmail.com:パスワード
	
	(smtp.gmail.comはgmailのsmtpサーバー名である。）

ファイル作成後、

	postmap /etc/postfix/sasl_passwd

と入力して、このファイルの設定を有効にする。

次に、リレー先(中継先)の設定をpostfixのメイン設定ファイルに記述する。

ファイルの場所は

	/etc/postfix/main.cf
	
このファイルの最後に

	例；
	relayhost = [smtp.gmail.com]:587
	smtp_use_tls = yes
	smtp_sasl_auth_enable = yes
	smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
	smtp_sasl_tls_security_options = noanonymous	
	smtp_sasl_mechanism_filter = plain
	smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt
	
以上の設定を追加する。上記の設定はサンプルなので、自分の使いたい設定に変更する。

設定完了後、

	postfix start(postfix reload)
	
のコマンドでpostfixを起動させる。

メールを送りたい時は

	mail -s title 自分のアドレス@gamil.com
	
で送信できる。

間違っていたらご指摘をお願い致します。
Androidカラー透明度（Hex）

Hex Opacity Values

100% — FF
95% — F2
90% — E6
85% — D9
80% — CC
75% — BF
70% — B3
65% — A6
60% — 99
55% — 8C
50% — 80
45% — 73
40% — 66
35% — 59
30% — 4D
25% — 40
20% — 33
15% — 26
10% — 1A
5% — 0D
0% — 00
Choregraphe標準のボックスを拡張する その2

# 概要

その1の続き

_その1_ http://qiita.com/hws-hitorobo/items/dc594aa1799742736d0c

## リポジトリ

https://github.com/hws-hitorobo/custom_box


## 4. Inputがあったら定期処理を開始

Waitを拡張して定期的にoutputするボックスを作成します。
そのままですが、定期的にボックスを実行したい場合に使います。

```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.isStop = False

    def onUnload(self):
        self.isStop = True

    def onInput_onStart(self):
        import qi
        self.waiting = qi.async(self.onTrigger, delay=int(self.getParameter("Time(s)") * 1000 * 1000))

    def onInput_onStop(self):
        self.isStop = True

    def onTrigger(self):
        if not self.isStop:
            self.output()
            self.waiting = qi.async(self.onTrigger, delay=int(self.getParameter("Time(s)") * 1000 * 1000))
        else:
            self.onUnload()
```

原型が結構なくなってますが、
onTriggerのなかでフラグを確認して、
onStop入力がない場合は出力しつつ、
新しいWaitを登録しています。

使い方によっては危険なので、注意して使ってください。


## 5. Inputがあったら指定回数だけ定期処理を開始

上記のボックスをさらに拡張して
指定回数だけのループで終了するようにします。

```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.count = 0

    def onUnload(self):
        self.count = 0

    def onInput_onStart(self):
        self.count = self.count + self.getParameter("Count")

        import qi
        self.waiting = qi.async(self.onTrigger, delay=int(self.getParameter("Time(s)") * 1000 * 1000))

    def onTrigger(self):
        self.output()
        self.count = self.count - 1
        if self.count > 0:
            self.waiting = qi.async(self.onTrigger, delay=int(self.getParameter("Time(s)") * 1000 * 1000))
        else:
            self.count = 0
```

先ほどのフラグの代わりにカウンターを使ってます。

## 6. 3つのシグナルを待つWait For Signals

そのままです。
そもそもこういう作りになってしまったら、修正するべきかと思いますが、
使い道はあるかもしれません。

```
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)

    def onLoad(self):
        self.ok = [False]*3

    def onUnload(self):
        #puts code for box cleanup here
        ""

    def onStart(self, nInput):
        self.ok[nInput-1] = True
        bOutput = True
        for bOk in self.ok:
            bOutput = bOutput and bOk
        if( bOutput ):
            self.ok = [False]*3
            self.signalsReceived()

    def onInput_signal1(self):
        self.onStart(1)

    def onInput_signal2(self):
        self.onStart(2)

    def onInput_signal3(self):
        self.onStart(3)
```

Wait For SignalsのInputを3つにして中のリストも3つにしただけです。



---

ほかにもいろいろ作ってますが、
結構ピンポイントなものが多いので、
よく使うものだけ抜粋しました。
Ubuntu14.04にRuby on Rails学習用の環境構築をしたメモ

## 前提
Railsの勉強をしようと思い、環境構築をしたメモ。
超初心者向け。[Rails Crash Course](http://www.nostarch.com/railscrashcourse)という本を参考にしてます。
OSはVagrant上で動く初期状態のUbuntu14.04。

## 流れ
1. rbenvのインストール
2. RubyとRuby on Railsのインストール

## rbenvのインストール
rbenvはRubyの複数バージョンを管理するためのプログラム。
Pythonでいうvirtualenvのようなもの。

まずrubyのコンパイルに必要なツールをインストールしておく:

```sh
$ sudo apt-get install autoconf bison build-essential git libssl-dev libyaml-dev libreadline6 libreadline6-dev zlib1g zlib1g-dev libsqlite3-dev
```

次に、rbenvのリポジトリをコピー:

```sh
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

rbenvのpathの設定やら自動補完:

```sh
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```

最後にruby-build(```rbenv install```コマンドを使えるようにする)のインストール:

```sh
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## RubyとRuby on Railsのインストール
まず、利用可能なRubyのバージョンを調べる:

```sh
$ rbenv install -l
```

最新の安定バージョンをインストールする:

```sh
$ rbenv install 2.2.2
```

Rubyのバージョンを切り替える:

```sh
$ rbenv global 2.2.2
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
```

gem(Rubyのパーケージ管理ツール)でRuby on Railsをインストールする:

```sh
$ gem install rails
```

rbenvをアップデートする:

```sh
$ rbenv rehash
```

これでとりあえず始められるはず。やったね。
リソース付きのQt5のプログラムをCMakeでコンパイルする方法

Qtを使うとGUIをいい感じに作ることができるのですが，普段CMakeを使っている自分には，qmakeを使わないといけないのが面倒でした．最近，CMakeを使ってQtを含むプログラムをコンパイルできるということを知ったのと，Qtを使ったプログラムを作る用ができたのをきっかけに，学生向けに作ったプログラムをCMakeでコンパイルできるよう書き換えました．無事起動はしたのですが，アイコン類が表示できませんでした．Qtでは，アイコン類は，リソースとして*.qrcファイルにまとめて記述しているため，これをCMakeが触れるようにする設定が必要となります．以下，調査して実験した結果をまとめます．

# 参考にしたページ
* http://www.cmake.org/pipermail/cmake/2013-March/054120.html
* http://doc.qt.io/qt-5/cmake-manual.html
* http://cmake.3232098.n2.nabble.com/How-to-embed-Qt-resources-using-CMake-td7584926.html
* http://www.wakayama-u.ac.jp/~chen/cmake/cmakeqt.html
* http://www.coltware.com/2012/06/11/qt-cmake-build/

# プログラム
* https://github.com/tmichi/meshview

昔作った簡易ポリゴンビューワーです．Binary STLファイルのみ読み込み可能です．気がついたらqmakeファイルが消えていたので，これをCMakeでコンパイルできるようにします．

#環境
* Qt (5.4.1)
* Eigen (3.2.4)
* OpenGL (入っているもの)
* CMake (3.2.2)
* Macbook (OS: Yosemite)

#コード
編集するのはCMakeLists.txtになります．

```cmake:src/CMakeLists.txt
set(CMAKE_PREFIX_PATH /usr/local/opt/qt5/lib/cmake )
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5Widgets REQUIRED)
find_package(OpenGL)

QT5_ADD_RESOURCES(RESOURCES meshview.qrc)
include_directories (/usr/local/include/eigen3)

add_executable(meshview Camera.cpp
Camera.hpp
ChangeColorWidget.cpp
ChangeColorWidget.hpp
Color3f.hpp
ExporterCamera.cpp
ExporterCamera.hpp
ExporterMesh.cpp
ExporterMesh.hpp
GLWidget.cpp
GLWidget.hpp
ImporterCamera.cpp
ImporterCamera.hpp
ImporterMesh.cpp
ImporterMesh.hpp
Light.cpp
Light.hpp
MainWindow.cpp
MainWindow.hpp
Mesh.cpp
Mesh.hpp
Model.cpp
Model.hpp
MouseEvent.cpp
MouseEvent.hpp
MouseListener.cpp
MouseListener.hpp
Preference.cpp
Preference.hpp
View.cpp
View.hpp
VirtualTrackball.cpp
VirtualTrackball.hpp
main.cpp
${RESOURCES}
)

target_link_libraries(meshview ${OPENGL_LIBRARY} )
QT5_USE_MODULES(meshview Widgets OpenGL)
```

最初の数行と最後のQT_USE_MODULESは，QtをCMakeでコンパイルするときに必要な設定です．

ポイントは，QT_ADD_RESOURCESのようです．ここでリソースファイル(.qrc)を与えます．また，add_executableにもリソースファイルを同様に追加します．これで，CMakeでコンパイルできるようになります．

#結果
ツールバーのアイコンが表示されていることが確認できます．ただし，プログラムのアイコンは表示されません．これをどうにかするのはパッと見難しそうです．

Macを使って確認したので，Windows等で使いたい場合は，includeやらlibraryのリンクをそれなりに設定する必要があります．

![meshview.png](https://qiita-image-store.s3.amazonaws.com/0/74252/1ef64bc0-7231-2453-96b7-2c27eeed686f.png)
Jenkinsで、0埋めしたビルド番号でGitにタグを打つ

#はじめに

JenkinsのGit Pluginを使うと、ビルドが終わったあとに、リポジトリにタグを打つことができる。
Jenkinsは、環境変数 BUILD_NUMBER にビルド番号を保持している。これを使って、Gitリポジトリにタグを打つのに悩んだのでメモしておく。

#やりたいこと

* build-<ビルド番号> というタグを打ちたい
* ビルド番号は4桁の整数。4桁に満たないときは左側に0を埋めて4桁にする

この、0埋めして4桁にするのに悩んだ。

#使うプラグイン

次のプラグインを入れておく。

* [Git Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin)
* [EnvInject Plugin](https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin)

#すること

まず、「ビルド手順の追加」で「シェルの実行」を選ぶ。テキストエリアには、次のようなスクリプトを書く。

```shell-session
mkdir -p tmp
printf "MY_TAG = build-%04d" $BUILD_NUMBER > tmp/tag.properties
```

続いて、「ビルド手順の追加」で「環境変数のインジェクト」を選ぶ。「プロパティファイルのパス」のテキストボックスに、 ``tmp/tag.properties`` と書く。

これによって、環境変数``MY_TAG``に、build-0023 のような値が設定されるようになる。

最後に、「ビルド後の処理の追加」で、「Git Publisher」を選ぶ。「Tag to push」や「Tag Message」に、``$MY_TAG``のように、環境変数を参照する形式で書くことができる。

#おわりに

もっといいやり方があったら、ぜひ教えてください。
古めのIEで利用するWebページで，javascriptのコンソールを利用する場合の注意

自分がハマったのでメモ．

IE8, IE9 で開発者ツールを開いていない状態で，javascript の console.log() を使うとエラーが発生する．
Firefox38 はエラーにはならなかった．他のブラウザは不明．

## 症状
1. javascriptでエラーが発生
2. 古いIEで症状が見られる（とりあえずIE8とIE9で確認）
3. **開発者ツールを開いたら正常に動く**

## 対応
console.log() を使う場合は，

```js:sample.js
 if (window.console) console.log("文字列");
```

などとすると，このエラーを回避できる．
jQueryのソースではそうやってた．
Choregraphe標準のボックスを拡張する その1

# 概要

Choregraphe標準のボックスには便利なものが多いですが、
ユースケースによってはそのままでは使えない場合が多々あります。
この記事では実際によく使うボックスの拡張を使用する例とともに紹介していきます。

## リポジトリ

ここで紹介しているボックスと以前紹介したRandom Outボックスは
こちらのリポジトリにcblをあげています。

https://github.com/hws-hitorobo/custom_box


_【PEPPER】InputしたらRandomでOutputするPythonBoxをつくる_　　http://qiita.com/hws-hitorobo/items/0a0a57199c24a25a602f

## 1. 値付きのWait

値を出力するボックスの後にWaitを入れたいときや、
値を入力するボックスの前にWaitを入れたいときなどに使用します。


```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)

    def onLoad(self):
        self.waiting = None
        self.p = None

    def onUnload(self):
        self.cancelWaiting()

    def triggerOutput(self):
        self.timerOutput()

    def cancelWaiting(self):
        if self.waiting:
            self.waiting.cancel()
        self.waiting = None

    def onInput_onStart(self, p):
        self.cancelWaiting()
        self.p = p
        
        import qi
        self.waiting = qi.async(self.triggerOutput, delay=int(self.getParameter("Timeout (s)") * 1000 * 1000))

    def onInput_onStop(self):
        if self.getParameter("Trigger timerOutput if cancelled") and self.waiting and self.waiting.isRunning():
            self.timerOutput(self.p)
        self.onUnload()
```

標準のWaitの入出力の型をダイナミックに設定して、
入力で入ってきた値をself.pに保存して、出力時にself.pを渡します。

ディレイでも同様です。

ちなみにWaitとDelayの違いですが、
WaitはInputごとにリセットされ、
DelayはInputの回数分Outputします。


## 2. 値付きOnly Once

ALMemoryからのイベントを排他制御するときなどに
よく使うOnly Onceですが、イベントの引数をそのまま次のボックスに渡したいときなどに重宝します。

```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)

    def onLoad(self):
        self.bFirstTime = True

    def onUnload(self):
        self.bFirstTime = True

    def onInput_onSignal(self, p):
        if( self.bFirstTime ):
            self.bFirstTime = False
            self.firstTime(p)
```

同じく入力と出力をダイナミックに変更します。

WaitやDelayと違いInputのメソッド内で完結するので、
プロパティを持つ必要がないです。


## 3. 値付きWait For Signals

上記の2つのケースの複数ボックスの処理を待機するバージョンです。

```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)

    def onLoad(self):
        self.ok = [False]*2
        self.p  = None

    def onUnload(self):
        #puts code for box cleanup here
        ""

    def onStart(self, nInput):
        self.ok[nInput-1] = True
        bOutput = True
        for bOk in self.ok:
            bOutput = bOutput and bOk
        if( bOutput ):
            self.ok = [False]*2
            self.signalsReceived(self.p)

    def onInput_signal1(self, p):
        self.p = p
        self.onStart(1)

    def onInput_signal2(self):
        self.onStart(2)
```

Wait For Signalsの場合もWaitと同じように一度self.pにsignal1の値を保存しています。


---

長くなってきたので、その2につづく

_その2_ http://qiita.com/hws-hitorobo/items/fcd72e3958cd59457f7b
xcodeでエミュレータの日本語キーボード切り替え

エミュレータで日本語キーボードが表示できなかったので、設定の仕方。

まず、iOSシミュレータでキーボードが表示されていることを確認します。もし、されていない場合は、iOS Simulator -> Hardware -> Keyboardにある「Connect Hardware Keyboard」のチェックを外します。

あとは、xcodeで言語切り替え。

1. Info.plistのLocalizationsに日本語を追加
![Screen Shot 2015-06-30 at 19.17.08.png](https://qiita-image-store.s3.amazonaws.com/0/59560/1b680817-a836-5d78-24dc-70a75894215e.png)



2. EditSchemeを選択
![Screen Shot 2015-06-30 at 19.16.35.png](https://qiita-image-store.s3.amazonaws.com/0/59560/a78ac365-5ac1-cc0d-c138-cd4277cabcb0.png)



3. Run -> Option -> Application LanguageからJapaneseを追加
![Screen Shot 2015-06-30 at 19.36.05.png](https://qiita-image-store.s3.amazonaws.com/0/59560/e484e108-e98f-8b53-a039-7e896d2bdea9.png)
エラー通知のIPNをテストする方法

決済エラー時IなどのIPNがどのような情報を通知するか確認するための方法です。

IPNのテストにはIPNシミレータが便利です。
https://developer.paypal.com/developer/ipnSimulator

ここからIPNの受信URLに、様々な通知を手動でおくることができます。
ここのstatusにFailedなど指定することで基本的なステータスの通知内容を確認できますが、
さらに詳細なエラーコードに対応したテストを行いたい場合は、
amountにエラーコードに対応した値を入れることで可能になります。

下記ページの Testing Your IPN Error Notification Code に記述があります。
IPN Testing
https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNTesting/#ipn-negative-testing

IPNの通知内容のフォーマットは以下にのっています。
https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables
Atom のツリーとタブのフォントを変更する

メニューの
[File] ⇒ [Open your Stylesheet]
でスタイルシートを開く

※japanese-menu で日本語化している場合は
　[ファイル] ⇒ [スタイルシートを開く]

以下を追記してスタイルシートを保存する

```
.tree-view {
  font-family: "Meiryo";
}
atom-workspace {
  font-family: "Meiryo";
}
```
Golang の net/url で # を含む文字列を Parse() する

net/url の `Parse()` に `#` を含む文字列を渡す時は以下の点に注意する。

* `#` 以降は削除される。 (フラグメント識別子と見なされる)
* `#` を文字列に含めたい場合は `%23` で記述する。 (エスケープシーケンス)

以下はこの記事を書くに至った経緯なので、多くの方にとって有用な情報はないと思います。

### 発端

Go で PostgreSQL に繋いでみようと思い、以下のようなコードを書いていた。

```go
package main

import (
        "database/sql"
        "fmt"
        _ "github.com/lib/pq"
)

func main() {
        db, err := sql.Open("postgres", "postgres://user1:@localhost:5432/postgres?sslmode=disable&password=asdf#1234")
        if err != nil {
                panic(err)
        }
        fmt.Println(db)

        rows, err := db.Query("SELECT * FROM table1")
        if err != nil {
                panic(err)
        }
        fmt.Println(rows)
}
```

実行してみると...

```
panic: pq: password authentication failed for user "user1"
```

認証に失敗してしまった。

### 調査

`panic` が起きた `db.Query` から辿って行くと、 lib/pq が DSN をパースする際に `net/url` の `Parse()` を呼んでいた。

* `#` 以降の削除
* RFC 2396 に基づいた URL 文字列のアンエスケープ

`Parse()` では上記 2 点の処理がされている。

### 修正

`#` をエスケープシーケンスに置き換えた。

```go
db, err := sql.Open("postgres", "postgres://user1:@localhost:5432/postgres?sslmode=disable&password=asdf#zxcv")
```

これを

```go
db, err := sql.Open("postgres", "postgres://user1:@localhost:5432/postgres?sslmode=disable&password=asdf%23zxcv")
```

こうすることで無事に動きました。
iOSのプッシュ通知を何度もテストする方法

# 何が問題か

iOSでプッシュ通知を実装すると、プッシュ通知を有効化する確認ポップアップが表示されます。
このポップアップは一度表示すると最低1日は再表示されないという仕様なので、確認ポップアップ後のコールバックのテストなどがとってもやりづらいです。

![通知.png](https://qiita-image-store.s3.amazonaws.com/0/3676/ee7fe51d-c4ce-2b96-a6e3-1d4c66288765.png)

# 対応

公式のドキュメントに対応が書いてありました。

> # Resetting the Push Notifications Permissions Alert on iOS
> The first time a push-enabled app registers for push notifications, iOS asks the user if they wish to receive notifications for that app. Once the user has responded to this alert it is not presented again unless the device is restored or the app has been uninstalled for at least a day.
> 
> If you want to simulate a first-time run of your app, you can leave the app uninstalled for a day. You can achieve the latter without actually waiting a day by following these steps:
> 
> 1. Delete your app from the device.
> 2. Turn the device off completely and turn it back on.
> 3. Go to Settings > General > Date & Time and set the date ahead a day or more.
> 4. Turn the device off completely again and turn it back on.
> 
> https://developer.apple.com/library/ios/technotes/tn2265/_index.html#//apple_ref/doc/uid/DTS40010376-CH1-TNTAG42

日付を戻すタイミングとか書いてないですが、以下の手順で問題なくできてます。

1. アプリを削除
2. デバイスを再起動
3. 日付を1日以上進める（いつも2日ぐらい進めてます）
4. デバイスを再起動
5. 日付を戻す
6. アプリをインストール

これで何度でもテストができますね！
デバイスを再起動する時点で、めんどくさすぎますが(；´Д｀)


# 7/1 2:07 追記

ちなみにプッシュ通知のこの辺の情報は、

/private/var/mobile/Library/RemoteNotification/Clients.plist

内で管理されてるそうです。

> The plist: /private/var/mobile/Library/RemoteNotification/Clients.plist
> 
> ... contains the registered clients for push notifications. Removing your app's entry will cause the prompt to re-appear
> http://stackoverflow.com/questions/2438400/reset-push-notification-settings-for-app

脱獄した端末なら簡単に再テストができそうです！（未確認）
あ、もちろん脱獄して何かあっても知りませんｗ
commit履歴をまとめてプルリク出したい

```zsh:command1
git rebase -i origin/master
```

pick コミットコメント1
pick コミットコメント2
pick コミットコメント3

　　↓

pick コミットコメント1
s コミットコメント2
s コミットコメント3

とすると、コミットコメント1のコミットに残りのコミットをまとめあげてくれる

その後

```zsh:command2
git push -f origin feature/item_provide
```

で無理やりpushすればおｋ