OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftでNSManagedObjectのSubclassを使う場合は、対応Class名にモジュール名のPrefixを付ける


タイトルそのままですが、
swiftでCoreDataのNSManagedObjectの Subclassを作るとき、 `@objc(EntityClass)` と付けるやり方がありますが、それよりはCoreDataのEntity定義で 
**(モジュール名).(EntityClass名)** 
とする方が良さそうです。

@objc(Entity) を付ける場合
====

`@objc(Entity)` を付けるとおそらく名前空間がGlobalな（従来のObjectiveCが使っている）場所になるのだと思います。
つまり、

```
@objc(ChildEntity)
class ChildEntity: NSManagedObject {
    @NSManaged var identity: String
    @NSManaged var name: String?
    @NSManaged var birthday: NSDate?
    @NSManaged var sex: NSNumber?
    @NSManaged var imageFilename: String?
}
```

と書くと `ChildEntity` というClassが定義されるので、CoreDataの設定も`ChildEntity`と書いておけば良いことになる（のだと思います）。

しかしこれだと、従来のObjectiveCコードでたまたま ChildEntity というClass(というかinterface)が定義されているとおそらくビルドできなくなりそうです（だから今までは３文字Prefixを付けていたわけですが）。


@objc を付けない場合
=====

`@objc()` を付けない場合、CoreDataのModel定義で、モジュール名のPrefixを付けます。以下のような感じになります。

![PetampCoreDataModel_xcdatamodel_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/11124/bd917b00-3cee-e0a2-4443-78d74054c3ff.png "PetampCoreDataModel_xcdatamodel_—_Edited.png")


```
class ChildEntity: NSManagedObject {
    @NSManaged var identity: String
    @NSManaged var name: String?
    @NSManaged var birthday: NSDate?
    @NSManaged var sex: NSNumber?
    @NSManaged var imageFilename: String?
}
```

普通のSwiftのClassは `モジュール名.Class名` という名前を持つので、他のコードやライブラリと衝突することはまずありません（モジュール名が同じでない限り…）。
モジュール名は普通は Projectの **Target名** になります。

どっちが良いか？
=====

結論としては **@objc()を付けない** 方が良いと思っています。

* 多少モジュール名のPrefixをModel定義に書くのが面倒ですが、まあそれほどでもない
* 名前の衝突リスクを回避できるのは大きい
* @objcを付ける方法だと上手くいかない **時があった** が、付けない方法にしたら解消した（これは一時的な問題かもしれないですが）。
【勉強会】Unity勉強会に参加しました

