OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryを使った連続chainアニメーション

jQueryを使うと簡単にアニメーションが書けるのですが、アニメーションの完了がコールバックになっているので連続したアニメーション、特に同時実行ではなく連鎖するアニメーションが書きづらくなります。
そういった場合は、以下の様にコールバックから連鎖する関数を書き、そこでアニメーションを行います。

```html:
<ul class="agenda">
  <li>うどんはじめました。</li>
  <li>冷やし中華もはじめました。</li>
  <li>もりそばもはじめました。</li>
  <li>国破れてサンガリア</li>
</ul>
```

```css:
.agenda li {
  display: none;
}
```

```js:
$(function() {
  var chain = function(e, i) {
    i = i || 0;
    $(e[i]).fadeIn(2000, function() {
      chain(e, i+1);
    });
  };
  chain($('.agenda li'));
});
```

Deferredを使っても書けますが、これくらいの単純なアニメーションであれば使う必要はないと思います。
ローカルからTreasureDataへのアクセス


TreasureDateに格納されているデータをローカルPCから簡単にアクセスする方法。
toolbeltを使えば簡単にアクセスができる。

**toolbeltインストール**
下記のURLからダウンロードする
http://help.treasure-data.com/kb/installation/installing-td-command-on-windows

インストーラの指示に従ってインストールする。
※特別な設定は不要

**アカウントの設定**

>td account -f
>XXXXX@xxx.co.jp
>password

**データへアクセス**
SQLのようにデータにアクセスできる

>td query -w -d applog "select * from tracking group by v['mem']"

※applogはアクセス先、trackingはテーブル
※カラムはv['']で囲んで書く

**ファイルへ出力**

>td query -w -d applog -f csv -o output.csv "select * from tracking"
RedShiftの日本語あんちょこメモ

#サポートしていないPostgreSQLの機能

[ここに記載されている。](http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-features.html)

#データ型

とりあえず、範囲を追加

|Data type|	Aliases|	Description|	範囲|
|-----------|------------|------------|------------|
|SMALLINT| INT2|	Signed two-byte integer|	-32768 to +32767
|INTEGER|	INT, INT4|	Signed four-byte integer|	-2147483648 to +2147483647
|BIGINT|	INT8|	Signed eight-byte integer|	-9223372036854775807 to 9223372036854775807
|DECIMAL|	NUMERIC|	Exact numeric of selectable precision|	可変長
|REAL| FLOAT4|	Single precision floating-point number|	- 3.40E+38 ～ -1.18E-38、0、および 1.18E-38 ～ 3.40E+38
|DOUBLE PRECISION|	FLOAT8|	Double precision floating-point number|
|BOOLEAN|	BOOL|	Logical Boolean (true/false)|	TRUE, FALSE, NULL
|CHAR|	CHARACTER|	Fixed-length character string|	65535 bytes (64K -1)
|VARCHAR|	CHARACTER VARYING|	Variable-length character string with a user-defined limit|	65535 bytes (64K -1)
|DATE|	|	Calendar date (year, month, day)|	4713 BC to 5874897 AD(1 day)
|TIMESTAMP|	|	Date and time (without time zone)|	4713 BC to 5874897 AD(1 microsecond)


#Copyコマンド
[並び替え可能。](http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html)
こんな感じ。

###"Load data from a file with default values"
```sql:
copy venue_new(venueid, venuename, venuecity, venuestate) 
from 's3://mybucket/data/venue_noseats.txt' 
credentials 'aws_access_key_id=<your-access-key-id>;
aws_secret_access_key=<your-secret-access-key>' 
delimiter '|';
```

* Copy元ファイルに存在するカラムをスキップしてCopyすることはできない。
* Datetime型のデータをDate型のカラムにCopyすることはできない。
git submodule update がいちいち面倒くさいあなたへ

エイリアス貼りましょう。
.zshrcへ、

```
alias gsu='cd $(git rev-parse --show-toplevel) && git submodule update && cd -'
```

を追記。
gsuと叩けば一発でsubmodule updateします。

エイリアスなのでgsuの部分はお好きな文字列で良いです。
.zshrc編集したらsourceで読み込むのを忘れずに。

--------

作った経緯

「あーそろそろmasterブランチ追跡しないとー」

```
git pull 
git status
```

↓

```
## master
 M ../sub/module
```

イラッ
「あーはいはいsubmodule updateね」

```
git submodule update
```

↓

```
You need to run this command from the toplevel of the working tree.
```

イライライラッ
なんでいちいちthe toplevel of the working treeとやらまで行かなあかんねん！めんどい！
the toplevel of the working tree行ってgit submodule updateして今おるとこへ戻ってこい！

というエイリアスを作っただけです。
そもそもgit pullと一緒にしてしまってもいいような気もしますが、そこはお好みで。
Enter で ls と git status を表示すると便利

とある方の
__"エンターだけで ls と git status 表示するようにしてある"__
というつぶやきを見て便利そうだと思ったのでやってみました。

