OmniAICreator/Qiita-1.07M huggingface dataset:
angularJSの$httpで送ったデータを$_POSTで受け取る


angularの$httpを利用するとajaxリクエストが送信可能です。

~~~
$scope.$http(config)
~~~

configにはオブジェクトでそれぞれ送信情報を送ります。

- method: HTTPメソド。'GET', 'POST' とか
- params: GET形式のURLにひっつくパラメータ
- data: POST形式のリクエストBODYにひっつくパラメータ
- header: リクエストヘッダ
- url: URL

## POSTでパラメータを送る時の問題
　ただangularからPOSTでパラメータを送信しても、PHP側から`$_POST`で取得できない。

~~~coffeescript:
    result = $http(
      method: "POST"
      url: url
      data: data
    )
~~~

　PHP側から取得するには

~~~PHP:
$request_body = file_get_contents('php://input');
$data = json_decode($request_body,true);
~~~
みたくします。ヘッダに`application/x-www-form-urlencoded`がついてないので`$_POST`側に自動で展開されないみたいです。

なんか最近はこういうpayloadの送り方が流行ってるみたいですが非常に面倒です。誰得なんでしょうか?


### `$_POST`で取りたい!!

　そんなわけのわからん方法で取れる、って言われても納得出来ねぇよ!!って人向けに。javascriptで送信する際に以下のようにちょっと操作を加えます。

~~~coffeescript:
    result = $http(
      method: "POST"
      url: "#{Config.api}user/put"
      data: $.param(data)
      headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    )
~~~
ポイントとしては2点

- 自分で`application/x-www-form-urlencoded`ヘッダを送信する。
- データを`$.param`関数で変換する。

です。


## つーか$httpってjQuery.ajaxとどう違うの?
　jQuery.ajaxと違って$httpはangularの内部だからコールバックで$scope.$applyしなくていいんだぜ!!みたいな記事を見た気もするけど、
jQuery.ajaxのコールバックも$scope.$apply要らんかったような…

　angularっぽい書き方と言う事で$httpを使ってますが正直あんまり利点は感じません。
あ、でも成功時と、エラー時のコールバック引数の形が同じなのは嬉しい。
AngularでDBユニーク列の利用可能問い合わせバリデーション


　AngularJSでフォームを作成すると、バリデーションが色々いじれて便利です。

　ここまで色々出来るようになってくるとJS側でかなりガッツリバリデーションを済ませてしまって登録のHTTPレスポンスは正常応答のみを前提として、異常応答は極端な処理ですませる…としたくなるところです。

　ただちょっと変わったバリデーションをかけようとするとたちまちうまく行かなくなるのがフレームワーク系の辛い所。

　今回は、入力されたログインIDが利用可能かの確認をDBに問い合わせる、というバリデーションをやってみます。

## とりあえずコード

~~~html:html
            <input type="text" class="pure-u-1" name="login_id" id="form_login_id" 
                   ng-model="post.login_id" ng-pattern="/^[0-9a-zA-Z_]+$/" 
                   ng-maxlength="10" ng-change="validateLoginId()" required/>
            <div class="panel-red" ng-show="joinForm.login_id.$error.pattern">
                ログインIDは半角英数字で入力してください。
            </div>
            <div class="panel-red" ng-show="joinForm.login_id.$error.unique">
                そのログインIDは使用できません。
            </div>
            <div class="panel-green" 
                   ng-show="joinForm.login_id.$dirty &&!joinForm.login_id.$error.inquired &&!joinForm.login_id.$error.unique">
                そのログインIDは使用可能です。
            </div>
            <div class="panel-red" ng-show="joinForm.login_id.$error.maxlength">
                ログインIDは10文字以内で入力してください。
            </div>
~~~

んでngChangeは以下の様に実装する。

~~~coffeescript:coffeescirpt
  $scope.validateLoginId = ()->
    $scope.joinForm.login_id.$setValidity "inquired",false #DB照会待ちエラーのセット   
    startVal = $("#form_login_id").val()
    setTimeout ->
      do (val = startVal) ->
        if val == $("#form_login_id").val()
          Config.log "test for #{val} #{$("#form_login_id").val()}"
          # http発行
          result = $http(
            method: "POST"
            url: "#{Config.api}user/valid_user_id/#{val}"
          )
          result.success (data,status,headers,config) ->
            $scope.joinForm.login_id.$setValidity "inquired",true    
            $scope.joinForm.login_id.$setValidity "unique",true
          result.error (data,status,headers,config) ->
            $scope.joinForm.login_id.$setValidity "inquired",true    
            $scope.joinForm.login_id.$setValidity "unique",false
    ,1000
~~~

`joinForm`はフォーム名、`Config.log`は`console.log`のラッパー、`Config.api`はAPIドメインです。
コピペで動くかは微妙。参考程度に。

## ポイント
### エラーのセット
今回は`inquired ` と`unique`の二つのエラーを登録しています。

- inquired: DBへの照会を済ませているかのチェック
- unique: DBにいまだ登録されていないキーであることのチェック

DBに確認しにいく、という処理の都合上、この二つのエラーをきっちりわけないと
DB確認中の数秒間はバリデーションOKになってしまう…という問題が発生します。

angularのエラーのセットは`$setValidity` で。`form.$setValidity`としてもいいし、`form.elem.$setValidity`としてもいい。同じエラー名で複数の要素のエラーを判別したいなら後者の方がオススメです。

### ng-changeの問題
ng-clickは`$event`がとれるのに、ng-changeは$eventが取れない。ので、ng-change内は上記の用にIDベタ書きで要素取得するしかなさそうです。
あと一文字一文字の変更毎にng-changeが発火してしまうので、setTimeoutを使って1秒間変動がなければ、という条件をつけています。処理フロー的には

1. フォーム内容の変更
2. 問い合わせ済みエラーの`inquired`を発行
3. フォームデータの保存
4. 1秒待つ
5. フォームデータの取得&&1秒前のフォームデータ(3.で保存)と比較
6. 変化がなければDBへの問い合わせを実行
7. DBからの応答を受け取ったら、問い合わせ済みエラーの`inquired`を削除
8. 応答でNGとの内容なら重複エラーの`unique`を発行

みたいな感じです。

## 気になる点

### DB問い合わせ応答の順番入れ替わりについて
　無数にサーバ問い合わせを行うと、順番が入れ替わって結果が返ってくる事がある。
　今回の処理では1回めの問い合わせから2回めの問い合わせまでには少なくとも1秒の猶予があるので、1秒以内にDB問い合わせが帰ってくれば順番の入れ替わりについての心配は無いのだけれども…
　きっちり処理を固めるなら多分そのへんに手をいれることになるのか…

### ng-showがごちゃごちゃする点について
　イライラする。
Quartz2Dでむっちゃ細い線を書く

http://stackoverflow.com/questions/12878781/drawing-a-very-thin-line-with-cgcontextaddlinetopoint-and-cgcontextsetlinewidth

こんな感じで細い線を書こうとしても、色が薄くなるだけで細い線を書いてくれない。

```objc
CGContextSetLineWidth(ctx, 0.5f);
CGContextSetStrokeColorWithColor(ctx, [UIColor alloc] blackColor].CGColor);
CGContextMoveToPoint(ctx, 10, 0);
CGContextAddLineToPoint(ctx, 10, 100);
CGContextStrokePath(ctx);
```

そういうときは、線の太さの半分だけずらす。

```objc
CGFloat lineWidth = 0.5f;
CGContextSetLineWidth(ctx, lineWidth);
CGContextSetStrokeColorWithColor(ctx, [UIColor alloc] blackColor].CGColor);

CGContextMoveToPoint(ctx, 10+lineWidth*0.5, 0);
CGContextAddLineToPoint(ctx, 10+lineWidth*0.5, 100);
CGContextStrokePath(ctx);
```

マジかよって感じ。
zlibのクロスコンパイル方法

#はじめに