# 概要
* [【第1回】UnityアセットまみれのLT大会](http://unityassetjp.doorkeeper.jp/events/12698)
    * 時間：　2014-07-30（水）19:30 - 21:30
    * 概要：　Unityアセットが紹介されて、DK２に関する内容もある
* [【#TechBuzz】第23回Unity勉強会](https://atnd.org/events/51622)
    * 時間：　2014-07-31（木）19:30 - 22:00
    * 概要：　Unity基本、アセット紹介、Unityで開発に関する技術

# 内容
### Unity パーティクルシステム超入門
* [公開レポート](http://www.slideshare.net/minorunakanou/unity-particle-systemforbeginner)
* 詳細
    * パーティクルシステムとは
        * [３D空間に描かれた２Dの画像です。煙や炎、水飛沫や葉っぱの効果に用いられます](http://ws.cis.sojo-u.ac.jp/~izumi/Unity_Documentation_jp/Documentation/Manual/Particle%20Systems.html)
    * [分類](https://www.assetstore.unity3d.com/jp/#!/category/125/page/1/sortby/popularity)
        * 気象（雨、雪）
        * 炎
        * 魔法
        * 水
        * その他
　　 * 使い方
        * インスペクタの基本設定
        * モジュール設定
    * 参照
        * http://qiita.com/nenjiru/items/04d5dc9f518125394b19
        * http://ws.cis.sojo-u.ac.jp/~izumi/Unity_Documentation_jp/Documentation/Manual/Particle%20Systems.html

### パーティクルを作る有名人
* 秋山高廣 さま
    * Unityアセット（パーティクル専門）を作って、販売している
* 個人ホームページ
    * http://unity3d.flyingteapot.net/
* 作品
    * http://unity3d.flyingteapot.net/portfolio-2/
* 月売り上げ
    * 20 ~ 30万円

### 美少女（ユニティちゃん）
* 誰？
    * ここで、見えるよ
        * http://www.gaprot.jp/wp-content/uploads/mecanim/UnityChan3.html
    * unityアセットとして、使って、ゲームを作れる
    * OSSで、無料でDLできる
    * コントロール、ボイズ、顔
* ホームページ
    * http://unity-chan.com/


### photon unity network
* 何これ？
    * 誰でもリアルタイムマルチプレイヤーゲームを開発してグローバルに配信するサービスです
* ホームページ
    * https://www.exitgames.com/ja/PUN
* 無料タイプ
    * 20 CCU
    * 20 コネクション
    * ˜4k 月間アクティブユーザー
    * 500 メッセージ/秒 1ルームにつきCCUバースト は含まれません

### 360音声
* ある会社のプロジェクト
* 全天球動画を撮るときに、360度の音声を記録する
* Oculusで、全天球を見るときに、どっちに見ると、そっちの音声が出る
Installing rbenv and ruby 2.1.2 onto Ubuntu 14.04 LTS

so forgettable me, just write down. thanks.

```sh
~/  $  sudo apt-get install build-essential git curl zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev sqlite3 libsqlite3-dev nodejs tk
 :

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

~/  $  git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-buildom
 :
※ i can't treat rbenv-gemset in rubymine, so i don't install it (but i want it :P

~/  $ vi .bashrc
 :
 :
# ruby 
export RBENV_ROOT=$HOME/.rbenv 
export PATH=$RBENV_ROOT/bin:$PATH 
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi 

# git
git_branch() { 
  echo $(git branch --no-color 2>/dev/null | sed -ne "s/^\* \(.*\)$/\1/p") 
} 
export PS1='\[\033[0;33m\]\W/ \[\033[1;32m\]$(git_branch)\[\033[0m\] $ '

~/  $ . .bashrc
~/  $ env|grep PATH
 :
PATH=/home/sato1043/.rbenv/shims:/home/sato1043/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
 :

~/  $ rbenv
rbenv 0.4.0-98-g13a474c
Usage: rbenv <command> [<args>]
 :

~/  $ rbenv versions
* system (set by /home/sato1043/.rbenv/version)

~/  $ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]  （※aptの依存性で入ったruby）

~/  $ rbenv install 2.1.2
Downloading ruby-2.1.2.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/f22a6447811a81f3c808d1c2a5ce3b5f5f0955c68c9a749182feb425589e6635
Installing ruby-2.1.2...
Installed ruby-2.1.2 to /home/sato1043/.rbenv/versions/2.1.2

~/  $ rbenv versions
* system (set by /home/sato1043/.rbenv/version)
  2.1.2

~/  $ rbenv global 2.1.2

~/  $ rbenv versions
  system
* 2.1.2 (set by /home/sato1043/.rbenv/version)

~/  $ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

~/  $ gem install rbenv-rehash
 :
1 gem installed

~/  $ gem install bundler
 :
1 gem installed

```

now i cant use ruby 2.1.2 by rbenv.
混乱しないSCSS設計のメモ


```scss:style.scss
@import "compass";
@import "compass/reset";//normarizeよりreset派です

@import "setting";//変数のまとめ
@import "module";//@mixinと@extendのまとめ
@import "sprite";//retina対応スプライトmixinを多用する場合はこちらに
@import "base";//body,a,imgなど
@import "layout";//変更が少ないheader&footer(→コンパイル時間の短縮が出来る)

```
eclipseでヘッダファイルをインクルードしているのに型エラーが解決されない件

先日eclipseでC++のプログラム開発を行っていたら、ヘッダファイルをインクルードしているはずなのに型が定義されていないというようなエラーが出ました。
それについての原因と解決方法を私のブログにまとめました。↓
http://infotech776.blog.fc2.com/blog-entry-62.html
出ると割りと困るエラーなので共有いたします！
iOS7のUITextViewで文末にカーソルを移動する際のバグの回避方法

iOS7のUITextViewでカーソルを文末に移動するのに、以下のようにするとカーソルは文末に移動しますが、その後の動作がおかしくなる場合があります。

```objc:Objective-C
NSRange r = NSMakeRange(textView.text.length, 0);
textView.selectedRange = r;
[textView scrollRangeToVisible:r];
```
iOS7のUITextViewには文字の長さに関連したバグがあるようです。
これは以下のようにすることで回避できます。

```objc:Objective-C
UITextPosition *pos = textView.endOfDocument;
textView.selectedTextRange = [textView textRangeFromPosition:pos toPosition:pos];
CGRect caretRect = [textView caretRectForPosition:pos];
caretRect.size.height += textView.font.lineHeight;
[textView scrollRectToVisible:caretRect animated:NO];
```
ちなみにlineHeightを加算しているのは、最下行がキーボードの下に隠れるバグを回避するためです。また、animated:YESにすると、長文の場合に文末までスクロールしないことがあります。
sensu 0.13でハマったところ

seusuのバージョンが0.12→0.13になってハマったところ

## sensu-dashboardがパッケージから除外された
http://sensuapp.org/docs/0.13/install_a_dashboard
> Currently, it’s recommended that you use Uchiwa, as it works with the latest API changes.

公式ではuchiwaを推奨しているもよう。

```
# yum install uchiwa
# chkconfig --levels 345 uchiwa on
# service start uchiwa
```

uchiwaのLISTENポートは3000。

## OjがMultiJsonに変更に
handlerやextensionで`Oj`を使ってた部分を`MultiJson`に変更する必要あり？

* https://github.com/sensu/sensu-community-plugins/pull/689
* https://github.com/lusis/sensu_influxdb_handler/pull/5/files

下のinfluxdb_handlerでハマって、このプルリク分を適用したら正常に溜まり初めました。
Go言語: 自前の構造体をエラーとして返したい


次のことで困ったら自前でエラー型を定義して返すといい。

* `func DoSomething() (result String, err error, myError MyError, myError2 MyError2)` のように複数のエラーを返すコードになってインターフェイスがごちゃごちゃに…
* `errors.New` で作ったエラーではクライアントコードの細かなエラー処理が面倒…

## 自前のエラー型を作る上でのポイント

1. [errorインターフェイス]を実装した構造体を作る
2. クライアントコードはswitchでエラー処理を分岐

Goではerrorインターフェイスがあり、これを実装した型ならどんなものでも `error` として返すことできる。複数のエラー型を返したい場合、すべてのエラー型でこれを実装しておくと、関数のインターフェイスを `func DoSomething() (result String, err error)` とシンプルに保つことができる。一方のクライアントコードは `switch` で各エラー型ごとの処理を行うこともできる。なので、関数を提供する側、クライアントコードどちらの実装もシンプルになる。

## 例: HTTPレスポンスのステータスコードに応じて、ClientErrorとServerErrorを返す


```go
package main

import (
	"net/http"
	"io/ioutil"
	"fmt"
)
func main() {
	body, err := httpGet("http://www.mocky.io/v2/53dc17ab6ab0013e054ebdd8")

	if err != nil {
		switch err := err.(type) {
		case ClientError: fmt.Printf("client error: status code is %d and message is \"%s\"", err.Code, err.Message)
		case ServerError: fmt.Printf("server error: status code is %d", err.Code)
		default: fmt.Printf("other error: %s", err)
		}
	}
	
	println(string(body))
}

func httpGet(url string) (body []byte, err error) {
	resp, err := http.Get(url)

	if err != nil {
		return body, err
	}

	if 400 <= resp.StatusCode && resp.StatusCode <= 499 {
		message, _ := ioutil.ReadAll(resp.Body)
		return body, ClientError{resp.StatusCode, string(message)}
	}

	if 500 <= resp.StatusCode && resp.StatusCode <= 599 {
		return body, ServerError{resp.StatusCode}
	}

	body, err = ioutil.ReadAll(resp.Body)

	if err != nil {
		return body, err
	}

	return body, err
}

type ClientError struct {
	Code int
	Message string
}

func (err ClientError) Error() string {
	return fmt.Sprintf("Status code: %d, message: %s", err.Code, err.Message)
}

type ServerError struct {
	Code int
}

func (err ServerError) Error() string {
	return fmt.Sprintf("Status code: %d", err.Code)
}

```

参考: [Error handling and Go - The Go Blog](http://blog.golang.org/error-handling-and-go)

[errorインターフェイス]: http://golang.org/ref/spec#Errors
Githubで誤ってforkした場合の対処方法

メモ書き

Githubで他の人のプロジェクトを眺めいたら、知らないうちにforkしてしまっていた。
調べたら自分でブランチを作った場合と同じだった。
プロジェクトを削除する方法。

自分のアカウント配下で削除したいプロジェクトを選択。
画面右の「Settings」を押下。
画面最下部の「Delete this repository」を押下。
削除したいアカウント名/プロジェクト名を入力して「I understand ...」を押下。#アカウント名/プロジェクト名は画面上にボールド体で表示されていますね。
IntelliJ IDEAプラグイン -Shifter- 解説

## Shifterとは
　2つのキー（標準でCtrl+Alt+Shift+Period/Comma）を使い、文字列を様々な形式でシフトするプラグインです。ほとんどのJetBrains IDE製品に対応しています。
　この記事に記載されている機能は執筆現在の最新版であるv1.1.11のものです。IntelliJ IDEAのバージョンは13.1.14で動作確認しています。
[プラグインリポジトリ](http://plugins.jetbrains.com/plugin/6149?pr=idea)

## 記事内の表記について
　シフト前のbeforeとシフト後のafterを載せています。`┃`はカーソルの位置を表します、指定がない場合は全選択か選択なしです。

# 一般的なシフト
どの拡張子のファイルでも使える一般的なシフト機能です。

## 複数行指定でABC順で昇順/降順に並び替え
|before|after|
|---|---|
|slider<br>button<br>frame|button<br>frame<br>slider|

## 単一行のカンマで区切ったリストを昇順/降順に並び替え
|before|after|
|---|---|
|Banana, Apple, Cake|Apple, Banana, Cake|

## 単一行内を選択し、"と'、/と\を切り替え
|before|after|
|---|---|
|"A" 'B'|'A' "B"|
|/C/ \D\|\C\ /D/|

## 数値をインクリメント/デクリメント
|before|after|
|---|---|
|`┃`0|1|

## Unixタイムスタンプを1日ずつインクリメント/デクリメント
フォーマットしてバルーン表示するおまけ付き。

|before|after|
|---|---|
|`┃`1400556652<br>(※2014/05/20 12:30:52)|1400643052<br>(※2014/05/21 12:30:52)|

## PHP:ABC順に現在のドキュメント内で見つかった前/次の変数にシフト
PHP書けないのでサンプルコードはありません。シフト処理は次のやつと同じっぽい。

## ABC順に現在のドキュメント内で見つかった前/次の'か"で囲まれた値にシフト
|before|after|
|---|---|
|"`┃`Apple" "Cake" "Banana"|"Banana" "Cake" "Banana"|

## RGB値の~~メイド~~明度をインクリメント/デクリメント
|before|after|
|---|---|
|#`┃`00AA00|#01AB01|

## CSSの長さの値を1ずつインクリメント/デクリメント
em, in, px, pt, cmに対応。

|before|after|
|---|---|
|20`┃`px<br>1`┃`em|21px<br>2em|

## HTML特殊文字のエンコード/デコード
|before|after|
|---|---|
|<>|`&lt;&gt;`|

## 同じ文字からなる文字/文字列のASCIIコードを前/次にシフト
カーソルは隣接か文字列内ならどこでもいい。

|before|after|
|---|---|
|A|B|
|OOO|PPP|

## 数値で終わる文字列の数値部分をインクリメント/デクリメント
カーソルは隣接か文字列内ならどこでもいい。

|before|after|
|---|---|
|id776|id777|

# 拡張子別のシフト
　.cssファイルならbold/italicなどの切り替えなどが登録されています。
　Settings->Project Settings->Shifterで確認・編集ができます。
　数が多いのでここでは紹介しませんが、書式は簡単なので確認してみるといいでしょう。
タブとかスライドショーとかのコンテンツ切り替え用jQueryプラグイン


タブとかスライドショーを実装するのに毎回探したり、その場実装で作ったりしていました・・。

そろそろ楽するためにも「ちゃんと作っておこう！」と思い、標準的な機能を組み込んだプラグインを作りました！

GitHub: https://github.com/kamem/jquery.dataExtend

（jQuery.dataExtedの説明と合わせて同じリポジトリに入っています。）

[DEMO]
[DEMO]: http://github.develo.org/jquery.dataExtend


仕様
------
1. タブ移動のような単純な切り替え。
2. スライドショーの実装。
3. タブの位置をストレージに保存。
4. 基本的な表示切り替えはクラスを変えることにより実装しています。※表示中のコンテンツはonそれ以外のコンテンツはoffが付きます。  
（slideshow or opacityの場合は、クラス変更とは別にleftやopacityをjsで変更しています。）



使い方
------
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery.tab.js"></script>
    <script type="text/javascript">
	$(function(){
		 $('.tab').tab();
	});
	</script>

###  html ###
	<ul class="nav content_main">
		<li>nav1</li>
		<li>nav2</li>
		<li>nav3</li>
	</ul>
	<ul class="main_assist">
		<li class="prev">prev</li>
		<li class="next">next</li>
	</ul>
	<div class="main">
		<section>
			<h2><a href="#content1">1</a></h2>
		</section>
		<section>
			<h2><a href="#content2">2</a></h2>
		</section>
		<section>
			<h2><a href="#content3">3</a></h2>
		</section>
	</div>

* ナビゲーションとして使いたい部分をプラグインとして指定します。
* そのタグのクラスに付いている「content_main」「content_」の後の文字（例の場合main）クラスが付いているエリアの子要素がタブとして切り替わります。
* 「前」や「後ろ」に進む操作をしたい場合は「main_assist」のように「タブ移動したいコンテンツクラス_assist」というタグで囲った子要素に「prev」と「next」クラスをそれぞれ付けることが実装できます。

### 初期設定 ###

	timer: false,
	num: 0,
	isSessionStorage: false,
	type: 'normal',
	speed: 400,
	easing: 'linear',
	isRoop: false


* timer: {Number} タブの自動移動の感覚（setinterval）
* num: {Number} 初期位置
* isSessionStorage: {Boolean} ストレージに保存するか
* type: {String} 移動時の動きのタイプ (slideshow or opacity)
* speed: {Number} 移動速度
* easing: {String} イージングのタイプ [Easing/jQuery](http://semooh.jp/jquery/cont/doc/easing/)  
イージングが必要な場合には、イージングプラグインを別途読み込んでください。
* isRoop: {Boolean}「next」を押して次へ進んだ時に「最後から最初」の移動を戻るのではなくループするようにするか
jQuery でフォームの内容を JSON に serialize する


jQuery を使って CoffeeScript でフォームの内容を JSON に serialize してみました。

```coffee
$.fn.serializeJson = ->
  object = {}
  $.each(this.serializeArray(), ->
    object[this.name] = this.value
  )
  object
```

使い方

```coffee
$('form#some-form').serializeJson()
```

もっとよさげな方法があったらコメントで教えてください！
Running Kubernetes Example on CoreOS, Part 2

Running Kubernetes Example on CoreOS, Part 2
https://coreos.com/blog/running-kubernetes-example-on-CoreOS-part-2/
が出ましたので、お試ししてみました。

以下は、Vagrant で CoreOS の Kubernetes Cluster を VirtualBox 上に構築し、[GuestBook example](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/examples/guestbook/README.md) を実行する手順です。

コードは、Gist に置きましたので、参照してください。
Running Kubernetes Example on CoreOS, Part 2
https://gist.github.com/YungSang/6177b69f1754f0590dbe

## Step Zero: クラスタの構築

```
$ git clone https://gist.github.com/6177b69f1754f0590dbe.git
$ vagrant up
```

これで、etcd discovery 用に一つ、Kubernetes master 用に一つ、Kubernetes minion が２つ起動されます。

### SSH tunnel の設定

ローカルマシンから `kubecfg` を使う場合は、以下の設定をします。
`master` にログインしてから `kubecfg` を使っても同じです。

```
$ curl -OL http://storage.googleapis.com/kubernetes/darwin/kubecfg
$ chmod +x kubecfg
$ mv kubecfg /usr/local/bin
```

```
$ vagrant ssh-config master > ssh.config
$ ssh -f -nNT -L 8080:127.0.0.1:8080 -F ssh.config master
$ kubecfg list pods
Name                Image(s)            Host                Labels
----------          ----------          ----------          ----------

```

### コンテナ間のルーティングの設定

このままでは、VM をまたがったコンテナ間の通信が出来ていないので、静的にルーティングを追加することにしました。

```
$ vagrant ssh minion-1
core@minion-1 ~ $ sudo route add -net 10.244.2.0/24 enp0s8
core@minion-1 ~ $ sudo route add -net 10.244.2.0/24 gw 10.244.2.1 enp0s8
```

```
$ vagrant ssh minion-2
core@minion-2 ~ $ sudo route add -net 10.244.1.0/24 enp0s8
core@minion-2 ~ $ sudo route add -net 10.244.1.0/24 gw 10.244.1.1 enp0s8
```

## Step One: redis master の起動

```
$ kubecfg -c redis-master.json create pods
```

## Step Two: redis master service の設定

```
$ kubecfg -c redis-master-service.json create services
```

## Step Three: redis slave の起動

```
$ kubecfg -c redis-slave-controller.json create replicationControllers
```

## Step Four: redis slave service の設定

```
$ kubecfg -c redis-slave-service.json create services
```

## Step Five: frontend UI の起動

```
$ kubecfg -c frontend-controller.json create replicationControllers
```

```
$ open http://192.168.12.11:8000
$ open http://192.168.12.12:8000
```

これでどちらからアクセスしても Guestbook が動くようになりました。
openFrameworks for iOS でアンチエイリアス＆レティナ対応

openFrameworks for iOS を試し中ですが、デフォルトだとアンチエイリアスがかかっていなくてエッジが滑らかではありません。
アンチエイリアスをかけ、レティナに最適化する方法を見つけたので書いておきます。

## コード

``main.mm`` に以下の通り書き足します。
画面のサイズはiPhone、iPadの解像度に合わせてあげる必要があります。

```cpp:main.mm

#include "ofMain.h"
#include "ofApp.h"

int main(){
    
    // 以下の３行を追加
    ofAppiOSWindow *window = new ofAppiOSWindow();
    window->enableAntiAliasing(2);
    window->enableRetina();
    
    // 画面のサイズ640x960に (4inchのiPhone用)
    ofSetupOpenGL(640,960, OF_FULLSCREEN);

	ofRunApp(new ofApp);
}

```

## 結果

### before
![default.png](https://qiita-image-store.s3.amazonaws.com/0/27326/fa2c4884-6f18-15e8-9dcc-a39c11a27263.png)

### after
![retina+antiarias.png](https://qiita-image-store.s3.amazonaws.com/0/27326/e26782d0-049a-d0c1-83f0-d08f99c5f529.png)
ヨーダが「Size matters not」って言ってたけどデータがでかすぎてトレーニングが終わりません


3400万件の100文字程度の日本語のテキストを150万件のラベルに分類しようとしています。アドバイスください。

##どこまでやったか
1. EC2のc3.8xlargeを1台用意しました(ごついやつ)
2. 日本語をmecabで切り分けました
3. sk-learnでvectorizeしました(MAX_FEATURES=10000)
4. sk-learnでTruncatedSVDしました
5. sk-learnでnormarizeしました
6. ライブラリ外でCython使えるところはCythonで書きました(cdefを使える限り使いました)
7. RandomForestClassifierでn_jobs=32にしてfitしました(10コアまでしか認識しなかった)


##何ができないか
1. 上記の条件で48時間実行しましたがfit中にセグメンテーション違反でこけました
2. 同条件で試しにトレーニングデータを150万件に減らしたけど、それでも24時間以上かけて終わりませんでした
3. セグメンテーション違反の原因は未調査です(が、上記の実行時間等から、このやり方では使い物にならない気がしているので、抜本的にやり方を変える必要があるのではないかと思っています)

##何がしたいか

下記の前提を守りつつ学習と予測をできるようにしたいです


##前提
1. 縦3400万件、横100文字程度の日本語のテキストで、それぞれに正解のラベルがあるデータでトレーニングと予測をしようとしています
2. その道2週間の素人なので簡単な方法が望ましいです
3. 学習一発に3万円くらいならかけられます(場合によってはもうちょっとかけられるかも)
4. 100文字の日本語の内容は聞かないでください。名詞が多いです。
5. RandomForestにしたのは、sk-learnの分類器を10000件くらいのデータでかたっぱしから試したら精度が良かったからです
6. 最も成績が良く、かつ学習が速かった分類器はExtraTreesClassifierでしたが、Cythonにしたらセグメンテーションエラーを頻発し、原因を追い切れなかったので諦めました
7. 目標の学習時間は48時間、予測時間は1分です

##今考えてる選択肢(上の方が優先順位が高い)

1.spark+mlib+EC2+金
2.Mahout+hadoop+Elastic Map Reduce+金
chefで"ERROR: Your private key could not be loaded from"と注意された時の対処法

# 対処法
1. 秘密鍵をローカルレポジトリに配置

	<pre>
	$ cp -a ~/.ssh/id_rsa .chef/&ltuser_name&gt.pem
	</pre>

2. chefでローカルオプションを有効にする

	<pre>
	$ chef cookbook list -z
	</pre>

# 怒られる原因
1. <user_name>.pemを用意していなかった
	警告内容としてはknifeコマンドを打つ前に，.chefにclient keyを配置しなければいけないらしい．

2. chefサーバに問い合わせにいっていた
	ローカル環境でなく，まだ立てていないchefサーバに問い合わせに行ってしまっていた．
POH Lite 天才火消しエンジニア霧島 3.33秒

[3.33秒](http://qiita.com/rana_kualu/items/9c082ecb59cba0ba9bce) / [0.01秒](http://qiita.com/rana_kualu/items/23a0ef14db9e4eb44e45)

https://paiza.jp/poh/kirishima
> ※ 実際のプロジェクトではこの様には行きませんので、人員を増やす場合は慎重に検討する事をお勧めいたします。 

1万円の下請けってどんなところなんだろうか。
まあ典型的なナップザック問題なので、さっくり解いてしまいましょう。

```php
<?php
	// 入力をパース
	$input = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
		// 1行目は必要人数
		$ninzuu = (int)$input[0];
		// 2行目は会社数 使わない
		// $kaishasuu = (int)$input[1];
		// 3行目以降は人数+価格 最大50社しかない
		unset($input[0]);unset($input[1]);
		$list = array_map(function($a){
			// 0=>人数,1=>価格
			$t=explode(' ', $a, 2);
			return [(int)$t[0],(int)$t[1]];
		}, $input);
	
	// 動的計画法
	$data = [0=>0];
	foreach($list as $key1=>$val1){
		// 1社で越えている場合は0にだけ足せばいい
		if($val1[0]>=$ninzuu){
			if(isset($data[$val1[0]])){
				$data[$val1[0]] = min($data[$val1[0]], $val1[1]);
			}else{
				$data[$val1[0]] = $val1[1];
			}
			continue;
		}
		
		foreach($data as $key2=>$val2){
			// 既に人数を越えている場合は計算不要
			if($key2 >= $ninzuu){ continue; }
			
			// 対象人数の金額を登録
			$num = $key2+$val1[0];
			if(isset($data[$num])){
				// 既に値がある場合は安い方
				$data[$num] = min($data[$num], $val2+$val1[1]);
			}else{
				$data[$num] = $val2+$val1[1];
			}
		}
	}
	
	// 最低人数越えのキーのうち、最低金額のものを選択
	$minTotal = 250000000;
	foreach($data as $key=>$val){
		if($key >= $ninzuu && $val < $minTotal ){
			$minTotal = $val;
		}
	}
	print($minTotal . PHP_EOL);
```

普通に動的計画法を適用しただけです。
実に簡単ですね。
人数をキーにしたせいで動的計画法というより総当たりになってしまった気もしますがまあいいや。
さっそく実行。

https://twitter.com/rana_kualu/status/495214956573229056
http://paiza.jp/poh/kirishima/result/bebdc876df9e6cd24b4ee916a06eeea3

||||
|:------------|:-----|:------------|:---|
| Test case 1 | 通過 | 実行時間： 0.01 秒 |
| Test case 2 | 通過 | 実行時間： 0.01 秒 |
| Test case 3 | 通過 | 実行時間： 0.01 秒 |
| Test case 4 | 通過 | 実行時間： 0.01 秒 |
| Test case 5 | 通過 | 実行時間： 0.01 秒 |
| Test case 6 | 通過 | 実行時間： 0.27 秒 |
| Test case 7 | 通過 | 実行時間： 3.33 秒 |

あっさり合格しました。
めでたし。

まあ、実はここに辿り着くまでに2回も失敗しているのですが。

https://twitter.com/rana_kualu/status/494452573533773825
http://paiza.jp/poh/kirishima/result/4f809703f962fdb735dd00dd83943b22

最初、何も考えずに『単価の安い順に足していく』という頭の悪すぎる実装をやってしまいテスト5で失敗。
10人でいいプロジェクトに単価の安い100人を送り込まれてもねえ。

https://twitter.com/rana_kualu/status/494821947201421312
http://paiza.jp/poh/kirishima/result/a5ec246afdb9c754e44f003bae62ab97

まじめに考えてきちんと動的計画法を適用したのに何故かテスト7だけ失敗。
その日は何処にも間違う要素無いだろうがーなんでだーと延々悩んで結局答えが出なかったのですが、翌日見直してみたら
	`$minTotal = 5000000;`
とか書いてあって即死。
いやあこれは酷い。

さてこのアルゴリズム、テスト7では3秒以上かかっていますが、PHPで既に0.01秒というおかしな値が達成されています。
いったい果たしてどんな書き方がなされているのでしょうか。
必要なグリフだけを残してフォントの容量を削減

日本語フォントは容量が大きいので、スマートフォンアプリやウェブアプリではあまり気軽に使用することができません。
そこで、一部の文字だけを抽出したフォントを作成して、容量を削減します。

##FontForge
FontForgeはGUIでフォントを編集できるクロスプラットフォームのツールです。
当然、選択した文字（グリフ）を削除する機能もあります。しかし、さすがに手作業でやるのは面倒くさい。

そこで、FontForgeのスクリプト機能を使用します。
http://fontforge.org/ja/scripting.html
なんと！日本語化されたドキュメントがあります！

##使用する文字の準備
まず、使用する文字を列挙したファイルを作成します。今回は`used_letters.txt`というファイル名でUTF-8にして保存しました。

さっそくFontForgeスクリプトを実行したいところですが、FontForgeスクリプトの機能は貧弱です。UTF-8のデコードができません。

そこで、簡単なスクリプトを書いてFontForgeスクリプト自身を生成します。

```rb:
#conding: utf-8
$stdout = File.open("./select_used.pe", "w")

print "codepoints = "
p File.read("used_letters.txt", encoding:"utf-8").codepoints
print <<EOM
i = 0
len = SizeOf(codepoints)
while (i < len)
	SelectMore(codepoints[i], codepoints[i])
	++i
endloop
EOM
```

以下のようなスクリプトが生成されます。

```
codepoints = [10, 9, 34, 75, 111, 114, 101, 97, 110, 3]
i = 0
len = SizeOf(codepoints)
while (i < len)
	SelectMore(codepoints[i], codepoints[i]) // グリフを追加選択
	++i
endloop
SelectInvert() // 選択範囲を反転
Clear() // 選択中のグリフを削除
```

##結果
私のプロジェクトでは、20MBあったフォントを120KB程度まで削減することができました。
Bootstrap Lightboxの代わりにLightbox-for-Bootstrap


Bootstrap Lightboxが自分のアプリ上だと上手く動かせなかった(topポジションが意味わからない値になってたり、hideクラスもつけるべきなのかつけるべきじゃないのかわからんかった...)ので、Lightbox-for-Bootstrapを使ってみた。
こっちは問題なく動く。

自分は以下の組み合わせでうまく動かせず。問題の切り分けはしていないので、自分の使い方が間違っていただけなのかは不明。
Bootstrapバージョン: 3.1.1
Bootstrap Lightbox: 0.6.1


Bootstrap Lightbox
http://www.jasonbutz.info/bootstrap-lightbox/

Lightbox for Bootstrap
https://github.com/djinteractive/Lightbox-for-Bootstrap
pluckメソッドがArrayのArrayではなくHashのArrayを返せるようにする


## 通好みのメソッド`pluck`

Railsでアプリケーションを組むと、ActiveRecordのインスタンス生成コストが勿体ないな、と感じることが多いと思います。

そんな時の強い味方が`pluck`メソッドで、愛用される方も多いと思います。

Rails4からは複数のカラムも指定できて、使い勝手が向上しました。
複数カラムを指定すると、値がArrayのArrayで返って来ます。

例を示すと、例えばこんなデータがあるとすると

* employees

| id | name   |    created_at     |
|:--:|:------:|:-----------------:|
|1   | Taro   |2014-08-01 01:00:05|
|2   | Jiro   |2014-08-01 02:00:06|
|3   | Saburo |2014-08-01 03:00:07|

```ruby
Emplyee.pluck :id, :name
=> [[1, "Taro"],
 [2, "Jiro"],
 [3, "Saburo"]]
```

のように返ります。
これはこれで良いのですが、この結果をJSONで返したい時等は、できればHashのArray、つまり

```ruby
Emplyee.hash_pluck :id, :name
=> [{:id=>1, :name=>"Taro"},
 {:id=>2, :name=>"Jiro"},
 {:id=>3, :name=>"Saburo"}]
```

のように返って欲しいです。
これを実現できるように、`pluck`メソッドに手を入れました。

ついでに、tableの物理column名と論理column名が異なることもあるだろうと、key名も指定できるようにしています。

## 前提条件

Rails4.1で動作を確認しました。

## できあがったものがこちら

コードの細かい説明は省きます。短時間で書いた、と言い訳を先にしておきます。

```ruby
module ActiveRecord::Calculations
  def pluck_with_keys *column_names
    unless (options = column_names.pop).is_a? Hash
      return pluck_without_keys *(column_names << options)
    end
    _pluck = pluck_without_keys *column_names
    case keys = options[:keys]
    when TrueClass
      _pluck.map{|obj| Hash[*column_names.zip(obj).flatten]}
    when Array
      _pluck.map{|obj| Hash[*keys.zip(obj).flatten]}
    else
      _pluck
    end
  end
  alias_method_chain :pluck, :keys
end
```

これを`RAILS_ROOT/lib/extensions/calculations.rb`等に保存して、`RAILS_ROOT/lib`をautoload_pathに追加した上でinitializer辺りでこのファイルを`require`します。

## 使ってみる

既存のシステムにも適用し易いように、元の`pluck`メソッドの挙動になるべく影響無いようにしています。

元々`pluck`は可変長引数を取りますが、最後の引数がオリジナルの`pluck`が取らないHashが来たら動きが変わります。

最後の引数に`keys: true`とすると、指定したcolumn名をkeyにしてHashが帰り、`keys: [:employee_id, :employee_name]`のようにkey名の配列を渡すと、そのように良い感じにしてくれます。

実際の動作はこのような感じです。

```ruby
Employee.pluck :id, :name
=> [[1, "Taro"],
 [2, "Jiro"],
 [3, "Saburo"]]

Employee.pluck :id, :name, keys: true
=> [{:id=>1, :name=>"Taro"},
 {:id=>2, :name=>"Jiro"},
 {:id=>3, :name=>"Saburo"}]

Employee.pluck :id, :name, keys: [:employee_id, :employee_name] 
=> [{:employee_id =>1, :employee_name=>"Taro"},
 {:employee_id =>2, :employee_name=>"Jiro"},
 {:employee_id =>3, :employee_name=>"Saburo"}]
```

key名が足りないと、あるものしか返しません。

```ruby
Employee.pluck :id, :name, keys: [:employee_id] 
=> [{:employee_id =>1},
 {:employee_id =>2},
 {:employee_id =>3}]
```

狙った通りに出来ました。

gemにしようかな。
VM上のDockerコンテナに固定ipを割り振ってホスト側から接続出来るようにする

**確認環境**

```
HOST: Mac OSX 10.9
Docker HOST: ubuntu 14.0.4
```

**VirtualBoxにホストオンリーネットワークアダプターを追加(Mac側)**

```
$ ADAPTER=$(VBoxManage hostonlyif create | egrep -o "vboxnet[0-9]+")
$ VBoxManage hostonlyif ipconfig $ADAPTER --ip 192.168.56.1 --netmask 255.255.255.0
$ VBoxManage dhcpserver add --ifname $ADAPTER --ip 192.168.56.100 --netmask 255.255.255.0 --lowerip 192.168.56.101 --upperip 192.168.56.254
$ VBoxManage dhcpserver modify --ifname $ADAPTER --enable
```

**vagrantでdockerの動くubuntuを用意(Mac側)**

```
$ vagrant box add ubuntu-14.04-amd64-vbox https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box

$ mkdir ubuntu-docker
$ cd ubuntu-docker
$ vagrant init ubuntu-14.04-amd64-vbox

$ sed -i "" -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.56.254"/g' ./Vagrantfile
```

**ブリッジネットワークの設定(ubuntu側)**

```
$ vagrant up
$ vagrant ssh
$ sudo su
$ apt-get install -y bridge-utils arping
$ curl -sSL https://get.docker.io/ubuntu/ | sudo sh
$ sed -i -e '$d' /etc/rc.local
$ echo "/sbin/brctl addbr docker1" >>  /etc/rc.local
$ echo "/sbin/ip addr add 192.168.0.1/24 dev docker1" >> /etc/rc.local
$ echo "/sbin/ifconfig docker1 up" >> /etc/rc.local
$ echo "/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE" >> /etc/rc.local
$ echo "exit 0" >> /etc/rc.local
```

**pipeworkのインストール(ubuntu側)**

```
$ cd /usr/local/bin
$ wget https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework
$ chmod +x pipework
```

**設定を反映するためにリブートする(Mac側)**

```
$ vagrant reload
```

**ルーティングを設定*(Mac側)**

```
$ sudo route add -net 192.168.0.0/24 192.168.56.254
```

**ssh-serverが動作するイメージを用意する(ubuntu側)**

```
$ docker pull sylvainlasnier/ssh
```

**コンテナ起動(ubuntu側)**

```
$ CID=$(docker run -d sylvainlasnier/ssh)
```

**コンテナにipを割り振る(ubuntu側)**

```
$ pipework docker1 $CID 192.168.0.2/24@192.168.0.1
```

**sshログインしてみる(Mac側)**

```
$ ssh root@192.168.0.2
```

### ホスト側からDockerを操作出来るようにする

**Dockerの起動オプションを変更(ubuntu側)**

```
$ sed -i -e 's/DOCKER_OPTS=/DOCKER_OPTS="-H=tcp:\/\/0.0.0.0:4243"/g' /etc/init/docker.conf
$ service docker restart

```

**zshenv等に下記を追加**

```
export DOCKER_HOST=tcp://192.168.56.254:4243
```

boot2dockerみたいにMac側からdockerを操作出来るようになる
GCC最適化制御パラメータ

gcc --help=params
gcc --param name=value
https://github.com/mirrors/gcc/blob/gcc-4_6-branch/gcc/params.def
https://github.com/mirrors/gcc/blob/gcc-4_7-branch/gcc/params.def
https://github.com/mirrors/gcc/blob/gcc-4_8-branch/gcc/params.def
https://github.com/mirrors/gcc/blob/gcc-4_9-branch/gcc/params.def
https://github.com/gcc-mirror/gcc/blob/gcc-5-branch/gcc/params.def
https://github.com/mirrors/gcc/blob/master/gcc/params.def

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
> `--param name=value`
> In some places, GCC uses various constants to control the amount of optimization that is done. For example, GCC does not inline functions that contain more than a certain number of instructions. You can control some of these constants on the command line using the `--param` option.
>
> The names of specific parameters, and the meaning of the values, are tied to the internals of the compiler, and are subject to change without notice in future releases. 
>
> ...
Qiitaのある記事以降のストック数を計算するページつくってみた

Qiitaのストック数を報告するのに計算が面倒になってきた+ちょっと勉強しようと思ったので作ってみた！！！のです！！！

# こんなページです :smirk_cat: 

+ http://bl.ocks.org/71713/raw/4a8b5515afde2c278e32/
 + ボタンをポチッとしてください。（早すぎるとデータ読み込み前かも）
+ ![ss 2014-08-01 21.19.49.png](https://qiita-image-store.s3.amazonaws.com/0/19712/37c23d58-39f9-4510-2c8f-ecfb009ed6c9.png)

# 自分も使ってみたい方向け説明

+ ソースはここです： https://gist.github.com/71713/4a8b5515afde2c278e32
 + https://gist.github.com/71713/4a8b5515afde2c278e32#file-index-html-L10 どの記事以降の基準となる記事のidを入れて下さい（記事のidはAPI叩いてみました）
 + https://gist.github.com/71713/4a8b5515afde2c278e32#file-index-html-L11 自分のQiitaのアカウント名を入れて下さい
 + どこかに置いて（ローカルでもいいですが）「Make Graph」をぽちっとするだけ！

# やりたかったこと

## QiitaのAPI叩いてみたかった

 + ココです！ http://qiita.com/docs/api
 + 記事のidも「特定ユーザーの投稿取得」をたたけばわかります！
 + 蛇足：JSON見るときは**JSONView**オススメです。

## APIの結果をGoogleChartに流し込んでみたかった

 + これです！ https://developers.google.com/chart/?hl=ja
 + GoogleCart自体は以前からちょいちょい使っていたのですが、APIを叩いた結果をぐりぐりしてみたかったのでやってみました。（後述の通り諦めた部分がありますが :cry: ）

## Gist使ってみたかった

 + Githubは仕事で使う機会があったのですが、こっちはなかなかないなーと思って、せっかく１ページにおさめたので置いてみました

## bl.ocks.org使ってみたかった

 + こちらを見かけてこれだー！！と思ったので。:triumph: >> http://qiita.com/hnakamur/items/ad1346bc9cfb0288ff60

# 出来なかったこと

+ 見て分かる通り、ボタンを押す必要がある状態になりました :scream: 
 + API叩いた結果をGoogleChartに流して表示するをうまく制御出来ずでしたが眠いので諦めます。。
+ 記事のidを基準にしています :pensive: 
 + 本当はちゃんと汎用的に2014/04以降の記事、と書きたかったのですが、日付操作は今日はやる気起きませんでした :expressionless:
+ ソースの中身にidとか埋め込んでしまった
 + 最初のボタンになっているのと同様でうまく「データを取ってくる」と「グラフ描く」を制御出来なかったのでこちらも諦めました

こうすればいい感じに出来るよ、とかあれば教えてください :persevere:
certificate verify failed (Faraday::SSLError)

## 原因

Berkshelf とかで SSL に接続できない場合に発生。

Windows の Chef Client(に組み込まれている Ruby)に 
Berkshelf をインストールしたときにおきた。

* curlなど で使う CA用証明書がない
* 証明書があっても SSL_CERT_FILE が参照できていない

## 対策

### SSL_CERT_FILE に証明書のパスを指定する。

```bash
$ export SSL_CERT_FILE=/usr/lib/ruby/1.9.1/rubygems/ssl_certs/ca_bundle.pem
```

### 存在しない場合は、以下からダウンロード。

```bash
$ curl -O http://curl.haxx.se/ca/cacert.pem
$ mkdir /etc/certs/cacert.pem
$ export SSL_CERT_FILE=/etc/certs/cacert.pem
```

###　上記でうまくいかない場合

(2015/1/10 追記)

https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt
をダウンロードし任意のフォルダに保存

コントロール パネル\システムとセキュリティ\システム → システムの詳細設定 → 環境変数

変数名：　SSL_CERT_FILE
変数値： D:\work\chef-repo\curl-ca-bundle.crt

http://curl.haxx.se/docs/caextract.html RSA-1024 removed を参照


## 参照

http://stackoverflow.com/questions/4528101/ssl-connect-returned-1-errno-0-state-sslv3-read-server-certificate-b-certificat
RuboCop | Style/TrailingComma

# RuboCop | Style/TrailingComma

## 概要

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

配列やハッシュの末尾のカンマの有無をチェックします。
デフォルトではカンマがあると警告が出ます。

しかし、コピペやコード生成のことを考えると最後の行にも
カンマがある方が便利だったりするので用途や考え方によって
設定値を変更すると良さそうです。

## TrailingComma

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|EnforcedStyle|comma|最後の要素にカンマを必要とする|--|
|EnforcedStyle|no_comma|最後の要素にカンマを必要としない|○|

### 検証プログラム

~~~ruby:trailing_comma.rb
print [
  1,
  2,
  3,
]
h1 = {
  key1: :value1,
  key2: :value2,
}
print h1
print [
  1,
  2,
  3
]
h2 = {
  key1: :value1,
  key2: :value2
}
print h2
~~~

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

~~~yaml:.rubocop.yml
TrailingComma:
  EnforcedStyleForMultiline: no_comma
~~~

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

Offenses:

trailing_comma.rb:4:4: C: Avoid comma after the last item of an array.
  3,
   ^
trailing_comma.rb:8:16: C: Avoid comma after the last item of a hash.
  key2: :value2,
               ^

1 file inspected, 2 offenses detected
~~~

### 実行結果 final_blank_line に設定した場合

~~~yaml:.rubocop.yml
TrailingComma:
  EnforcedStyleForMultiline: comma
~~~

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

Offenses:

trailing_comma.rb:14:3: C: Put a comma after the last item of a multiline array.
  3
  ^
trailing_comma.rb:18:3: C: Put a comma after the last item of a multiline hash.
  key2: :value2
  ^^^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/trailing_comma.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/trailing_comma_spec.rb

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
初めてのRuby on rails ~予約投稿機能を実装してみた！~

あるWebサービスの一機能として、指定したコンテンツの予約投稿機能のようなものを作成したので、そのやり方とそこで学んだことを記していきます。

まずはテーブルを作成します。
必要なデータはpost_date(投稿したい日時), content_id(コンテンツID), content_title(コンテンツ), content_bobyです。他にもいろいろあるかと思いますが、ひとまずこれで。


`rails generate model willpost post_date:date content_id:string content_title:integer contet_body:integer `

まずは、モデルから

```ruby:willpost.rb
class willpost < ActiveRecord::Base
  belongs_to :User
  attr_accessible :post_date :content_id, :content_title, :content_boby

  scope :willpost, -> { where('post_date >= ?', Date.today) }

  class << self
    def willpost_content
  	  contents = content.willpost
    end
  end
end
```

投稿したいコンテンツの日付けがDate.todayと一致したらそのコンテンツのデータを取ってくるようにします。

contensの値をContorollerに渡して、Viewで表示したらDoneです！
bashでシングルクォートをエスケープする方法

例えば、abc'deのような文字列をechoしたい場合、
#ダメな例
```
$ echo 'adb\'de'
>
```

#OKな例
```
$ echo 'abc'\''de'
abc'de
```

'abc'で一回文字列を終了し、\'でエスケープします。
その後、'de'で文字列を再開します。
staticではないメソッドをis_callableに渡した時のバージョンによる違い

PHP5.4ではstaticではないメソッドを
is_callable("クラス名::メソッド名")でチェックしてもtrueとなりますが、
PHP5.2ではfalseとなります。

**PHP5.4**

```php
php > class Foo { function test() { echo 1; } static function static_test() { echo 2; } function is_callable($name) { return is_callable($name);} }
php > $f = new Foo;
php > echo $f->is_callable("test");
php > echo $f->is_callable("Foo::test");
1
php > echo $f->is_callable("Foo::static_test");
1
php > call_user_func_array("Foo::test", array());
1
php > call_user_func_array("Foo::static_test", array());
2
```

**PHP5.2**

```php
php > class Foo { function test() { echo 1; } static function static_test() { echo 2; } function is_callable($name) { return is_callable($name);} }
php > $f = new Foo;
php > echo $f->is_callable("test");
php > echo $f->is_callable("Foo::test");
php > echo $f->is_callable("Foo::static_test");
1
php > call_user_func_array("Foo::test", array());
PHP Warning:  call_user_func_array(): First argument is expected to be a valid callback, 'Foo::test' was given in php shell code on line 1

Warning: call_user_func_array(): First argument is expected to be a valid callback, 'Foo::test' was given in php shell code on line 1
php > call_user_func_array("Foo::static_test", array());
2
```
複数の計算機をひとつのものとして扱う

本日は趣向を変えて複数の計算機を透過的にひとつのものとして使う話です。以前に[データ分析用の計算機環境を用意する](http://qiita.com/ynakayama/items/d5eb82718d10a496c2ab)話をしましたが、その続きというか補足です。

## 手元の計算機で開発する問題点

人によっては手元のノート PC の性能にこだわり、ローカルで開発をしたりする人がいるようですが、この場合いくつかの問題があります。

* いくら性能の高い計算機を買おうとも、その性能には上限がある
* 長時間かかるジョブを実行した場合、終了するまでノートを閉じて持ち運んだりできない
* 複数の拠点で開発する場合、重いノートを持ち歩かなければならない
* 手元の計算機に障害が発生するとすぐに開発の継続が困難になる

### ソリューション

これに対し、遠隔に設置したものも含む複数の計算機によるクラスタで開発をする場合、さまざまなメリットがあります。

* [スケールアウト](http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3)することができる
* 長時間かかるジョブを実行し、そのまま接続を切り離せる
* 複数の拠点で開発する場合でも、接続するための機器さえあれば同一環境で開発をできる
* 計算機のどれか一台に障害が発生しても影響は小さくて済む

# 計算機の統合

GNU/Linux を中心とした環境ではいくつかの方法で開発環境を透過的にひとまとめにできます。

## sshfs

ファイルシステムを統合する最強の手段が [sshfs](http://fuse.sourceforge.net/sshfs.html) です。この手のソリューションは昔から多く有り他にも [NFS](http://ja.wikipedia.org/wiki/Network_File_System) などがありますが、既存の認証の仕組みを利用し手軽かつ安定した接続を維持できるのは sshfs かと思います。

### 基本的な接続方法

たとえば手元の local から遠隔の remote という計算機のルートディレクトリを統合する場合はこうなります。 [rsync](http://ja.wikipedia.org/wiki/Rsync) でファイルを転送するときと一緒なのでわかりやすいかと思います。

```bash
sshfs your_name@remote:/ ~/mnt/remote_dir
```

こうすると ~/mnt/remote_dir の下に remote のルートディレクトリがマウントされます。

この仕組みを利用して、複数の計算機のホームディレクトリをひとつのディレクトリの下にまとめることができます。シェルスクリプトなどを用意して、接続の可否確認と接続をひとまとめに自動実行できるようにしておくと良いでしょう。

もちろん権限や認証情報は ssh で接続したその情報がそのまま適用されます。

## ssh ポートフォワーディング

ssh ポートフォワーディングは離れた計算機のポートを転送する機能です。これを利用すれば、例えば遠隔の計算機で実行している本来ローカルホストからしかアクセスできないテストサーバーのサービスを、あたかも手元の計算機で実行しているかのようにアクセスすることができたりします。

手元を local 、遠隔を remote という名前だとするとこうなります。

```bash
ssh -L9999:remote:9999 your_name@remote
```

上の例では、遠隔の 9999 番ポートの内容に対し localhost:9999 でアクセスできるようになります。

### ssh ポートフォワーディングを利用した接続例

たとえばデスクトップ環境の無いヘッドレスなサーバーが稼働していたとします。このサーバー上で一時的にデスクトップでの対話操作が必須なプログラムを動かしたくなったとします。

#### X を用意する

X を提供する環境と、最小限のウィンドウマネージャー、それに VNC サーバーだけを用意しておきます。

```bash
sudo apt-get install xvfb fluxbox x11vnc
```

#### X を起動する

```bash
# 適当なディスプレイ番号を予め設定しておく
export DISPLAY=:99
# X の起動
sudo Xvfb $DISPLAY -screen 0 1024x768x24 2>&1 >> $TMP/xvfb.log &
# ウィンドウマネージャーの起動
fluxbox 2>&1 >> $TMP/window-manager.log &
# VNC サーバーの起動
x11vnc -display $DISPLAY -loop -bg -nopw -listen localhost -xkb 2>&1 >> $TMP/vnc.log &
```

この状態で前述した ssh ポートフォワーディングにより 5900 番を転送します。クライアントで VNC を起動して localhost:5900 に接続すれば fluxbox な GUI が起動しますので、あとは目的のプログラムを起動すれば良いです。

```bash
# VNC クライアントの起動
xtightvncviewer localhost &
```

## rsync

rsync はネットワーク経由であろうがなかろうが透過的にファイルを転送することができます。これは多くの人がご存知でしょうし、[マニュアル](http://www.linuxmanpages.com/man1/rsync.1.php)を読むのが早いでしょう。

## TRAMP + Emacs

[TRAMP](http://tramp.sourceforge.net/tramp_ja.html) はリモートファイルの編集機能を提供するしかけです。これを Emacs から利用できることで、 Emacs でリモートのファイルも編集できるようになります。

TRAMP を使ってリモートのファイルを弄る 
http://qiita.com/miyakou1982/items/d05e1ce07ad632c94720

Emacs からファイルをオープンする時に C-x C-f して次のようにするとリモートファイルをオープンできます。

```el
/ssh:your_name@remote:/home/your_name/
```

## まとめ

自分の手元以外にある計算機をどのように透過的に利用すれば良いか、方法を色々と説明しました。

ssh プロキシーを利用した多段認証を簡略化する方法については[こちら](http://qiita.com/ynakayama/items/92fa443fe5926e17d8dc)をご覧ください。
DB2のパフォーマンスチューニング

## パフォーマンスチューニング

IBMのマニュアルで解説されているのに気付いた...
「パフォーマンスの調整」がパフォーマンスチューニングとか気付かないし...

* [DB2 for Linux UNIX and Windows 9.7.0>データベースの基本>パフォーマンスの調整](http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.perf.doc/doc/c0005414.html?cp=SSEPGG_9.7.0%2F2-3&lang=ja)
* [DB2 for Linux UNIX and Windows 9.7.0>データベースの基本>パフォーマンスの調整>パフォーマンスに影響を及ぼす要因>アプリケーション設計](http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.perf.doc/doc/c0054922.html?lang=ja)
Mavericksにアップデートしたら(?)rbenvが消えてた


正確には消えてはいなかったっぽいです。
以下で直りました。

```
$brew unlink rbenv
$brew link rbenv
```

Mavericksにしてからいろんなものが動かなくなってしまった...
うかつにアップデートするんじゃなかった...

参考URL
http://satorumpen.blogspot.jp/2014/03/os-x-mavericks-brew.html
Cocoapodsで.pchや.pcmのエラー時の対処法


Xcode6 beta4 を使っていてハマったのでメモ。

`fatal error... .pch/.pcm' was built` というエラーが発生し、Podsフォルダや.xcworkspaceを消して入れなおしても、OrganizerパネルからDerived Dataの削除やCleanを実行しても解決しない...。

# 対処法

```
trash /Users/YourUserName/Library/Developer/Xcode/DerivedData/ModuleCache/*
```

この後、Cleanを実行して解決しました。

rmコマンドでもいいかもしれないけど、使うたびにヒヤヒヤするので`brew install trash`で入れたtrashコマンドを使用してゴミ箱に送ります。

## 参考
http://stackoverflow.com/questions/18995793/accidentally-modified-an-ios-sdk-header-file-now-i-cannot-compile-in-simulator
テキストフレームの配列をX座標でソートしてみる

```javascript:
//オブジェクトのソートサンプル
//①複数のテキストフレームを選択
//②①のテキストフレームを配列に入れる
//③配列内でのテキストフレームの順番をX座標順にソートする

//ソート用の関数X座標昇順に並べる
function mySort(a,b) {
	return(a.visibleBounds[1]-b.visibleBounds[1]);
}

//ドキュメント
myDoc = app.activeDocument;
var myObj = new Array();
myObj = myDoc.selection;
myObj.sort(mySort);
```
DB2でのデッドロック

## データベースのデッドロックの原因

[データベースのデッドロック - モノノフ日記](http://mononofu.hatenablog.com/entry/20071128/1196212796)によると

> デッドロックには以下の３種類があります。
> 1. サイクルデッドロック
> 2. 変換デッドロック
> 3. テーブルスキャンデッドロック

_1._は分かる。（参考：[DB2 Deadlock デッドロックの公式見解](http://ugya.tripod.com/deadlock/locking.htm)）
_3._なんかはロックエスカレーションによって予期しないデッドロックが発生する可能性があってやだ。

[DB2 Deadlock アクセスプラン解析とインデックス作成](http://ugya.tripod.com/deadlock/accessplan.htm)から引用
> インデックススキャンがテーブルスキャンに変わることによって行ロックが表全体のロックにかわり結果的にデッドロックが発生する確率が増加してしまう。

[DB2 Deadlock デッドロック対策の検討](http://ugya.tripod.com/deadlock/solution.htm)
> 外部キー(Foreign Key)
    表Aに表Bへの外部キーが定義してある場合
    表Aへの行のinsertは表Bのロックも発生する。

## ロックエスカレーション

[DB2 Deadlock ロックのエスカレーションとデッドロックの関連](http://ugya.tripod.com/deadlock/escalation.htm)

DB2だとdb2diagでログを日時範囲を指定して調べれば、ロックエスカレーション起きたか分かる。

### 実行例

```
$ db2diag -time 2014-07-30-15:2014-07-30-16
$ db2diag -level error -time 2014-07-31
```

## DB2でのアクセスプラン解析

DB2だとDataStudio使った方が良い。
VisualExplainが分かり易い。

## 参考

[DB2とデッドロック](http://ugya.tripod.com/deadlock/)
Oracle tnsnames.ora の書き方

Oracleの`tnsnames.ora`の書き方で、いつもつまずく。

```
ERROR:
ORA-12514: TNS:
リスナーは接続記述子でリクエストされたサービスを現在認識していません
```

ローカル開発環境とサーバ開発環境が同じ`SID``(SERVICE NAME)`なので、TNS名によって接続先のDBを切り替えたい場合、何の違いであるかは不明であるが、`SID` 指定で接続できる場合と `SERVICE_NAME` 指定で接続できる場合があるようだ。今後理由を調査予定。

```tnsnames.ora
# ローカル開発環境
ORADB_LOCAL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oradb)
    )
  )

# サーバ開発環境
ORADB_SERVER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = oradb)
    )
  )
# ORA-12514エラーになる記述
#ORADB_SERVER =
#  (DESCRIPTION =
#    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
#    (CONNECT_DATA =
#      (SERVER = DEDICATED)
#      (SERVICE_NAME= oradb) ##ここを SID = にする
#    )
#  )
```
そもそも、私が `SID` と `SERVICE NAME` の違いを正確に認識していないことが問題なのであるが…。
Rocketeerを使ってみる


######やること

PHPのデプロイツールのRocketeerを用いて環境 AからGitHubにおいてあるアプリケーションを、リモートの環境 Bにデプロイする。

######試した環境

CentOS 6.5

PHP 5.4

※ 以降、環境 Aで作業を行う

######composerのインストール

```
 # curl -sS https://getcomposer.org/installer | php -d detect_unicode=Off
 # mv composer.phar /usr/local/bin/composer
```
 

 - http://tech.basicinc.jp/php/2013/08/18/php_composer/



######Rocketeerのインストール 

```
# cd /{project-folder}
# composer require anahkiasen/rocketeer:dev-master
 // default設定でEnterを押してく
```

 - http://atijusts.hatenablog.com/entry/2014/01/18/175531


######Rocketeerの設定

```
# cd /{project-folder}
# cd .rocketeer
# vi scm.php
 // GitHubのrepository, username, password等をUPDATE
# vi config.php
 // 環境 Bのhost, username, password等をUPDATE
# vi remote.php
 // 環境 Bのroot_directory, files等をUPDATE
```

######Rocketeerでデプロイ

```
# cd /{project-folder}
# ./vendor/bin/rocketeer deploy
```

######デプロイ結果の確認

```
# cd /{project-folder}
# cd .rocketeer/logs
# less production--yyyyMMdd.log
```
NetworkManager を使っているときに WPA2-EAP (WPA2 Enterprise) とかのアクセスポイントに上手く接続できない

解決策: gnome-keyring をインストールする

参照: https://wiki.archlinux.org/index.php/NetworkManager_(%E6%97%A5%E6%9C%AC%E8%AA%9E)
grunt-contrib-less で sourceMap

grunt-contrib-less で sourceMap を生成してみる。

- ドキュメントルートは html
- lessファイルは /assets/less に保存
- cssファイルは /assets/css に保存
- マップファイルは /assets/css/map.json に保存


````javascript
grunt.initConfig({

    less: {
        dev: {
            options: {
                sourceMap: true,
                sourceMapFilename: "html/assets/css/map.json",
                sourceMapURL: "/assets/css/map.json",
                sourceMapBasepath: "html",
                sourceMapRootpath: "/"
            },
            files: [
                {
                    expand: true,
                    cwd: "html/assets/less",
                    src: ["*.less"],
                    dest: "html/assets/css",
                    ext: ".css"
                }
            ]
        }
    },

    watch: {
       less: {
            files: ["./html/assets/less/**/*.less"],
            tasks: ["less:dev"]
        }
    },

    connect: {
        dev: {
            options: {
                base: "./html/",
                keepalive: false,
                port: 8080
            }
        }
    }

});

grunt.registerTask("dev", ["connect:dev", "watch:less"]);
````

**localhost:8080** で確認すると、
開発者ツールで less ファイルを辿れるようになります。

sourceMapFilename を省略すると css ファイルに直接ソースマップが埋め込まれます。

オプションの名前が sourceMapFilename であって sourceMapFileName ではないのが、
個人的にはちょっと気持ち悪くもあり。
qmail + vpopmail の環境を別サーバーに移行する


qmail + vpopmail で動いてるサーバーをリプレースする事になったのでその備忘録

## 新サーバーの構築

qmail と vpopmail をインストールする

## 新サーバーへデータを移行

念のためqmailを落とした状態で以下の作業を行う

*新環境に旧環境の　/var/qmail/control 内をコピー
*新環境に旧環境の　/var/qmail/users 内をコピー
*新環境に旧環境の　/home/vpopmail/domains 内をコピー

`/var/qmail/users`の中にvirtualdomain関係の設定が保存されてるみたいです。
SSHd on Cygwin

### Worklog

run cygwin(mintty) as **Administrator**

```bash
$ ssh-host-config -y

...

*** Query: Please enter the password for user 'cyg_server': ********
*** Query: Reenter: ********
```

```bash
$ net start sshd
```

### Outpus

```bash
~$ ssh-host-config -y

*** Query: Overwrite existing /etc/ssh_config file? (yes/no) yes
*** Info: Creating default /etc/ssh_config file
*** Query: Overwrite existing /etc/sshd_config file? (yes/no) yes
*** Info: Creating default /etc/sshd_config file
*** Info: Privilege separation is set to yes by default since OpenSSH 3.3.
*** Info: However, this requires a non-privileged account called 'sshd'.
*** Info: For more info on privilege separation read /usr/share/doc/openssh/README.privsep.
*** Query: Should privilege separation be used? (yes/no) yes
*** Info: Updating /etc/sshd_config file
*** Query: Overwrite existing /etc/inetd.d/sshd-inetd file? (yes/no) yes
*** Info: Creating default /etc/inetd.d/sshd-inetd file
*** Info: Updated /etc/inetd.d/sshd-inetd

*** Query: Do you want to install sshd as a service?
*** Query: (Say "no" if it is already installed as a service) (yes/no) yes
*** Query: Enter the value of CYGWIN for the daemon: []
*** Info: On Windows Server 2003, Windows Vista, and above, the
*** Info: SYSTEM account cannot setuid to other users -- a capability
*** Info: sshd requires.  You need to have or to create a privileged
*** Info: account.  This script will help you do so.

*** Info: You appear to be running Windows XP 64bit, Windows 2003 Server,
*** Info: or later.  On these systems, it's not possible to use the LocalSystem
*** Info: account for services that can change the user id without an
*** Info: explicit password (such as passwordless logins [e.g. public key
*** Info: authentication] via sshd).

*** Info: If you want to enable that functionality, it's required to create
*** Info: a new account with special privileges (unless a similar account
*** Info: already exists). This account is then used to run these special
*** Info: servers.

*** Info: Note that creating a new user requires that the current account
*** Info: have Administrator privileges itself.

*** Info: The following privileged accounts were found: 'cyg_server' .

*** Info: This script plans to use 'cyg_server'.
*** Info: 'cyg_server' will only be used by registered services.
*** Query: Please enter the password for user 'cyg_server':
*** Query: Reenter:


*** Info: The sshd service has been installed under the 'cyg_server'
*** Info: account.  To start the service now, call `net start sshd' or
*** Info: `cygrunsrv -S sshd'.  Otherwise, it will start automatically
*** Info: after the next reboot.

*** Info: Host configuration finished. Have fun!
```

### References

+ http://docs.oracle.com/cd/E26854_01/install.12103/b65084/preinstall_req_cygwin_ssh.htm
+ http://www.ne.jp/asahi/hishidama/home/tech/windows/cygwin/ssh.html
+ http://mymemo.weby11
OSXでbundleを使ってMechanizeを入れる


```
$ brew tap homebrew/dupes
$ brew install libxml2
$ brew install libxslt
$ brew install libiconv
$ bundle config build.nokogiri --with-iconv-dir=$(brew --prefix libiconv) --with-xml2-include=$(brew --prefix libxml2)/include/libxml2
$ bundle install --path vendor/bundle
```

## 参考
> [OSX - Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法 - Qiita](http://qiita.com/t_732_twit/items/a7956a170b1694f7ffc2)
Mac OS X Environment

個人的なメモ

### Installation Packages

* [Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)
* [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
* [VMware Fusion](http://www.vmware.com/jp/products/fusion)
* [Vagrant](https://www.vagrantup.com/downloads.html)
* [Packer](https://www.packer.io/downloads.html)
* [Xcode (git)](https://developer.apple.com/jp/xcode/downloads/)

### Setup Personal Environment

```bash
$ curl -fSkL https://raw.github.com/hansode/env-bootstrap/master/build-personal-env.sh | bash
```

### Links

+ https://github.com/hansode/env-bootstrap