OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyにnokogiriをinstallする。


nokogiriを使ってrubyでwebページのスクレイピングをしたい。nokogiriの依存ライブラリを入れて、gem installする。

```
$ brew install libxml2 libxslt
$ brew link libxml2 libxslt
$ gem install nokogiri
Building native extensions.  This could take a while...
Building nokogiri using packaged libraries.
ERROR:  Error installing nokogiri:
	ERROR: Failed to build gem native extension.

    /usr/local/Cellar/ruby/2.0.0-p247/bin/ruby extconf.rb
Building nokogiri using packaged libraries.
-----
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
```

なんかエラーが出る。下記を参考にして、brew installしてみる。
[osx - Why does installing nokogiri on Mac OS fail with libiconv is missing? - Stack Overflow](http://stackoverflow.com/questions/5528839/why-does-installing-nokogiri-on-mac-os-fail-with-libiconv-is-missing)

```
$ brew update
$ brew install libiconv
Error: No available formula for libiconv
Apple distributes libiconv with OS X, you can find it in /usr/lib.
Some build scripts fail to detect it correctly, please check existing
formulae for solutions.
```

なんかまだエラーでる。下記にちょうど良い感じの記事が有ったので、binaryから入れる。

[■OSXでnokogiriのインストールするとき。 - めもちょう。](http://dominion525.hatenablog.jp/entry/2012/03/26/102539)

[Nokogiri](http://nokogiri.org/tutorials/installing_nokogiri.html)

```
$ cd /usr/local/src/
$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
$ tar xzvf libiconv-1.13.1.tar.gz 
$ cd libiconv-1.13.1
$ ./configure --prefix=/usr/local/Cellar/libiconv/1.13.1
$ make
$ make install
$ brew link libiconv
```

で、公式ドキュメントのを参考にしてinstall コマンドしてもエラーが出たので、上のブログを参考にして下記でinstallする。

```
gem install nokogiri　-- --with-xml2-include=/usr/local/Cellar/libxml2/2.7.8/include/libxml2
--with-xml2-lib=/usr/local/Cellar/libxml2/2.7.8/lib
--with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26
--with-iconv-include=/usr/local/Cellar/libiconv/1.13.1/include
--with-iconv-lib=/usr/local/Cellar/libiconv/1.13.1/lib
```
Vueで自前のdirectiveを登録する

クリックしたらその名前のイベントを発火するだけのディレクティブを作った。自分は処理の委譲の為にこれ作らんと話にならなかったので。

```coffee
Vue.directive 'dispatcher',
  isLiteral: true
  bind: (value) ->
    @el.addEventListener 'click', =>
      @vm.$dispatch(@expression)

v = new Vue
  template: """<button v-dispatcher="message"></button>"""
  
v.$on 'message', ->
  console.log 'message clicked'
```


最初ViewModelのインスタンスを得る方法がわからなかったのだけど、リファレンス読んだらちゃんと書いてあった。

    el: the element the directive is bound to.
    key: the keypath of the binding, excluding arguments and filters.
    arg: the argument, if present.
    expression: the raw, unparsed expression.
    vm: the context ViewModel that owns this directive.
    value: the current binding value.

[Directives In Depth - vue.js](http://vuejs.org/guide/directives.html "Directives In Depth - vue.js")
ランダムで且つ重複しない数値リストを作る


F# 入門中です。

[フラッシュ暗算](http://www.shuzan.jp/kentei/flash/)ぽいアプリを作っていて、次々と表示する数値は、

* ランダムで
* 一度使った数値は二度と使わなくて
* ０も使わない

というルールにしています（公式ルールは知らない）

``makeRandomList`` の引数 ``rand`` は ``System.Random`` のインスタンス、``count`` は生成するリストの要素数、``arr`` は生成した数値群(=再帰処理で値の既出判定に使う)としています。

``rand.Next(10)`` で得た値が、0 もしくは ``arr`` に存在する場合は、もう一度同じパラメータで再帰呼び出し、そうでない場合は ``count`` を減算しつつ、``arr`` に値を連結して再帰呼び出しします。``count`` が ``0`` になったら ``arr`` を返して終わります。

```fsharp:
let rec makeRandomList = fun (rand:Random, count:int, arr:List<int>) ->
    match count with
    | 0 -> arr
    | _ -> 
        let n = rand.Next(10) // 1桁の数値
        if n = 0 || arr |> List.exists (fun x->x=n) then 
            makeRandomList (rand, count, arr) 
        else makeRandomList (rand, count-1, [n] @ arr)

let arr = makeRandomList (new Random(DateTime.Now.Millisecond), 3, [])
for x in arr do
    Console.WriteLine x

// 出力例
7
5
4
```

こんな感じで書けばいいのかなあ。
なんかところどころ手続き型の書き方になってる気がしますが、C# で ``while`` で処理するよりはスマートにできた気がします。
そろそろAndroid Studioに乗り換えたらいいかも

Google I/O 2014でついにAndroid Studioのベータ版が発表された。自分も3ヶ月ほどAndroid Studio使っているけど、大分良い感じだし基本的に問題もないので、乗り換え検討してる人はそろそろ乗り換えてよい時期かも。

# いいたいこと
* Android Studioに乗り換えても、 **すぐに** アプリ開発のフローが変わったり、大幅に効率化されるわけではない。
* でも、ビルドツールである`Gradle`の機能を理解しはじめると、どんどん開発フローが洗練されていくよ。
* 一度`Gradle`を前提とした開発フローになれると、`Gradle`無しの開発には戻れないし、多分今後のAndroidアプリ開発の主流はこっちだから、どこかで乗り換えたほうがいいし、そろそろ乗り換えてよい時期。

# 乗り換えのステップ
`Android Studio`に乗り換える上では、覚えなければいけないことが沢山ある。順を追って、焦らず乗り換えていったほうがいい。

## まずは、IDEとしてのAndroid Studioに慣れる。
* `Eclipse`でやっていたことと同じようなことを`Android Studio`でもできるようになるまで頑張る。
* **第一歩として`Eclipse`で作っていたプロジェクトをインポートする、というのはやめたほうがいい。** ライブラリプロジェクトがあったり、外部ライブラリを使っていたり、テストプロジェクトがあったり、そういうのが動かせるようになるまで、覚えなければいけないことが多くて、ハードルあがる。
* **最初は、新しいプロジェクトをAndroid Studio上で作ってIDEの使い方を覚えていったほうが絶対いい。**
* キーバインドの違いとかも覚えて、まず`IDE`として快適に使えるようになるまで良さがわからなくても使って慣れること。

## Gradleの機能をちょっと使ってみる
* `Gradle`に部分的に触れて慣れていく。
* `dependencies`で、サポートライブラリあたりをプロジェクトにインポートしてみる。そうすると、今まで`Eclipse`でライブラリを使いたかった場合に比べて`Gradle`(+`Android Studio`)がいかに便利かわかる。

## Gradleの色々な機能は少しずつ触れてく
* `Product Flavors`とかも便利だし面白いのだけど、アプリの内容によっては縁がない/メリットを実感できないかもしれないので、そういうのは気が向いたときでいい。

# 乗り換えて便利だなと思うこと
前述の通り、`Android Studio` / `Gradle`の基本的な使い方に慣れた後じゃないと、ここらへんのメリットは多分ピンとこない。

## Product Flavorsが便利
* サーバー/クライアントアプリで、StagingサーバーとProductionサーバーがあるような場合、`Staging`用ビルドではStagingサーバーにつなぐ、`Production`用ビルドではProductionサーバーにつなぐ、とか複数のビルド用の設定を用意できる。
* 「Staging用ビルドはビルド時にパッケージ名をcom.example.staging.myappに変える」みたいな設定もできて、そうすると端末の中にStaging用とProduction用と両方のapk入れられるし。

## 自動化/CIとの相性が抜群
* `Eclipse`と違って、プロジェクトのディレクトリのルートで`gradlew`を実行するだけでIDE上でビルドした時と同じ挙動をコマンドラインから実現できるので、スクリプト内でビルドを実行したり、`Jenkins`でビルドのジョブを作ったりするために設定/準備をする必要がない。

## 開発フローが変わる
* 自動化しやすい + Gradleで今までより色々なことが簡単にできる -> **自動化/CI連携を前提とした開発フローを作りやすい**
* 例えば、動作確認用のテストapkを作るとき
  * `Eclipse`の場合: 
      * テスト用に接続先サーバーの値を書き換える
      * リファクタリング機能でパッケージ名を変更してapkを作る
      * 作り終わったら元に戻す
      * みたいな
  * `Android Studio` + `Gradle`の場合: 
      * `Product Flavors`であらかじめ「動作確認時用のサーバーアドレス」と「本番用のサーバーアドレス」を用意しておく
      * 動作確認用のapkが欲しいときは`./gradlew assembleStagingDebug`コマンドを叩く
      * 本番環境用は`./gradle assembleProductDebug`叩くだけ
      * そもそもgitレポジトリにpushがあったら、`Jenkins`マシンで自動的に両環境用のビルドを作ってapkをアップロードする、とかもできる。

# 乗り換えコストとかデメリットとか
* IDEとしての操作性の違いに慣れるまでは若干時間かかった。好みの問題もあるけど、Eclipseよりもキーバインドで色々なことができる(オーバーライドメソッドの定義とか、ブロックを`try/catch`で囲むとか)ので便利。
* `Gradle`の使い方(なにができるのか、どこにどうやって設定書けばよいのか)も慣れるまで少し時間かかった。特にライブラリプロジェクト使ったり、テストプロジェクトが別にあったり、とか`Eclipse`時代に作ったプロダクションレベルのプロジェクトを`Gradle`で適切に管理できるようになるまで、覚えることが結構たくさんある。
* `Android Studio` / `Gradle`それぞれ不具合はほとんど遭遇してない。 **安定性は問題なし。**

# 結論
最初に書いた通り **乗り換えたらすぐに効率が上がるわけではないけど、使い続けていれば段々効率が上がっていくし、安定してるしそろそろ乗り換えたらいいと思う**
【html5】入力候補を表示

テキストボックスに入力候補を表示する方法。

##方法
テキストのlistの値と、datalistタグのidを同じにすることで、datalistタグのoptionのvalueが入力候補として表示される。

```html:html
<input type="text" list="word">

<datalist id="word">
 <option value="AAA">
 <option value="BBB">
 <option value="CCC">
</datalist>

```
Browser App on Qt Creator on Kubuntu14.04 を動かす

# やること

Browser App on Qt Creator on Kubuntu14.04 を動かす。
[Browser App on Qt Creator on Ubuntu12.04 を動かす](http://qiita.com/naohikowatanabe/items/499639ef3ed37a4cd203) の Kubuntu 版。


# スクリーンショット

## Kubuntu14.04 desktop
青くてかっこいい。
![snapshot1.png](https://qiita-image-store.s3.amazonaws.com/0/35514/01548d8f-70b2-576a-b8fb-cf557731f781.png)

## Qt Creator 
![snapshot2.png](https://qiita-image-store.s3.amazonaws.com/0/35514/690916a9-bc39-981d-7c28-04d48511b6ca.png)


# 環境構築

## Kubuntu14.04 の iso イメージ作成

kubutntu14.04 iso イメージはここから落とせる。1GB ありますよっと。

http://www.kubuntu.org/getkubuntu
Kubuntu 14.04 LTS (Latest Release and Long Term Support)
Download Kubuntu 14.04 LTS 32-Bit (recommended)
Download Kubuntu 14.04 64-Bit

kubuntu-14.04-desktop-i386.iso 
を DVD に焼いて、空 PC 用意して、適当に Kubuntu インストール。

## Qt Creator 環境構築

```
$ sudo apt-get install qtcreator
$ sudo apt-get install qt-sdk
$ sudo apt-get install libqt5webkit5-dev
```

で qtcreator 動いた。

```
Qt Creator 3.0.1
Based on Qt 5.2.1 (GCC 4.8.2, 32 bit)
```

以下注意点。

+ ubuntu 環境では動作した、
http://qt-project.org/downloads#qt-creator
qt-creator-opensource-linux-x86_64-3.1.2.run
は、 kubuntu ではインストール出来なかった。 apt-get でインストールが必要。
+ なぜか、 最初に `qt-sdk` をインストールしようとすると、パッケージが見つからないと怒られる。
+ `libqt5webkit5-dev` が未インストール状態だと、HTML5 App 作成時、 Qt Creator 上でエラー発生。ビルドが出来ない。

```
:-1: error: Unknown module(s) in QT: webkit webkitwidgets
```

参考
http://stackoverflow.com/questions/18699403/project-error-unknown-modules-in-qt-webkitwidgets/18699404#18699404?newreg=afbe3e97caad40ad9196da41fec33956


# Qt Creator 起動

Qt Creator 起動後は特に詰まらなかったので省略。
[Browser App on Qt Creator on Ubuntu12.04 を動かす#Qt Creator 起動](http://qiita.com/naohikowatanabe/items/499639ef3ed37a4cd203#1-4)
と同じ。
cocos2d-x 3.0で一定時間後にラムダ式を実行する

ゲームを作っていると一定時間後に特定の処理を入れたい場合がある。
cocos2d-x 3.0ではC++11でラムダ式が使えるのだが、Nodeが実装しているscheduleやscheduleOnceメソッドを使うと、schedule_selectorというマクロを使ってクラスに実装したメソッドをコールバックに指定しなくてはいけない。

たとえば、3秒後に変数_flagにfalseを代入したいときはこんなことになる。

```cpp:SomeClass.h

class SomeClass
{
private:
	void someMethod();
	void disableFlag(float d);
	bool _flag = false;
}


```

```cpp:SomeClass.cpp

void SomeClass::someMethod()
{
	// 3秒後に_flagという変数にfalseを代入したい
	this->scheduleOnce(schedule_selector(SomeClass::disableFlag), 3);
}

void SomeClass::disableFlag(float d)
{
	this->setFlag(false);
	_flag = n;
}


```

[![ゴン ふざけんな ふざけるな](http://tiqav.com/2r1.th.jpg)](http://tiqav.com/2r1)

まぁこれ一回だけとかなら許せなくはないですが、頻繁に起こることなので私の怒りが有頂天に達しました。

# DelayTimeとCallFuncを使う

そこでなにかいい方法はないかと考えた結果、同じくNodeが実装しているrunActionを使う方法を思いつきました。runActionは色々なアクションを簡単に実行できるので重宝しますが、その中でも時間を遅らせるDelayTimeと引数なしstd::function型のコールバックを実行するCallFuncを使えばいいのです。こんな風に。

```cpp:SomeClass.cpp

void SomeClass::someMethod()
{
	// 3秒後にラムダ式を実行
	this->runAction(Sequence::create(DelayTime::create(3),CallFunc::create([this](){
		this->_flag = false;
	}), NULL));
}


```

せっかくなのでこんなマクロを作りました

```cpp

#define call_after(callback, delay) \
runAction(Sequence::create(DelayTime::create(delay), CallFunc::create(callback), NULL))

void SomeClass::someMethod()
{
	call_after([this](){ this->_flag = false; }, 3);
}

```

めっちゃ気持ちいいです。
FuelPHPでdoctrine-extensionを使ってcreated_at/updated_atを更新する


`created_at`/`updated_at`をinsertやupdateのタイミングで更新しようとすると、
`Event`を実装しなければならず、ややめんどくさい。

`doctrine-extension`を使えば解決しそうだが、いざ使おうと調べると`Symfony`での話ばかりだった。
実際に試したほうが早いと思い、試してみた。

全然難しくもなんともなかった。

## 事前準備

例のごとく、以前の記事と同じ構成の環境を使うので、同じ様にセットアップしておく。

- http://qiita.com/gyhino@github/items/188d207d26f608269b3a
- http://qiita.com/gyhino@github/items/ddf92157b81f31ce5af2

## composerでインストールする

https://packagist.org/packages/gedmo/doctrine-extensions

上記のpackagistの通り、`"gedmo/doctrine-extensions": "2.3.*@dev"`を追加する。

```json:composer.json
{
	"require": {
		"aspendigital/fuel-doctrine2": "dev-master",
		"gedmo/doctrine-extensions": "2.3.*@dev",
		"symfony/yaml": "~2.1"
	},
	"config": {
		"vendor-dir": "app/vendor"
	},
	"minimum-stability": "dev"
}
```

追加したら以下のコマンドでインストール（更新）する。

```
php composer.phar update
```

なお`composer`でインストールする事により`composer`の`autoloader`に追加されるので、設定する必要はない。

## EventManagerに登録する

http://www.doctrine-project.org/2010/11/18/doctrine2-behavioral-extensions.html

これを読む限り`EventManager`に`TimestampableListener`を登録すればやりたいことは出来そうなので登録してみる。

`aspendigital/fuel-doctrine2`のライブラリ内で`EventManager`を生成、`EntityManager`にセットされてしまうので、
以前`SQLLogger`を仕込んだ時と同様`init_callback`を使って登録する。

以前の記事:
http://qiita.com/gyhino@github/items/52d3c90e8f20c9908a34

```php:app/config/db.php
<?php
return array(
	'doctrine2' => array(
		'proxy_dir' => APPPATH.'classes'.DIRECTORY_SEPARATOR.'proxy',
		'proxy_namespace' => 'Proxy',
		'metadata_driver' => 'simplified_yaml',
		'metadata_path' => array(
			APPPATH.'config'.DIRECTORY_SEPARATOR.'doctrine' => 'Entity',
		),
		'init_callback' => function($manager, $connection) {
			$manager->getConnection()->getConfiguration()->setSQLLogger(new Sample\Doctrine\SQLLogger($connection));
			$manager->getEventManager()->addEventSubscriber(new \Gedmo\Timestampable\TimestampableListener());
		},
	),
);
```

これでフレームワーク側の設定完了。あっさり。

## エンティティの定義

あとはエンティティの定義を追加すれば、動く。
色々あってyamlでの定義に変更したので、今回はyamlでの定義を記載する。

対象フィールドに`gedmo:`以下を追記する。

```yml:app/config/doctrine/Campaign.orm.yml
Entity\Campaign:
	table: campaigns
	repositoryClass: Entity\CampaignRepository
	id:
		id:
			type: integer
			generator:
				strategy: AUTO
	fields:
		title:
			type: string
			length: 512
		createdAt:
			column: created_at
			type: datetime
			gedmo:
				timestampable:
					on: create
		updatedAt:
			column: updated_at
			type: datetime
			gedmo:
				timestampable:
					on: update
```

あとは通常通りpersistすればうまく更新される。
yoでAngularJSのテンプレートを生成するときに「Error: Attempt to unlock *, which hasn't been locked」とエラーが表示されるとき

原因は.npmへアクセスする権限がないユーザで利用しているためでした。
（ちなみにyoコマンドはsudoが利用できません。ターミナル内で怒られます。）

解消方法は以下の通り。（ユーザホームに.npmがある場合です）

```bash:bash
cd ~
sudo chown -R ユーザ名 .npm
```

無事ひな形が生成できました！
AppCodeのライブテンプレートでプルダウンメニューを出す方法

 
~~まず服を着ます~~ 

AppCodeのライブテンプレートってのは、ざっくり言うと **高機能なスニペット** みたいなもの。
カスタマイズ性が高く、例えば下記のように **プルダウンで選択できる項目を指定する** なんてことも出来たりします。

![0_project](https://dl.dropboxusercontent.com/u/958512/_blog/qiita/appcode_livetemplate_enum/0.png)



これには Edit Valiables で **enum()** を使います。

1. テンプレート内に任意の定数を作成。
1. `Edit Valiables`でダイアログを開き　
1. 先ほどの定数のエリアにenmu()でプルダウン表示したい文字列を入れる。


![0_project](https://dl.dropboxusercontent.com/u/958512/_blog/qiita/appcode_livetemplate_enum/1.png)






アイディア次第でいろいろ出来そうですね！
超基本的なコーディングの注意点


社会人１年目のメモが見つかったので転載。
基本C言語の話なんだけど他でも流用できるかも。
本当に基本的なことだけですが


# 規約(コンベンション)を守ること

ソースコードで、コンベンション（いわば決まりごと）は守りましょう。
少なくとも、コードのルールの一貫性を持つようにしましょう。

# assert()を使おう!!
* 条件が真になるときはassert()をつかう
 * 引数のチェック
 * 仮定の有効性のチェック
* ありえない状態(switch-case文のdefault:は実行されないはずなのに、実行される…等）をチェック


# ステップ実行をしよう
開発環境のステップ実行は便利な機能なので使いましょう。
Visual C++にもついてます。
プログラムがどのような流れで実行されているかがよくわかります。

* 変数のチェック
* 関数がきちんと使われているかチェックする

ブレークポイントも活用しましょう。
ブレイクポイントをつけると、プログラムの実行がそこで止まります。
それから、変数の値を変えて、エラー処理がきちんと行われるかもチェックしましょう。

# 関数について
* 関数の戻り値にエラーコードを埋めてはならない
 * 正しいときはその値、エラーの時はNULL、EOF、-1…等（<=デバッグしずらくなる）

* 多目的な関数をつくってはいけない
  * 異なる機能ごとに分割すべき

# 構造体の初期化処理
* 構造体の初期化を忘れない。また、ユーザが変数の内容を意識しないように設計する場合、きちんと初期化処理を関数化する

# マジックナンバー（意味のわからない数字）をつかわない
* 意味のある数字で区別するように、enumか#defineを使う

# ユニットテストは成功と失敗は自明でなければならない
* 文字列を返す関数をテストするのに、そのままコンソール上に出力してチェックしていたが、きちんと期待する文字列と比較を行い、assert()をつかって真になるようにしなくてはならない。
* テストはできる限り自動化する
* 恒真のときはassert()を使う

# ソースコードを読む
ソースコードを読むためのツール
* GNU global
http://www.gnu.org/software/global/download.html
* globalの使い方
http://uguisu.skr.jp/Windows/gtags.html


# バグ報告の書き方
* 具体的に・正確に
* エラーが起きた状況を性格に再現できるようにする
* 環境もきちんと報告する
* エラーメッセージはメモする
* 症状を報告する。自分の診断と混合させない（余計な情報になる可能性があるため）

##　バグ報告についてのリンク
* 効果的にバグを報告するには
http://www.unixuser.org/~ueno/bugs-ja.html
* バグ報告ガイドライン(Mozilla)
http://www.mozilla-japan.org/quality/bug-writing-guidelines.html
日報の書き方


社会人１年目に書いたメモが見つかったので、転載。
(全然技術情報じゃないけど)

# 基本

* 予定とかかった時間(not 時刻)をきちんと書く
 * 作業をやる順番・かかる時間・使える時間を考慮して
* 進捗の度合いを書く
 * 前倒しか、遅れているか、予定通りか
* 予定通りに進まなかったら原因を考える
* 社内の用語と自分の理解を混合しない
* 読む人を意識して書く

# 予定と成果を合わせるために

* 作業を改善することを考えて、何を改善すべきか書く
* 見積もりの精度を上げる
 * 作業記録をとる（残るように）
 * 何で見積もりが会わなかったか考える
* 目標をはっきりさせる
* 何をしなければならないか、きちんと具体的なアクションに落とす

# 進捗報告をきちんと書く

* onTimeなのか、遅れているのか、進んでいるのか、変更したのか
* 遅れたり進んだりしたら、また日程変更したらその理由もきちんと書く
* 懸念事項も書く（きちんとわかりやすいように独立して書くこと）

# 成果
* 成果についてはきちんと説明する
* 学んだ点・理解した点を書いてみる。
* わかったこととわからないことを明確にして、書く。

# アウトプットはきちんと書く
* 求められているモノかどうか確認することも忘れない
gemをインストールしようとしたら、zlibが見つからない、とか言われた


# こんなエラーが出た

新しい環境でRubyも新規インストールしたし、Bundlerでも入れてみようとしたら、

```
$ gem install bundler
ERROR:  Loading command: update (LoadError)
    cannot load such file -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::UpdateCommand
```

Bundlerがインストールできない。

```
$ gem update
ERROR:  Loading command: update (LoadError)
    cannot load such file -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::UpdateCommand
```

gem updateもできない。むむむ。

# 対処

手っ取り早く解決したい方へ。

1. zlibをインストール

  ```
　$ sudo apt-get install zlib1g-dev
  ```

1. rubyを再インストール（これが大事）

  ```
  $ rbenv install 1.9.3-p484
  $ rbenv rehash
  ```

# 詳細
## 環境
Ubuntu 14.04 LTS 64bit (on Virtualbox)
ruby: 1.9.3-p484 （rbenvでインストール）


## 手順

上述の通り、zlibが見つからないというメッセージが出たので、

```
$ sudo apt-cache search zlib dev
...
zlib1g-dev - 圧縮ライブラリ - 開発キット
...
```
```
$ sudo apt-get install zlib1g-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  zlib1g-dev
（以下省略）
```

zlibインストール完了。ではもう一度 gem をインストール。

```
$ gem install bundler
ERROR:  Loading command: update (LoadError)
    cannot load such file -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::UpdateCommand
```

ダメじゃん。

[こちら](http://stackoverflow.com/questions/9727908/cannot-load-such-file-zlib-even-after-using-rvm-pkg-install-zlib)を参考にrubyを再インストール。

```
$ rbenv install 1.9.3-p484
rbenv: /home/myname/.rbenv/versions/1.9.3-p484 already exists
continue with installation? (y/N) y
Downloading yaml-0.1.6.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/7da6971b4bd08a986dd2a61353bc422362bd0edcc67d7ebaac68c95f74182749
Installing yaml-0.1.6...
Installed yaml-0.1.6 to /home/myname/.rbenv/versions/1.9.3-p484

Downloading ruby-1.9.3-p484.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/d684bc3a5ba72cda9ef30039f783c0f8cdc325bae5c8738c7bf05577cbe8f31d
Installing ruby-1.9.3-p484...
Installed ruby-1.9.3-p484 to /home/myname/.rbenv/versions/1.9.3-p484
```

```
$ gem install bundler
Fetching: bundler-1.6.3.gem (100%)
Successfully installed bundler-1.6.3
1 gem installed
Installing ri documentation for bundler-1.6.3...
Installing RDoc documentation for bundler-1.6.3...
```

めでたし、めでたし。
GitLab API 関連記事まとめ

# GitLab API 関連記事まとめ

更新日: 2014/07/18 21:38:27

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[GitLab API  gitlab gem で Issue のコメント一覧を取得する](http://qiita.com/tbpgr/items/5fa0cffe9560172d99d8)|2014/07/10 22:14:13|4|
|2|[GitLab API  gitlab gem で Issue を別のプロジェクトにコピーする](http://qiita.com/tbpgr/items/9785e81678bb7dadf53a)|2014/07/16 21:44:41|2|
|3|[GitLab API  gitlab gem で IssueNote (コメント)のリストから IssueNote (コメント)を登録するためのソースコードを生成する](http://qiita.com/tbpgr/items/aafa896c491c7c1c11c7)|2014/07/16 21:48:16|2|
|4|[GitLab API  gitlab gem で Issueの一覧から Issue を登録するためのソースコードを生成する](http://qiita.com/tbpgr/items/e99c6d2dc805a586de51)|2014/07/10 21:54:31|3|
|5|[GitLab API  gitlab gem で Issueの一覧を取得する](http://qiita.com/tbpgr/items/73fc5a793277e6216dae)|2014/07/09 22:03:54|7|
|6|[GitLab API  gitlab gem で Issueの編集](http://qiita.com/tbpgr/items/12d154add799ba679e6d)|2014/07/10 22:11:58|3|
|7|[GitLab API  gitlab gem で Wikiを clone するためのコードを生成する](http://qiita.com/tbpgr/items/a19b760c65db27c73d5b)|2014/07/09 21:58:30|4|
|8|[GitLab API  gitlab gem で グループの一覧を取得する](http://qiita.com/tbpgr/items/ceaf764b2a668fa32a51)|2014/07/08 21:16:24|3|
|9|[GitLab API  gitlab gem で プロジェクトのURL、リポジトリのURLの取得](http://qiita.com/tbpgr/items/2c9953bbba291bcb96fe)|2014/07/09 21:43:47|2|
|10|[GitLab API  gitlab gem で プロジェクトの一覧を取得する](http://qiita.com/tbpgr/items/8280ef38a1f067c8bef8)|2014/07/09 21:38:03|3|
|11|[GitLab API  gitlab gem で ユーザーの一覧を取得する](http://qiita.com/tbpgr/items/67b7290cba9c7a4649c5)|2014/07/08 21:19:29|4|
|12|[GitLab API  gitlab gem で 任意のプロジェクトの全ての Issue を疑似削除する](http://qiita.com/tbpgr/items/40c00facdb1f6daa6c51)|2014/07/16 21:41:32|2|
|13|[GitLab API  gitlab gem で 新規Issueの作成 ](http://qiita.com/tbpgr/items/039c9ea75db0da69c9da)|2014/07/10 21:49:28|2|
|14|[GitLab API  gitlab gem で 新規グループの作成](http://qiita.com/tbpgr/items/cb9d0eea296b6ae6f1d6)|2014/07/08 21:18:01|4|
|15|[GitLab API  gitlab gem で 新規プロジェクトの作成 ](http://qiita.com/tbpgr/items/ee0d179a773f8558da8d)|2014/07/09 21:41:59|4|
|16|[GitLab API  gitlab gem で 新規ユーザーの作成](http://qiita.com/tbpgr/items/caa191f69ced1a590c79)|2014/07/08 21:20:39|5|
|17|[GitLab  GitLab API でプロジェクトを削除する](http://qiita.com/tbpgr/items/205b2ae6ef48c3a5aa6a)|2014/07/18 21:36:53|0|
|18|[GitLab  GitLab API で既存プロジェクトを別グループの新プロジェクトに移動する](http://qiita.com/tbpgr/items/ee373cf3a06b6a71ff0e)|2014/07/18 21:38:08|0|
GitLab API | gitlab gem で 新規ユーザーの作成

# GitLab API | gitlab gem で 新規ユーザーの作成

## 概要
gitlab gem で 新規ユーザーの作成

## サンプル
~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
puts Gitlab.users.size # => この段階では 1(初期の管理者ユーザー分)
Gitlab.create_user('hoge@hogehoge_hige.jp', 'sample_pass', username: 'hoge')
Gitlab.create_user('hige@hogehoge_hige.jp', 'sample_pass', username: 'hige')
puts Gitlab.users.size # => この段階では 3
~~~

## 出力
~~~
1
3
~~~

## 補足
* username は GitLab API の必須項目
* name を指定しないと email が name として設定される

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で ユーザーの一覧を取得する

# GitLab API | gitlab gem で ユーザーの一覧を取得する

## 概要
gitlab gem で ユーザーの一覧を取得します

## サンプル
~~~ruby
require 'gitlab'
require 'pp'
require 'tbpgr_utils'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
users =  Gitlab.users

bulk_puts_eval binding, <<-EOS
users.first.id
users.first.username
users.first.state
users.first.is_admin
users.first.email
users.first.can_create_project
EOS

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

## 出力
~~~
users.first.id                 # => 3
users.first.username           # => "hoge"
users.first.state              # => "active"
users.first.is_admin           # => true
users.first.email              # => "hoge@hogehoge_higehige.io"
users.first.can_create_project # => true
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で 新規グループの作成

# GitLab API | gitlab gem で 新規グループの作成
## 概要
gitlab gem で 新規グループの作成

## サンプル

~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
puts Gitlab.groups.size # => この段階では 0

Gitlab.create_group('SampleGroup1', 'sample_group1')
Gitlab.create_group('SampleGroup2', 'sample_group2')

groups =  Gitlab.groups
puts Gitlab.groups.size # => この段階では 2
~~~

## 出力
~~~
0
2
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で グループの一覧を取得する

# GitLab API | gitlab gem で グループの一覧を取得する

## 概要

gitlab gem で グループの一覧を取得します

## サンプル

~~~ruby
require 'gitlab'
require 'tbpgr_utils'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
groups =  Gitlab.groups

bulk_puts_eval binding, <<-EOS
groups.first.id
groups.first.name
groups.first.path
groups.first.owner_id
EOS

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

## 出力
~~~
groups.first.id       # => 4
groups.first.name     # => "SampleGroup"
groups.first.path     # => "samplegroup"
groups.first.owner_id # => nil
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
RuboCop | Style/LineLength

# RuboCop | Style/LineLength

## 概要

RuboCopの「Style/LineLength」警告について。

1行あたりの文字数をチェックし、警告を出します。
デフォルトは80文字です。

## LineLength

各設定値での検証結果をまとめます。

### 検証プログラム

line_length.rb

~~~ruby
a = '67890123456789012345678901234567890123456789012345678901234567890123456789'
b = '678901234567890123456789012345678901234567890123456789012345678901234567890'
print a, b
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

~~~yaml
LineLength:
  Max: 80
~~~

~~~bash
$ rubocop line_length.rb
Inspecting 1 file
C

Offenses:

line_length.rb:2:81: C: Line is too long. [81/80]
b = '678901234567890123456789012345678901234567890123456789012345678901234567890'
                                                                                ^

1 file inspected, 1 offense detected
~~~

### 実行結果 81文字に設定します

.rubocop.yml

~~~yaml
LineLength:
  Max: 81
~~~

~~~bash
$ rubocop line_length.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
minimal-uiで全画面表示（height 100%）にして端末を横に回転させた場合のレイアウト崩れ回避方法


iPhoneサイトでよく利用されていたアクセスした直後にアドレスバーを隠す方法の1px強制的にスクロールさせる方法がありましたがiOS7以降やAndroidで、効かなくなりましたね。
個人的には本来の意図でスクロールさせているわけではないのであまり好きではありませんでしたが、ファーストビュー重視という点でよく用いられクライアントからも指示されることもあったと思います。

では別の方法はないかと探すとiOS7で実装されたminimal-uiでアドレスバーを細くする方法があります。

METAタグ

```
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
```

![minimalui1.png](https://qiita-image-store.s3.amazonaws.com/0/41761/c49780d2-765b-4225-4f6d-72cc785257bc.png)

このような感じでアドレスバーが細くなります。
※ずっと細いままなので少し意図と違うかもしれませんがSPAのionicなどのモバイルフレームワークでは使うこともあるかと思います。
ただこのminimal-uiで高さ100%のコンテンツ(ionicなど)を表示して回転させると全画面表示にならずレイアウトが崩れてしまいます。

![minimalui2.png](https://qiita-image-store.s3.amazonaws.com/0/41761/6d47fc99-acfa-bc78-c903-16e8cc627976.png)


これはおそらくアドレスバーの高さ分、表示が崩れているのだと思います。
指でスクロールさせると直るのですが触らないと直らないのでかっこ悪いですね。

ということは以前やっていた1pxスクロールさせるのを回転後に実行すれば？ということでやってみると。直りました。

![minimalui3.png](https://qiita-image-store.s3.amazonaws.com/0/41761/f3510971-704c-3167-ab86-c00fe22ce50b.png)

結局「スクロールさせる」ということでカッコ悪いですが、ブラウザのバグのため将来的に直るまでは仕方ないかなと思います。
ちなみにscrollByでは表示が直りませんでした。

```lang:JavaScript
window.onresize = function() {
    setTimeout(function() {
        window.scrollTo(0, 1);
    }, 1);
};
```

ionicなどのモバイルフレームワークを利用している時に困ったので参考に。
さくらのVPSでCoreOSのインストールに失敗した時の対処法メモ(Linuxでパーティションの削除方法)

やっちまったコマンド以下

```
# vpsは~/.ssh/conifgで設定しているHOSTです。
$ ssh vps sudo coreos-install -d /dev/vda -c cloud-config -C alpha
```

## 結論

パーティションを一度削除してから再インストール

さくらVPSなので「OSの再インストール」でCentOSガッとインストールして
rootでログインできるようになったら。

以下のコマンドでなんとかなった。

```
$ fdisk /dev/vda
> d 1
> w # wコマンドで保存　キャンセルの場合は q
```

## どういったエラーなのか

再現性は低いからメモ程度です
インストールに失敗して
ISOからインストールをしてネットワークの設定のため再起動をするも
その段階で上手く行かなくなります。

確認してはないんですが、ネットワークの設定がいらなければ
`vps sudo coreos-install -d /dev/vda -c cloud-config -C alpha`
をLiveCD側でちゃんと実行すればなんとかなるかも
debug.keystore の hashを確認する方法


```java
try {
    PackageInfo info = getPackageManager().getPackageInfo(
            "パッケージ名", 
            PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
} catch (NameNotFoundException e) {

} catch (NoSuchAlgorithmException e) {

}
```


```bash:shell
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
```

```bash:shell
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl md5
```
C#:PCL版の URI Query の Dictionary化


```csharp


    using System;
    using System.Linq;
    using System.Collections.Generic;
    using NUnit.Framework;

    using MonoTouch.UIKit;

	[TestFixture]
	public class UnitMisc : UnitBase
	{
  
		public Dictionary<string, string> ParseQuery(string query)
		{
			return query
					.Split ("?&".ToCharArray ())
					.Where (i => string.IsNullOrEmpty (i) == false)
					.Select (i => i.Split ('='))
					.ToDictionary (
						i => Uri.UnescapeDataString (i [0]), 
						i => Uri.UnescapeDataString (i [1]));
		}


		
		[Test]
		public void TestUri()
		{

			var authreq = _ (@"
			openid://?
  			response_type=id_token
  			&client_id=https%3A%2F%2Fclient.example.org%2Fcb
  			&scope=openid%20profile
  			&state=af0ifjsldkj
  			&nonce=n-0S6_WzA2Mj
  			&registration=%7B%22logo_uri%22%3A%22https%3A%2F%2F
    		client.example.org%2Flogo.png%22%7D
			");

			var uri = new Uri (authreq);

			var query = ParseQuery (uri.Query);

			Assert.AreEqual (query.Count, 6);
			Assert.AreEqual (query ["response_type"], "id_token");
			Assert.AreEqual (query ["client_id"], "https://client.example.org/cb");
			Assert.AreEqual (query ["state"], "af0ifjsldkj");
			Assert.AreEqual (query ["scope"], "openid profile");
			Assert.AreEqual (query ["nonce"], "n-0S6_WzA2Mj");
			Assert.AreEqual (query ["registration"],
				@"{""logo_uri"":""https://client.example.org/logo.png""}");

		}
	}
```
Swiftのif letでは二つ以上の変数を同時に束縛できないのでその代替方法

SwiftでOptionalタイプの変数からif letで値を取り出して利用しますが、現状では二つ以上の変数を同時にif letで扱うことができません。

二つ以上のOptionalタイプの変数から値を取り出す場合には以下のようにswitchを利用します。

```swift
let first : Int? = "1".toInt()
let second : Int? = "2".toInt()

switch (first, second) {
case (.Some(let f), .Some(let s)):
    println(f + s)
default:
    println("error")
}
```
devise の Controller のカスタマイズ

http://www.tamurasouko.com/?p=929

>
Deviseをインストールしてもそのコントローラは生成されません。Deviseが内部的に持っているコントローラが使用されます。そのため、Deviseのコントローラの挙動を変えたい場合は、そのDeviseのコントローラクラスを継承した独自のコントローラを作成する必要があります。認証用のモデルを「User」という名前にした場合、app/controllers/usersディレクトリ配下にsessions_controller.rbとregistrations_controller.rbという2つのコントローラファイルを作成します。前者はユーザのログイン/ログアウト機能のコントローラで、後者はユーザ登録機能のコントローラになります。それぞれソースコードは以下のようにします。
>

```sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
 
  def new
    super
  end
 
  def create
    super
  end
end
```

original の sessions_controller.rb
https://raw.githubusercontent.com/plataformatec/devise/master/app/controllers/devise/sessions_controller.rb

```registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
 
  def new
    super
  end
 
  def create
    super
  end
 
end
```
original の registrations_controller.rb
https://raw.githubusercontent.com/plataformatec/devise/master/app/controllers/devise/registrations_controller.rb
サーバーサイドでpngを軽量化（TinyPNGみたいな事）

コマンドラインから簡単にpngをTinyPNGみたいに軽量化できないものかなと思って探したらpngquantがありました。

Lossy PNG compressor 
http://pngquant.org/

ソースコードからのインストール手順です。

```bash
git clone git://github.com/pornel/pngquant.git
cd pngquant/
./configure --prefix=/usr/local
make 
make install
pngquant --version
```

適当なpngで本当に軽量化されるのか試してみます。

```bash
pngquant --quality=65-80 image.png
```

自分の環境ではこんな感じで強制上書きしています。

```bash
pngquant --ext=.png --force --speed 1 --quality=50-60 #{PNG_COMPRESS_PATH}
```

先日試してみたjpegをJPEG-miniのように軽量化するadptに比べると、かなりシンプルにインストールから利用まで出来ました。

adptを導入してみたメモです。 -> http://qiita.com/tkosuga@github/items/a2dbe2f8dfb7904d5fc6
それでもMemcachedを使いたいあなたに

# はじめに
Memcachedと、一般的なクライアントライブラリを用いた時の問題を
[本当は怖いMemcached](http://qiita.com/taruhachi/items/a844bf373623991873ff)
としてまとめました。
その時の結論としては「お手軽にMemachedを冗長化したいんだったらKyotoTycoonの相互レプリケーション機能を使うのがいいよ。」でしたが、多少のパフォーマンス劣化を許容できるのであれば、Memcachedでも信頼性を担保出来るやり方がありましたので、その記事になります。
この方式は過去に実際に利用したことのある方式に少し手を入れてデータ削除時の不整合発生を抑制する方式になります。

# 前回の記事の補足について
ちなみに、前回の記事に関して、以下の様なコメントをいただいております。それぞれ大変有り難いご指摘ではあるのですが、ここではいちいち反論しておきます。

Q.　そもそもキャッシュなんだから信用出来ないよね。
A.　マスタデータ更新時に自分でキャッシュデータの削除をしていたとしても信用出来ないパターンでの記事になります。

Q.　そもそもキャッシュなんだからノード障害時には代替ノードを探さずに、マスタデータを都度問い合わせにいけばいいだけじゃないの？
A.　キャッシュノードの障害が一時的である場合は特に問題ないように見えますが、キャッシュノードの障害が長引いた場合にはキャッシュのヒット率の些細な低下はマスタデータにとっては非常に大きな回数の問い合わせになる可能性があります。
また、例えキャッシュノードの障害が一時的であったとしても、キャッシュノード障害からの復帰時に古いデータが削除されておらずその間違ったデータを読み込んでしまうという本質に変わりはありません。

Q.　では、障害復帰時には自動的にサーバをクラスタに追加しなければいいのでは？
A.　障害の検知、復旧はMemcachedのクライアントライブラリが動的に行っており、そちらからは一時的な障害か、長期の障害かなどを判定できません。一時的な障害は高負荷時には頻発しますので、その障害が発生したからといって切り離したままで元に戻さないという運用をしてしまいますとシステム全体としての信頼性は最低レベルとなってしまいます。

# それでも俺はMemcachedを利用したい！！
利用しましょう。
その場合はMemcachedを完全に別系統で2台立てて、それぞれに書き込んだ上で整合性のチェックをするようにすることで障害発生率を減らします。


名付けてMemcached ミラーリング
![memcached_mirror.png](https://qiita-image-store.s3.amazonaws.com/332/38018/bcd62f57-4fb7-2f5f-3849-2951c7bfaea6.png)


# 利用の流れ
ご利用中の言語で以下の処理をするMemcachedクライアントヘルパクラスを準備してしまいましょう。

## コネクションの取得
クライアントからそれぞれのMemcachedノードにコネクションを張る。
→どちらか片方のコネクションを張ることができなかった場合はコネクション取得が成功したMemcachedノードのみを利用する

## データ書き込み
それぞれのMemcachedノードに、同一の書き込み日時を付加したデータを書き込む

## データ取得
それぞれのMemcachedノードからデータを読み出し、データの書き込み日時が新しい方を利用する。
※同一時刻でデータが異なっていた場合は両方破棄する
ただし、どちらか片方にデータが存在しなかった場合にはデータ読み出し失敗とする。
※データ削除を試みた後である可能性があるため

## データ削除
それぞれのMemcachedノードからデータの物理削除を行う

# スケールアウトをする場合
接続方法は全く同じで、各接続オブジェクトをMemcachedクラスタに置き換えるだけで、スケールアウト対応が可能になります。

Memcachedクラスタミラーリング
![memcached_cluster_mirror.png](https://qiita-image-store.s3.amazonaws.com/332/38018/b50f9bce-9690-195e-2396-58ea7cbf3f36.png)

この時、各クラスタの中では前回記事[本当は怖いMemcached](http://qiita.com/taruhachi/items/a844bf373623991873ff)で触れたのと同じデータ不整合問題が発生します。しかしながら、その結果を別のノードクラスタから取得した結果と付き合わせることでデータの整合性の担保をします。

# メリット・デメリット
## メリット
* クライアントライブラリの改修がなく、既存のライブラリを利用する事ができます。
　→このメリットとして、複数の言語からのアクセスをするときにそれぞれの言語用のクライアントライブラリ全てに手を入れる必要がなくなります。
* ElastiCacheのMemcachedサービスをそのまま利用することができます。
* 各ノードクラスタにノードを追加することでスケールアウトも可能です。
* アベイラビリティゾーンを超えた構成にすることでより冗長性が確保できます。

## デメリット
* 常に倍の回数の読み書きを行う必要がありますので、クライアントアプリケーションから見たパフォーマンスは1/2になります。
* 冗長度が2ですので、Memcached全体のパフォーマンスも1/2になります。

# 補足：データ信頼性評価についての雑な思考実験
ある大きな負荷をかけた時にノード一つ構成の時のエラー率が1/1000だったと仮定する
また、このエラー率はノードへのアクセス数に比例して増加すると仮定する。

## それぞれのクラスタに1台ずつノードがあった場合
各クラスタへのアクセス数は同じなので、クラスタ単位のエラー率は1/1000のまま
両方のノードがエラーを返答した時にエラーデータを取得することになるので、特定のデータのエラー率は(1/100万)まで下がる

## それぞれのクラスタにn台ずつノードがあった場合
各クラスタへのアクセス数は同じなので、それぞれのノードには1/nのアクセスが発生する。
この時の単体のノードのエラー率は1/(1000*n)となる
ここで、クラスタ全体のエラー率は(1/(1000*n))*n = 1/1000になるが、クラスタ上の特定のデータがエラーに巻き込まれる確率は1/(1000*n)となる
両方のノードがエラーを返答した時にエラーデータを取得することになるので、特定のデータの最終的なエラー率は1/(100万*n*n)まで下がると考えられる

例、各クラスタが2ノードで構成されていた場合のエラー率は1/400万
WebStormでDocumentRootのディレクトリを指定するやり方

# 前提

- 下記のような構成でプロジェクトを構成している
- ローカルのWebStormプロジェクトディレクトリがドキュメントルートより上の階層である
- IDEがルートからの相対パス(ex. `/css/style.css` )をうまく解釈してくれない

## プロジェクトの階層

    - /web/trunk         # 開発環境のルートディレクトリ
        - /.idea         # WebStormプロジェクト
        - /app           # Railsなどのアプリケーション領域
        - /frontend_src  # フロントエンドのアプリケーション領域
        - /public        # ドキュメントルート
            - /css       
                - style.css
            - index.html 

つまりHTMLやCSSのパスを`/web/trunt/public/`をドキュメントルートとして解釈してほしい。

# WebStormの設定

`Preference > Project Settings > Derectories` の任意のディレクトリを選択し、Resource Rootに設定すると解決しました。

![webstorm_cap.png](https://qiita-image-store.s3.amazonaws.com/0/3516/b95b9863-42fc-62fb-2456-4a0fcb84540d.png)
SSH接続をIPアドレスで制限する

# SSH接続できるIPアドレスを制限する
手順は簡単.
/etc/hosts.denyと/etc/hosts.allowに以下を追記すればよい.

~~~bash:/etc/hosts.deny
...
sshd : all
~~~

~~~bash:/etc/hosts.allow
...
sshd : 192.168.0. << 192.168.0.xxxからの接続を許可
sshd : 10.0.3.15 <<10.0.3.15の接続を許可
~~~

判定処理は、一旦hosts.denyの制限を適用した上でhosts.allowの条件に当てはまれば接続を許可する流れっぽい.

~~sshだけでなくhttpdなど他のdaemonも同様の手順で設定できる.~~
**[[訂正]]**
**間違いです.少なくともCentOSでhttpdに対する制限は不可能です.**

ここで紹介した設定で制限できるのはlibwrapを利用するもののみです.
実行ファイルが利用するライブラリはlddコマンドで確認できます

~~~bash:sendmailのライブラリ確認
$> ldd /usr/sbin/sendmail
~~~
出力にlibwrap.so.0が含まれていれば制限可能です.
sendmailやnfs関連(locked,mountd等)あたりは同様の手順で設定可能です.
CentOSで日本語キーボードに変更する(in CUI)


VMとかで簡易インストールを勝手にされて「英字キーボードじゃねぇかゴルァ！！！」ってなった方も多いと思います。
もしくは2徹ぐらいしてCentOSをminimalでinstallしてたら「あかん…キーボード設定の時の意識ない…」という方も多いと思います。

ちなみに僕は二つともなった経験あります。

なんでCUI限定かっていうとGUIだともう投稿されています。
[CentOSのキーボード配列を日本語に変更(GUI) by @tamamius](http://qiita.com/tamamius/items/ad261090d47560b17c73)


CentOS6.x系で確認しています

##設定ファイル確認
\# cat /etc/sysconfig/keyboard
KEYTABLE="us"
MODEL="PC105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"

しっかり英字キーボードですね。

##設定ファイル編集
\# vim /etc/sysconfig/keyboard
KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"

こんな感じに設定すれば大丈夫です。
R によるファイル入出力の方法

[前回](http://qiita.com/ynakayama/items/c1bb0d92a712e58bf6fc)や[前々回](http://qiita.com/ynakayama/items/b79dceaea62326c75354)は R に触れましたが、そもそも R の情報はインターネットに豊富にありますし、多少古い情報もあるとはいえ[検索した方が早い](http://b.hatena.ne.jp/search/tag?q=r)でしょう。

筆者はグルー言語として局所的に R を利用することが多いので、他の処理との連携を意識して、自分用のメモを兼ねて R を使ったファイル I/O 周りについてまとめます。

## 入出力ファイル

構造化されたデータを読み書きするためには次のような関数があります。

### 入力

外部のファイルを開いて R のデータフレームに取り込みます。

|関数|説明|
|:--|:--|
|read.table|半角スペースまたはタブで区切ったデータの読み込み|
|read.delim|タブで区切ったデータの読み込み|
|read.csv|カンマで区切ったデータの読み込み|

### 出力

R で処理した結果としてデータフレームをファイルに出力します。

|関数|説明|
|:--|:--|
|write.csv|カンマで区切ったデータの読み込み|

他にもありますが基本は CSV 出力で事足りるでしょう。

## 画像ファイル

R の情報を掲載しているサイトによってはインタラクティブシェルからそのままプロットした図表を閲覧したり、あるいは pdf に出力したりしていますが、特にレポーティングのことを考えるとまず画像ファイルに出力するのが良さそうです。

### .png ファイルに出力する

プロットする前に、あらかじめ png 関数で出力情報を定義しておきます。

```r
png("image.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA)

plot(x,y)

dev.off()
```

### .jpg ファイルに出力する

画像ファイルの形式が異なってもやることは基本的に一緒です。

```r
jpeg(filename = "graphic.jpg", width = 480, height = 480,
    pointsize = 12, quality = 100, bg = "white", res = NA)
```

## R による関数の利用

汎用的なコードは関数にまとめて外部ファイルに置きたくなります。

### 関数定義

R では関数の定義を次のようにおこないます。

```r
# 関数を定義する
some_function <- function (x, y) {
  # 加算結果を含めたベクトルを返却
  return (c(x, y, x+y))
}

# 一度定義した関数はビルトインな関数と同様に使えます
some_function(1, 2)
#=> [1] 1 2 3
```

### 外部ファイルの読み込み

```r
# 外部ファイルを読みこめば関数の定義も読み込まれます
source('some_function.R')

> some_function(3, 4)
[1] 3 4 7
```

### 外部ファイルの実行

R そのものを外部ファイルから呼んで実行するにはリダイレクトを利用します。

```bash
$ R --no-save --no-restore < some_function.R
```

## まとめ

R でファイル入出力をする方法についてまとめました。他の処理と連携する場合には特に必要となるでしょう。
Homebrew caskでインストールしたFirefoxでSeleniumのセッションが作れない？



FirefoxはSelenium2のドライバがデフォルトで同梱されているので、Google ChromeやIEのように別途ドライバをダウンロードしてくる必要がない。なので、Selenium Server Standaloneの起動は、`-browser` オプションを指定するだけですぐに使えるようになる。

```console
$ java -jar selenium-server-standalone-2.42.2.jar -browser browserName=firefox,version=30,platform=MAC,maxInstances=2
```

しかし、Homebrew CaskでFirefoxをインストールした環境では、このコマンドではSeleniumのセッションを作ろうとすると、Firefoxのバイナリが見つからないという例外が発生してしまう。

例外の抜粋:

```
java.util.concurrent.ExecutionException: org.openqa.selenium.WebDriverException: java.lang.reflect.InvocationTargetException
Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:03'
System info: host: 'suin.local', ip: '10.0.1.14', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.4', java.version: '1.7.0_60'
Driver info: driver.version: unknown

...


Caused by: org.openqa.selenium.WebDriverException: java.lang.reflect.InvocationTargetException
Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:03'
System info: host: 'suin.local', ip: '10.0.1.14', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.4', java.version: '1.7.0_60'
Driver info: driver.version: unknown

...

Caused by: org.openqa.selenium.WebDriverException: Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: MAC
Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:03'
System info: host: 'suin.local', ip: '10.0.1.14', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.4', java.version: '1.7.0_60'
Driver info: driver.version: FirefoxDriver

...

18:34:36.319 WARN - Exception: Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: MAC
Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:03'
System info: host: 'suin.local', ip: '10.0.1.14', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.4', java.version: '1.7.0_60'
Driver info: driver.version: FirefoxDriver
```

SeleniumはFirefoxのバイナリが `/Applications/Firefox.app/Contents/MacOS/firefox-bin` があれば勝手にそれをロードしてくれるが、ない場合は明示的にバイナリのパスを指定する必要がある。Homebrew CaskでインストールするとFirefoxは `/opt/homebrew-cask/Caskroom/` にインストールされ、`~/Applcation` にシンボリックリンクが張られる。このFirefoxをSeleniumから使うためには、 `-Dwebdriver.firefox.bin` パラメータでFirefoxのバイナリのパスを明示的に指定する。

```console
$ java -jar selenium-server-standalone-2.42.2.jar -browser browserName=firefox,version=30,platform=MAC,maxInstances=2 -Dwebdriver.firefox.bin=$HOME/Applications/Firefox.app/Contents/MacOS/firefox-bin
```
peco で git のコミットハッシュを選択する alias

いちいち `git log` からコミットハッシュを探しだすのが面倒なので、alias を定義してみました。

```zsh
alias -g C='`git log --oneline | peco | cut -d" " -f1`'
```

例えば、`git show C` では peco で選択したコミットの中身をみることができます。
`git reset --hard C` では選択したコミットまでロールバックできます。


また、reflog から選択する alias も定義しました。

```zsh
alias -g R='`git reflog | peco | cut -d" " -f1`'
```

`git reset --hard R` では peco で選択した時点まで操作履歴をロールバックできます。

See also: [dot.zsh/.zshrc.peco - dtan4/dot.zsh](https://github.com/dtan4/dot.zsh/blob/master/.zshrc.peco)
CentOS7のdockerイメージ作った(remi,epel,ja,237.5 MB)

[CentOS7QA のdockerイメージをRepositoryを登録と、日本仕様にした。 - Qiita](http://qiita.com/tukiyo3/items/892929a73287dd4641e4)に追加。

# 起動方法

```bash:
docker run -it tukiyo3/centos-ja:7.0 /bin/bash
```

# 特徴

* 237.5 MB (docker imagesコマンド結果)
* remiリポジトリ追加
* epelリポジトリ追加
* LANG=ja_JP.UTF-8
* timezone: Asia/Tokyo
CreateJSでcanvasに読み込んだ画像の基準点を設定する方法

CreateJSを用いてcanvasに読み込んだ画像の基準点を設定する方法です。
※デフォルトではオブジェクトの左上(0,0)が基準点のようです。

```js:javascript
window.onload = function(){

	var stage = new createjs.Stage('canvas');
	
	var queue = new createjs.LoadQueue();
	
	queue.addEventListener('complete', function(e){
		
		// Bitmapオブジェクトを生成
		var bitmap = new createjs.Bitmap(queue.getResult('image_1'));
		stage.addChild(bitmap);
		
		// Bitmapオブジェクトの中心座標を取得
		var x = bitmap.getBounds().width / 2;
		var y = bitmap.getBounds().height / 2;
		
		// Bitmapオブジェクトの基準点を画像の中心に設定
		bitmap.x = x;
		bitmap.y = y;
		bitmap.regX = x;
		bitmap.regY = y;
		
		// Bitmapオブジェクトを90度回転
		bitmap.rotation = 90;
		
	});
	
	queue.loadManifest([
		{id: 'image_1', src: 'images/image_1.png'}
	]);
	
	createjs.Ticker.setFPS(30);
	createjs.Ticker.addEventListener('tick', function(){
		stage.update();
	});

}
```

画像の読み込みが終わり、Bitmapオブジェクトが生成された時点で、getBoundsメソッドを用いて矩形領域を取得します。
短形領域の中心座標をBitmapオブジェクトの基準点として設定し、90度回転させました。
基準点はregX、regYプロパティで設定。
また、Bitmapオブジェクトの座標も変更しないと、基準点を変更した時点でBitmapオブジェクトがデフォルト座標(0,0)にズレてしまうので、こちらも変更。
AFNetworking を使って Web API のクライアントを作る方法

エラー処理等は省きます。


参考: http://cocoadocs.org/docsets/AFNetworking/2.0.0/Classes/AFHTTPSessionManager.html

```objc:APIManager.h
#import "AFHTTPSessionManager.h"

#ifdef DEBUG
#define API_BASE @"http://staging.api.example.com/"
#else
#define API_BASE @"http://api.example.com/"
#endif

@interface APIManager : AFHTTPSessionManager

// singleton
+ (instancetype)shared;

// 例えば News っていうリソースを取ってくるとして。
- (void)fetchNews:(void (^)(NSArray *news, NSError *error))handler;
@end
```

```objc:APIManager.m
#import "APIManager.h"
#import "News.h"

@implementation APIManager

+ (instancetype)shared
{
    static APIManager *_shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _shared = [[self alloc] init];
    });

    return _shared;
}

- (instancetype)init
{
    // NSURLSessionConfiguration も指定したい場合は
    // initWithBaseURL:sessionConfiguration: を使う
    // 未指定の場合 [NSURLSessionConfiguration defaultSessionConfiguration] が使われる。
    if (self = [super initWithBaseURL:[NSURL URLWithString:API_BASE]]) {
        // 何か設定しておきたいことがあればこのへんで。
        // responseSerializer はデフォルトで AFJSONResponseSerializer
        // requestSerializer はデフォルトで AFHTTPRequestSerializer
    }
    return self;
}

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
                            completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler
{
    NSMutableURLRequest *mutableRequest = [request mutableCopy];
    mutableRequest.timeoutInterval = 20.0; // なんか共通でやっときたいこと色々
    return [super dataTaskWithRequest:mutableRequest completionHandler:completionHandler];
}

- (void)fetchNews:(void (^)(NSArray *, NSError *))handler
{
    [self GET:@"/api/v1/news" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSArray *news = [News newsWithResponse:responseObject]; // News クラスのオブジェクトの配列を返すとして。
        if (handler) {
            handler(news, nil);
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        if (handler) {
            handler(nil, error);
        }
    }];
}
@end
```

色々はしょってますが、大枠でこんな感じに API をラップしたメソッドをつくっていきます。

コントローラからはこんな感じで使うイメージ

```objc:NewsViewController.m
// 抜粋
[[APIManager shared] fetchNews:^(NSArray *news, NSError *error) {
    if (!error) {
        self.news = news;
        [self.tableView reloadData];

    } else {
        // 何らかのエラー処理!!
    }
}];
```
Dropboxのサムネイル取得高速化

## Improving Dropbox Performance: Retrieving Thumbnails - Dropbox Tech Blog

https://tech.dropbox.com/2014/01/retrieving-thumbnails/

メモを見つけたので共有。

### 問題
ブラウザではリクエストの並列数に上限があるため、サムネイル取得の全体のパフォーマンスが低下する。(Request queuing)

![](https://tech.dropbox.com/wp-content/assets/perf_blog/thumb-waterfall.orig.png)

### 解決策
まずSPDYを検討したが、以下の理由により断念した。
* Amazon ELB (ロードバランサ)はSPDYをサポートしてない
* モバイルアプリではSPDYを使えない

HTTPSで画像のURLをbatch requestsしてdata URIで返すことにした。

```
GET https://photos.dropbox.com/thumbnails_batch?paths=
        /path/to/thumb0.jpg,/path/to/thumb1.jpg,[...],/path/to/thumbN.jpg
```

```
HTTP/1.1 200 OK
Cache-Control: public
Content-Encoding: gzip
Content-Type: text/plain
Transfer-Encoding: chunked

1:data:image/jpeg;base64,4AAQ4BQY5FBAYmI4B[...]
0:data:image/jpeg;base64,I8FWC3EAj+4K846AF[...]
3:data:image/jpeg;base64,houN3VmI4BA3+BQA3[...]
2:data:image/jpeg;base64,MH3Gw15u56bHP67jF[...]
[...]
```

* base64にするとオーバーヘッドがあるが、gzip圧縮されるためそのオーバーヘッドは相殺される
* キャッシュできる
* progressiveロードできる

ので問題なく動く。

### 結果
全プラットフォームにデプロイし、Webではページ読み込み速度が40%向上した。

今後はSPDYの採用を計画している。

https://tech.dropbox.com/2014/01/retrieving-thumbnails/
ツイッター風のメモアプリ作成時のメモ


#アプリの作成方法

## フレームワーク（Mojolicious）

アプリのひな形を作成する

``` 
$ mojo generate lite_app twitter.pl
```

テストサーバを立ち上げる

```
$ morbo twitter.pl
```


#見た目（CSS）
##Bootstrap

###Bootstrapの読み込み 
``` HTML
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">

<!-- Optional theme -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">

<!-- Latest compiled and minified JavaScript -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
```

##Bootsrapの使い方で参考になるサイト
* [ブートストラップスターターテンプレートv2.0.4](http://php-fan.org/sample_code_demo/bootstrap.html)


* [Twitter Bootstrap Button Generator for Twitter Bootstrap 3](http://www.plugolabs.com/twitter-bootstrap-button-generator-3/)
RubyGems / bundler の設定


最近、色々と整理したのでまとめ。

# RubyGems

- `--no-document`をデフォルトに

```~/.gemrc
gem: --no-document
```

`--no-ri --no-rdoc`は`deprecated`らしい。

http://qiita.com/kei_q/items/d13235157fcfc435489d

# bundler

- 並列処理させる
- `bin`を指定しておく

```~/.bundle/config
---
BUNDLE_JOBS: '4'
BUNDLE_BIN: vendor/bin
```

# direnv

- インストール

```console
brew install direnv
```

```~/.zshrc
eval "$(direnv hook zsh)"
```

- 各プロジェクトでの設定

```.envrc
export PATH=$PWD/bin:$PWD/vendor/bin:$PATH
```

こうしておくと、`bundle exec`いらないし`Rails 4`の`bin`とぶつかる事もない。
CreateJSでcanvasに読み込んだ複数画像をまとめて処理する方法

CreateJSを用いてcanvasに読み込んだ複数画像をまとめて処理する方法です。
複数のBitmapオブジェクトをまとめるのに、Containerクラスを使用します。
※[こちら](http://qiita.com/pikoshimame/items/62dc2681ae598dfdefff)の応用編

```js:javascript
window.onload = function(){

	var stage = new createjs.Stage('canvas');
	
	// 複数のオブジェクトをまとめるコンテナを生成
	var container = new createjs.Container();
	stage.addChild(container);
	
	var queue = new createjs.LoadQueue();
	
	queue.addEventListener('fileload', function(e){
		if(e.item.type === createjs.LoadQueue.IMAGE){
			var bitmap = new createjs.Bitmap(e.result);
			// コンテナにaddChildする
			container.addChild(bitmap);
		}
	});
	
	queue.addEventListener('complete', function(e){
		// コンテナのalphaを0.5にする
		container.alpha = 0.5;
	});
	
	queue.loadManifest([
		{id: 'image_1', src: 'images/image_1.png'},
		{id: 'image_2', src: 'images/image_2.png'},
		{id: 'image_3', src: 'images/image_3.png'},
		{id: 'image_4', src: 'images/image_4.png'},
		{id: 'image_5', src: 'images/image_5.png'}
	]);
	
	createjs.Ticker.setFPS(30);
	createjs.Ticker.addEventListener('tick', function(){
		stage.update();
	});

}
```

全ファイルの読み込みが完了した時点で、Containerオブジェクトのalpha値を変更すると、内包されているBitmapオブジェクトのalpha値がまとめて変更されました。