ARMのターゲットデバイス上にLinuxルートファイルシステムを一から構築する機会があり、[zlib](http://www.zlib.net/)を、x86_64のUbuntuホスト上でクロスコンパイルしました。本記事では、zlibをクロスコンパイルする手順をメモします。

#前提

クロスコンパイルを行ったzlibのバージョンは、1.2.8です。

クロスコンパイラは、ホスト上の~/x-tools/bin/arm-linux-gnueabi-gccにインストールされているものとします。また、ターゲットデバイスのルートファイルシステムは、ホスト上の~/rootfsがルートであるとします。

#クロスコンパイル方法

```shell-session
CC=~/x-tools/bin/arm-linux-gnueabi-gcc ./configure --prefix=~/rootfs/usr
make
make install
```

上記を実行すると、ルートファイルシステム~/rootfs/usr配下のincludeやlibディレクトリなどにzlibのファイルがインストールされます。
Sublime Text 2 + Visual Studio 2012でC++開発するための設定

#Visual Studio 2012
##外部ツールに追加
編集中のファイルをSublime Text 2で開けるように外部ツールに登録する。
[ツール] -> [外部ツール] -> [追加]

| **名称** | **設定値** |
|:-----------|:------------|
| タイトル | Sublime |
| コマンド | C:\Program Files\Sublime Text 2\sublime_text.exe |
| 引数 | \$(ItemPath):\$(CurLine):\$(CurCol) |
| 初期ディレクトリ | \$(ItemDir) |

##外部ツール呼び出しをキーバインド設定
[ツール] -> [オプション] -> [環境] -> [キーボード]
にて「ツール.外部コマンド～」に登録する。
個人的にはF2とかに登録してる。

#Sublime Text 2
##必要なパッケージ
[SublimeClang](https://github.com/quarnster/SublimeClang "SublimeClang") をPackage Managerでインストール。

##プロジェクトに関係しないインクルードパス設定。
[Preferences] -> [Package Settings] -> [Sublime Clang] -> [Settings - User]

```json
{
	"options": [
		"-Wall",
		"-isystem", "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\include",
		"-isystem", "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\atlmfc\\include",
		"-isystem", "C:\\Program Files (x86)\\Windows Kits\\8.0\\Include\\um",
		"-isystem", "C:\\Program Files (x86)\\Windows Kits\\8.0\\Include\\shared",
		"-isystem", "C:\\Program Files (x86)\\Windows Kits\\8.0\\Include\\winrt"
	]
}
```

##プロジェクト毎のインクルードパス設定
[こちらの投稿](http://qiita.com/nagakenjs/items/e06911f4ff9e9871cd2b "Sublime TextでC++の開発環境を作る")を参考に設定する。
以下引用。
>##参照するヘッダファイルの追加
>
>開発で作成した独自のヘッダファイルは、同じフォルダにない限りSublimeClangからは参照されず、includeを書いてもエラーとなります。
>解決するには、Sublime Textのプロジェクトの設定ファイルにヘッダファイルがあるディレクトリのパスを追記します。これでinclude文がエラーにならず、補完も効くようになります。
>
>1. [Project] - [Save Project As…]メニューでプロジェクトを作成する。ファイル名がプロジェクト名になるので、任意の名前を付ける。
>1. [Project] - [Edit Project]メニューよりプロジェクトの設定ファイルを開く。
>1. 設定ファイルにヘッダファイルへのパスを追加する。
>
>```json
>{
>    "settings": {
>        "sublimeclang_options": [
>            "-I/path/to/foo/include",
>            "-I/path/to/bar/include"
>        ]
>    }
>}
>```

##キーバインド設定
Visual StudioっぽくF12で関数ジャンプできるようにする。
[Preferences] -> [Key Bindings - User]

```json
[
	{ "keys": ["f12"], "command": "clang_goto_def", "context": [{"key": "clang_supported_language"}] },
	{ "keys": ["ctrl+f12"], "command": "clang_goto_implementation", "context": [{"key": "clang_supported_language"}] },
	{ "keys": ["shift+f12"], "command": "clang_go_back", "context": [{"key": "clang_supported_language"}] }
]
```
Angular 基本の形


ドキュメントとかに載ってるfunction単独でコントローラ、っていうアレはなんか邪道らしい。
綺麗に書く時はモジュール使って…っていうお作法になるんだけど形をいっつも忘れるのでまとめとく。

面倒なんでcoffeeのみです。

~~~coffeescript:
window.moduleJoin = angular.module 'join',[]
moduleJoin.controller 'joinController', controllerJoin;
~~~

### モジュールの登録

~~~coffeescript:
window.moduleJoin = angular.module 'join',[]
~~~

モジュールとモジュール名を登録する。上の例だとモジュール名joinでmoduleJoin変数にモジュールを格納する。

ng-app属性で指定するのはモジュール名、の方

### コントローラの登録

~~~coffeescript:
moduleJoin.controller 'joinController', controllerJoin;
~~~

モジュールにコントローラとコントローラ名を登録する。上の例だとコントローラ名joinControllerでcontrollerJoin変数にあるコントローラを格納する。

ng-controllerで指定するのはコントローラ名、の方

### なにがまずいか

~~~~
controllerJoin = function($scope){
    
}
~~~
って形でコントローラ作って、`ng-controller="controllerJoin"`ってした場合、HTMLが変数名に依存する。

変数名はJSの圧縮とかで変わることも考えると、moduleとか使って変数と呼び出しキー文字列とをマッピングする形で作るほうが安全。
setTimeoutに引数渡す方法


色々と面倒だったけど頑張ったらなんとなったので。

要はテキスト入力フォームの値が変化してから一定時間変わらなかった時に、イベントを発生させたいわけです。

~~~coffeescript:coffeescript
    startVal = $("#input").val()
    setTimeout ->
      do (val = startVal) ->
        if val == $("#input").val()
          Config.log "test : #{val} #{$("#input").val()}"
        else
          Config.log "invalid : #{val} #{$("#input").val()}"   
    ,1000
~~~

~~~javascript:javascript
     startVal = $("#input").val();
     setTimeout(function() {
       (function(val) {
          if (val === $("#input").val()) {
            Config.log("test"));
          } else {
            Config.log("invalid"));
          }
        })(startVal);
      }, 1000);
~~~

メモ程度に自コードから抜き出して整形しただけなので、動くかは微妙。特にJSはcoffeeのコンパイルから抜き出して整形してる感じ。あくまでイメージ程度に。

#### 使い所

ログインIDの利用可能バリデーションとか。APIめちゃクチャ投げられるの嫌いな人向け
(というか想定API応答時間分は間隔空けないと結果の戻りが順不同だから面倒だったり)

#### 雑感
coffeeの即時関数の書き方が面倒だった。
引数が最初に来るので、

~~~coffee:coffeescript
    setTimeout ->
      do (val = $("#input").val()) ->
        if val == $("#input").val()
          Config.log "test : #{val} #{$("#input").val()}"
        else
          Config.log "invalid : #{val} #{$("#input").val()}"   
    ,1000
~~~

とか書いてても違和感なくて、コンパイル済みのコード見てようやく気づいた。
ClojureでSEND+MORE=MONEYを解いた

```clojure:smm/core.clj
(ns smm.core
  (:refer-clojure :exclude [==])
  (:use [clojure.core.logic])
  (:require [clojure.core.logic.fd :as fd]))

;;;   S E N D
;;; + M O R E
;;; ---------
;;; M O N E Y

(defn digitso [nums n]
  (fresh [h t]
    (conso h t nums)
    (conde
      [(emptyo t) (== h n)]
      [(fresh [n0 nn]
         (fd/* nn 10 n0)
         (fd/+ n0 h n)
         (digitso t nn))])))

(defn solve []
  (run 2 [q]
    (fresh [s e n d m o r y send more money]
      (fd/in s e n d m o r y (fd/domain 0 1 2 3 4 5 6 7 8 9))
      (fd/!= s 0) (fd/!= m 0)
      (fd/distinct [s e n d m o r y])
      (digitso [d n e s] send)
      (digitso [e r o m] more)
      (digitso [y e n o m] money)
      (fd/+ send more money)
      (== q [s e n d '+ m o r e '=  m o n e y]))))
```

```
user=> (use 'smm.core)
user=> (solve)
([9 5 6 7 + 1 0 8 5 = 1 0 6 5 2])
```
saharaでVagrantの状態管理


##saharaとは
OSの途中の状態を記憶しておき、好きな時にそこまでロールバックできる。

##注意点
Vagrant1.1には公式には未対応の様子。
別途対応版を公開してくださっている方がいるので、そちらを利用させて頂く。

Vagrantの必須プラグインSaharaをVagrant 1.1に対応させました | Ryuzee.com
http://www.ryuzee.com/contents/blog/6555

###インストール

```sh
$ git clone https://github.com/ryuzee/sahara.git
$ cd sahara
$ bundle install
$ vagrant plugin install sahara
```
###確認

```sh
$ vagrant plugin list
sahara (0.0.15)
```

###利用する

```sh
# sandboxモード開始
$ vagrant sandbox on

# 変更を決定する
$ vagrant sandbox commit

# 変更を破棄し、ロールバックする
$ vagrant sandbox rollback

# sandboxモード終了（commitしていないものは破棄される）
$ vagrant sandbox off

# 現在sandboxモードかどうかの確認
$ vagrant sandbox status
```

便利！


##追記（2013/10/14）
sandbox on, sandbox commitは非常に時間がかかる。
一度Vagrantを停止してから行うと少しましになる。

```sh
$ vagrant halt
$ vagrant sandbox commit
```

## Vagrantに慣れたら

サーバ構成管理ツールのChefで、Vagrantの魅力を最大限に引き出しましょう！

Chefの基本
http://qiita.com/kidachi_/items/9d569b8673e70ef93f0e

knife-soloによるChefの実行
http://qiita.com/kidachi_/items/b222fb2892e6108c46d5
rubyのgeocoderの使い方


## gemでインストール
```
gem install geocoder
```

## IPや住所から詳細情報取得
```rb
require 'geocoder'
require 'pp'
Geocoder.configure(:language  => :ja,  :units => :km )

pp Geocoder.address("東京タワー")
pp Geocoder.search("東京タワー")
pp Geocoder.search("210.194.198.60")
pp Geocoder.address("210.194.198.60")
pp Geocoder.search("106.187.50.98")
pp Geocoder.address("106.187.50.98")

```
robocopyに出会った

### 自宅のデスクトップはWindows7です

* あるディレクトリ以下のファイルをまるっとコピーして定期的に差分をバックアップ側に更新したいな
* ローカルでrsync的なことができればよい
* ただしWindows

### robocopy

* robustのrobo
* win7 builtin
* See `robocopy /?`

```bat
robocopy /e D:¥hoge E:¥hoge
```

みたいなやつを`.bat`で保存して投げやりな感じでタスクスケジューラに登録した
Apache JMeterで任意のタイムゾーンの現在時刻文字列変数を設定する


JMeterのBSF Pre Processorでjavascriptを用いてゴリゴリする。

# 環境
* Mac OS/X 10.7.5
* JMeter 2.9

# 設定

BSF Pre Processorをこんな感じで
![kobito.1381554878.157791.png](https://qiita-image-store.s3.amazonaws.com/0/18719/792d8434-d5a2-d2d2-0898-94766da22d53.png "kobito.1381554878.157791.png")


BSF Pre Processor Script の中身をこんな感じでゴリゴリ

```javascript:
// Parameters 第一引数 (変換後 のタイムゾーンオフセット [時])
var tzHoursOffset = args[0];
// Parameters 第二引数 (変換後 のタイムゾーンオフセット [分])
var tzMinutesOffset = args[1];

// 引数のタイムゾーンオフセットをミリ秒単位に変換
var tzOffset = tzHoursOffset*60*60*1000 + tzMinutesOffset*60*1000;

var localDate = new Date();
var localOffset = localDate.getTimezoneOffset() * 60000;
var utc = localDate.getTime() + localOffset;

var targetTime = utc + tzOffset;

var now = new Date(targetTime);
var year = now.getFullYear();
var month = zeroPadding(now.getMonth() + 1);
var date = zeroPadding(now.getDate());
var hour = zeroPadding(now.getHours());
var minutes = zeroPadding(now.getMinutes());
var seconds = zeroPadding(now.getSeconds());

// 変数'utcDate'に "YYYY-MM-DD'T'HH:mm;ss +HH:mm"な文字列を設定する
vars.put('utcDate', year + "-" + month + "-" + date + 'T' + hour + ":" + minutes + ":" + seconds + getTimeZoneString(tzHoursOffset, tzMinutesOffset));

/**
   * 時、分を"+HH:MM" フォーマットに変換
   * @param hourOffset {Number} 時
   * @param minutesOffset {Number} 分
   * @return {String} "+HH:MM"
   */
function getTimeZoneString(hourOffset, minutesOffset){
  var sign = hourOffset >= 0 ? "+" : "-";
  var hours = zeroPadding(""+hourOffset);
  var minutes = zeroPadding(""+minutesOffset);
  return sign + hours + ":" + minutes;
}

/**
   * 1桁の数値を 0埋め
   */
function zeroPadding(target){
    return ('00'+target).slice(-2);
}
```

# 出力イメージ
HTTP Requestの設定
![kobito.1381555050.585914.png](https://qiita-image-store.s3.amazonaws.com/0/18719/a85fa478-f19f-19b1-097c-dd1e13309322.png "kobito.1381555050.585914.png")

出力結果

```text:
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 124
User-Agent: Java/1.7.0_09
Host: localhost:8000
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

<RequestBody>
  <element sequence="3">
     <timestamp>2013-10-12T05:06:41+00:00</timestamp>
  </element>
</RequestBody>POST / HTTP/1.1
Connection: close
```
Function.prototype.bindの、複数の引数を配列で渡せるバージョン

Function.prototype.bindの、複数の引数を配列で渡せるバージョンを作ってみました。
Function.prototype.bindApplyという拡張メソッドがそれです。
また、この拡張メソッドを使わずに自前でやる方法（getBoundFuncByMySelf）も書きました。
（注意：ECMAScript 5 に準拠したWebブラウザが必要です）

地味に便利だと思います ^o^

```js
Object.defineProperty(
Function.prototype,
'bindApply', 
{
value : function( thisObject, argumentsArray ) {
return Function.prototype.bind.apply(this, [thisObject].concat(argumentsArray));
},
writable : false,
enumerable : false,
configurable : false
}
);

function getBoundFuncByBindApply(obj, func, argv) {
return func.bindApply(obj, argv);
}

function getBoundFuncByMySelf(obj, func, argv) {
return Function.prototype.bind.apply(func, [obj].concat(argv));
}

function showThis(arg1, arg2){
alert(this + arg1 + arg2);
}

var foo = getBoundFuncByBindApply("Thisです:", showThis, [" Foo "," Boo "]); // どちらでもOK
var foo = getBoundFuncByMySelf("Thisです:", showThis, [" Foo "," Boo "]); // どちらでもOK

foo();
```
nc -lk で受信値を垂れ流すだけのサーバ


# 環境
* Mac OS/X 10.7.5

# 使用目的
jMeterで作成するHTTPリクエストの内容確認がしたかったので。

# コマンド
```bash:nc
#ポート 8000で待ち受ける
nc -lk 8000
```
TCPコネクションが切断されてもncが終了されないように -k を付与。
jMeter側はtimeoutを早めに設定しておく。

![kobito.1381550484.500274.png](https://qiita-image-store.s3.amazonaws.com/0/18719/ac5eb30e-9545-b792-e3b9-670e42c09966.png "kobito.1381550484.500274.png")

# 結果
```bash:出力イメージ
nc -lk 8000                                   
POST / HTTP/1.1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 99
User-Agent: Java/1.7.0_09
Host: localhost:8000
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

<RequestBody>
  <element sequence="1">
     <timestamp></timestamp>
  </element>
</RequestBody>POST / HTTP/1.1
Connection: close

```
CSVをパースする

## csvを配列に変換する関数

```js
// ネイティブ版
function parseSV(str, delimiter){
  if(!delimiter) delimiter = ","
  return str.split('\n').reduce(function(table,row){
    if(!table) return;
    table.push(
      row.split(delimiter).map(function(d){ return d.trim() }) //余白削除
    );
    return table;
  }, []);
}

/* ネイティブ版はIE8以下では動かないので
 * underscore.jsを使う方が良いかも
 */
function _parseSV(str, delimiter){
  if(!delimiter) delimiter = ","
  return _.reduce(str.split('\n'), function(table,row){
    if(!table) return;
    table.push(
      _.map(row.split(delimiter), function(d){ return d.trim() }) 
    );
    return table;
  }, []);
}
```

使用

```js
var csv = "name, age, job\n" +
    "清水,17,エンジニア\n" +
    "田中,34,デザイナー\n"+
    "佐藤, 21,マネージャー";

var csvArray = parseSV(csv);
console.log(csvArray);
-> [["name","age","job"],["清水","17","エンジニア"],["田中","34","デザイナー"],["佐藤","21","マネージャー"]]
```

デリミタを変更(tsv)

```js
var tsv = "name	address	email\n" +
    "鈴木	東京都	suzuki@hoge.com\n" +
    "木村	群馬県	kimura@hoge.com";

var tsvArray = parseSV(tsv, "\t");
console.log(tsvArray);
->[["name","address","email"],["鈴木","東京都","suzuki@hoge.com"],["木村","群馬県","kimura@hoge.com"]]
```

<br />

## オブジェクトに変換するwrapper と組み合わせる。

```js
function toObject(array){
  var head = array.shift();
  var objArray = []; 
  for(var b=0; b < array.length; b++){
    var tmp = {};
    for(var i=0; i< head.length; i++){
      tmp[head[i]]=array[b][i];
    }
    objArray.push(tmp);
  }
  return objArray;
}
```

使用

```js
var obj =  toObject(parseSV(csv));
console.log(obj);
->[{"name":"清水","age":"17","job":"エンジニア"},{"name":"田中","age":"34","job":"デザイナー"},{"name":"佐藤","age":"21","job":"マネージャー"}] 
```

composeを使う

```js
var csv2obj = _.compose(toObject, parseSV);
var obj2 = csv2obj(csv);
console.log(obj2);
->[{"name":"清水","age":"17","job":"エンジニア"},{"name":"田中","age":"34","job":"デザイナー"},{"name":"佐藤","age":"21","job":"マネージャー"}] 
```

## 追記(tsv -> array -> obj)
underscore.jsで関数の部分適用を行う際に、束縛する引数の入れ替え等を行う方法がわからなかったので、mixinでflipメソッドを追加する。

```js
_.mixin({
  flip:function(fn){
    return function() {
      var args = Array.prototype.slice.call(arguments);
      // flip arguments when called
      return fn.apply(this, args.reverse());
    };    
  }
});
```

引数(デリミタ)を部分適用

```js
var tsv2array = _.partial(_.flip(parseSV), "\t"); //デミリタを部分適用する
var tsv2obj =  _.compose(toObject, tsv2array);
var obj3 = tsv2obj(tsv);
console.log(obj3);
->[{"name":"鈴木","address":"東京都","emailr":"suzuki@hoge.com"},{"name":"木村","address":"群馬県","emailr":"kimura@hoge.com"}]
```
Android 4.0系のWebViewでtouchendが発火しないバグ対策

```js:
// Android 4.0系でtouchendが発火しない対策
// # touchstart時もしくはtouchmove時にe.preventDefault()で
// # ブラウザのスクロールを停止しないとtouchendが発火しない
$("*")
	.on("touchstart", function(e) {
		Y1 = e.originalEvent.touches[0].clientY;
	})
	.on("touchmove", function(e) {
		Y2 = e.originalEvent.touches[0].clientY;
		if(Math.abs(Y1 - Y2) < 5){
			e.preventDefault();
		}
	});
```
接続してきた相手のIPアドレスを返すだけのサーバ

分散システム組んでるとこういう簡単なのが便利だったりする。
RubyのSocketでacceptしてSocketの情報読んで送り返してcloseするだけの簡単な物。
`setsockopt`で再利用できるよう指定することで、二度目以降もこのプロセスが立ち上がりやすいようにしている。

```rb
require 'socket'

# ソケット作成
serv = Socket.new Socket::AF_INET, Socket::SOCK_STREAM, 0

# 関連付けたい自分のアドレスを作成
sockaddr = Socket.sockaddr_in 9191, "0.0.0.0"

# 再利用可能なように設定
serv.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true

# アドレスとソケットを関連付け
serv.bind sockaddr

# listen開始。外部の接続を受け付ける
serv.listen 5

puts 'IP notifier start'

# 無限ループ
loop do

  # 接続を待機。sockは[socket, address]の配列で帰って来る
  sock, addr = serv.accept

  # IPアドレスとポートの組を獲得。 _ で受け取ってるのは使わないから
  host, _ = addr.ip_unpack

  # 接続してきたクライアントにそのIPを通知
  sock.write host

  # ソケット切断
  sock.close

end
```

簡単ですね。
Emacs 24 でhowmがうまく動かなかった時

Emacs 24 で howmを使っている時に、「<<<hoge」みたいなリンクから遷移しようとすると以下のエラーが出る。

```\n:minibuffer
Error in post-command-hook (riffle-post-command): (void-variable inhibit-first-line-modes-regexps)
```

リンクに限らずhowmで全文検索すると同じようにエラーになる。


Emacs 24 に対応していないhowmのバージョン（1.3.9）を使っていたのが原因だった。
howm 1.4.1に更新したら大丈夫になった。

最新版は以下ページで頂いた。
http://howm.sourceforge.jp/index-j.html
UIActivityで追加したアイテムのアイコンをカラーにするPrivate API

UIActivityのアイコンは一般的、アルファチャンネル画像を指定して使い、iOS 6では銀色のアイコン、iOS 7では白いアイコンに変換されますよね。
うーん、Appleと同じくカラーのアイコンが使いたい・・

```objc:
- (UIImage *)activityImage {
    return [UIImage imageNamed:@"SampleAcitvity.png"];
}
```

## 調査
適当にログを出して調査・・

カラーのSNSのアイコンを表示しているActivityは、_activityImageForApplication:の引数にcom.apple.MobileSMSというBundle Identifierを指定していることが分かります。
その後、_activityGenericImage:が呼び出されて、SMSアイコンが引数として入っている模様。
最終的に変換されたイメージは_UIMappedBitmapImageで返されています。

```objc:syslog

MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityImageForApplication:com.apple.MobileSMS]
MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityGenericImage:<_UIMappedBitmapImage: 0x15701f90>]
MobileSafari[1609]: rtn: <_UIMappedBitmapImage: 0x15701f90>

```

次にカラーでないアイコンは、_activityFunctionImage:の引数にUIImageなアイコンが入って_UIActivityFunctionImageとして返しています。

```objc:syslog

MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityFunctionImage:<UIImage: 0x15700250>]
MobileSafari[1609]: rtn: <_UIActivityFunctionImage: 0x15700320>

```

## サンプルコード
これで、仕組みはだいたい分かるのでサンプルコードを示します。

```objc:SampleActivity.h
#import <UIKit/UIKit.h>
@interface LINEActivity : UIActivity
@end

@interface UIActivity (Private)
+ (id)_activityFunctionImage:(id)arg1;
+ (id)_activityGenericImage:(id)arg1;
+ (id)_activityImageForApplication:(id)arg1;
@end
```

```objc:SampleActivity.m
@implementation SampleActivity

+ (UIActivityCategory)activityCategory
{
    return UIActivityCategoryShare;
}

- (BOOL)isUsableHatena
{
    return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"hatenabookmark://"]];
}

/*
 - (UIImage *)activityImageではなく- (UIImage *)_activityImage
*/
- (UIImage *)_activityImage
{
    if ([self isUsableHatena])
        return [NSClassFromString(@"UIActivity") _activityImageForApplication:@"jp.ne.hatena"];
    else {
        return [NSClassFromString(@"UIActivity") _activityFunctionImage:[UIImage imageNamed:@"SampleAcitvity.png"];
    }
}

- (NSString *)activityTitle {
....
```

## 解説

**注意: - (UIImage *)_activityImageを使うのがミソです。- (UIImage *)activityImageでは駄目です。**

_activityImageForApplication:で指定したBundle Identifierのアプリが存在しない場合は、アイコンが表示されないため、_activityFunctionImage:でアルファチャンネルな画像のアイコンを指定して表示させています。

また、_activityImageForApplication:を使わず_activityGenericImage:に直接、画像を指定してやるとカラーのアイコンが表示されると思います。試していない。

iOS 7からUIAcitivityが上段と下段に分かれましたが、通常追加したアイテムは下段に表示されます。
+ (UIActivityCategory)activityCategoryにUIActivityCategoryShareを返せば上段に表示されます。これは、Appleのリファレンスに書いています。


## LINEアプリが存在し、はてなブックマークアプリが存在しない場合

![2013-10-11 23.56.09.png](https://qiita-image-store.s3.amazonaws.com/0/15103/6ff6d5ff-c314-b12e-f6a8-ea681d9a67ad.png "LINEアプリが存在し、はてなブックマークアプリが存在しない場合")
vimからwebdictを使用する

```

NeoBundle 'thinca/vim-ref'

現在のvim-refにはwebdictが入っていて、WEB上の辞書を引くことができる

"vim-ref
"Ref webdictでalcを使う設定
let g:ref_source_webdict_cmd = 'lynx -dump -nonumbers %s'
"let g:ref_source_webdict_use_cache = 1
let g:ref_source_webdict_sites = {
			\ 'alc' : {
			\   'url' : 'http://eow.alc.co.jp/%s/UTF-8/'
			\   }
			\ }
function! g:ref_source_webdict_sites.alc.filter(output)
	  return join(split(a:output, "\n")[42 :], "\n")
endfunction

と、ショートカットキーとして
:cnoremap aa Ref webdict alc<Space>

を設定。:aaと押すと
:Ref webdict alc
に置き換わるので

:Ref webdict alc hello
などと書いてEnterすれば辞書結果が表示される

--

テキストブラウザのインストールが必要
brew install lynx

文字化けしたら設定を変える
vim /usr/local/Cellar/lynx/2.8.7/etc/lynx.cfg

...
#CHARACTER_SET:iso-8859-1
CHARACTER_SET:utf-8
...
#PREFERRED_LANGUAGE:en
PREFERRED_LANGUAGE:ja
...

参考：http://www.karakaram.com/20120726-vim-ref

```
DOS(NYAOS+Console2)でssh-agentを起動するバッチ


##作成動機
- NYAOS(DOS)上でGit for Windowsのssh-agentを実行すると環境変数が上手く登録されず動作しないので、動くようにしてみた。  

 置き場：https://github.com/tarVolcano/ssh-a_bat

##使い方

- NYAOS+Console2：`cmdsource "ssh-a.bat"`を実行。(_nyaファイルでaliasを指定して、ついでに実行すると良い)

- DOS：`ssh-a.bat`を実行

 ※バッチ実行後、`ssh -T git@github.com`などで接続確認してください。


##バッチの目的

- DOSまたは、NYAOS+Console2でssh-agentを起動する。
 - ssh-agentで使う環境変数を"バッチファイル名_env.log"に記録、プロンプト起動時に変数が不足していたら再setする。
 - ssh-agentを重複起動しないようにする。もし、制御できない(環境変数の記録がない)プロセスがあればkillする。

- ssh-add -l で一つも鍵が登録されてなければ、ssh-addも実行する。
 - 一つでも登録されていればssh-addは行わない。


##事前準備

- git\binのパスが通っている(msys のコマンドを使うので)
- 環境変数HOMEが設定されている
- %HOME%\.sshのconfigファイルが設定されている


##環境

- Git for Windows v1.8.4
- NYAOS 3.3.8_2
- Console2 2.00.148
- Windows XP Pro SP3
MacのSublimeText2でPkgControlなしでコマンド一発でインストールする方法


最近リポジトリ登録されてないパッケージいれることも増えてきて、
更にパッケージコントロールのダイアログが開かなくなる事案も発生しました。（これはクリーンインストールしたら治りました）

それなら、もう、ターミナルからコマンド一発でインストールできればいいじゃないと思いましたまる

##条件
+ Git、SublimeText2がインストールされていること
+ インストールしたいパッケージのURL
+ Terminalで鳥肌が立たない心


###コマンドの入力

```Terminal（コマンドライン）
cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages # Mac
git clone GIT_URL # GIT_URLをパッケージURLに変更してください
```


### TextExpanderの入力支援ソフトの例

filltextでポップアップでURL入力したら直ぐにインストール実行できるようにしました。


```bash:TextExpander

cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages
git clone %filltext:name=pkgaddress:default=%

```


<br><br>
余談なんですが、
package control install packageの一番文字数の少ない呼び出し方で探してて、
今まではstallだったけど今の最強はpint。
もっと短いのありましたらぜひぜひ教えてもらえたら光栄です。
coffeescriptの文法を常にチェックする

最初は
NeoBundle 'scrooloose/syntastic'
とcoffeelintを使おうとしたけれどうまくいかなかった

npmからcoffee, coffeelintを入れてターミナルから動くようにした後
vimrcにて
let g:syntastic_coffee_checkers = ['coffeelint']
coffeelintを優先して使うように設定してもcoffeeでチェックしてしまう

するとjQueryを使ったときに$で間違ってエラー判定してしまうので
coffeelintを使いたかったのだが、断念

--

次の手として
coffeeをライブコンパイルする
NeoBundle 'vim-coffee-script'

cnoremap cf CoffeeCompile watch vert
と設定してvimからcfと打つと2カラムになり
片方に生成されたJSが表示されるようにした

これで文法エラーは防げる

![top.js.coffee____virtual_machine_centos64_github_repositories_voxel_editor_server_jsonserver_app_assets_javascripts__-_VIM.jpg](https://qiita-image-store.s3.amazonaws.com/0/12309/75ecd546-6875-fb30-0181-12a88d4d0ebe.jpeg)
[リスト]開発者向けグループチャットサービス

[リスト]開発者向けグループチャットサービス

以下の様な観点で評価(偉そう)してます。

* 共有したファイルへのリンクへはメンバーのみがアクセス可能であること
* CIツールやリポジトリなどの開発者向けのサービスと通知連携がとれること

| サービス名 | アップロードファイル | 開発者向け<br/>外部連携 |
|:-----------|:------------|:------------:|
| [HipChat](https://www.hipchat.com/ "HipChat") | 誰でもアクセス可 | [★★★](http://help.hipchat.com/knowledgebase/topics/10037-integrations) |
| [Flowdock](https://www.flowdock.com/ "Flowdock") | 誰でもアクセス可 | [★★★](https://www.flowdock.com/help/integrations) |
| [ChatWork](https://www.chatwork.com/login.php?lang=ja&args= "ChatWork") | 要ログイン | ★☆☆|
| [Typetalk](http://www.typetalk.in/ja/) | 要ログイン |★☆☆|
| [Idobata](https://idobata.io/) | 誰でもアクセス可 |★★☆|
| [Slack](https://slack.com/ "Slack: Be less busy")| 要ログイン | [★★★](https://slack.com/integrations) |


本当はHipChat使いたいんだけど、ファイル共有のURLを知っていれば誰でもアクセスできると言うこともあり、今はChatWorkを使用中。
[Are files uploaded to HipChat secure/private?](http://help.hipchat.com/knowledgebase/articles/64477-are-files-uploaded-to-hipchat-secure-private- "Are files uploaded to HipChat secure/private?")

[2014年6月13日追記:Slackかなり良さそう。導入してみたい。]
matplotlibのインストール（Python 3.3.2）


（追記 2013/10/21）
・SciPyのインストールを追記

###インストール

scipyインストールにFORTRANのコンパイラが必要らしい。

```
% brew install gfortran
```


次に、pipでいろいろインストール。

```
% pip install ipython

% pip install readline

% pip install numpy

% CC=clang CXX=clang FFLAGS=-ff2c pip install scipy

% pip install matplotlib
```

※ scipyのインストールは[ここ](http://blog.f13.jp/post/21714276427/pybrain "PyBrainでニューラルネットワーク - インストール編")を参考に

__ipython__
>IPython (あいぱいそん) はPythonを対話的に実行するためのシェルである。オリジナルの Python に比較して、型推定を強化し、対話的実行のための文法を追加してあり、コード・ハイライティングおよびタブによる補完が行える。IPython は SciPy パッケージの一部として公開されている。
>引用元：[Wikipedia (IPython)](http://ja.wikipedia.org/wiki/IPython "Wikipedia (IPython)")

__readline__
文字列入力用ライブラリ。ipythonを使いやすくする。

__numpy__
>Python用の拡張モジュールであり、数値計算を効率的に行うための型付きの多次元配列（例えばベクトルや行列などを表現できる）のサポートをPythonに加えるとともに、それらを操作するための大規模な高水準の数学関数ライブラリを提供する。
>引用元：[Wikipedia (NumPy)](http://ja.wikipedia.org/wiki/NumPy "Wikipedia (NumPy)")

__scipy__
>NumPyの配列・行列演算に加えて、高次元の科学技術計算を可能にするライブラリ。
>引用元：パーフェクトPython　株式会社技術評論社 P. 291 

__matplotlib__
 >Pythonおよびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリである。
>引用元：[Wikipedia (matplotlib)](http://ja.wikipedia.org/wiki/Matplotlib "Wikipedia (matplotlib)")


###シンボリックリンクを張る
virtualenvを使っている場合、`.virtualenvs/仮想環境名/bin/`にipython3がインストールされるので、シンボリックリンクを張っとく。

```
% cd ~/.virtualenvs/仮想環境名/bin
% ln -s ipython3 ./ipython
```

これで、ターミナルから`ipython`でipythonが起動できる。

###グラフを描いてみる

```
# ipythonを起動
% ipython --pylab
```

```
In [1]: x = arange(0,1,0.1)

In [2]: y = 2*x

In [3]: plot(x,y)
Out[3]: [<matplotlib.lines.Line2D at 0x10cbbec10>]
```

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/18185/81cfe78a-01fb-81b0-f036-12be8bfdc7d8.png "figure_1.png")


##参照
・[sessanの日記 - OS X Mountain Lion 環境にmatplotlibをインストールする](http://sessan.hatenablog.com/entry/2013/05/11/142547 "sessanの日記 - OS X Mountain Lion 環境にmatplotlibをインストールする")
・[@IT - ITエンジニアのためのデータサイエンティスト養成講座（3）](http://www.atmarkit.co.jp/ait/articles/1306/25/news005.html "@IT - ITエンジニアのためのデータサイエンティスト養成講座（3）")
・[akiyoko blog](http://akiyoko.hatenablog.jp/search?q=numpy "akiyoko blog")
・[F13 - PyBrainでニューラルネットワーク - インストール編](http://blog.f13.jp/post/21714276427/pybrain "PyBrainでニューラルネットワーク - インストール編")
【jQuery】スムーズスクロールと何かのバッティングを取り消す

スムーズスクロールとtabとかがバッティングした。
（そういえばどちらともアンカーがトリガーだった）

## 対処方法

スムーズスクロールがjQueryのanimateを使った（下のような）コードだったら

```js
$('html,body').animate({scrollTop: ***}, ***);
```

tabとか切り替えるクリックイベントのコードに下記を追加すればいいっぽい。

```js
$('html,body').animate().stop();
```

## この対処法が効かない場合には

tabとかで使っているリンク先を「id+なんか文字列」に変更して、jsで文字列の置き換え（replace("置き換える前の文字","置き換えた後の文字")）をして、そもそもスムーズスクロールが効かないようにすれば大丈夫です。
PEAR の Services_AmazonECS4-0.9.0 を 2011.10.26 の仕様変更以降のProduct Advertising APIに対応させる

# PEAR の Services_AmazonECS4-0.9.0 を 2011.10.26 の仕様変更以降の Product Advertising API に対応させる方法のメモ

PEAR の Services_Amazon パッケージの v0.9.0 が現状の Product Advertising API に対応していないようだったので、その修正内容のメモ。
API側で廃止されたOperationに対応するメソッド（SellerLookup等）はもちろん使用できないが、
それ以外のOperationの認証と検索はできるようになる。

##  AmazonECS4.php:85行目を修正

```php:AmazonECS4.php
// define('SERVICES_AMAZON_BASEURL', 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService');
define('SERVICES_AMAZON_BASEURL', 'http://webservices.amazon.com/onca/xml');
```

## AmazonECS4.php:133行目下あたりにメンバ変数を追加

```php:AmazonECS4.php
    var $_service = 'AWSECommerceService';
```

## AmazonECS4.php:313～318行目を修正

```php:AmazonECS4.php
            /*
            'US' => 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService',
            'UK' => 'http://webservices.amazon.co.uk/onca/xml?Service=AWSECommerceService',
            'DE' => 'http://webservices.amazon.de/onca/xml?Service=AWSECommerceService',
            'JP' => 'http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService',
            'FR' => 'http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService',
            'CA' => 'http://webservices.amazon.ca/onca/xml?Service=AWSECommerceService',
            */
            'US' => 'http://webservices.amazon.com/onca/xml',
            'UK' => 'http://webservices.amazon.co.uk/onca/xml',
            'DE' => 'http://webservices.amazon.de/onca/xml',
            'JP' => 'http://webservices.amazon.co.jp/onca/xml',
            'FR' => 'http://webservices.amazon.fr/onca/xml',
            'CA' => 'http://webservices.amazon.ca/onca/xml',
```

##  AmazonECS4.php:1046～1056行目の_buildUrlメソッドを次のように修正

```php:AmazonECS4.php
	function _buildUrl($params)
	{
		$params['AWSAccessKeyId'] = $this->_keyid;
		$params['AssociateTag'] = $this->_associd;
		$params['Service'] = $this->_service;
		$params['Version'] = $this->_version;
		$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
		ksort($params);
		$canonical_string = '';
		foreach ($params as $k => $v) {
		    $canonical_string .= '&'.str_replace('%7E', '~', rawurlencode($k)).'='.str_replace('%7E', '~', rawurlencode($v));
		}
		$canonical_string = substr($canonical_string, 1);
		$parsed_url = parse_url($this->_baseurl);
		$string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
		$signature = base64_encode(hash_hmac('sha256', $string_to_sign, SECRET_KEY, true));
		$url = $this->_baseurl.'?'.$canonical_string.'&Signature='.str_replace('%7E', '~', rawurlencode($signature));
		return $url;
	}
```

以上
rubyのクラスやらモジュールがモヤっとしている人へ


どうも。今、やっとこの「モヤッ」が解消されたgogotanakaです。

この記事はrubyやrailsはそれなりに書けるけど

実はclassとかmoduleの継承とかインスタンスとかそいう言葉を出されると「モヤッ」となる、

方々のためにこの辺をまとめてみましたよ。

#という体裁の自分用の備忘録である。


##表記法

よく本とかに載っている表記法だけど一応確認。

###ThisIsClass#this_is_method

これは`ThisIsClass`クラスのインスタンスのメソッド`this_is_method`を指してる

###ThisIsClass.this_is_method
###ThisIsClass::this_is_method

これは`ThisIsClass`クラスのクラスメソッド`this_is_method`を指している


## 一回 class Hoge ~ end を忘れよう
rubyをいじった事がある方にはおなじみ、

```ruby:ex1.rb
class Foo < Bar
  def foo
    p "foo↑↑"
  end
end
```

この構文ある種の糖衣構文（シンタックスシュガー）です.

一回忘れると良いです.

ちなみにこのある種の糖衣構文を使わなければ、

```ruby:ex1.rb
Bar = Class.new
Foo = Class.new(Bar) do |c|
  def foo
    p "foo↑↑"
  end
end
```

まあ、`def` もある種の糖衣構文とも言えるのだけどそれは後ほど.

##What is "self" ?
`self` とはカレントオブジェクトと呼ばれたりもするが、

その時点でのメソッドの呼び出し口、と言っていいだろう.



```ruby:self.rb

class ThisIsClass
  ##self は ThisIsClassクラス自体
  def this_is_method
    ##self は ThisIsClassクラスのインスタンス
    puth 'うんこしたいよー'
  end
end

```
この辺でモヤッとなってる方は一度この記事に目を通してからもう一度読み直すと良いだろう。

##クラスメソッド
以下はThisIsClassクラスにクラスメソッドthis_is_methodを定義するやり方を４つ紹介している。

```ruby:class-method.rb

class ThisIsClass
  def ThisIsClass.this_is_method
    puth 'うんこしたいよー'
  end
end

class ThisIsClass
  def self.this_is_method
    puth 'うんこしたいよー'
  end
end

class ThisIsClass
  class << ThisIsClass
    def this_is_method
      puth 'うんこしたいよー'
    end
  end
end

class ThisIsClass
  class << self
    def this_is_method
      puth 'うんこしたいよー'
    end
  end
end

```

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


```ruby:instance-method.rb
class ThisIsClass
  def ThisIsClass.this_is_method
    puth 'うんこしたいよー'
  end
end
```

>this_is_instance = ThisIsClass.new

ThisIsClassクラスに対してクラスメソッドnewを呼び出すとThisIsClassのインスタンスが返ってくる。

インスタンスメソッドとは、そいつらに対してのメソッドである。

##クラス定数
いつか書くお
##クラス変数
いつか書くお
##インスタンス変数
いつか書くお

##クラスの拡張
既に定義されたクラスにメソッドを新たに追加する事。（上書きではなく新規作成

```ruby:クラスの拡張.rb

class ThisIsClass
  def this_is_method
    puts 'うんこしたいよー'
  end
end

class ThisIsClass
  def this_is_additional_method
    puts 'やっぱしたくないよー'
  end
end

```

##継承

クラスを定義する時に

#class 新しいクラス << 親クラス

という形式で定義すると、親クラス内で定義したメソッドを新しいクラス内でも使う事が出来る。

さらに親クラスのメソッドの編集も行える。

差分を新しいクラスで実装する事が出来る。


```ruby:class-method.rb

class ParentClass
  def this_is_method(n)
    puts "#{n.to_s}回うんこしたいよー"
  end
end

class ChildClass << ParentClass
  def this_is_method(n)
    m = n + 1
    super(m)
  end
end

```
super は同名のメソッドを親クラスから呼び出す事を意味する。

これでChildClassクラスのメソッドthis_is_methodはParentClassクラスのメソッドthis_is_methodよりも一回多くうんこをしたい事になる。


#モジュール
#以下編集中だけどだしちゃう
*インスタンスを持たない
*継承できない
クラスはモノと処理だがモジュールは処理だけ

1.名前空間の提供
2.モジュール関す
3.mix-in

```ruby:class-method.rb
module Hoge
  CONSTANT = 123
  def this_is_method(n)
    puts "#{n.to_s}回うんこしたいよー"
  end
  module_function :hello
end
```
>p Hoge::CONSTANT	#=> 123
>p Hoge.this_is_method(2)


>include Hoge
>p CONSTANT	#=> 123
>this_is_method(n)


カプセルか
ポリモルフィズムを積極的に活用したのがダックタイピング
「アヒルのように歩きアヒルの用に泣くものはアヒルに違いない」
つまり「オブジェクトを特徴付けるのは実際のクラスや継承関係ではなく、そのオブジェクトがどのように振る舞うか」
「種類ではなくどのように振る舞うか」

```ruby:class-method.rb
module Hoge
  def hey(ary)
    ary[1]
  end
end
```
hey({ 1 => "uuu"})でも動く

ArrayかHashは関係ない
replicate-rewrite-dbについて

MySQLはレプリケーションするslaveのdb名を変更することができる。
その際にconfigファイルに `replicate-rewrite-db` という記述をする。

##### 例

* Masterの `sun` スキーマにある `t1` テーブルをSlaveの `ora` スキーマにある `t1` テーブルにレプリケーションする

|m or s  |schema |table |
|:--------:|:---------:|:------:|
|Master |sun        |t1      |
|Slave   |ora        |t1       |

* slaveのconfigに下記を追記

```
[mysqld]
replicate-rewrite-db = sun -> oracle
```
JmeterのBeanshellAssertionについて


JmeterのCounterオブジェクトがちょっと使いにくかったので自分でシーケンス的な変数を定義して使おうと思い、BeanshellAssertionに以下のようなスクリプトを足しました。

```
${__intSum(${sequence}, 1, sequence)};
```

全然動かなくて辛かったのですが、以下のようにしたら動きました。

```
${__intSum(${sequence},1,sequence)};
```

半角スペースが余計でした。
３時間ぐらい使いました。
[リスト]ホスティング型CIツールリスト


時間ができたらブログで記事を書く

* [Codeship](https://www.codeship.io/ "Hosted Continuous Integration and Continuous Deployment. The Codeship.")
* [drone.io](https://drone.io/ "Continuous Integration · drone.io")
* [Travis CI](https://travis-ci.com/ "Travis CI: Continuous Integration and Deployment That Just Works")
* [wercker](http://wercker.com/ "Welcome to wercker")
* [tddium](https://www.tddium.com/ "tddium | Home")
* [CircleCI](https://circleci.com/ "Continuous Integration and Deployment - CircleCI")
Arch linuxのpacmanで `database file for "core" does not exist` とか出た時の対処法

Arch linux で pacman 使おうと思ったらこんなエラー出た。

```
database file for "core" does not exist
database file for "extra" does not exist
database file for "community" does not exist
```

## 解決策

`pacman -Syy`

で同期(？)されてエラーが出なくなる。
td-agentのファイル読み込み設定

### Apache

パッケージ

```shell-session
$ sudo yum -y install httpd
```

パッケージインストール後、Apacheのログのオーナーはroot。

```shell-session
$ ls -ld /var/log/httpd
drwx------ 2 root root 4096 Oct 11 13:14 /var/log/httpd
```

そのため、td-agentグループを追加し、読み込みと実行権を与える。

変更前

```shell-session
$ ls -ld /var/log/httpd
drwx------ 2 root root 4096 Oct 11 13:14 /var/log/httpd
```

実行

```shell-session
$ sudo chgrp td-agent /var/log/httpd/
$ sudo chmod g+rx /var/log/httpd/
```

変更後

```shell-session
$ ls -ld /var/log/httpd
drwxr-x--- 2 root td-agent 4096 Oct 11 13:14 /var/log/httpd
```

### MySQL

パッケージ

```shell-session
$ sudo yum -y install mysql-server
```

パッケージインストール後、MySQLのログのオーナーはmysql。
initスクリプト実行時にグループをmysqlに戻してしまうため、groupを変更しない。
変わりに、mysqlにtd-agentのグループを追加する。

```shell-session
$ ls -l /var/log/mysqld.log 
-rw-r----- 1 mysql mysql 3432 Oct 11 15:43 /var/log/mysqld.log
```

変更前

```shell-session
$ cat /etc/group | grep mysql
mysql:x:27:
```

実行

```shell-session
$ usermod -G mysql td-agent
```

変更後

```shell-session
$ cat /etc/group | grep mysql
mysql:x:27:td-agent
```

### syslog
ファイルのオーナーはrootのため、グループにtd-agentを加える。

変更前

```shell-session
$ ls -l /var/log/messages 
-rw------- 1 root root 73171 Oct 11 15:47 /var/log/messages
```

実行

```shell-session
$ sudo chgrp td-agent /var/log/messages
$ sudo chmod g+rx /var/log/messages
```

変更後

```shell-session
$ ls -l /var/log/messages 
-rw-r-x--- 1 root td-agent 87451 Oct 11 15:52 /var/log/messages
```
適当に決まった月のカレンダーつくる方法

なんか決まった月のカレンダーをつくりたいときにやった方法。もっといい方法ありそう。

まずi18nのlocaleに曜日のリストをつくる。 [svenfuchs/rails-i18n](https://github.com/svenfuchs/rails-i18n)とか使ってると最初からはいってるからべんりー。

```yaml
ja:
  date:
    abbr_day_names:
      - 日
      - 月
      - 火
      - 水
      - 木
      - 金
      - 土
```

つぎに、その月のデータをつくる。

```ruby
# `beginning_of_week`はそのままだと月曜始まりになる。
# 今回は日曜始まり土曜終わりにしたいから`beginning_of_week(:sunday)`として
# 日曜日を週始まりにする。
from_date = Date.new(2013, 10, 1).beginning_of_week(:sunday)
to_date = Date.new(2013, 10, 31).end_of_week(:sunday)
@calendar_data = from_date.upto(to_date)
```

あとはView側でよしなにテーブルにしてやればいい。

```html+erb
<table>
  <tr>
    <!-- こう書くと、ja.ymlの`abbr_day_names`をいいかんじに処理してくれる -->
    <% t('date.abbr_day_names').each do |day_name| %>
      <td><%= day_name %></td>
    <% end %>
  </tr>
  <% @calendar_data.each do |date| %>
    <!-- wdayは曜日を日曜始まりで0〜6でだしてくれる -->
    <% if date.wday == 0 %><tr><% end %>
    <td>
      <%= date.month %>/<%= date.day %>
    </td>
    <% if date.wday == 6 %></tr><% end %>
  <% end %>
</table>
```

結果は下のとおり。

![スクリーンショット 2013-10-11 16.07.02.png](https://qiita-image-store.s3.amazonaws.com/0/2/8bd63a9f-fc70-e6fb-ece1-18b47b51833f.png "スクリーンショット 2013-10-11 16.07.02.png")
Unityの2Dゲーム開発で使ったAsset紹介

Unityでの2Dライトゲームで使ってみたAssetの紹介です。

### NGUI (＄95)
* 3D開発でも重宝するUI作成における鉄板のAsset。
* 開発者がUnityにJoinしたため次期アップデートで似たような機能が組み込まれるかもしれない。
* DrawCallを抑えられるため高パフォーマンスらしい。
* 画像を同Atlasにまとめないとdepthによる描画順コントロールができない。
* ゲームメイン機能とUIとをはっきり区別した開発には向くが、UIの中にゲームオブジェクトを表示させたりするとやりにくかったりする。 (上記描画順制御の関係で)
* 高機能 (ボタン、グリッド表示、スクロール、アニメーションなど)

### 2DToolkit (＄65)
* 開発の後半で試したため結局使わずあまりわからない。。
* 2Dアクションゲームの開発では鉄板のAsset。
* 画像の見た目通りの当たり判定をつけたりできる。
* UIもちょっと用意されてる。

### ex2D (＄35)
* Atlasと使ったパラパラアニメーションに特化したAsset。
* パラパラアニメーションのコマごとに時間を調節したり細かい制御ができる。

### Smooth Moves (＄75)
* キャラクターの画像をパーツごとに用意し骨組みとして動かせるAsset。
(ボーンアニメーションというらしい)
* 少ない画像素材で豊富な種類のアニメーションを作成可能。

### iTween (Free)
* 2Dにかぎらずアニメーションで鉄板のAsset。

### Orthello (Free, Pro $35, UI系 各＄35)
* 無料でもパラパラアニメ、Tweenアニメなどある程度用意されてるAsset。
* 結局アニメーション以外では有料が必要になって序盤で使わないことにした。。


## まとめ

* 2Dゲームの場合
色々揃ってる2DToolkitで構成しUI周りはNGUIでやる。
アニメーションのところで必要になったらSmooth Movesやex2Dを試してみるといいと思います。

* 動くキャラを表示させるなど複雑なUIを作りたい場合
NGUIのDepthでは同Atlasの画像しか描画順を制御できない。NGUIのAtlasにパラパラアニメーションも入れるとAtlasが肥大してしまうし、別Assetのオブジェクトも混ぜたい。NGUIの背面に表示させたいUI群と前面に表示させたいUI群ばどに分けると制御できるが面倒。この部分だけ別のAssetで作るのも手。
Vimで日本語の切り替えで毎回っっっっっっってなる対策

[Vimで日本語の切り替えで毎回っっっっっっってなる対策 / さよならインターネット](http://blog.kenjiskywalker.org/blog/2013/10/11/vim-de-multi_byte_ime/)

`.gvimrc`に  

```
if has('multi_byte_ime') || has('xim') 
  highlight Cursor guifg=NONE guibg=White
  highlight CursorIM guifg=NONE guibg=DarkRed
endif
```

って書いたら

![http://gifzo.net/hfBHJNAZR0.gif](http://gifzo.net/hfBHJNAZR0.gif)  
  
こんな風に全角の時に赤色になるから
ノーマルモードで全角で入力しちゃってうわああああ！！！
っていうことなくなるのでおすすめです。
  
MacVimだと`multi_byte_ime`使えなくて
[macvim-kaoriya](https://code.google.com/p/macvim-kaoriya/)だと使えました。  
マコピーに教えてもらいました。ライフチェインジング！
SNSのウィジェットコードをまとめる

Facebook の「いいね！」ボタンとかのウィジェットを発行してサイトに貼付けようとすると

```html
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
```

こんなコードを5個とか貼付ける事になってかなり邪魔。
コードを読むと

```html
<script id="facebook-jssdk" src="//connect.facebook.net/ja_JP/all.js#xfbml=1" async></script>
```

こんなHTMLを作ってるだけだったりするので、直接これをに書けば良いのではないかと。
これも大量に張ると可読性が悪そうなので、 require.js でまとめる。

```html
<script src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.8/require.min.js"></script>
<script>
require([
    '//www.google-analytics.com/analytics.js', // Analytics
    '//platform.twitter.com/widgets.js',  // Twitter 
    '//connect.facebook.net/ja_JP/all.js',  // Facebook
    '//apis.google.com/js/plusone.js'  // G+
]);
</script>
```
Mac(Mountain Lion)にPython環境を構築


Pythonのインストールにpythonzを使っている記事が多かったが、[ここ](http://kesin.hatenablog.com/entry/2013/07/22/%E7%B5%90%E5%B1%80Python%E3%81%AFvirtualenv%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%81%97%E3%81%9F "Kesin's diary プログラミングの記事がメインです。Python率高し")を参考に、Pythonのインストールはhomebrewで行う。

###Pythonのインストール
```
# 2系のpythonをインストール
% brew install python

# 3系のpythonをインストール
% brew install python3
```

###virtualenvとvirtualenvwrapperのインストール
virtualenvとvirtualenvwrappeについては[この辺](http://blog1.erp2py.com/2011/07/virtualenv.html "今日のPython - VIRTUALENV について")を参照。


```
% pip install virtualenv virtualenvwrapper
```

###virtualenvとvirtualenvwrapperの設定

`.zshrc`に以下を追記

```.zshrc
# virtualenvwrapperが使うpythonを指定
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
# pipをグローバルにインストールした場合でも, virtualenv環境にパッケージをインストールする.
export PIP_RESPECT_VIRTUALENV=true
source "/usr/local/bin/virtualenvwrapper.sh"
```

###仮想環境の作成
```
# python2系を使用するpy2という環境を作成
% mkvirtualenv py2 --python /usr/local/bin/python2

# python3系を使用するpy3という環境を作成
% mkvirtualenv py3 --python /usr/local/bin/python3

# 作成した仮想環境を確認
% lsvirtualenv
py2
===


py3
===


(py3)
```

###virtualenvwrapperコマンド

[virtualenvwrapper 3.5 - コマンドリファレンス](http://virtualenvwrapper-docs-ja.readthedocs.org/en/latest/command_ref.html "virtualenvwrapper 3.5 - コマンドリファレンス")

##参照
・[Kesin's diary プログラミングの記事がメインです。Python率高し - 結局Pythonはvirtualenvで管理してみることにした](http://kesin.hatenablog.com/entry/2013/07/22/%E7%B5%90%E5%B1%80Python%E3%81%AFvirtualenv%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%81%97%E3%81%9F "Kesin's diary プログラミングの記事がメインです。Python率高し")
・[今日のPython - VIRTUALENV について](http://blog1.erp2py.com/2011/07/virtualenv.html "今日のPython - VIRTUALENV について")
・[kanonjiのブログ - pythonzとvirtualenvとvirtualenvwrapperでPython環境構築のメモ](http://kanonji.info/blog/2013/07/11/pythonz%E3%81%A8virtualenv%E3%81%A8virtualenvwrapper%E3%81%A7python%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E3%83%A1%E3%83%A2/ "今日のPython - VIRTUALENV について")
OpenVZのコンテナバックアップ

proxmox3.0で動作している仮想マシンを別のマシンに移動したかったが、マイグレーションのやり方が
分からなかったので手動で行った。

バックアップ
============
proxmox3.0で[openVZ](http://download.openvz.org)のコンテナをバックアップする。

```bash:
# vzdump 101 -dumpdir /root -compress lzo
INFO: starting new backup job: vzdump 101 --dumpdir /root --compress lzo
INFO: Starting Backup of VM 101 (openvz)
INFO: CTID 101 exist unmounted down
INFO: status = stopped
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: creating archive '/root/vzdump-openvz-101-2013_10_11-13_17_03.tar.lzo'
INFO: Total bytes written: 7538493440 (7.1GiB, 23MiB/s)
INFO: archive file size: 3.80GB
INFO: Finished Backup of VM 101 (00:05:45)
INFO: Backup job finished successfully
# ls -lh
total 3.8G
-rw-r--r-- 1 root root  501 Oct 11 13:22 vzdump-openvz-101-2013_10_11-13_17_03.log
-rw-r--r-- 1 root root 3.8G Oct 11 13:22 vzdump-openvz-101-2013_10_11-13_17_03.tar.lzo
```

リストア
============
こっちはproxmox3.1で実施した。

```bash:
# vzrestore vzdump-openvz-101-2013_10_11-13_17_03.tar.lzo 101
extracting archive '/root/tmp/vzdump-openvz-101-2013_10_11-13_17_03.tar.lzo'
Total bytes read: 7538493440 (7.1GiB, 36MiB/s)
restore configuration to '/etc/pve/nodes/myproxmox/openvz/101.conf'
```


# その他

* [Containerのバックアップ - なんとなくWiki](http://seesaawiki.jp/w/nishiwaki0624/d/Container%A4%CE%A5%D0%A5%C3%A5%AF%A5%A2%A5%C3%A5%D7)

* バックアップの中断は`vzdump`をkillすればよい。
carriewaveでExifの回転情報をいい感じにする


```
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  process :fix_rotate
 
  def fix_rotate
    manipulate! do |img|
      img.auto_orient
      yield(img) if block_given?
      img
    end
  end
end
```
直前のコミットを取り消して新しいブランチにコミットし直すのに便利なエイリアス

「直前のコミットの取り消し」「取り消したコミットのやり直し」に相当するコマンドをすぐ忘れるので `uncommit` と `recommit` というエイリアスを作ってある。

```
[alias]
    co = checkout
    uncommit = reset HEAD^
    recommit = commit -c ORIG_HEAD
```

直前のコミットを取り消して、現在のブランチから新しいブランチを切り、直前に取り消したコミットメッセージを再利用して改めてコミットするにはこうする：

```
git uncommit         # コミットを取り消す。変更はワーキングツリーに残る
git co -b new-branch # ブランチを作る
git add .            # 変更をインデックスに追加
git recommit         # 取り消したコミットメッセージを再利用してコミット
AVPlayer#seekToTime で正確な時間に移動する

iOS の動画編集アプリを作っている際に、動画の再生開始の位置を小刻みに調整し、かつ AVPlayer でのプレビューにその位置の映像を表示させたい場合があります。動画素材のトリミングの際などに。

単純に、特定の CMTime に対して、 `AVPlayer#seekToTime:` しただけでは、正確な位置に移動できません。つまりは、シークバー的な細かな移動の実装ができないことを意味します。

そのような実装をする場合は、以下のメソッドを利用するとよいみたいです。

```objc
AVPlayer#seekToTime:toleranceBefore:toleranceAfter:
```

`[time-toleranceBefore, time+toleranceAfter]` というように、範囲を含んだ形でメッセージを送ることで、正確な位置への移動が可能になります。
jQueryでbodyにフラグメントを挿入済みかどうか調べるには？


jQueryでは

```js
var a = $('<div><p>test</p></div>');
```
このようなHTMLの断片を本文に挿入せずに
フラグメントの状態で
offset位置などを取得するとおかしなことになりますよね。
（実際に起こりがちなのはDOMそのものが差し替わっていて参照しているものが違うとか）

このDOMが本文にあるかの
状態を調べる時の一番簡単なものってなんでしょうか？。
思いつくあたりを書いてみました。


```js
var a = $('<div><p>test</p></div>');
var $is_contents = $('html').find(a);
if($is_contents.length>0){

}else{
	//エラー処理
}
```
```js
var a = $('<div><p>test</p></div>');
var $is_contents = a.parents('body');
if($is_contents.length>0){

}else{
	//エラー処理
}
```
あとDOM内に適切なプロパティ持ってるんじゃ無いかと調べてみるとparentNodeがありました。parentElementもあります。

```js
var a = $('<div><p>test</p></div>');

if(a.get(0).parentNode){

}else{
	//エラー処理
}
```
一応こんな感じでできそうなんです、ブラウザ実装状況に問題がなければ。

offset取得やアニメーションなどにはparentNodeがnullだった場合は常にエラーを投げるようにしてもいいかもですね。ただ念のためDocumentFragmentも処理に入れないといけない？

```js
var a = $('<div><p>test</p></div>');
var parent =a.get(0).parentNode;
if(parent && parent.nodeType !== 11){

}else{
	//エラー処理
}
```
parentNodeだとDOMの位置に依存するので意図通りの使い方は限定されそうですが無ければエラー投げれるのでその点では一番使いやすそうです。