![qiita_do_enter.png](https://qiita-image-store.s3.amazonaws.com/0/10548/d112beb6-b994-6d35-4186-767922e080a4.png)

基本的なやり方は以下の記事が参考になりました。

- [zshでコマンドが空の状態でenter押したときに任意のコマンドを実行する方法 - kei_q](http://d.hatena.ne.jp/kei_q/20110406/1302091565)

ただ、上記方法では私の環境の場合、プロンプトが1回余分に表示されてしまって気持ちが悪いので、その辺りも手を加えました。

#Installation

以下スクリプトを ``.zshrc`` に記述すれば、何も入力されていない状態で Enter を打つだけで ``ls`` と ``git status`` が表示されるようになります。

```zsh:.zshrc
function do_enter() {
    if [ -n "$BUFFER" ]; then
        zle accept-line
        return 0
    fi
    echo
    ls
    # ↓おすすめ
    # ls_abbrev
    if [ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" = 'true' ]; then
        echo
        echo -e "\e[0;33m--- git status ---\e[0m"
        git status -sb
    fi
    zle reset-prompt
    return 0
}
zle -N do_enter
bindkey '^m' do_enter
```

``ls`` は以下記事の ``ls_abbrev`` を使用するのがお勧めです。

- [Zsh - chpwd内のlsでファイル数が多い場合に省略表示する - Qiita [キータ]](http://qiita.com/yuyuchu3333/items/b10542db482c3ac8b059)

Enter はちょっとやり過ぎという方は別のキーに割り当てると良いでしょう。

#おわり

``ls`` や ``cd`` の入力をどれだけ減らせるかというのは、ターミナル使用者の力量が問われる部分ではないでしょうか。
(最近Twitterで cd後のls や mkdir後のls/cd の話が少し話題になってましたね)

そんな私の ``zsh`` の設定は以下にあるので良ければどうぞ。

- [dotfiles/.zsh at master · yonchu/dotfiles](https://github.com/yonchu/dotfiles/tree/master/.zsh)

また、良いアイディアやアドバイスなどありましたら教えてください。
WebGLでレンダリングしたものをキャプチャする


WebGLでレンダリングしているcanvas要素から、`toDataURL()`メソッドでキャプチャが取れなかったのでメモ。

オプションのpreserveDrawingBuffeをtrueにする。

```javascript
var context = canvas.getContext("experimental-webgl", {preserveDrawingBuffer: true});
```

ただ、これを使ってもcanvas 2Dに`drawImage`してもキャプチャが表示されなかった。
（`new Image()`で生成したimgのsrcに設定すると表示はされた）

##参考
* http://asalga.wordpress.com/2011/08/01/using-webgl-readpixels-turn-on-preservedrawingbuffer/
CentOS に ant を入れる


Apache Ant のダウンロードページに掲載されているリンクのURLからダウンロード。

```
wget http://ftp.tsukuba.wide.ad.jp/software/apache//ant/binaries/apache-ant-1.9.1-bin.zip
```

ダウンロードしたzip の展開先は、/opt 配下に展開。
/usr/local/bin/ant を /opt/(ant展開先)/bin/ant にシンボリックリンクする。

```
$ sudo su
# cp apache-ant-1.9.1-bin.zip /opt
# cd /opt
# unzip apache-ant-1.9.1-bin.zip
# ln -s /opt/apache-ant-1.9.1/bin/ant /usr/local/bin/ant
```

<code>hash -r</code> して <code>ant</code> コマンドが実行できたらOK


## 参考

[CentOSにantをインストールする方法。](http://www.bhnt.co.jp/blog/%E9%9B%91%E8%A8%98/%E7%A4%BE%E5%93%A1%EF%BC%9Acobra/centos%E3%81%ABant%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%80%82/)
pageinit、pagecreate等が呼ばれない場合。

【改めて記述】
動かす事ができたので改めて書きます。
http://jsbin.com/aheped/1
とにらめっこしてわかった事。

 1.  $(function(){})内でpageinit等のイベントを定義する必要は無い。
 1. pageinitがセットされるタイミングで既にDOM構築が終わっていなければいけない。

恐らく1の動作で$(function(){})で定義すると環境によって動作が違うように感じる。というわけで、レガシーな書き方に近い方法を踏襲すれば良い様子。

 1. pageinitは$(function(){})の外で定義する。
 1. 上記はDOM構築が終わってから呼べば良いので、bodyの一番下でjsを定義したりすると良い。

自分の所ではこれで無事に動作しました。以下は過去に書いた駄文。

---------------

【追記】なんだかイロイロ調査不足で上げてしまった様子なので、また改めて調査してから書き直します。ごめんなさい。

どうもイベントが呼ばれない様子で調べてみると、下記が引っかかった。
http://forum.jquery.com/topic/pageinit-event-not-fired-with-1-3-1
導入しているバージョンが同一で似たような相談をしている。

※下嘘。
途中で提示されている下記は、ChromeやMac上のSafariではポップアップが2回呼ばれて正しい動作をしたが、iPhoneでは何も呼ばれなかった。
http://jsbin.com/aheped/1/edit
※すんまそん。上嘘でした。動作してた。

現在継続調査中（誰か知ってる人おせ〜て）。
この辺りに不安があるなら古いバージョンを使う等工夫をした方が良いかも知れない。

とりあえずソース。

```js:
    $(document).on('pagecreate', '#main-page', function(event){
        console.log('#main-page pagecreate');
    });

    $(document).on('pageinit', '#main-page', function(event){
        console.log('#main-page pageinit');
    });
```


$(function () {})の外で書いても中で書いてもiPhoneでは呼ばれてくれない。むむー。


【追記】
Chromeでも、URLを綺麗な状態にしたらイベントが起こらなくなった。
iPhoneでも
Markdown to RSpec 

[RSpec](https://github.com/rspec/rspec)はRubyのテストフレームワークです。TDDやBDDに利用されています。
ステークフォルダーの価値(振る舞い)を自然言語に近い形でテストコードに記述することができます。

# Usage

テストコードは振る舞いを**3つ**のメソッドで記述します。

| method   | examplar  |
|:---------|:----------|
| describe | 概要、機能 |
| context  | 行動、状態 |
| example  | 期待      |


`describe`と`context`は任意で階層を増やすことができます。
(`context`は`describe`のエイリアスです。用途に合わせて使います。)

```Ruby:example_spec.rb
describe "概要" do
  describe "機能" do
    context "行動" do
      context "状態" do
        example "期待"
      end
    end
  end
end
```

`xxx_spec.rb`ファイルに振る舞いを記述するので、設計のドキュメンテーションを
**Markdown**で記述すると**RSpec**にコンバートが簡単です。

# Example

## Markdown

メモ帳のアプリケーションを簡単に設計してみます。

```notepad_spec.md
# メモ帳

## 新規
* メモ帳が作成される
* タイトルは無題で表示される
* テキストは空白で表示される

## 開く
* 選択するファイルの一覧が表示される
* 選択したファイル名がタイトルに表示される
* 選択したファイルの内容がテキストに表示される

## 保存
### メモ帳が新規の場合
* ファイル名を入力して保存する

### メモ帳が更新の場合
* ファイルを上書きで保存する
```

## RSpec

このMarkdownをRSpecに置換えます。

```Ruby:notepad_spec.rb
describe "メモ帳" do
  describe "新規" do
    example "メモ帳が作成される"
    example "タイトルは無題で表示される"
    example "テキストは空白で表示される"
  end

  describe "開く" do
    example "選択するファイルの一覧が表示される"
    example "選択したファイル名がタイトルに表示される"
    example "選択したファイルの内容がテキストに表示される"
  end

  describe "保存" do
    context "メモ帳が新規の場合" do
      example "ファイル名を入力して保存する"
    end

    context "メモ帳が更新の場合" do
      example "ファイルを上書きで保存する"
    end
  end
end
```

## Pending

まずは `example` にブロックの記述がないので**PENDING**になります。
(`rspec -cf d`コマンドでスペックがカラーで階層に表示されます。)

```Bash
$ rspec -cf d notepad_spec.rb 

メモ帳
  新規
    メモ帳が作成される (PENDING: Not yet implemented)
    タイトルは無題で表示される (PENDING: Not yet implemented)
    テキストは空白で表示される (PENDING: Not yet implemented)
  開く
    選択するファイルの一覧が表示される (PENDING: Not yet implemented)
    選択したファイル名がタイトルに表示される (PENDING: Not yet implemented)
    選択したファイルの内容がテキストに表示される (PENDING: Not yet implemented)
  保存
    メモ帳が新規の場合
      ファイル名を入力して保存する (PENDING: Not yet implemented)
    メモ帳が更新の場合
      ファイルを上書きで保存する (PENDING: Not yet implemented)
```

## Implement

Notepadクラスにcreateメソッドを実装したとします。
(この例はスタブで必ずテストが成功するようにしています。)

```Ruby:notepad_spec.rb
describe "Notepad" do
  describe ".create" do
    let(:notepad) {Object.new}

    example "creates a notepad" do
      notepad.stub(:title) {"無題"}
      expect(notepad.title).to eq("無題")
    end

    example "returns blank to the text" do
      notepad.stub(:text) {nil}
      expect(notepad.text).to be_nil
    end
  end
end
```

クラスメソッドは`.`、インスタンスメソッドに`#`を`describe`に記述すると出力が読みやすくなります。

```Bash
$ rspec -cf d notepad_spec.rb 

Notepad
  .create
    creates a notepad
    returns blank to the text
```

他にも`before`や`let`などの便利なメソッドがRSpecにあります。

要件から設計(タスク化)をするときに受入(テスト)まで考慮すると
開発でのソースコードが仕様書に近くなるので素敵です。


# Tips

RSpecのアサーションの推奨が`should`から`expect`に変更されました。

## should

冗長かと思いながらも`it`は`should`から始めていました。

```Ruby
it "should return blank to the text" do
  notepad.text.should be_nil
end
```

## expect

`expect`に変えるついでに`it`の`should`も外しました。
(ただ`it`は三人称単数なので動詞の最後にsを付ける必要があります。)

```Ruby
it "returns blank to the text" do
  expect(notepad.text).to be_nil
end
```

### example

`it`は三人称単数を気にすることになるので`example`に変更しました。

```Ruby
example "returns blank to the text" do
  expect(notepad.text).to be_nil
end
```
XCodeでプロジェクトを起動したら「no editor」しか出てこなくなってしまった時

プロジェクトを起動したら、「no editor」としか書いていないツールバーなども何もないつるっとしたウィンドウが出てきましたYO。
そんなときの対処法。

File -> Source Control -> Refresh Status

これで再度プロジェクトファイルを開いたら治りました。
ツールバーやナビゲーションバーは非表示になってしまいましたが、

View -> Show Toolbar

など、ひとつひとつ表示させてなおしました。


こちらを参考にしました。
http://stackoverflow.com/questions/5994630/why-does-xcode-4-version-editor-sometimes-say-no-editor
Emacs で URL エンコードする

ググるといろいろやり方はあるようだが一番簡単なのはこれではなかろうか。

```el:
(require 'url-util)
(url-hexify-string "やっほー") ;; => %e3%82%84%e3%81%a3%e3%81%bb%e3%83%bc
```

**ただし `'utf-8` 限定。**
SolarisのソフトウェアRAIDチェック

cronで定期的に動かしてみる。

```bash:
#!/bin/bash
#
export LANG=C
ERR=/usr/sbin/metastat | grep State: | grep -v Okay | wc -l
if $ERR -ge 1
then
 /usr/sbin/metastat | /bin/mail -s "RAID ERROR" hogehoge@example.com
fi
```
Unity NGUIでアスペクト比にかかわらずGameObjectの位置を指定する方法

iPhone4,5や、Androidで異なるアスペクト比の画面サイズに対して

画面上、左端からボタンを配置したいということが、UnityのIDEで設置するだけではできないが、
スクリプトを対象のボタンなどのGameObjectに付加することで実現できる

### 追記：すなおにAnchorを使ったほうがいいと思います。Anchorの使い方がわからなくて自力実装したので、Anchorで表現しきれないところをハックして実装したい方には参考になるかもです。Unity4の最新版は2D 対応したのでソッチのほうがいいかもね！

[Unity]NGUIで画面サイズに合わせる(NGUI2.3.0対応版)<http://udasankoubou.blogspot.jp/2013/05/unitynguingui230.html>なんかを同時に利用する場合はもう少しこねくり回す必要あり。またSprineの場合はBoxColliderがないので少し違う。

このスクリプトでは、対象のオブジェクトを設置するx,y位置設定は、左上から表示が始まる位置とする(Webと一緒)

```csharp::NGUIPositionDitector.cs
using UnityEngine;
using System.Collections;

public class NGUIPositionDitector : MonoBehaviour {
	BoxCollider boxCollider;
        public float x,y;
	// Use this for initialization
	void Start () {
		boxCollider = (BoxCollider)GetComponent("BoxCollider");		
		transform.localPosition = new Vector3(-Screen.width / 2  +boxCollider.size.x/2 + x, Screen.height /2 - boxCollider.size.y/2   , y);
              SendMessage("SetTweenPos",transform.localPosition);
	}

}
```

UIButtonOffsetを拡張する必要もある。ボタンを押した時のアニメーション位置が位置の変更に対応している無いので、UIButtonOffsetのmPosをセットできるようにする。

```csharp::UIButtonOffset.cs
// Vector3 mPos;
 protected Vector3 mPos;
```

```csharp::UIButtonOffsetExtender.cs
using UnityEngine;
using System.Collections;

public class UIButtonOffsetExtender : UIButtonOffset {	
	void SetTweenPos(Vector3 newPosition){
		mPos=newPosition;
	}
}
```
appendした要素をクリックしたときに、$(this)を得るには

## やりたかったこと
appendした要素(#list liとする)をクリックしたときに、$(this)を得る

## jQuery1.9まで
ぐぐったところ、このように書くらしい。
でもjQuery1.9からlive使えない・・・

```js:
$('#list li').live('click', function(){
    alert($(this));
    return false;
});
```

## jQuery1.9から
色々試した感じ、これで行けそう。$(this)じゃないけど。

```js:
$('#list').on("click",$('li'),function(e){
	alert($(e.target));
	return false;
});
```

デモ：http://jsdo.it/Ituki/ag35
Change project type

- 4.2などは、プロジェクトのプロパティメニューから
- 4.3では、プロジェクトのプロパティメニューに表示がない。
-- とりあえず.projectファイルを直接書き換えでJavaプロジェクトには変換できる

# 4.2以前

## Operation
> "Properties..." -> "Project Facets"

## Reference
- [Eclipseでプロジェクトのタイプを後から変更 ： eclipse, java | メモリークラフト](http://www.memorycraft.jp/2008/11/eclipse.html)

# 4.3 Kepler他

## 直接書き換え

```:before
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>hogehoge project</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
	</buildSpec>
	<natures>
	</natures>
</projectDescription>
```

```:after
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>hogehoge project</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
	</natures>
</projectDescription>
```
Encoding for "properties" files

# ポイントメモ
- propertiesファイルのエンコーディングは、"ISO-8859-1"
- Eclipseの場合、設定ですでに"ISO-8859-1"で指定されている。
- 通常のフリーのエディタでは２バイト文字部分を読めないので注意。

# Reference
- [ISO-8859-1とは : JavaA2Z](http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000702.html)
- [Eclipseでpropertiesファイルの日本語文字化けを直す - 虎塚](http://d.hatena.ne.jp/torazuka/20130225/eclipse)
- [プロパティ・ファイルを読み込む](http://www.02.246.ne.jp/~torutk/javahow2/utilproperties.html)
- [CoolなEclipseプラグイン（1）：Javaのプロパティファイルを編集できるプラグイン (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0503/26/news009.html)
CarrierWaveでファイルの内容をもとにcontent-typeの判定を行う

# CarrierWaveでファイルの内容をもとにcontent-typeの判定を行う

## 拡張子をもとに判定することの問題

ファイルのアップロードを行うアプリを実装する際に、ファイルのcontent-typeを判定したいことがある。

もっとも手軽にcontent-typeの判定を行う方法としては拡張子での判定がある。CarrierWaveではuploaderクラス内でextension_white_listメソッドを上書きすることで、ホワイトリスト形式でアップロードを許可する。

```ruby:app/uploaders/avatar_uploader.rb
  # 〜抜粋〜

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg gif png)
  end
```

しかし、拡張子だけをもとに判定した場合は内容はPDFだけど拡張子が.jpgになっているようなファイルの内容と拡張子に相違があるファイルがバリデーションを通過してアップロードできてしまう。
このようなケースを防ぎたい時は、ファイルの内容をもとにcontent-typeを判定する必要がある。

## ファイルの内容をもとに判定を行う方法

"[ruby-filemagic](https://github.com/blackwinter/ruby-filemagic)"というGemがある。このGemではファイルの内容をもとにcontent-typeの判定を行うことができる。
ruby-filemagicの簡単な使用方法は以下の通りである。

まず、インストールを行う。

```ruby:Gemfile
gem 'ruby-filemagic'
```

```
bundle install
```

続いて、`rails console`上で適当なファイルに対してcontent-typeの判定を行ってみる。

```ruby:at_console.rb
require "filemagic"
FileMagic.new(FileMagic::MAGIC_MIME).file(File.join("/path/to/files/actually_pdf.jpg"))  # ※actually_pdf.jpgは、内容はPDFだけど拡張子が.jpgのファイル
=> "application/pdf; charset=binary"
```

このように、拡張子にとらわれずファイルの内容によってcontent-typeが判定できる。

このruby-filemagicをCarrierWaveで利用できるようにするGemで"[carrierwave-magic](https://github.com/glebtv/carrierwave-magic)"というのがある。これを利用すると掲題の目的を達成することができる。
carrierwave-magicの使用方法(の一例)は以下の通りである。

まず、インストールを行う。

```ruby:Gemfile
gem 'carrierwave-magic'
```

```
bundle install
```

続いてアップローダでcarrierwave-magicを利用できるように設定する。

```ruby:app/uploaders/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
  include CarrierWave::Magic
  process :set_magic_content_type => [true]

  # 〜以下省略〜
end
```

基本的には[carrierwave-magic](https://github.com/glebtv/carrierwave-magic)のREADMEにあるusageに従った形だが、第一引数をtrueにすることで必ずファイル内容をもとにcontent_typeの判定が行われるようになる(※詳しくはcarrierwave-magicのソースを参照)。

これでAvatarUploaderのインスタンスではcontent_typeにファイル内容をもとにチェックした値が入るようになった。
あとはその値をもとに任意のバリデーションを行う。

```ruby:app/models/user.rb
  # 〜抜粋〜
  mount_uploader :avatar, AvatarUploader
  validate  :avatar_valid?, :if => Proc.new{ |user| user.avatar_changed? && user.errors[:avatar].blank? }

  def avatar_valid?
    if avatar.file.content_type != "image/jpeg"
      errors.add(:avatar, "不正なファイルが添付されています。")
    end
  end
```

また、この方法は拡張子がついていないファイルのcontent-typeを確認したいときなどにも利用できる。
Androidでカメラ画像を取得する

Andoroidでカメラアプリを作ろうと思うことはあると思う。
そのとき、SurfaceViewを使って、カメラのプレビュー画像を
表示するのはよくあると思われる。

ここで、プレビュー画像を取得しようと思ったら、めっちゃハマった。

まず、やろうとしたのは

・view.getDrawingCache()

でスクリーンショットを取得する方法。
結論だけ言うと失敗。カメラのプレビューは取得出来ないようだ。

その後、ネットの海をさまよった結果、
一番良さそうな方法は、PreviewCallback内の
onPreviewFrame(byte[] data, Camera camera) が
呼ばれたタイミングで、引数のbyte[] dataを使う方法。

参考：
[http://tech.thecoolblogs.com/2013/02/get-bitmap-image-from-yuv-in-android.html](http://tech.thecoolblogs.com/2013/02/get-bitmap-image-from-yuv-in-android.html)


どうやるかというと、
１．引数dataから、YuvImageを作成する。
２．それをjpegに変換。
３．jpegをBitmapに変換する。

ソースは以下。

```Java
private PreviewCallback previewCallback = new PreviewCallback() {
  @Override
  public void onPreviewFrame(byte[] data, Camera camera) {
    // 読み込む範囲
    int previewWidth = camera.getParameters().getPreviewSize().width;
    int previewHeight = camera.getParameters().getPreviewSize().height;
            
    // プレビューデータから Bitmap を生成 
    Bitmap bmp = getBitmapImageFromYUV(data, previewWidth, previewHeight);
    // あとはBitmapを好きに使う。
  }

  public Bitmap getBitmapImageFromYUV(byte[] data, int width, int height) {
      YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null);
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      yuvimage.compressToJpeg(new Rect(0, 0, width, height), 80, baos);
      byte[] jdata = baos.toByteArray();
      BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options();
      bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565;
      Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length, bitmapFatoryOptions);
      return bmp;
  }
}
```

>はじめにYuvImageを作成するのは、onPreviewFrameに渡されるdataが
>RGBではなくYUB形式なので、そのままではBitmapを作成出来ないせい。
Linux のディストリビューションを判別する


http://www.novell.com/coolsolutions/feature/11251.html より引用

|Distribution 	|Release Information file|
|:------------------|:-------------------------|
|Novell SUSE 	|/etc/SUSE-release|
|Red Hat 	|/etc/redhat-release, /etc/redhat_version|
|Fedora 	|/etc/fedora-release|
|Slackware 	|/etc/slackware-release, /etc/slackware-version|
|Debian 	|/etc/debian_release, /etc/debian_version,|
|Mandrake 	|/etc/mandrake-release|
|Yellow dog 	|/etc/yellowdog-release|
|Sun JDS 	|/etc/sun-release|
|Solaris/Sparc 	|/etc/release|
|Gentoo 	|/etc/gentoo-release|
|UnitedLinux 	|/etc/UnitedLinux-release|
|ubuntu 	|/etc/lsb-release|

上記のファイルを確認することでディストリビューションを判断できる。
GeoJSON参照リンクまとめ

忘れそうなのでいろいろメモ。

* [geoJSON本家](http://www.geojson.org/)
* [geoJSONフォーマット仕様](http://geojson.org/geojson-spec.html)
* [geoJSONフォーマット仕様 - 日本語訳](http://s.kitazaki.name/docs/geojson-spec-ja.html)
* [日本語訳されたかたのブログ](http://kshigeru.blogspot.jp/2012/05/geojson.html?spref=fb#id4)
* [Quick How to](https://github.com/jlord/gs2geojson)
* [使い方の例](http://blog.godo-tys.jp/category/geojson/)
* [D3.jsとTopoJSONで地図作成](http://kshigeru.blogspot.jp/2013/03/d3-geojson-polygon.html)

* [Mapbox/geocoding](https://github.com/mapbox/geo-googledocs)
* [Mapbox/geocoding-googledocs-usage](http://www.mapbox.com/blog/mapping-google-doc-spreadsheet/)
* [Mapbox/quick usage](http://www.mapbox.com/tilemill/docs/guides/google-docs/#geocoding)
* [gs2geojson](https://github.com/jlord/gs2geojson)
Adobe AIRでAndroid/iOS/iOSシミュレータを判定する


Android、iOS、iOSシミュレータを判定して処理を分けたい。

とりあえずこんな感じで判定できた。（ちゃんとテストしてないけど）

```as3:
var device:String = "unknown";if (Capabilities.manufacturer.search('Android') > -1) {	device = "android";} else if (Capabilities.manufacturer.search('iOS') > -1) {	device = Capabilities.os.search('x86') > -1 ? "iossimulator" : "ios";}
```

シミュレータだとCapabilities.architectureがx86になるのかなーっと思ったけどARMになるっぽい。
Capabilities.osにx86_64って入ってたのでそれで判定した。
New Relicの可用性監視でサイトが動いている事を検知する

![Availability_Settings_-_New_Relic.png](https://qiita-image-store.s3.amazonaws.com/0/10032/4c817610-0fc3-e2fa-fff3-12651cc50e61.png)

ほぼ全てのEngine Yardユーザが利用しているNew Relicにはサイトが停止していないかを外部から監視するモニタリング機能があります。Engine Yardも指定したURLへのモニタリング機能がありますが、これは内部からの監視になっているので外部からの監視が可能で高機能なNew Relicの設定はぜひともしておきましょう。

設定はNew Relicのダッシュボードでアプリケーションを選択し、Setting > Availability monitoring のタブの中から行います。設定項目は次のとおり。

* Turn on availability monitoring for {app}
    * このアプリケーションで可用性監視を有効にする
* URL to ping:
    * 定期的に監視するURL
* Elapsed time between failures before a downtime event is recorded:
    * ダウンタイムのイベントを記録するまでの経過時間 (30秒、1分、2分、3分、5分、10分から選択)
* Substring required in response for a valid result:
    * 正常なレスポンス内に含まれるべき文字列
* Treat redirects as a valid result. (Redirects will not be followed)
    * リダイレクトを正常な結果と扱う。 (リダイレクトを追跡はしない)
* Validate SSL certificate
    * SSL証明書を検証する

またアラートの送信先のメールアドレスも任意の数設定する事ができ、メンテナンス時などにAPIを使って一時的に監視をオフにする事もできます。
gitignoreのサンプル

GitHubに様々なプロジェクト用のgitignoreのサンプルがまとめてありました。
こういうことをして頂いている方に感謝です。

https://github.com/github/gitignore

初めて触る種類のプロジェクトの時にファイルの取捨選択に困るときがあるのでありがたいです。
MKMapView: 2点間の距離

```objc:2点間の距離を取得（MKMapPoint）
MKMapPoint point1 = MKMapPointForCoordinate(coordinate1);
MKMapPoint point2 = MKMapPointForCoordinate(coordinate2);
CLLocationDistance distance = MKMetersBetweenMapPoints(point1, point2);
```
---
[MKMapView のメモ / 座標変換など](http://qiita.com/CarmineScarlet/items/f17315cd08f7212b5695)
CloudWatch 標準メトリクス(監視項目) 一覧

標準メトリクス一覧がネットで調べてもなかなかでてこなかったので、備忘録として残しておきます。
-------
> 参考：http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-cloudwatch.html

1. CPUUtilization
割り当てられた EC2 コンピュートユニットのうち、現在インスタンス上で使用されているものの比率。このメトリックスは、選択されたインスタンス上でアプリケーションを実行するのに必要な処理能力を表します。
単位: Percent

1. DiskReadOps
このインスタンスで利用できるすべてのエフェメラルディスクでの、完了した読み取り操作の数（インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください）。
このメトリックスは、一定の時間当たりの、アプリケーションがディスクから読み取る回数を表しています。これを利用すると、アプリケーションがハードディスクからデータを読み取る速度がわかります。
単位: Count

1. DiskWriteOps
このインスタンスで利用できるすべてのエフェメラルディスクでの、完了した書き込み操作の数（インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください）。
このメトリックスは、一定の時間当たりの、アプリケーションがハードディスクに書き込む回数を表しています。これを利用すると、アプリケーションがハードディスクにデータを保存する速度がわかります。
単位: Count

1. DiskReadBytes
このインスタンスで利用できるすべてのエフェメラルディスクでの、読み取られたバイトの数（インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください）。
このメトリックスを使用すると、このインスタンスのハードディスクからアプリケーションが読み取るデータの量がわかります。これを利用すると、アプリケーションの速度がわかります。
単位: Bytes

1. DiskWriteBytes
このインスタンスで利用できるすべてのエフェメラルディスクでの、書き込まれたバイトの数（インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください）。
このメトリックスを使用すると、このインスタンスのハードディスクにアプリケーションが書き込むデータの量がわかります。これを利用すると、アプリケーションの速度がわかります。
単位: Byte

1. NetworkIn
このインスタンスのすべてのネットワークインターフェースで受信されたバイトの数。このメトリックスは、1 つのインスタンス上での 1 つのアプリケーションへのネットワークトラフィックの量を表しています。
単位: Bytes

1. NetworkOut
このインスタンスのすべてのネットワークインターフェースから送信されたバイトの数。このメトリックスは、1 つのインスタンス上での 1 つのアプリケーションからのネットワークトラフィックの量を表しています。
単位: Bytes
jQuery  tooltipプラグイン tipsy

jQueryのtooltipを表示するプラグインを探してたところ見つけた。
数年前のプラグインのようだけど、tooltipをただ単に表示したい時には必要十分な感じだった。

オフィシャルはここなのかな
[tipsy](http://onehackoranother.com/projects/jquery/tipsy/)

ページ最下部にDownloadとGithubのリポジトリURLが乗ってます。DLページの方はjQueryオフィシャルのプラグインページに飛ぶけど、古いのでGithubから落としたほうが楽。
適当なところで落としてくるとバージョンが古かったりしてハマったので注意した方がいいかも。

jquery.jsとjquery.tipsy.jsを読みこめば、最低限以下で使える。

```html:tipsy
<span id="hoge" title="hoge">jquery object</span>

<script type="text/javascript">
$(function() {
	$("#hoge").tipsy({
		gravity: 's'
	});
});
</script>

```

対象のjQueryオブジェクトをマウスオーバーすると、title要素の値が表示されます。
titleが無いと何も表示されません。
与えるオブジェクトの中身を変更すればいろいろ変えられるみたい。

デフォルトでは以下になっている模様。

```JavaScript:default
    $.fn.tipsy.defaults = {
        className: null,
        delayIn: 0,
        delayOut: 0,
        fade: false,
        fallback: '',
        gravity: 'n',
        html: false,
        live: false,
        offset: 0,
        opacity: 0.8,
        title: 'title',
        trigger: 'hover'
    };
```

対象の要素をappendする時は

```JavaScript:
live: true
```

としてやれば反応してくれます。
liveな辺りから古い感じがしますね。

どこかからバージョンが古いのを捕まえてきたらしく、liveに対応していない版だったのでどはまりしました。
Objective-Cの正規表現、キャプチャした変数で文字列置換


```objc:replace_capturestr.m
NSString *str = @"hogehogefugao";
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"(hoge).+(fugao)" options:0 error:nil];
NSString *new_str = [regexp
              stringByReplacingMatchesInString:str options:0 range:NSMakeRange(0, str.length) withTemplate:@"$1山$2"];
//new_strは hoge山fugaoになります。
```

キャプチャと、リプレイスはこんな感じにできる。すぐ忘れるからメモ代わりに。
NSMutableDictionaryの適切でない使い方

普段からObjective-Cを頻繁に書いているわけではないので、ありがちなミスかどうかは分からないのですが、NSMutableDictionaryを間違った使い方をしていたために起きていたバグを発見したのでメモしておこうと思います。

```objc:example01.c
NSMutableDictionary *mutable_dic = [[NSMutableDictionary alloc] initWithCapacity:2];
//辞書の生成
int i;
for (i = 0; i < 100; i++) {
    NSDictionary *dic = [NSDictionary dictionaryWithObject:@"hoge" forKey:@"Key"];
    [mutable_dic addEntriesFromDictionary:dict];
}
```

上記のようなコードがあったとき、[mutable_dic count] すると、辞書の長さはいくつになるでしょうか？
これ、1になります。[mutable_dic addEntriesFromDictionary:dict] の字面から、「add」しているんだから
ループ分の長さの辞書ができる気がしてしまうかもしれません。
しかし、このaddEntriesFromDictionaryは辞書の中に辞書を入れ子で突っ込んでいく処理をしているわけではなく、キーとバリューの組み合わせをmutable_dicに与えているだけです。
そして、辞書のキーは一意でなくてはいけません。ですから、毎ループごとにキーとバリューの組み合わせを上書きする処理になります。

そもそも、これに類する処理はNSMutableArrayを作って、突っ込んで行くのが適切だと僕は考えます。
実際に目撃した例だと、もう少し複雑でしたがArrayを使わない理由はなかったように思います。
ただ、この書き方をしてもループごとに「使うキーが異なる」場合なら、意図通り？にaddされていきます。
OpenCSVのCSVWriterでエスケープなしでCSVを吐く

import au.com.bytecode.opencsv.CSVWriter
ダブルクオーテーション不要で吐き出したいときは第3引数にNO_QUOTE_CHARCTERを指定

```java:
CSVWriter writer = new CSVWriter(buf, ',', CSVWriter.NO_QUOTE_CHARACTER, "\r\n");
```
HTC J Butterfly htl21 を Macでデバッグ接続するためにやったこと

`vi ~/.android/adb_usb.ini` して、最終行に`0x0bb4`を追加
`./adb kill-server`
`./adb shell`

`0x0bb4` の部分は、htl21をUSB接続した状態で
`system_profiler SPUSBDataType`
→出力内容内の `Android Phone`→`Vendor ID` 部分で確認できる

参考
http://tande.jp/lab/2012/02/1649
http://blog.r-sky.jp/post/17988132856/mac-android-usb
rbenvでRubyの環境を作る


## rbenv、ruby-buildのインストール

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

## パスを通す

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(rbenv init -)"' >> ~/.profile
$ exec $SHELL -l
```

## インストール可能なrubyのバージョンを表示

```
$ rbenv install -l
```

## 指定したバージョンをインストール

```
$ rbenv install 2.0.0-p247
$ rbenv rehash
$ rbenv global 2.0.0-p247
```

## Bundlerのインストール

```
$ rbenv exec gem install bundler
$ rbenv rehash
```
Pythonzとvirtualenvでクリーンなpython環境


*環境はUbuntu*

## 必要なパッケージをインストールする

```
apt-get -y update
apt-get -y upgrade
apt-get -y install python
apt-get -y install python-setuptools
apt-get -y install python-pip
apt-get -y install python-virtualenv
```

## Pythonzのインストール

```
cd ~
curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
echo '[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc' >> ~/.bashrc
source ~/.bashrc
```

## PythonzでPythonをインストール

好きなバージョンインストール出来ます。とりあえず2系の最新をインストール

```
pythonz install 2.7.5
```

## virtualenvの設定

```
virtualenv -p ~/.pythonz/pythons/CPython-2.7.5/bin/python ~/.pythonz/virtualenv/Python-2.7.5
echo 'PATH=$HOME/.pythonz/virtualenv/Python-2.7.5/bin:$PATH' >> ~/.profile
source ~/.profile
```

## Pythonの文字コードをUTF-8にしておく

````
cd ~/.pythonz/virtualenv/Python-2.7.5/lib/python2.7/site-packages
touch sitecustomize.py
echo 'import sys' >> sitecustomize.py
echo 'sys.setdefaultencoding("utf-8")' >> sitecustomize.py
```

Pythonz + virtualenvでglobalなpython環境を汚染せずにバージョン管理、パッケージ管理が出来るようになります。
Emacs で始める D言語!

アイスクリームが美味しい季節になりましたね．
というわけで，この記事は[D言語 Advent Calendar 2012](http://qiita.com/advent-calendar/2012/d) の17日目です．

D言語始めたいけどどうしたらいいかわからない人のための記事．
この記事を読めば D言語用の環境が簡単に整うよ！

英語版: [Start D with Emacs](https://github.com/flycheck/flycheck-d-unittest/wiki/Start-D-with-Emacs)

## DMDのインストール
これがないと始まりません．
[dlang.org](http://dlang.org/download.html) から自分の環境にあったものをインストールしましょう．

## Emacs の exec-path の設定
DMD にパスを通していない場合には，以下の行を`.emacs` に追加してください．
("/path/to/dmd" は DMD をインストールしたパスに置き換えてください)．

```el:.emacs
(add-to-list 'exec-path (expand-file-name "/path/to/dmd"))
```

## package.el 用に MELPA リポジトリを追加
d-mode や flycheck 等のパッケージは [MELPA](http://melpa.milkbox.net/) に収録されています．
`package-install` からこれらをインストールできるように，以下を `.emacs` に追加してください．

```el:.emacs
(require 'package)
(add-to-list 'package-archives
 '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)
```

## d-mode.el のインストール
d-mode を使うと，D言語のキーワード等を色分けしてくれるので便利です．
`M-x package-install d-mode` でインストール出来ます．

## Flycheck のインストール
Flycheck を使うと，D言語のエラーチェックを自動でやってくれます．
`M-x package-install flycheck` でインストール出来ます．

## flycheck-d-unittest.el のインストール (任意)
flycheck-d-unittest を入れると，ユニットテストを自動実行してくれるので色々はかどります．
`M-x package-install flycheck-d-unittest` でインストールしたあと、以下を `.emacs` に追加しましょう．

```el:.emacs
(setup-flycheck-d-unittest)
```

## Flycheck の細かい設定
`.emacs` に以下を追加しておくと便利です．

```el:.emacs
(add-hook 'd-mode-hook
          (lambda ()
            (local-set-key  (kbd "C-c C-p") 'flycheck-previous-error)
            (local-set-key  (kbd "C-c C-n") 'flycheck-next-error))
```

## 出来上がり!!
やったね！ これでD言語書き放題だよ！

これで， Emacs で拡張子が `d` のファイルを開くと，キーワード等をそれらしく色分けしてくれます．
また，エラー部分には波線が引かれるので文法がわからない初心者も安心です．
`C-c C-p` と `C-c C-n` で，カーソルの一つ前 (or 後) にあるエラーに飛ぶことができます．

また，以下のように unittest ブロック中に実行したいコードを書くと，自動でコードを実行してユニットテストのエラーを検出してくれます．
main 関数なんかいらんかったんや！

```d:sample.d
#!/usr/bin/env rdmd

unittest{
    assert(1+2 == 3);
    auto arr = [1, 2, 3];
    assert(arr.length == 4); // 間違ってるけど Emacs が教えてくれる！
}

version(unittest) {}
else
void main()
{
    import std.stdio;
    writeln("main 関数とか飾り．");
}
```

D言語の文法は以下のリンクからどうぞ．

* [D言語公式](http://dlang.org/)
* [d-manual](https://github.com/k3kaimu/d-manual)
* [D言語基礎文法最速マスター](https://gist.github.com/repeatedly/2470712)
環境構築・環境の共有・dotfilesのまとめ方(tmux + zsh + vim)


> メインの開発環境は tmux+zsh+vim 
> 自宅・会社・開発サーバ等々で、設定を共有するために
> 行っていること。
> 備忘録をかねた個人用メモなので
> こまかいことは自分で調べてくださいXD
> 何か要望があれば詳細追記します

# dotfilesをgithubまたはbitbucketで管理する。

> 基本的には、ネットワークさえつながれば
> いつでも同じ開発環境を構築できる状態であればよい。
> Dropboxとかに保存するでもよいけど、バージョン管理できないし
> リモートサーバー上に設置するのが面倒なのでgithub等がベスト
> 自分は、プライベートリポジトリを作れるという点でbitbucketを利用中。

## 設定ファイルをまとめたdotfilesフォルダを用意する。

> 自分の場合は以下のような感じ。
> これを丸まるgithubに突っ込む
> 一部、リポジトリを別にもつディレクトリもあるんだけど。

```
./
|-- .gvimrc
|-- .tmux.conf
|-- .vimrc
|-- .zshrc
|-- formac
|   `-- key4remap
|       `-- private.xml
|-- setup.sh
|-- vimfiles
|   |-- bundle
|   |-- template
|   `-- vundle.git
|-- vimrc
`-- zsh
```

## 各ファイル・ディレクトリの意味

*.gvimrc*

> MacVim(Mac機), Gvim(Win機)でvimアプリを利用する際の
> 設定情報を記述する。基本は.vimrcに記載してあるので
> 主にGUI専用の内容を記述。

*.tmux.conf*

> tmux用の設定をまとめておく

*.vimrc*

> vim用の設定をまとめておく
> vimのインストール方法は[こちらを参照](http://qiita.com/kinef/items/bac09fe6717ed16d7fad)
> プラグイン等の関係からvimは7.3以上を利用している。

*.zshrc*

> 補完関係の設定やプロンプトの変更など。

*formac*

> mac機ではKey4Remapアプリを利用してキーバインドを
> 独自にXMLで定義しており、それをここで管理している。

*setup.sh*

> dotfilesディレクトリを新規にgit clone した際に、
> 必要ディレクトリの生成や、シンボリックリンク作成用の
> シェルスクリプト。

*vimefiles*

> 自前で管理しているdotfilesとは別にリポジトリをもつ
> ファイルの管理。またはvimのプラグイン等もここでセット

*vimfiles/bundle*

> vimのプラグインをインストールした際は、ここに格納される。
> .gitignoreの対象

*vimfiles/vundle.git*

> bundle管理

*vimefiles/template*

> 新規ファイル作成時に利用するテンプレートを格納
> .plファイルの場合は、必要なモジュールをuseしておくetc

*vimrc*

> .vimrc内で読み込んでいるdotfiles
> .vimrc.bundle, .vimrc.unite といった感じで
> 任意の粒度にわけている。

*zsh*

> 自動補完用の auto-fu.zsh をサブモジュールとして管理している。

## dotfilesをまとめる

> 自分の場合は上述のような感じだけど
> まーそこは人によって様々だとおもうので
> 適当にちゃちゃっっとつくっちゃえばいいとおもいます。
> bitbucketまたはgithubの使い方はgoogle御大が教えてくれるはず

#### gitモジュール管理

> 基本的には作成したdotfilesのディレクトリを
> githubまたはbitbucketにアップロードすればOK
> すこしトリッキーなのはgit submoduleを使っているところ
> サブモジュールとは、簡単にいうとブランチ内で他の
> リポジトリのブランチを利用すること

> 自分の場合は、自分のbitbucketブランチで
> vim用のプラグイン管理とzsh用の補完モジュールなんかを登録してる。
> コマンドは以下のようなかんじ。

```
# gitのプラグイン管理
# git add submodule $remote_path $install_pathといった形式
git add submodule http://github.com/gmarik/vundle.git .vimfiles/vundle.git
```


## bitbucketからdotfilesをダウンロードする。

> リポジトリ管理の準備ができてからは以下のように
> 開発環境で展開する。いくら環境がふえようと
> 以下のコマンドをうつだけで準備は整う。
> ※別途viでのバンドルインストールなどは必要。

```
$ cd ~/

# これでdotfilesディレクトリが~/以下に作成される。
$ git clone https://kinef@bitbucket.org/kinef/dotfiles.git

# dotfilesディレクトリに移動
$ cd dotfiles/

# サブモジュールをインストールする。
$ git submodule init
$ git submodule update

# 必要ディレクトリとリンクを作成
$ ./setup.sh
```
OpenVZでtty1を追加する

OpenVZタイプのアプライアンス導入時に、
ssh接続onlyのtty1が存在しないコンテナが作成される場合がある。

これだとネットワークの設定を行う際に不便なため、
コンテナのinittabにtty1を追加するように設定する

```bash:
 nano /var/lib/vz/root/*/etc/inittab

 # add this
 1:2345:respawn:/sbin/getty 38400 tty1
```

参考ページ
http://pve.proxmox.com/wiki/OpenVZ_Console
FreeBSD 9-STABLEベースのmfsBSDをビルドしてみる

## 前書き

9.1-RELEASEにはVirtIO関連のカーネルモジュールは入っておらず、mfsBSDを使う場合にはMakefileをいじったりVirtIOのソースコードを組み込んだりしてからビルドする必要があります。
9-STABLEにはカーネルモジュールとして入っているので、mfsBSDを9-STABLEベースでビルドできたらいいなぁと思ったらわりとあっさり作れちゃったのでメモします。

## 材料

- 作業場となる稼働中のFreeBSD
- mfsBSDのソースコード
  https://github.com/mmatuska/mfsbsd (Download ZIPからダウンロード)
- FreeBSD 9-STABLEのスナップショットからbase.txzとkernel.txz
  http://ftp2.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/9.1-STABLE/ (数日ごとに更新される様子。ftp.jp.freebsd.orgとかだとちょっと古い傾向があります)

## 手順

1. まず、作業場となるFreeBSDにログインし、rootになります。
1. svnupなどを使用して、9-STABLEのソースコードを最新の状態にします。
1. 材料のmfsBSDのソースコードとFreeBSD 9-STABLEのスナップショットをダウンロードします。
1. mfsBSDのソースコードを展開し、mfsBSDをビルドします。

```zsh:
# pwd
/root

# svnup stable    ...(2)

# fetch https://github.com/mmatuska/mfsbsd/archive/master.zip
# mkdir snapshots
# cd snapshots
# fetch http://ftp2.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/9.1-STABLE/base.txz
# fetch http://ftp2.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/9.1-STABLE/kernel.txz    ...(3)
# cd ..

# unzip master.zip
# cd mfsbsd-master
# make iso -DCUSTOM -DBUILDWORLD -DBUILDKERNEL -DSE -DROOTHACK BASE=/root/snapshots MAKEJOBS=3    ...(4)
```

(4)はbuildworldなどが実行されるためだいぶ時間がかかります。オプションはmfsBSDのBUILDとかMakefileとかを読んで適宜調整してください。ビルドが成功すれば ``/root/mfsbsd-master`` に ``mfsbsd-se-9.1-STABLE-amd64.iso`` というファイルが出来上がります。VirtIOが入っているのでKVMをベースにしているVPSなどでも役に立つんじゃないかと思います。
Growthforecast でグラフを累計表示にする


## Growthforecast
Growthforecast のグラフはデフォルト gauge ( number の数値で常に上書き ) という mode で表示される。数値が送られて来た時だけ、みょい〜んとグラフがあがってからさがる。

増加し続けて欲しいグラフもあるので累計表示にしたいです。
どこからやるんでしょうねえって、SETTING ボタン押下からの設定画面できるのかなって思ってたら、できない！

mode には Gauge, Subtract, Both とあって、これはどうやら gmode ( 積算か差分グラフの選択、「gauge」または「subtract」。デフォルトは「gauge」 ) ですねと。
すいませんでした…。 http://kazeburo.github.io/GrowthForecast/ をよく読みましょう。

気を取り直して、ひとまずcurl で投げてみましょう。

```
curl -X POST -F number=1 -F mode=count http://example.com/api/:service_name/:section_name/:graph_name
```

すると、SETTING ボタン の隣あたりにある mode が count になるし、値も加算されているし、よさそうですよと。（ gauge だったグラフに対して、count を投げても count に切り替わった。逆もそう。 ）

## fluent-plugin-growthforecast

fluentd から Growthforecast に投げるのにお世話になっていて、こいつからよろしく投げてもらえるとうれしいです。

なので https://github.com/tagomoris/fluent-plugin-growthforecast を見ると、 count ありますね。

```
mode option available with gauge(default), count, modified, just same as mode of GrowthForecast POST parameter.
```

というわけで match に mode count を追加してあげれば OK でした。
onclickとontouchstartの比較テスト

```html:
<html>
  <head>
    <title>onclick test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <script>
      leftpx=0;
      function touch(){
        leftpx += 10;
        //alert(leftpx+'px '+document.getElementById('migi').style.left);
        document.getElementById('migi').style.left = leftpx+'px';
      }
      function reset(){
        leftpx = 0;
        document.getElementById('migi').style.left = leftpx+'px';
      }
    </script>
    <style>
      .yaji{font-size:20px; }
      .btn{font-size:20px; width:200px; height:50px; text-align:center; margin-top:20px;}
    </style>
  </head>
<body bgcolor="#FFFFFF" text="#000000">

  <div id="migi" class="yaji" style="position:absolute; left:0px;">
   ■
  </div>
  <div style="clear:both;"></div>

  <div style="position:absolute; top:50px;">
    <button class="btn" onclick="touch()">onclick</button>
    <button class="btn" ontouchstart="touch()">ontouchstart</button>
    <button class="btn" ontouchstart="reset()">reset</button>
  </div>
  
</body>
</html>
PHPでUTF-8の文字列をマルチバイト、シングルバイト問わず１文字ずつ取得する

```php:split.php
<?php
$text = "テキストtextテxト";
$encoding = "UTF-8";

$textLength = mb_strlen($text, $encoding);
        
for($i = 0; $i < $textLength; $i++) {
    echo mb_substr($text, $i, 1, $encoding)."\n";
}
```
ApacheのMPMおよび組み込まれてる拡張モジュールの確認


## MPMの確認

```zsh:
$ apachectl -l
Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  event.c
  http_core.c
  mod_so.c
$
```

preforkだとevent.cがprefork.cに変わる。

## 組み込まれている拡張モジュールの確認

```zsh:
$ apachectl -M
Loaded Modules:
 core_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 auth_basic_module (shared)
 authn_file_module (shared)
 authz_default_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 dir_module (shared)
 env_module (shared)
 expires_module (shared)
 headers_module (shared)
 mime_module (shared)
 php5_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 rpaf_module (shared)
 setenvif_module (shared)
 status_module (shared)
Syntax OK
$
```
コンソールへの出力を上書きしてゆく方法


カウントダウンをしたいときとか、普通にprintを使って

```
for i in range(100):
    print i
```
とするとコンソール上に

1
2
3
4
5
…

と、縦長に出力されてしまう。
これだと見づらいので、インストールの時に表示される進度メーターのように、__次の数字を出力する際に前の出力が消えて そこに次の数字が現れてほしい__。

上書きする場合

```
import sys, time
for num, i in enumerate(range(100)):
    sys.stdout.write("\r%d" % num)
    sys.stdout.flush()
    time.sleep(0.01)
```
sys.stdout.writeの\rがキモっぽい。これがないと上書きされない。

追記してゆく場合

```
import sys, time
for i in range(100):
    sys.stdout.write("=")
    sys.stdout.flush()
    time.sleep(0.01)
```

これで無駄な出力で画面がうめつくされるのを防げるわけです。
Shared example内の特定のexampleを実行したい時



例えば以下の様な状況だとします。

```ruby:user_spec.rb
describe User do
  it_behaves_like 'person'

  des...
end
```


```ruby:shared_examples_for_person.rb
shared_examples_for 'person' do
  describe 'instance methods' do
    subject { create(:"#{described_class.class_name.underscore}") }

    describe '#dead?' do
      context 'when dead' do
        before { subject.alive = false }

        it 'returns true' do
          expect(subject.dead?).to be_true
        end
      end
    end
  end
end
```


そして`user_spec.rb`を実行したら、`shared_examples_for_person.rb`のテストだけが失敗して、次からはその失敗したテストケースだけを実行したくなったりする時がありますよね。

落ちたテストがshared_examplesじゃなかったら`$ rspec ./spec/models/user_spec.rb:200`てな具合に個別で実行出来るんですが、
shared_exampleは行数の指定が出来ないようです。(https://github.com/rspec/rspec-core/issues/793)

そんな時は

`$ rspec -e "when dead" ./spec/modesl/user_spec.rb`

と実行すると`"when dead"` context内のテストを実行してくれるようです。(https://github.com/rspec/rspec-core/issues/835#issuecomment-15111557)
Google+の記事についたコメントをブログやWEBページに貼り付けるコード

Google+の記事についたコメントをブログやWEBページに貼り付けるコード
-------------------------------------

Ryutaroh Yamashitaの雑記 (Google+の記事についたコメントをブログやWEBページに貼り付ける)
http://ryutaroh-yamashita.blogspot.jp/2013/06/googleweb.html

上記のページで教えていただいたものを、javascriptコード化してみました。
設定の方法は下記の部分をそれぞれ書き換えて貼り付けるだけです。

 * {GoogleAPI Key} APIキー
 * {data-update-id} 記事ID

```html:
<div class="g-comments-for {GoogleAPI Key} {data-update-id}"></div>
<link href="https://www.googledrive.com/host/0B1hYW-B3Uhi1d0E1dlgtNUV2RTg" rel="stylesheet" media="screen" />
<script type="text/javascript" src="https://www.googledrive.com/host/0B1hYW-B3Uhi1SjdTYjNLcUgtbTg"></script>
<script type="text/javascript" src="https://www.googledrive.com/host/0B1hYW-B3Uhi1b0lYd3RNb3BRMFE"></script>
<script type="text/javascript" src="https://apis.google.com/js/client.js?onload=commentrLoad"></script>
```

一応各読み込みコードについて説明します。
いずれも書き換えてカスタムして使ってくれてOKです。
googleのapi以外は私個人のgoogle driveに配置してあるものです。

* https://www.googledrive.com/host/0B1hYW-B3Uhi1d0E1dlgtNUV2RTg
   スタイルシートです。適当に作りました。

* https://www.googledrive.com/host/0B1hYW-B3Uhi1SjdTYjNLcUgtbTg
  実態はただのjQueryです。

* https://www.googledrive.com/host/0B1hYW-B3Uhi1b0lYd3RNb3BRMFE
  コメント取得してきてg-comments-for のなかにHTMLを入れるJSです。

* https://apis.google.com/js/client.js?onload=commentrLoad
  googleのapiです。

Ryutaroh Yamashitaさん感謝です＾＾
SQLでRedmineのチケットを抽出する

## 「終了したチケット」以外のチケット（未完了）を抽出する。

```sql:
SELECT
  *
FROM
  issues I
  INNER JOIN issue_statuses S
    ON I.status_id = S.id
WHERE
  S.is_closed <> 1
```

```sql:
SELECT
  *
FROM
  issues I
WHERE
  EXISTS
    (SELECT * FROM issue_statuses WHERE is_closed <> 1 AND id = I.status_id);
```

## その他の条件を追加
```sql:
SELECT
  *
FROM
  issues I
  INNER JOIN issue_statuses S
    ON I.status_id = S.id
  INNER JOIN trackers T
    ON I.tracker_id = T.id
WHERE
  S.is_closed <> 1 # 未完了(issue_statuses)
AND
  I.status_id = 1 # ステータスID (issue_statuses)
AND
  T.id = 1 # トラッカーID (trackers)
AND
  assigned_to_id IS NULL # 担当者なし (users)
AND
 author_id = 6 # 作成者（users)
AND
 priority_id = 4 # 優先度（1:低め、2:通常、3:高め、4:急いで、5:今すぐ）
AND
  due_date < '2013-03-20' # 期限日
ORDER BY
  due_date DESC
```
MongoDBでユニーク制限をかける際に値を持っているものだけ対象にする（これでいいよね？）

値が無い状態があり得るけれど、入っている場合にはユニークな条件を課したいという場合。
https://groups.google.com/forum/#!topic/mongodb-user/79tQ0o_AvUs
どうやらSparse Indexesという機能があるらしい。

http://docs.mongodb.org/manual/core/indexes/#Indexes-SparseIndexes
を見るとどうやら欲しい機能に合致しているらしい。

http://sssslide.com/www.slideshare.net/doryokujin/mongodb1#52
も補完する情報として良さそうだ（日本語）。
PHPのリモートデバッグ

## 環境
phpstorm: ubuntu (192.168.87.144)
webサーバー: centos (192.168.87.147)

## 準備(centos側)

```bash:
$ sudo yum install php-devel gcc gcc-c++ autoconf automake make
$ sudo pecl install xdebug
```

## 手順
* ubuntuでphpstormの「Run>Start Listen PHP Debug Connections」を選択。
*  centosで/etc/php.d/xdebug.iniを編集し、apache再起動。

```bash:/etc/php.d/xdebug.ini
; Enable xdebug extension module
;extension=xdebug.so
;zend_extension=/usr/lib64/php/modules/xdebug.so (64bitの場合)
zend_extension=/usr/lib/php/modules/xdebug.so
xdebug.remote_enable= on
xdebug.remote_handler=dbgp
xdebug.remote_host=192.168.87.144
;xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_autostart = on
xdebug.remote_mode=req
xdebug.dump.GET = *
xdebug.dump.POST = *
```

*  centosから以下実施

```bash:
$ PHP_IDE_CONFIG='serverName=192.168.87.144' php -dxdebug.remote_host=192.168.87.144 a.php
```

*  ubuntuでdebuggerが反応することを確認。

ブックマークレットのurl: http://www.jetbrains.com/phpstorm/marklets/
[JavaFX] 一度だけイベントハンドラー

```java:EventUtils.java
public static <A extends Node, B extends Event> void addOnetimeEventHandler(
	final A targetNode,
	final EventType<B> eventType,
	final ProxyEventHandler proxyHandler) {
	targetNode.addEventHandler(eventType, new EventHandler<B>() {
		@Override
		public void handle(B event) {
			Node node = (Node) event.getTarget();
			node.removeEventHandler(eventType, this);
			proxyHandler.handle(node);
		}
	});
}
 
public static interface ProxyEventHandler {
	void handle(EventTarget target);
}
```
CloudWatchのELB監視項目

----
2014/02/13追記
[ELBの挙動とCloudWatchメトリクスの読み方を徹底的に理解する ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/elb-and-cloudwatch-metrics-in-depth/)がわかりやすいですね

----

* [Elastic Load Balancing
Developer Guide (API Version 2012-06-01)](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_MonitoringLoadBalancerWithCW.html)を見て各監視項目の内容を訳してみた（英語苦手)

| Metric              | Unit | 詳細 |
|:-----------------|:------|:-----|
| Latency              | Seconds | リクエストがロードバランサーを離れてから対応する応答を受け取るまでの経過時間|
| RequestCount         | Count   | ロードバランサーに処理されるリクエストの数|
| HealthyHostCount     | Count   | 指定されたAvailabilityZoneでのロードバランサーに登録されたhelthyなEC2インスタンスの数。 unhealthyな閾値を超えてヘルスチェックに失敗していないホストはhealthyだとみなされる。 このmetricを評価する場合、dimensionはLoadBalancerNameとAvailabilityZoneで規定されるはずである。 このmetricは指定されたAvailability Zoneでのhealthyなインスタンスの数を表している。 200でない応答(HTTPやHTTPSでのヘルスチェックの場合)が返ったり、ヘルスチェックを行っている場合にタイムアウトするような接続の問題でインスタンスはunhealthyになることがある。 全てのhealthyなホスト数の合計を得るために、このmetricは各登録されたAvailabilityZoneを取得し、全てのmetricを合わせて追加する必要がある |
| UnHealthyHostCount   | Count   | 指定されたAvailabilityZoneでのロードバランサーに登録されたunhelthyなEC2インスタンスの数。 unhealthyな閾値を超えてヘルスチェックに失敗したホストはunhealthyだとみなされる。 このmetricを評価する場合、dimensionはLoadBalancerNameとAvailabilityZoneで規定されるはずである。 このmetricは指定されたAvailability Zoneでのunhealthyなインスタンスの数を表している。 200でない応答(HTTPやHTTPSでのヘルスチェックの場合)が返ったり、ヘルスチェックを行っている場合にタイムアウトするような接続の問題でインスタンスはunhealthyになることがある。 全てのunhealthyなホスト数の合計を得るために、このmetricは各登録されたAvailabilityZoneを取得し、全てのmetricを合わせて追加する必要がある |
| HTTPCode_ELB_4XX     | Count   | ELBによって生成された4xx(クライアントエラー)系のHTTPレスポンスコードの数 |
| HTTPCode_ELB_5XX     | Count   | ELBによって生成された5xx(サーバーエラー)系のHTTPレスポンスコードの数。 もしバックエンドのインスタンスが登録されていない、healthyなバックエンドインスタンスがない、要求率がELBの現在利用可能なキャパシティーを超えているといったような場合、ELBは5xxエラーを生成するだろう。 このレスポンス数はバックエンドインスタンスが生成したレスポンスを含んでいない |
| HTTPCode_Backend_2XX | Count   | バックエンドインスタンスによって生成された2xx(成功)系のHTTPレスポンスコードの数 |
| HTTPCode_Backend_3XX | Count   | バックエンドインスタンスによって生成された3xx(ユーザのアクションが必要)系のHTTPレスポンスコードの数 |
| HTTPCode_Backend_4XX | Count   | バックエンドインスタンスによって生成された4xx(クライアントエラー)系のHTTPレスポンスコードの数。 このレスポンス数はELBが生成したレスポンスを含んでいない |
| HTTPCode_Backend_5XX | Count   | バックエンドインスタンスによって生成された5xx(サーバーエラー)系のHTTPレスポンスコードの数。 このレスポンス数はELBが生成したレスポンスを含んでいない |
CloudWatchのRDS監視項目

 * [Amazon CloudWatch
Developer Guide (API Version 2010-08-01)](http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html#rds-metricscollected)を見て各監視項目の内容を訳してみた（英語苦手)

| Metric             | Unit | 詳細 |
|:------------|:----|:----|
| BinLogDiskUsage     | Bytes   | マスターのバイナリログのディスク容量 | 
| CPUUtilization      | Percent | CPU使用率のパーセンテージ |
| DatabaseConnections | Count   | 使用中のデータベース接続数 | 
| DiskQueueDepth      | Count   | ディスクアクセスの待っている完了していないIO(read/write要求)の数 |
| FreeableMemory      | Bytes   | 利用可能なランダムアクセスメモリ量 |
| FreeStorageSpace    | Bytes   | 使用可能なストレージ・スペースの量 |
| ReplicaLag          | Seconds | リードレプリカDBインスタンスがソースDBインスタンスから遅延する時間 |
| SwapUsage           | Bytes   | DBインスタンスで使用されているスワップ領域の量 |
| ReadIOPS            | Count/Second | 1秒あたりのディスクI/O操作の平均数 |
| WriteIOPS           | Count/Second | 1秒あたりのディスクI/O操作の平均数 |
| ReadLatency         | Seconds      | ディスクI/O操作ごとにかかった時間の平均量 |
| WriteLatency        | Seconds      | ディスクI/O操作ごとにかかった時間の平均量 |
| ReadThroughput      | Bytes/Second | 1秒あたりのディクス読み込みバイト数の平均値 |
| WriteThroughput     | Bytes/Second | 1秒あたりのディクス書き込みバイト数の平均値 |
gmail経由でメールを投げる

# Gmailでメールを投げる

BackupShellみたいな夜間バッチが夜中にブンまわって実行結果をメールでよこせ。
SMTPサーバー？そんなもの入れられん！とかそんな時。
適当に`Gmail`で捨てアカ取ってそこを踏み台にすればいいんじゃね？
※ただし`Perl`は入れる

```bash:メールを投げるスクリプト
authorize="`perl -MMIME::Base64 -e 'print encode_base64("\000******\@*******\000**********")'`"
    (
      sleep 3
      echo "EHLO `hostname`" 
      sleep 3
      echo "AUTH PLAIN ${authorize}" 
      sleep 3
      echo "MAIL FROM: <${mail_user}>" 
      sleep 3
      echo "rCPT TO: <${to}>" 
      sleep 3
      echo "DATA" 
      sleep 3
      (
        echo "Subject: ***************" 
        echo "From: ${mail_user}" 
        echo "To: ${to}" 
        echo "" 
        echo "message: ${error_msg}" 
        echo "hostname: `hostname`" 
        echo "filename: ${date}_daily" 
        echo "date: `date +%Y/%m/%d` `date +%H:%M:%S`"              
        echo "." 
      ) | perl -pe's/(?<!\r)\n/\r\n/'
      sleep 3
      echo "QUIT" 
    ) | openssl s_client -connect smtp.gmail.com:465
```

※ユーザー名・パスワードは先頭に「000」をつけないと認証ではじかれる。
※メンテ性を考えると、あらかじめ適当な変数に暗号化した文字列突っ込んどきゃいいんじゃね？って思ってやったらできなかった。どうやら暗号化ロジックそのものを渡してやらないといけないらしい。なんで？