OmniAICreator/Qiita-1.07M huggingface dataset:
AWSクレジットでRI買えないみたいなので注意なｗ

# AWSクレジットの一覧画面
↓こんな感じでAWSクレジットがいっぱい手に入ったので、さくっとリザーブドインスタンスでも買ってしまおうかとポチってみたんだ。

![credit.png](https://qiita-image-store.s3.amazonaws.com/0/18726/79e7cd4e-2fbc-dcb9-2e94-e5d8d378b716.png)

EC2ってあるから当然RI購入もできるんだろうなーって思ったのよ。

# その結果…
```text:
＿人人 人人＿
＞ 突然の死 ＜
￣Y^Y^Y^Y￣
```

![invoice.png](https://qiita-image-store.s3.amazonaws.com/0/18726/f4928622-17fa-35ce-a36a-7fe096c7499a.png)

クレジットの適用が$0.00ｗｗ　普通に全額請求が回ってきてたｗ

当然だけどone time feeじゃない部分はちゃんとクレジット適用されて請求ゼロ円になってたけどさ。
StrongParameters のはまりどころ

[StrongParameters](https://github.com/rails/strong_parameters) と[ActionArgs](https://github.com/asakusarb/action_args) を同時に使うと、以下の様な感じのシンタックスでパラメータを制御できる。

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  # ココ注目
  permits :title, :body

  def new
    @article = Article.new
  end

  def create(article)
    @article = Article.new article

    if @article.save
      redirect_to @article, notice: "New article was successfully created."
    else
      render 'new'
    end
  end
end
```

で、ソーシャルメディアに同時に拡散する感じのコードを書いている時にハマった。

```rb:aticles_controller.rb
class ArticlesController < ApplicationController
  # ココ注目
  permits :title, :body, :social_media
...
```

これだと、social_mediaに何も入らなかった。何度やっても無駄だった。謎い。
それもそのはず、viewでは↓こうなっていたから。

```haml:new.html.haml
= form_for @articles do |f|
  .field
    = f.label :social_media_facebook do
      = f.check_box :social_media, { multiple: true }, 'facebook', nil
  .field
    = f.label :social_media_twitter do
      = f.check_box :social_media, { multiple: true }, 'twitter', nil
```

つまり、permitsした`social_media`には複数の値が入る可能性がある、っていうのをStrongParametersにあらかじめお知らせしておかなくてはいけない。
というわけで、↓こう書き換えた。

```rb:articles_controller.rb
  # ココ注目
  permits :title, :body, social_media: []
...
```

万事解決。
heroku db:pull したら gem がないっていわれた


- heroku-toolbelt/2.39.5 (x86_64-darwin10.8.0) ruby/1.9.3
- OSX 10.8.4
- rbenv, homebrew 使用

`gem install heroku` したらこんなこと言われた。

```bash
$ gem install heroku
...
Fetching: heroku-2.39.5.gem (100%)
 !    The `heroku` gem has been deprecated and replaced with the Heroku Toolbelt.
 !    Download and install from: https://toolbelt.heroku.com
 !    For API access, see: https://github.com/heroku/heroku.rb
...
```

これに従って https://toolbelt.heroku.com から Heroku Toolbelt をインストール。
`heroku db:pull` したら下記メッセージ。

```bash
$ heroku db:pull
 !    Taps Load Error: cannot load such file -- taps/operation
 !    You may need to install or update the taps gem to use db commands.
 !    On most systems this will be:
 !
 !    sudo gem install taps
```

`gem install taps` してもだめ。rbenv 使ってるからかな。
`heroku` コマンドの shebang を調べてみる。

```bash
$ head -n 1 `which heroku`
#!/usr/local/heroku/ruby/bin/ruby
```

`/usr/local/heroku/ruby` に自前で ruby 持ってるらしい。
たぶん gem コマンドもあるだろうと思ったらやっぱりあったので、改めて `taps` をインストール。

```bash
$ /usr/local/heroku/ruby/bin/gem install taps
```

その後 `heroku db:pull` すると今度は `sqlite3` がないというのでインストール。

```bash
$ /usr/local/heroku/ruby/bin/gem install sqlite3
```

もっかい試すと `pg` がないと言うのでインストール。

```bash
$ /usr/local/heroku/ruby/bin/gem install pg
```

これで `heroku db:pull` できるようになった。
Vagrant Berkshelf plugin を使う場合のメモ

# Vagrant Berkshelf plugin

RiotGamesがリリースしてる[Berkshelf](http://berkshelf.com/)というプロダクト。
GemfileっぽくBerksfileというファイルに使いたいcookbookを書いていく。

```rb:Berksfile
site :opscode

cookbook 'apt'
cookbook 'git'
cookbook 'ruby'
```

そして、cookbookをネット経由だかリソース経由だかでインストールする。

```
berks install --path cookbooks
```

Berkshelf自体、とても便利。
Vagrantと連携させたいなーと思ってたら
[vagrant-berkshelf plugin](https://github.com/riotgames/vagrant-berkshelf)があった。RiotGames製。

これで、Berksfileにcookbook一覧を書いて
あれこれすれば終わるな～、便利だなーと思ったがはまりどころが。


```rb:Berksfile
site :opscode

cookbook 'rbenv', git: 'https://github.com/fnichol/chef-rbenv.git'
```

んで、こうしてberks installすれば、
rbenvのgithub上で公開されてるクックブックを手元に落としてこれる。便利。

# site-cookbooks転送でハマり

でまあ、```enabled = true```にしないとVagrant Berkshelf plugin無効になってると思うじゃないですか。
そうじゃなかったんですよね。明示的に```enabled = false```にする必要があります。
まあ、Berkshelfの教義に沿うならそりゃcookbooksだけしか使わないですよね...

```rb:Vagrantfile
config.berkshelf.enabled = false
```

はまって週末を無駄にしました...

```rbVagrantfile
chef.cookbooks_path = [ "cookbooks", "site-cookbooks" ]
```

以上のように明示的にcookbooksのパス指定しても、
Vagrant box上にホストマシンからcookbookが転送されないので
「？？？」ってなっちゃって大変でした。

# メタなcookbooksを使うには

Vagrant Berkshelf pluginを使いつつ、メタな、
他のcookbook利用前提のcookbooksを使うにはどうするか。

## cookbookそのものを調整中の場合

Berksfileのcookbookにpathとしてローカルを指定する

```rb:Berksfile-local
cookbook 'my_cookbook', path: "/home/hoge/fuga/site-cookbooks/my_cookbook'
```

ローカル指定(path)しても、Berkshelfは
opscodeにあるcookbook優先して確認しにいくので
cookbookについてはユニークな名称じゃないといけない。

## メタなcookbookが完成した場合

Berksfileのcookbookにメタcookbookのリポジトリを登録する

```rb:Berksfile-git
cookbook 'my_cookbook', git: 'https://github.com/futoase/chef-my_cookbook.git'
```

# その他

chefが既にインストールされてるVagrant box使う場合、
古いバージョンのchefを利用することになるので、[vagrant-omunibus plugin](https://github.com/schisamo/vagrant-omnibus)を利用すると良いです。

```rb:Vagrantfile
config.omnibus.chef_version = "11.4.4" # バージョン 11.4.4 の chef を使いたい場合
```

[knife-solo](https://github.com/matschaffer/knife-solo)使うとか他にもやり方はあるけど、なんかこう手段が多すぎる...

# 他

個人的に[resetさん](https://github.com/reset)とお話してみたい
RailsのマイグレーションをApache経由で実行する

## /etc/sudoers

```
Defaults:nobody !requiretty
Cmnd_Alias RESET=/opt/app/rails/app/public/reset.sh
nobody ALL=(ALL) NOPASSWD:RESET
```

## reset.cgi
```bash:
#!/bin/bash

/usr/bin/sudo /opt/app/rails/app/public/reset.sh
```


## reset.sh

```bash:
#!/bin/bash

echo "

"

export PATH=/usr/local/pgsql/bin:/usr/local/bin:/usr/local/bin:/bin:/usr/bin

cd /opt/app/rails/app

rake db:migrate:reset
rake db:seed

echo "success"
```


## httpd.conf
```
ScriptAlias /cgi-bin/ "/opt/app/rails/app/public/"
<Directory "/opt/app/rails/app/public/">
   AllowOverride None
   Options None
   Order allow,deny
   Allow from all
</Directory>
```
spreadsheetを使用してmodelの中身をxls形式で出力する

### 概要
コントローラから対象モデルのxlsファイルデータを呼び出して
send_dataを使用してxlsファイルをダウンロード出来るようにします。

# application.rb
```rb:
require 'spreadsheet'
require 'stringio'
```

# Gemfile
```rb:
gem 'spreadsheet'
```

# hoge_controller.rb
```rb:
def export_excel
  xls = HogeModel.create_xls
  send_data(xls.string.bytes.to_a.pack("C*"), :filename => 'hoge.xls', :type => 'application/vnd.ms-excel')
end
```

# hoge_model.rb
```rb:
def self.create_xls
  book = Spreadsheet::Workbook.new
  sheet = book.create_worksheet(:name => 'Sheet1')
  hoge = HogeModel.new
  sheet.row(0).replace hoge.column_names
  hoge.all.each_with_index do |col, count|
    sheet.row(count + 1).replace col.attributes.values
  end
end
```

### 不明点(情報求む)
sheetの次row指定に対して追加をするメソッドが見つけられなかったので
each_with_indexでcountを取得して+1しています。
railsでredis-objectsを使う際にはredis-namespaceも使ったほうがいいかも


railsでredisを扱うのに[redis-objects](https://github.com/nateware/redis-objects)とか便利ですよね。

なんですが、このredis-objectsをrailsのARで使用する際、デフォルトではredisのキーは`モデル名:ID:指定したキー`といった形になります。

----

たとえばこんなかんじで使ってるとして

```ruby:config/initializers/redis.rb
Redis.current = Redis.new(:host => '127.0.0.1', :port => 6379)
```

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  include Redis::Objects
  value :hoge
end
```

```ruby
user = User.find(1)
user.hoge.value = 'aaa'
```

redis-cliを使って直接確認。

```
$ redis-cli
redis 127.0.0.1:6379> GET user:1:hoge
"aaa"
```

----

これでも別にいいんですけど、ローカルで開発してて、立ち上げてるredisは1つだけで複数のプロジェクトでredis使ってるなんて時に、もしも他プロジェクトとモデル名とキー名がかぶると面倒なことになっちゃいます。

redisのdb機能を使うって手 ``Redis.new(:host => '127.0.0.1', :port => 6379, :db => 1)`` もあるんですが、数字でしか指定できないので「今までのプロジェクトで何番まで使ってるけ？」みたいなことになりかねないんじゃないかと。

[redis-namespace](https://github.com/resque/redis-namespace)
====

そうならないようにプロジェクト毎にキーが違えばなーって時にはコレ。
READMEにある通り、redisの呼び出し時にキーに指定したnamespaceを追加してくれます。

``` ruby
r = Redis::Namespace.new(:ns, :redis => @r)
r['foo'] = 1000
```

```
$ redis-cli
redis 127.0.0.1:6379> GET ns:foo
"1000"
```

----
これをredis-objectsにも使っちゃいましょう。

```ruby:config/initializers/redis.rb
namespace = [Rails.application.class.parent_name, Rails.env].join ':'
Redis.current = Redis::Namespace.new(namespace,
  :redis => Redis.new(:host => '127.0.0.1', :port => 6379))
```

namespaceはなんでもいいんですが、プロジェクト毎に違うほうがいいので、railsのアプリ名だったり環境名を使えばいいのではないかと。

この設定で先ほどの``User#hoge``の例でいくと、

```ruby
user = User.find(1)
user.hoge.value = 'bbb'
```

```
$ redis-cli
redis 127.0.0.1:6379> GET SampleApp:development:user:1:hoge
"bbb"
```

こんなかんじでキー名にnamespaceがついてます。

----

これでプロジェクト毎に違う名前がつくのでモデル名やらキー名を気にする必要がなくなりますねー。

よかったよかった。
Titanium Mobilde + Alloy でTableViewの長押しイベントをハンドルする

テーブルビューを使ってると、長押し(longpress)イベントを使いたいことがある。
そんなときどうすればいいのか。試してみた。

# longpress or longclick ?

[公式サイトのドキュメント](http://docs.appcelerator.com/titanium/latest/#!/api/Titanium.UI.TableViewRow)を見ると、TableViewRowにlongclickというイベントがあるようだが、これがうまく動かない。

しょうがないのでいろいろ試した結果。以下のようにすると動くっぽい。（iPhone Simulatorのみ動作確認済み）

とりあえず、サンプルを作成しつつ見ていく。
（サンプルなので実際に使う場合は、データの追加処理などが必要だろう。）

# 画面

まず、画面をデザインしておく。

```xml:app/views/index.xml
<Alloy>
    <Collection src="todo" />
	<Window class="container">
   	    <TableView dataCollection="todos" onLongpress="onLongPress" >
       	    <TableViewRow title="{task}" onClick="onClick" />
       	</TableView>
       	</TableView>
    </Window>
</Alloy>
```

# model

次にモデルも作っておく。

```javascript:app/models/todo.js
exports.definition = {
    config: {
        "columns": {
            "task": "TEXT",
            "limitTime": "TEXT",
            "done": "INTEGER"
        },
        "defaults": {
            "task": "-",
            "limitTime": "",
            "done": "false"
        },
        "adapter": {
            "type": "sql",
            "collection_name": "todos",
            "idAttribute": "id"
        }
    },
    extendModel: function (Model) {
        _.extend(Model.prototype, {});
        return Model;
    },
    extendCollection: function (Collection) {
        _.extend(Collection.prototype, {});
        return Collection;
    }
};
```

Collectionのインスタンスを、app/alloy.jsであらかじめ作成しておく。

```javascript:app/alloy.js
Alloy.Collections.todos = Alloy.createCollection('todo');
```

# イベントハンドラ

index.jsに、長押し(longpress)イベントのハンドラを追加する。

```javascript:app/controllers/index.js
function onLongPress(e){
	var index = e.index;  // 行のインデックス（０からはじまる）
	var row = e.row;       // 各行のデータ
	var task = row ? row.title : null;
	Ti.API.info("<<LongPress>>");
	Ti.API.info(index);
	Ti.API.info(task);
}

function onClick(e){
	var index = e.index;  // 行のインデックス（０からはじまる）
	var row = e.row;       // 各行のデータ
	var task = row.title;
	Ti.API.info("<<Click>>");
	Ti.API.info(index);
	Ti.API.info(task);
}

$.index.addEventListener('open', function(){
	var todos = Alloy.Collections.todos;
	todos.fetch();
});

// Free model-view data binding resources when this view-controller closes
$.index.addEventListener('close', function() {
    $.destroy();
});

$.index.open();
```

# 簡単な説明

index.xmlで、

```xml:app/view/index.xml
        <TableView dataCollection="todos" onLongpress="onLongPress" >
            <TableViewRow title="{task}" onClick="onClick" />
        </TableView>
```

のように、
・onLongpressをTableViewでハンドル
・onClickはTableViewRowでハンドル
しているのは、onLongpressもonLongclickもTableViewRowでは捕まえることが出来なかったからです（Titaniumのバージョンによるかもしれませんが…）。

TableViewのonLongpressに渡される引数eと、
TableViewRowのonClickに渡される引数eのデータはほぼ同じ（イベントの種類は当然違いますが）なので、これでいいのかなと思います
Macでzsh環境を整える

## インストール

```zsh
brew install zsh
brew link zsh
chpass -s /usr/local/bin/zsh
```

## oh-my-zsh

https://github.com/robbyrussell/oh-my-zsh


## autojump

https://github.com/joelthelion/autojump


## Incremental completion on zsh

http://mimosa-pudica.net/zsh-incremental.html


## Syntax Highlighting

https://github.com/zsh-users/zsh-syntax-highlighting
ruby で無限リストを作る

先に使い方を考えた。

```ruby
# ブロックなしだと `succ` で進める
builis( 0 ).take(5)
#=> [0,1,2,3,4]

# ブロックなしだと `succ` で進めるので、文字も使える
builis(?a).lazy.zip((1..3).cycle).map( &:join ).take(10).force
#=> ["a1", "b2", "c3", "d1", "e2", "f3", "g1", "h2", "i3", "j1"]

# ブロックありだと、ブロックの評価結果を次の要素にする
builis( 11 ){ |x| [x/2,x*3+1][x%2] }.take_while{ |x| x!=1 }
#=> [11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2]
```

こんなの。
名前は、build list から。

実装はこんな具合

```ruby
def builis( start )
  Enumerator.new do |y|
    i=start
    loop{
      y<<i
      i = block_given? ? yield(i) : i.succ
    }
  end
end
```

便利かどうかはよくわかってない。

使用例追加：

```ruby
#みんな大好きフィボナッチ
builis([0,1]){|x|[x[1],x[0]+x[1]]}.take(15).map(&:first)
#=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

#みんな大好きフィボナッチもう一つ
builis([]){|x| [x,x[0]]}.take(15).map{|x|x.flatten.size}
#=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
```
GLSLについてのメモ

[WebGLの勉強を始めました。](http://qiita.com/edo_m18/items/0ae86d3d680c30eb57c1)の姉妹記事的な感じです。
主にGLSLについてのメモや備忘録を書いていきます。

##ビルトイン関数(一部)

| 関数 | 説明 |
|:-----|:------|
|radians(x)|xを度数からラジアンに変換する|
|degrees(x)|xをラジアンから度数に変換する|
|abs(x)|xの絶対値を返す|
|sign(x)|xが正なら+1.0、0.0なら0.0、負なら-1.0を返す|
|floor(x)|x以下の最大の整数を返す|
|ceil(x)|x以上の最小の整数を返す|
|fract(x)|x-floor(x)を返す|
|mod(x, y)|x-y*floor(x/y)を返す|
|min(x, y)|xとyのより小さい値を返す|
|max(x, y)|xとyのより大きい値を返す|
|clamp(x, a, b)|min(max(x, a), b)を返す。なお、HLSLなどで実装されている `saturate` 関数は、`clamp(a, 0.0, 1.0)` によって実現できる |
|mix(x, y, a)|x(1-a)+y*aを返す（つまり線形補間）|
|step(a, x)| aはしきい値、xはチェックされる値。しきい値未満の場合は0.0を、それ以上の場合は1.0の二値化を行う関数 |
|smoothstep(e0, e1, x)|エルミート補完を行う|
|sin(x)|正弦を返す|
|cos(x)|余弦を返す|
|tan(x)|正接を返す|
|asin(x)|逆正弦を返す|
|acos(x)|逆余弦を返す|
|atan(y, x)|逆正接を返す|
|pow(x, y)|xのy乗を返す|
|exp(x)|eのx乗を返す|
|log(x)|xの自然対数を返す|
|exp2(x)|2のx乗を返す|
|log2(x)|xの底2のlogを返す|
|sqrt(x)|xの平方根を返す|
|inverssqrt(x)|1/sqrt(x)を返す|


##ベクトル用ビルトイン関数(一部)

| 関数 | 説明 |
|:-----|:------|
|length(x)|xの長さをfloatで返す|
|distance(x, y)|xとyの距離をfloatで返す|
|normalize(x)|xを正規化した値を返す|
|dot(x, y)|xとyの内積をfloatで返す|
|cross(v1, v2)|vec3型の引数v1とv2の外積をvec3で返す|
|faceforward(N, I, R)|dot(R, I) < 0ならNを返し、それ以外は-Nを返す|
|reflect(I, N)|Nを法線として、Iの反射方向をIと同じ型で返す|
|refract(I, N, eta)|Nを法線、eta（常にfloat型）を屈折率として、Iの屈折方向をIと同じ型で返す|

##ベクトルの比較演算

| 関数 | 説明 |
|:-----|:------|
|lessThan(x, y)|要素ごとの x < y の比較結果を返します|
|lessThanEqual(x, y)|要素ごとの x <= y の比較結果を返します|
|greaterThan(x, y)|要素ごとの x > y の比較結果を返します|
|greaterThanEqual(x, y)|要素ごとの x >= y の比較結果を返します|
|equal(x, y)|要素ごとの x == y の比較結果を返します|
|notEqual(x, y)|要素ごとの x != y の比較結果を返します|
|any(x)|xのすべての要素がfalseならfalseを、それ以外ならtrueを返します|
|all(x)|xのすべての要素がtrueならtrueを、それ以外ならfalseを返します|
|not(x)|xの全要素の真偽値を反転して返します|
Adobe JSXでPhotoshopのレイヤーにカラーラベルをつける

こんなクラスを用意して、

```js:
#target photoshop

var PSLayerUtil = function() {
  this._colorRef = new ActionReference();
  this._colorRef.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
}
PSLayerUtil.LayerColors = {
  Red: 'Rd  ',
  Orange: 'Orng',
  Yellow: 'Ylw ',
  Green: 'Grn ',
  Blue: 'Bl  ',
  Violet: 'Vlt ',
  Gray: 'Gry ',
  None: 'None',
};
PSLayerUtil.prototype = {
  _colorRef: null,
  setLayerColor: function(layerColor) {
    var colorDescriptor = new ActionDescriptor();
    colorDescriptor.putEnumerated(charIDToTypeID('Clr '), charIDToTypeID('Clr '), charIDToTypeID(layerColor));
    var desc = new ActionDescriptor();
    desc.putReference(charIDToTypeID('null'), this._colorRef);
    desc.putObject(charIDToTypeID('T   '), charIDToTypeID('Lyr '), colorDescriptor);
    executeAction(charIDToTypeID('setd'), desc, DialogModes.NO);
    return this.layerColor();
  },
  layerColor: function() {
    var desc = executeActionGet(this._colorRef);
    var charID = typeIDToCharID(desc.getEnumerationValue(charIDToTypeID('Clr ')));
    for(var key in PSLayerUtil.LayerColors) {
      var value = PSLayerUtil.LayerColors[key];
      if(value === charID) return key;
    }
    return 'None';
  },
}
```

こんな感じで実行すれば、

```js:
var util = new PSLayerUtil();
alert(util.setLayerColor(PSLayerUtil.LayerColors.Red));
```

選択してるレイヤーにカラーラベルが付くらしい。
で、せっかくなので[GitHub](https://github.com/mazgi/Anice/wiki)で公開してみた。
iOSアプリ開発メモ（環境構築編その１）


これからiOSアプリ開発をしていく。
これまでにiOSアプリの勉強をちびちびとやってきたが、モチベーションの波が激しくなかなか進まない現状を打破したいという思いから、こうして世間に取り組みを公開していくことにした。
こうして自分に発破をかけるとともに、諸先輩方々からアドバイスなり指摘なりいただけたらいいなぁと考えている。

まず環境構築から。

以前から開発はしているので、XCodeのインストール、Appleの開発者登録も完了している。
したがってそれ以降の作業をメモする。

とりあえず次のような環境を構築したい。

1.  WindowsHomeServer2011上に構築されたGitリポジトリ
2. JenkinsによるiOSアプリビルド環境

この記事では1.についてまとめる。

#サーバ側（WindowsHomeServer2011）の設定
WindowsHomeServer2011（以下、WHS）のGit環境を構築する。
構築にあたっては以下のサイトを参考にした。
[WindowsでGit共有リポジトリをさくっと構築](http://thinking-megane.blogspot.jp/2012/07/windowsgit.html "WindowsでGit共有リポジトリをさくっと構築")
##Gitインストール
###msysGit
Windows用のGit「msysGit」を以下のサイトからダウンロードする。

[msysgit](https://code.google.com/p/msysgit/downloads/list)

※この時点の最新版は Git-1.8.3-preview20130601.exe

ダウンロードしたファイルを実行してインストール。

##共有リポジトリの作成
**共有リポジトリのベース**
WHSダッシュボードから以下の場所に共有リポジトリのベースを作成。
D:\ServerFolders\Repository

**共有リポジトリフォルダの作成**
XCodeプロジェクト毎に共有リポジトリを用意する必要があるので、ベースフォルダ内に各プロジェクト用のフォルダを作成する。ここでは”study.git"フォルダを作成。
※フォルダ名には".git"をつけるが慣例らしい

git bash起動し、作成した"study.git"フォルダに移動する。
`cd /d/ServerFolders/Repository/study.git`

続けてリポジトリの初期化をする。
`$git init --bare --shared=true`
"study.git"フォルダ内に各種ファイルが生成される。

以上でサーバ側の準備が完了。

##GitDaemonの起動
XCodeからアクセスするため、GitDaemonサービスを起動する。
以下のページを参考にバッチを作成してスタートアップに登録しておく。
https://gist.github.com/anonymous/3169875

**Windowsファイヤーウォールの設定**
リモートリポジトリへのアクセスに使用するポートを、Windowsファイヤーウォールの設定で開放する。
使用ポート：TCP/9418

以上で、サーバ側の設定は完了です。

#クライアント側（Mac）の設定
クライアント側のGit環境を構築する。
構築にあたっては以下のサイトを参考にした。
[WindowsでGit共有リポジトリをさくっと構築](http://thinking-megane.blogspot.jp/2012/07/windowsgit.html "WindowsでGit共有リポジトリをさくっと構築")
[Using GitHub Guide For Xcode](https://github.com/h-kagawa/iPhoneAppMakingGroup/wiki/Using-GitHub-Guide-For-Xcode)
[UQ Times 開発の記録](http://uqtimes.blogspot.jp/2012/05/xcodegithub.html)
##Gitクライアントインストール
###MacPorts
MackPortsを以下のサイトからダウンロードする
[MacPorts](http://www.macports.org/install.php)

「Mac OS X Package (.pkg) Installer」のセクションからMountain Lion用のインストーラをダウンロード。
今回ダウンロードしたのはMacPorts-2.1.3-10.8-MountainLion.pkg

###Command Line Tools for Xcode
Xcodeメニュー[Xcode]->[Open Developer Tool]->[More Developer Tool]を選択。
ブラウザが起動するので、AppleID認証画面で認証。
認証後に表示されたサイト「Download for Apple Developer」にて「Command Line Tool for Xcode」の最新版パッケージをダウンロードし、インストールする。
*この時点の最新版は xcode462_cltools_10_86938259a.dmg

###Git
以下のコマンドをターミナルから実行。
`$sudo port install git-core`

##XCodeプロジェクトの作成
XCodeを起動してプロジェクトを作成する。
プロジェクト名は、わかりやすいように共有リポジトリ名から".git"を除いた”Study"とする。
Source Controlのチェックボックスにチェックを入れてCreateボタン。
以上。

##リモートリポジトリとの関連付け
プロジェクトのローカルリポジトリとリモートリポジトリの関連付けを行う。
Xcodeメニュー[File]->[Source Control]->[Repositories…]を選択。

[Orgnizer - Repositories]ウィンドウが開く。

ウィンドウ左側のツリーから、[Study]->[Remotes]と選択。

ウィンドウ右側の下部にある[Add Remote]をクリック。
入力欄に以下のように入力し、Createをクリック。

* Remote Name:"origin" ←なんでもよい
* Location:"git://[サーバ名]/Study.git"　←サーバ側に作成したリポジトリを指定

以上でクライアント側の設定は完了。

##動作確認
###ローカルリポジトリへコミット
リモートリポジトリへ登録する前にローカルリポジトリへコミットが必要。
Xcodeメニュー[File]->[Source Control]->[Commit…]

**コミットする際の注意**
以下のファイルはコミットしないこと！
* project.xcworkspace
* xcuserdata

###リモートリポジトリへプッシュ
コミットが済んだら、リモートリポジトリへプッシュできる。
Xcodeメニュー[File]->[Source Control]->[Push…]

リポジトリ選択のダイアログが表示されるので、作成したリポジトリを選択してPushボタンをクリックする。

以上！
JavaScriptでのクラス定義


## よく使うパターン
あんまり意味のないHelloクラスを定義してみる

```js
var Hello = (function(){
	// constructor
	function Hello(name){
		this._name = name;
	}
	
	// private method
	function say(message){
		console.log(message + ', ' + this._name);
	}

	// public method
	function hello(){
		say.call(this, 'Hello');
	}

	Hello.prototype = {
		// constructor 修正
		constructor: Hello,
		// 以下 public メソッド
		hello: hello
	};
	return Hello;
}());
```
このパターンのポイントは、即時関数内にクラスに関係あるメソッドや変数をまとめるところ。
クラスの定義以外は、即時関数の外を汚さない。
また、公開したいインターフェースは最後の`prototype`に列挙するだけでいいのもポイント高い。

## 継承

このパターンで継承する場合ちょっとややこしくなる。
というかJSで継承しようとするとややこしくなる。

```js
var Animal = (function(){
	function Animal(name){
		this._name = name;
	}
	function say(){
		throw new Error('not implemented');
	}
	Animal.prototype = {
		constructor: Animal,
		say: say
	};
	return Animal;
}());

var Dog = (function(){
	function Dog(name){
		// super call
		Animal.call(this, name);
	}
	function say(){
		console.log('bowwow');
	}
	// Animal.prototype をプロトタイプチェーンに追加したいが、コンストラクタが邪魔なのでちょっと細工する
	Dog.prototype = (function(){
		function F(){}
		F.prototype = Animal.prototype;
		return new F();
	}());

	// 複数メソッドを定義する場合、並べて書かないとダメなのであまりイケてない
	Dog.prototype.constructor = Dog;
	Dog.prototype.say = say;
	return Dog;
}());
```

## `Object.create` が使えるなら

ちょっとスマートに書ける

```js
var Animal = (function(){
	function Animal(name){
		this._name = name;
	}
	function say(){
		throw new Error('not implemented');
	}
	Animal.prototype = {
		constructor: Animal,
		say: say
	};
	return Animal;
}());

var Dog = (function(){
	function Dog(name){
		// super call
		Animal.call(this, name);
	}
	function say(){
		console.log('bowwow');
	}
	// すっきり！
	Dog.prototype = Object.create(Array.prototype);

	// でもここはやっぱりイケてない
	Dog.prototype.constructor = Dog;
	Dog.prototype.say = say;
	return Dog;
}());
```
Rails 4.0 でSporkを動かすと uninitialized constant ActiveModel::Observing (NameError) と出る


参考
[Rails4でsporkがエラー - rochefort's blog](http://rochefort.hatenablog.com/entry/2013/03/30/221345)

上記ブログに書いてあるとおり、

```bash:
gem search spork --pre
```
でspork 1.0.0rc3を探してきて、

```Gemfile
gem 'spork', '1.0.0rc3'
```

と記入後、

```bash:
bundle update spork
```

とかやると動くようになりました。
サーブレット･フィルタによるApache Struts2の脆弱性(S2-016)への対応


[Apache Struts の脆弱性 (S2-016) に関する注意喚起](https://www.jpcert.or.jp/at/2013/at130033.html)に対して、struts2のバージョンアップをするのが最善ですが、何らかの事情によりバージョンアップが難しい場合の対応策の一つとして、サーブレット・フィルタによる防御があります。

## サーブレット・フィルタのコード

```java:AttackURLParamBlockFilter.java
	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain filter) throws IOException, ServletException {
		Enumeration<?> params = req.getParameterNames();

		while (params.hasMoreElements()) {
			String paramName = (String) params.nextElement();
			String paramValue = req.getParameter(paramName);
			
			if (isSafetyParam(paramName, paramValue)) {
				continue;
			}
			throw new IllegalArgumentException(
					String.format(
							"Bad request '%s' was detected.\n",
							paramName, paramValue));
		}

		filter.doFilter(req, res);
	}

	private static boolean isSafetyParam(String name, String value) {
		// S2-016(http://struts.apache.org/development/2.x/docs/s2-016.html)
		for (String target : new String[] { name, value }) {
			if (target.matches(".*\\%\\{.+\\}.*")
					|| target.matches(".*\\$\\{.+\\}.*")) {
				return false;
			}
		}
		// S2-017(http://struts.apache.org/development/2.x/docs/s2-017.html)
		if (name.matches(".*redirect:.*")
				|| name.matches(".*redirectAction:.*")) {
			return false;
		}

		return true;
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
```

## web.xmlの設定

コンパイルして適当に配置し、web.xmlに以下の様に記述する事で、フィルタとして機能します。注意点として、サーブレットフィルタの実行順は、web.xml中に記載したfilter-mappingの順になるという点が挙げられます。

このため、struts2用のフィルタ設定よりも前に、以下の設定を記述する必要があります。

```xml:web.xml
  <filter>
    <filter-name>s2016filter</filter-name>
    <filter-class>com.example.s2016filter.AttackURLParamBlockFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>s2016filter</filter-name>
    <url-pattern>*</url-pattern>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>
```

## 効果を確認する

[strutsのホームページに記載されている検証用のコード](http://struts.apache.org/release/2.3.x/docs/s2-016.html)により効果を確認する事が出来ます。

## どのような場合に有効か

struts2のバージョンアップが出来ない場合も、Apacheのmod_rewriteやファイアウォールなどで防御すれば良いだけなので、あまり有効な場面は無いかも知れません。ApacheなどのWebサーバと連携していない場合も、[UrlRewriteFilter](http://tuckey.org/urlrewrite/)を利用すれば同じ事が出来ます。
ライブラリにtemplate関数が入っている場合のリンクエラーの対処

以下の関数がライブラリに含まれているとする。

```cpp
template <typename T>
void hoge(T h);
```

テンプレート関数がライブラリに含まれている場合、ライブラリがリンク先でどのような型でこの関数が使われるかわからないため、リンクに失敗する。
ライブラリ内に以下のように宣言することで解決する。
例：`double`型で使用。

```cpp
template <typename T>
void hoge(T h);

template void hoge(double h);
```
PHPで関数合成を書いてみる


<a href="http://qiita.com/yuya_takeyama/items/858c5a0652441f54f0a8" target="_blank">PHP で関数合成 - Qiita [キータ]</a>

こちらの投稿がとても興味深かったので、自分なりに書いてみました。

```php:
<?php
class Compose
{
    public static function _()
    {
        $callables = func_get_args();

        return array_reduce($callables, function ($a, $b) {
            if ($a === null) {
                return function () use ($b) {
                    return call_user_func_array($b, func_get_args());
                };
            } else {
                return function ($arg) use ($a, $b) {
                    return call_user_func($b, $a($arg));
                };
            }
        });

    }
}


$mapUcfirst = function ($arg) {
    return array_map('ucfirst', $arg);
};

$splitWithUnderscore = function ($arg) {
    return explode('_', $arg);
};


$camelize = Compose::_($splitWithUnderscore, $mapUcfirst, 'join');
var_dump($camelize('man_with_a_mission'));
// ManWithAMission
```
HerokuからTwitterのAPIにアクセス出来ない問題

Herokuにあげたアプリケーションで、Twitter認証ができなくなる問題に遭遇(現在は解決？)。


```
(twitter) Authentication failure! timeout: Net::OpenTimeout, execution expired
```

なるものが出ていたので、ググると、同じ症状の人がいた。

[ruby on rails - (twitter) Authentication failure! timeout: Net::OpenTimeout, execution expired - Stack Overflow](http://stackoverflow.com/questions/17847233/twitter-authentication-failure-timeout-netopentimeout-execution-expired)

[ruby on rails - Twitter connection timeout - Stack Overflow](http://stackoverflow.com/questions/17817470/twitter-connection-timeout?noredirect=1#comment26066985_17817470)

どうやら、HerokuのIPがTwitterのブラックリストに載って、ブロックされているらしい。

[Heroku's primary IP addresses are being blocked by Twitter | Twitter Developers](https://dev.twitter.com/discussions/20185)

<del>どうしよう…</del>

僕の環境では、復活してましたが、皆さんのところではどうなんでしょう…
謎な挙動


CHOICE_MODE_SINGLE状態のListViewで指定したpositionのitemをチェック状態にしてListViewの先頭に表示する場合

こっちだと動かない

```java
		mListView.setSelection(position);
		mListView.setItemChecked(position, true);
```

こっちだと動く

```java
		mListView.setItemChecked(position, true);
		mListView.setSelection(position);
```

うーむ。。
コピペで使えるフォーム値取得jQuery

（2014-07-07 追記）

フォーム値取得＆設定するjQueryプラグイン作ったので、良ければそちらも。

* https://github.com/ginpei/jQuery.formval.js

（追記おわり）

# 共通: 要素検索

`name`属性で検索するのが手っ取り早くて良いと思います。

```html:
<form id="my-form">
  <input type="text" name="my-text" value="This is text." />
</form>
```

```js:
var $input = $('#my-form [name=my-text]');
```

# テキスト

```html:
<form id="my-form">
  <input type="text" name="my-text" value="This is text." />
</form>
```

```js:
var val = $('#my-form [name=my-text]').val();
console.log(val);  // => "This is text."
```

数字のときは`val=Number(val)||0;`とかしてください。

# ラジオボタン

```html:
<form id="my-form">
  <input type="radio" name="my-radio" value="A" />
  <input type="radio" name="my-radio" value="B" checked />
  <input type="radio" name="my-radio" value="C" />
</form>
```

```js:
var val = $('#my-form [name=my-radio]:checked').val();
console.log(val);  // => "B"
```

# チェックボックス

```html:
<form id="my-form">
  <input type="checkbox" name="my-checkbox" value="A" />
  <input type="checkbox" name="my-checkbox" value="B" checked />
  <input type="checkbox" name="my-checkbox" value="C" checked />
</form>
```

```js:
var $checked = $('#my-form [name=my-checkbox]:checked');
var valList = $checked.map(function(index, el) { return $(this).val(); });
console.log(valList);  // => ["B", "C"]
```

# セレクトボックス（単数）

```html:
<form id="my-form">
  <select name="my-select">
    <option value="A">This is A</option>
    <option value="B" selected>This is B</option>
    <option value="C">This is C</option>
  </select>
</form>
```

```js:
var val = $('#my-form [name=my-select]').val();
console.log(val);  // => "B"

// おまけ: 値ではなくラベル文字列が欲しいとき
var text = $('#my-form [name=my-select] option:selected').text();
console.log(text);  // => "This is B"
```

# セレクトボックス（複数）

```html:
<form id="my-form">
  <select name="my-multi-select" size="3" multiple>
    <option value="A">This is A</option>
    <option value="B" selected>This is B</option>
    <option value="C" selected>This is C</option>
  </select>
</form>
```

```js:
var val = $('#my-form [name=my-multi-select]').val();
console.log(val);  // => ["B", "C"]
```

# 元ネタ

というか、そのまんま。自分のブログから転載。

* [jQueryでフォームの値を取得する方法をまとめておくので、コピペでご利用ください。 | Ginpen.com](http://ginpen.com/2012/05/21/how-to-get-values-from-form-with-jquery/)
Git で最新のコミットのコミットログの summary を取得

```bash
git log -1 --oneline | cut -b 9-
```

これでいいんですかね？こう書く以外に特に良さそうな方法が分からない (cut の代わりに sed 使うとか awk 使うとかじゃなくて git のコマンドの方)．
Chrome拡張「measureit!」を入れている環境でjsエラーが出てしまうとき


## 結論から言うと
**window.onload**をやめましょう。

## なぜかというと
「measureit!」は、window.onloadを使って初期化処理を行っているが、
すでにonloadが設定されていた場合の回避法がちょっと雑っぽい。


こまかく内部で何が起きてるかは調査中。
続報をおまちください。(書くかわからないけど)
TitaniumでiOSのフォトライブラリにアルバムを作って画像を保存する方法

　Titanium mobileで作ったiOSアプリにおいて、カメラ機能やスクリーンショット機能で生成された画像データは、全部カメラロールに入ってしまうと思います。しかし、アプリごとにアルバム分けをして便利に画像の処理をしたい事もあるでしょう。Obj-Cでネイティブ開発しているなら簡単にアルバムを生成して、画像の保存先をそのアルバムに指定できるのですが、Titaniumでは外部のmoduleを使う必要があります。便利なモジュールはこちら、

- TiCustomPhotoAlbum｜https://github.com/hank7444/TiCustomPhotoAlbum

　このモジュールを`clone`とか`fork`して、手元で`$python build.py`してあげるとビルドが走ります。モジュールの使い方は、他のブログに記載されているので、そちらを参考にして下さい。

- 参考ページ｜http://watalucky.com/2011/08/23/【titanium】【tistorekit】モジュールを追加する方法/

　`tiapp.xml`を直接編集する方法もありますが、GUIのmodulesから追加してあげれば簡単です。

![スクリーンショット 2013-07-31 18.16.10.png](https://qiita-image-store.s3.amazonaws.com/0/9774/7f67fe12-981f-ad4b-6f99-6d0e7cb1766c.png "スクリーンショット 2013-07-31 18.16.10.png")

　ここで`ti.customphotoalbum`が見つからなかったら、置く場所やディレクトリ構造がおかしい可能性があるので確認してみて下さい。ここまでできたら、後はサンプルを見ながら下記の様なコードを書きます。

```js:useCostomPhotoAlbum
var image = "test.png";
var costomPhotoAlbum = require('ti.customphotoalbum');

costomPhotoAlbum.addCustomAlbumAndSaveImage(image, "ALBUM_NAME");
```

　こうすると、`"ALBUM_NAME"`に記載したアルバムが生成され、`image`に格納されている画像がそのアルバムに保存されます。ちなみに、`"ALBUM_NAME"`は2バイト文字でも指定可能でした。
Wiki、リポジトリのPHPコードの日本語が文字化けする

文字化けを回避する一つの方法として、PHPソースをJavaScriptとして認識させる。

## 環境
* Redmine 2.2.0

## 変更ソース

```rb:
*** syntax_highlighting.rb.default      2012-12-18 22:07:43.000000000 +0900
--- syntax_highlighting.rb      2013-07-31 16:59:23.599810790 +0900
***************
*** 40,51 ****
--- 40,53 ----
          # Should not return line numbers nor outer pre tag
          def highlight_by_filename(text, filename)
            language = ::CodeRay::FileType[filename]
+           language = :java_script if language == 'php' || language == :php
            language ? ::CodeRay.scan(text, language).html(:break_lines => true) : ERB::Util.h(text)
          end
  
          # Highlights +text+ using +language+ syntax
          # Should not return outer pre tag
          def highlight_by_language(text, language)
+           language = :java_script if language == 'php' || language == :php
            ::CodeRay.scan(text, language).html(:wrap => :span)
          end
        end
CloudFormationの分割とチェーン実行を試してみる

[JAWS-UG 島根支部 第0回勉強会](http://d.hatena.ne.jp/yoshidashingo/20130727/1374890824)に参加してCloudFormationのTipsとしてTemplateは分割してチェーン実行すると良いというのを知ったので試してみた。

今までどーんと1つのTemplate作ってしまってたけど、これだと実用的に利用出来そう。

### 呼び出すTemplate

 * 以下のTemplate作成してs3-ap-northeast-1のhogemoge-publicバケットにs3_bucket_policy.templateの名前で配置しアクセスできるようにしておく
 * Parametersで指定されたS3バケットに適当なバケットポリシーを設定してポリシー名を出力する簡単なTemplate

```json:
{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "test",

  "Parameters" : {
    "BucketName" : {
      "Type" : "String",
      "Default" : "",
      "Description" : ""
    }
  },
  
  "Resources" : {
    "S3BucketPolicy" : {
      "Type" : "AWS::S3::BucketPolicy",
      "Properties" : {
        "PolicyDocument" : {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "AWS": "*" },
            "Action": "s3:GetObject",
            "Resource": { 
              "Fn::Join" : [ 
                "", 
                ["arn:aws:s3:::", { "Ref" : "BucketName" }, "/*" ]
              ]
            }, 
            "Condition": {
		      "StringLike": {
			     "aws:UserAgent": [ "hoge*" ]
			  }
		    }
          }]
        },
        
        "Bucket" : { "Ref" : "BucketName" }
      }
    }
  },
  
  "Outputs" : {
    "S3BucketPolicy" : {
      "Value" : { "Ref" : "S3BucketPolicy" }
    }
  }
}
```

### 大元のTemplate

 * 他のTemplateを呼び出す際のResourceは以下のようにする
  * TypeはAWS::CloudFormation::Stack
  * TemplateURLで呼び出すTemplateを指定
  * TemplateのParametersがある場合はそれも指定
 * 呼び出したTemplateのOutputsを以下のように参照可能
  * { "Fn::GetAtt" : ["[Template呼び出したResource名]", "Outputs.[TemplateのOutputsのキー指定]"]}

```json:
{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "test",

  "Resources" : {
    "Bucket" : {
      "Type" : "AWS::S3::Bucket"
    },
    
    "BucketPolicy" : {
      "Type" : "AWS::CloudFormation::Stack",
      "Properties" : {
        "TemplateURL" : "https://s3-ap-northeast-1.amazonaws.com/hogemoge-public/s3_bucket_policy.template",
        "Parameters" : {
          "BucketName" : { "Ref" : "Bucket" }
        }
      }
    }
  },

  "Outputs" : {
    "S3BucketPolicy" : {
      "Value" : { "Fn::GetAtt" : ["BucketPolicy", "Outputs.S3BucketPolicy"]}
    }
  }
}
```

### Templateのチェーン実行

 * 大元のTemplate（hoge）を実行
  * 呼び出すTemplate（hoge-bucketpolicy-8tffgtdxlxim）も実行され結果が表示された

![cloudformation_run.jpg](https://qiita-image-store.s3.amazonaws.com/0/16768/34581ff6-0598-d219-91ce-d4d3dcfe1b7d.jpeg)
CentOS 6.4 でのスワップ領域の拡張

メモリ4GB、スワップ4GBの状態から、メモリを12GBまで増設したため、スワップを24GBにしたくなった。
対象は CentOS 6.4。イマドキは LVM を使っているので、昔とはオモムキが違い、あたふたしたので、メモしておく。

##現状の確認
今回対象の環境は HDD が1台のっているだけの PC。LVM 的に言うと、PV (物理ボリューム) が1つ。
VG (ボリュームグループ) も1つだけ設定されており、そこにはこの環境唯一の PV が含まれているだけ。
LV (論理ボリューム) は root, home, swap の3つが作られており、VG の空きは無し。
root, home 上には ext4 のファイルシステムが作られており、swap はスワップ領域。

##手順の確認
VG に空きがないので、swap の LV を拡張するには、root か home の LV を縮めないといけない。
home にかなり余裕があるので、home を縮め、その分を swap に回すことにする。
つまり、home LV 内のファイルシステムを縮める → home LV を縮める → swap LV を広げる という手順になる。

##home ファイルシステムの縮小後のサイズの把握
現在のサイズを調べ、欲しい容量を確保するにはいくつに縮めれば良いかを把握する。

```console
# df -Th /home
Filesystem    Type    Size  Used Avail Use% マウント位置
/dev/mapper/vg_hostname-lv_home
              ext4    176G  7.4G  160G   4% /home
```

欲しい容量は24GB-4GB=20GB。空きは十分にあるので、30GB縮めて146Gにすることにする。

##home ファイルシステムの縮小
home をアンマウントし、ファイルシステムのリサイズ。

```console
# umount /home
# e2fsck -f /dev/mapper/vg_hostname-lv_home
# resize2fs /dev/mapper/vg_hostname-lv_home 146G
```

resize2fs の引数に Step 3 で把握した容量を指定。

##home LV の縮小
home LV の縮小を行う。swap は余裕を見て +21G したいので、21G 縮めることにする。

```console
# lvresize -L -21G /dev/mapper/vg_hostname-lv_home
  WARNING: Reducing active logical volume to 157.56 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_home? [y/n]: y
  Reducing logical volume lv_home to 157.56 GiB
  Logical volume lv_home successfully resized
```

##home ファイルシステムの再拡張
home ファイルシステムは、余裕を見て30GB縮めたが、home LV は21Gしか縮めていない。
home LV に9GBほど空き容量が残っているはずなので、これを home ファイルシステムに返す。

```console
# resize2fs /dev/mapper/vg_hostname-lv_home
# mount /home
```

ここまで終われば、home に関する操作は終わりなので、再マウントしておく。

##swapの拡張

```console
# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       3964920 83592   -1
# swapoff /dev/dm-1
# lvresize -L +21G /dev/mapper/vg_hostname-lv_swap
# mkswap /dev/mapper/vg_hostname-lv_swap
# swapon /dev/mapper/vg_hostname-lv_swap
# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       25985016        0       -1
# free
             total       used       free     shared    buffers     cached
Mem:      12095724     335500   11760224          0      17752      77756
-/+ buffers/cache:     239992   11855732
Swap:     25985016          0   25985016
```

スワップの使用を止め、swap LV を拡張し、mkswap で領域の再作成後、スワップの使用を再開。
free でスワップが増えていることを確認して終了。
zsh, plenv(rbenv), parallel

## 読むべき人
- .zshrcに `export PATH=` を全部書いてる人
- .zshrcの中で `eval (plenv init -)` をやってる人
- .plenv/shimsを明示的に$PATHに追加してない人

どれか当てはまったらいつかハマるかも．

- process fork してperl 呼ぶと system perl が呼ばれちゃう人

の助けになるかも．

- 「vim quickrunでplenv(rbenv)のperl(ruby)が呼ばれてない！」

って人も助かるかも．

GNU parallelを使って並列処理する機会がありハマったのでめもしておきます．

## 問題
zshの設定ファイルには.zshenv, .zprofile, .zshrc等がありますが，それぞれ読まれ方が違います．
参考：http://news.mynavi.jp/column/zsh/001/index.html

```zsh:
zsh hogehoge.sh
```
とかやった場合は.zshenvしか読まれないようです．

ここで気になるのはPATHがどうなるかですが，.zshenvに書いてなければ当然exportされません．
通したはずのPATHが通ってない！と困ることになります．
また perl の error では @INC に module への path がないよ！みたいな感じになります．

あと plenv を init する際に plenv の perl の path が export されるので，.zshenv に plenv init を書いてる人は問題が起きません．

```pl:
sub CMD_init {
    home_init();
    print <<"...";
export PATH="$PLENV_HOME/shims:\${PATH}"
...
}
```

ただし.zshenv が読まれるたびに plenv init するのでオーバーヘッドが気になります．
oh-my-zsh 使ってると oh-my-zsh バージョンチェックのために zsh コマンドを使っていてそのタイミングでも plenv init するので余計気になります．
（そもそもoh-my-zshをマニュアル通りにインストールして使おうとすると .zshrc 読まないと .zshenv の内容読めないような気がするんだけどどうなんだろう…）

## 解決
- zsh の設定ファイルがそれぞれいつ読まれるのか把握する
- .plenv/shims も $PATH に入れとく
- export PATH を .zshenv に書く
- plenv init は .zshrc に書く

いろいろ試した結果これがいいかなあと思います．

## 2013-07-04追記
tmux使ってて新しいタブ開くと.zshenvが二回読まれててなんだろなとおもってたんですが，.tmux.confで

```
set-option -g default-command "reattach-to-user-namespace -l zsh"
```
としてzsh起動してました．
謎が解けた．

## 2013-07-08追記
まったく意識せずに書いてましたが私の環境では plenv を homebrew で入れてます．
なので

```zsh:
`brew --prefix`/bin
```
に plenv 自体のシンボリックリンクがある状態です．

```zsh
git clone git://github.com/tokuhirom/plenv.git ~/.plenv
```
した場合には，.zshenv か .zshrc の plenv init する前に

```zsh
export PATH=$HOME/.plenv/bin:$PATH
```
を書いとかないと login 時に plenv 自体が見つからずに init できませんので注意が必要です．
unittest.mock

Python 3.3 から標準で unittest.mock が使えるそうです。Python 3.2 の場合 PyPI から取ってきます。

    import sys
    assert(sys.version_info[0] == 3)
    if sys.version_info[1] >= 3:
        from unittest import mock
    else:
        import mock

使い方については本家 (http://docs.python.org/dev/library/unittest.mock) が詳しいのであまり書きませんが、個人的に便利そうだったのは mock.patch です。

    (mockをいんぽーと)
    >>> from StringIO import StringIO
    >>> def foo():
    ...     print 'Something'
    ...
    >>> @mock.patch('sys.stdout', new_callable=StringIO)
    ... def test(mock_stdout):
    ...     foo()
    ...     assert mock_stdout.getvalue() == 'Something\n'
    ...
    >>> test()

モックアウトのためにわざわざ引数増やしてたりしたんですが、そんな必要はなかったのですねぇ……

で、今実験的に使ってみてハマった件がひとつあるので、(上のページに書いてありますが) 一応言及しておきます (26.4.3.8. Where to patch)

    a.py
        -> Defines SomeClass

    b.py
        -> from a import SomeClass
        -> some_function instantiates SomeClass

この状況で SomeClass をモックアウトして some_function をテストしたいとします。まぁよくありますよね。別にSomeClassではなくて別の関数でも良いです。

この場合、

    @mock.patch('b.SomeClass')

が正しいのです。 'a.SomeClass' ではない。

b.py が "from a import SomeClass" をやった時点で b は本物の SomeClass への正しい参照を確保してしまいます。 a.SomeClass が参照する先を mock.patch で書き換えても意味はないのだそうです (詳しくは、上を読め)。

微妙に異なる以下のシナリオが考えられます。

    a.py
        -> Defines SomeClass

    b.py
        -> import a
        -> some_function instantiates a.SomeClass

この場合、

    @mock.patch('a.SomeClass')

が正しいそうです。紛らわしいやっちゃ。

まぁどちらにしても、標準ライブラリの範囲にこういう機能があるのは良いなぁ、と思いました。あくまで Python 3.3 ですが
Objectのkeyとvalueを反転させる。もしくはJSでenum的なものを作る。

久しぶりに本当にメモ。最近あまりによく使うので。

```javascript:inverse.js
/**
 * オブジェクトのkeyとvalueを反転させる
 * @param {Object} obj 反転させるオブジェクト
 * @param {Boolean} [keyIsNumber=false] keyが数値であるか？（数値ならkeyを反転させるとき数値に変換する）
 * @return {Object} keyとvalueの反転したオブジェクト
 */
function inverseObject (obj, keyIsNumber) {
  return Object.keys(obj).reduceRight(function (ret, k) {
    return (ret[obj[k]] = keyIsNumber ? parseInt(k, 10) : k, ret);
  }, {});
}
```

使い方はこんな感じ。

```javascript:inverse_usage.js
var
obj = {
  foo: 'bar',
  bar: 'foo',
},
inv = inverseObject(obj); //=> {bar: 'foo', foo: 'bar'}

// あんましこういう使い方しない…
console.log(obj[inv[obj[inv.foo]]])

var
// こんな風にしてenum的なものを作る
enumKeys = 'aaa bbb ccc'.split(' '),
enumLike = inverseObject(enumKeys);

console.log(enumLike.aaa); //=> 0 （数値にあまり意味は無い）
```

ちょっと使い方の説明が微妙な感じだけどこれでっ
syntastic.vimのlocation_listをunite-quickfixで表示する

unite-quickfixをインストールして.vimrcに

```vim:
let g:syntastic_always_populate_loc_list=1
```
を書くだけ．

```vim:
:Unite location_list
```

で表示されるよ！

```vim:
*'syntastic_always_populate_loc_list'*
Default: 0
Enable this option to tell syntastic to always stick any detected errors into the loclist:
>
    let g:syntastic_always_populate_loc_list=1
<
```
とのこと．
Bashの配列でjoinやsplitする

※ここに書いた僕のコードはBashの基本ルールを確認しながら構築した手法って感じですが、コメントでは別の良いやり方が紹介されてるのでそちらも要チェックです！

※この記事の手法は、区切り文字が1文字のみが対象です。2文字以上の区切り文字でjoin/splitをしたい場合はこの記事の手法は使えないので他の方法を頑張ってください。

# join
多分一番スマートと思われる方法。`IFS`変更の影響をサブシェルに閉じ込めて捨ててるのがポイント。

```bash:join-example.sh
arr=(a "b c" $'d\ne' f)

# join実行
str="$(IFS=,; echo "${arr[*]}")"

# 確認
echo "=== before ==="
for v in "${arr[@]}"; do
  echo "[$v]"
done
echo "=== after ==="
echo "$str"
```
```:output
=== before ===
[a]
[b c]
[d
e]
[f]
=== after ===
a,b c,d
e,f
```

# split
splitをスマートに書くのは無理ぽいので、普通に`IFS`を一時退避して戻すという手順をとる。

```bash:split-example.sh
str=$'a,b c,d\ne,f'

# split実行
IFS_ORIGINAL="$IFS"
IFS=,
arr=($str)
IFS="$IFS_ORIGINAL"

# 確認
echo "=== before ==="
echo "$str"
echo "=== after ==="
for v in "${arr[@]}"; do
  echo "[$v]"
done
```

```:output
=== before ===
a,b c,d
e,f
=== after ===
[a]
[b c]
[d
e]
[f]
```
php opensslを追加でインストール

#php opensslを追加でインストール

HTTP_request2でhttps://にアクセスするとエラーになった。

```
Need OpenSSL support for https:// requests
```

opensslが入っていない

```
$ php -m
[PHP Modules]
Core
ctype
curl
date
dom
ereg
fileinfo
filter
gd
hash
iconv
imagick
json
libxml
mbstring
mcrypt
mysql
mysqli
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
SPL
SQLite
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]
```

再インストールではなく、すでにあるphpに追加でインストールしようと思う。

```
$cd [php-source-dir]
$cd ext/openssl
$phpize
$ phpize
Cannot find config.m4.
Make sure that you run '/usr/local/bin/phpize' in the top level source directory of the module
```
怒られた

```
$ ls config.m4
ls: config.m4: そのようなファイルやディレクトリはありません
$ ls config*
config.w32  config0.m4
```

>http://ratememo.blog17.fc2.com/blog-entry-794.html
リネームで対応する

```
$cp config0.m4 config.m4
$ phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
```

インストール

```
$./configure
$make 
$make test
$sudo make install
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-zts-20090626/
$ls /usr/local/lib/php/extensions/no-debug-zts-20090626/openssl.so
/usr/local/lib/php/extensions/no-debug-zts-20090626/openssl.so
```

soファイルが出来た。

php,iniに追加

```
extension=/usr/local/lib/php/extensions/no-debug-zts-20090626/openssl.so
```

phpinfo();
で、確認するとopensslが出てる

ＯＫ
Yii 1.x で Codeception を使ってみる

## はじめに

Yii Framework 1.x 系で Codeception を試してみました。
Codeception の公式サイトを見ると、Yii1 Module というものがありますが、
ちょっと設定などがよくわからなかったので、自分なりにセットアップしてみました。
( Codeception に関する詳しい情報は公式サイトをご覧ください: http://codeception.com/ )

## protected/tests ディレクトリの入れ替え

既存のテストファイルを Codeception に入れ替える感じでやっていきます。

とりあえず protected/tests を protected/tests_default にリネームして、
composer.json で codeception 行を追加して Codeception をインストール。

~~~composer.json
{
    "require": {
        "yiisoft/yii": "1.1.14-rc"
    },
    "require-dev": {
        "codeception/codeception": "*",
        "phpunit/phpunit-selenium": "*",
        "phpunit/phpunit-story": "*",
        "phpunit/dbunit": "*",
        "phpunit/php-invoker": "*"
    }
}
~~~

~~~
composer update
~~~

次に bootstrap コマンドで protected 以下に Codeception のファイルを作成。

~~~
./vendor/bin/codecept bootstrap protected
~~~

データベースを扱っている場合は protected/tests/_data/ にテスト用のデータをエクスポートし、
そのあと protected/codeception.yml でデータベースの設定などをする。

~~~codeception.yml
paths:
    ...
settings:
    ...
modules:
    config:
        Db:
            dsn: 'mysql:host=localhost;dbname=hoge_test'
            user: 'testuser'
            password: 'testpass'
            dump: tests/_data/hoge_test.sql
~~~

## ユニットテストを実行してみる

protected/tests/unit.suite.yml で Db モジュールを使うように修正

~~~unit.suite.yml
class_name: CodeGuy
modules:
    enabled: [Db, CodeHelper]
~~~

変更後は build コマンドを忘れずに

~~~
../vendor/bin/codecept build
~~~

protected/tests/unit/_bootstrap.php を以下のように修正

~~~_bootstrap.php
<?php
$yii = dirname(__FILE__).'/../../../vendor/yiisoft/yii/framework/yii.php';
$config = dirname(__FILE__).'/../../config/test.php';

require_once($yii);

if (!Yii::app()) {
    Yii::createWebApplication($config);
}
~~~

ユニットテスト自体は元の tests_default/unit/ にあったものをコピペして
extends を DbTestCase から \PHPUnit_Framework_TestCase に修正すれば、
そのまま扱えるかと思います。

また、共通で扱うメソッドなどを別クラスに書いている場合は
tests/_helpers/CodeHelper.php などに移しておくといいかもしれません。
( 利用時は `use Codeception\Module\CodeHelper;` )

で、ユニットテストの実行は以下

~~~
../vendor/bin/codecept run unit
~~~

## 受け入れテストを実行してみる

protected/tests/acceptance.suite.yml で 扱うモジュールを書いて PhpBrowser の url を修正。
変更後は `build` を忘れずに。

~~~acceptance.suite.yml
class_name: WebGuy
modules:
    enabled: [PhpBrowser, Db, WebHelper]
    config:
        PhpBrowser:
            url: 'http://local.hoge/index-test.php'
~~~

次に cept ファイルを生成。

~~~
../vendor/bin/codecept generate:cept acceptance hoge/Index
~~~

cept ファイルはページ毎にファイルを生成しテストを書く感じなので、
個人的にはコントローラ毎にディレクトリを分けたほうが、テストしやすいかなと思います。
( cest ファイルにする場合は特にしなくてよいかも )

あとは /tests/acceptance/word/IndexCept.php にテストを書いて実行。

~~~
../vendor/bin/codecept run acceptance -d
~~~

## Yii のインスタンスが欲しい場合

受け入れテストや機能テストでも Yii のインスタンスが欲しい場合は
tests/unit/ の _bootstrap.php と同じような感じにすればいいと思います。

また、unit, acceptance, functional の _bootstrap.php で共通の処理をしている場合は、
tests/ にある _bootstrap.php にまとめてしまうほうがいいかもしれません。

## まとめ

[Yii1 Module](http://codeception.com/docs/modules/Yii1) で書かれている CodeceptionHttpRequest などは
全く使っていないわりに動いたのでちょっと不安ですが、
YIi 1.x 系での Codeception の導入のやり方などをまとめてみました。
git-svnで指定可能なbranchesに関して

`git svn -s` で簡単に構築出来ないブランチ構成の場合、`git-svn init`で構築した後`.git/config`を修正するか、`--branches`を`git svn clone`時に明示的に指定する必要があります。その際にbranchesに設定可能な文字列の書き方がちょっと特殊で注意が必要でしたのでメモしておきます。

詳しくは `git-svn help` してください。

### 基本的な設定方法

`git-svn -s`などで構築した場合は、以下のようになっていると思います。

``` bash
branches = xxx/yyy/*:refs/remomtes/*
```

大事な事は、 `:` の左辺と右辺に対して、`*` などで動的指定を行う必要がある点です。
`*`自体はどこでも構いません。左辺で指定した `*` が右辺で指定した `*` に設定されると考えると分かりやすいかと思います。

以下例です。
なお、`branches`は`[svn-remote "svn"]`の`url`に指定されたパスから相対パスで指定を行います。

``` bash
# fizz/直下のディレクトリがブランチとして認識され、
# svn/ブランチ名という形でgit上にブランチが切られます。
# ex) fizz/project1, fizz/project2
#  => svn/project1, svn/project2
branches = fizz/*:refs/remomtes/svn/*

# fizz/直下のディレクトリでその子として`project`ディレクトリを持つディレクトリがブランチとして認識され、
# svn/ブランチ名という形でgit上にブランチが切られます。
# ディレクトリ内には、projectの中身が配置されます。
# ex) fizz/branchA/project, fizz/branchB/project, fizz/branchC/hoge
#  => svn/branchA, svn/branchB
branches = fizz/*/project:refs/remomtes/svn/*

# `*`以外でも{}を利用してディレクトリを直接指定することも可能です。
# fizz/直下のディレクトリで`hoge`か`piyo`のフォルダがブランチとして認識され、svn/ブランチという形でgit上にブランチが切られます。
# ex) fizz/hoge, fizz/piyo, fizz/buzz
#  => svn/hoge, svn/piyo
branches = fizz/{hoge,piyo}:refs/remomtes/*
```


### 参考サイト
* http://lambdasakura.hatenablog.com/entry/2013/02/01/175811
* http://jp.messaliberty.com/2009/12/how-to-convert-svn-repo-to-git-repo/
* http://dqn.sakusakutto.jp/2012/10/svn-git-github-migration.html
パンくずの区切りを css だけで作る

例えば、下記の様なhtmlの場合、

~~~
<style type="text/css">
<!--
ul li {
    display: inline;
}

ul li+li:before {
    content: '\00a0->\00a0';
}
-->
</style>

<ul>
    <li>1階層</li>
    <li>2階層</li>
    <li>3階層</li>
    <li>4階層</li>
</ul>
~~~

こんな感じで表示できます。

![スクリーンショット 2013-07-31 12.37.29.png](https://qiita-image-store.s3.amazonaws.com/0/2978/17ab069d-72be-3d07-df6b-54fab2387ba0.png)

html部分がかなりスッキリとかけるのでおすすめです。
node.jsにリミッターを設定したい

使いどころ

人間ではない相手が無茶なリクエストをしてくることがあるので
そういったリクエスト数に一定の制限を設けたいときに使うかなぁ

例ではCPU処理をあげてるけど実際にはMYSQLとかMYSQLとかMYSQLだろうなぁ

```js::limitter.js
var createLimitter = module.exports = function(max, reset_sec){
    var reset_time = process.uptime() + reset_sec;
    var count = 0;
    return function(){
        if(process.uptime() >= reset_time){
            reset_time = process.uptime() + reset_sec;
            count = 0;
        }
        if(count >= max){
            return false;
        }
        count++;
        return true;
    };
};
```

```js::worker.js
var createLimitter = require('./limitter');
var check = createLimitter(20, 1); // 秒間２０回まで

var heavy_work = function(){
    if(!check()){
        return false;
    }
    cpu_heavy_calc();
    return true;
}
```