OmniAICreator/Qiita-1.07M huggingface dataset:
Padrino で Better Errors を使う2


[Padrino で better_errors を使う方法](http://qiita.com/items/1512c5c4aab5d51c811a)を書きましたが、
Plugin Generator を使って、もっと楽に導入ができるようにしました。

## Plugin Generator
ちなみに、[Plugin Generator](http://www.padrinorb.com/guides/generators#plugin-generator)というのは、Thor の[Actions](https://github.com/wycats/thor/wiki/Actions)を使って、定型的に行いたい処理をテンプレート化しておける便利な機構です。

色々なテンプレートが[公開](https://github.com/padrino/padrino-recipes/tree/master/plugins/)されていて、

```
$ padrino g plugin -l
```

というコマンドで、一覧を取得することができます。

今回追加したのは[これ](https://github.com/padrino/padrino-recipes/blob/master/plugins/better_errors_plugin.rb)です。


## 使い方
```
$ padrino g plugin better_errors
```
```
$ bundle install
```

簡単便利ですねー
NS_OPTIONS

iOS6からNS_ENUMとNS_OPTIONSというAPIが加わっています。
https://developer.apple.com/library/ios/#releasenotes/General/iOS60APIDiffs/
マクロなのでiOSのバージョンと関係なく使えます(追記)。

enumで型もtypedefで同時に定義する感じでしょうか。

```objc:NS_OPTIONS
typedef NS_ENUM(NSInteger, Hoge) {
    HogeNone,
    HogeFirst,
    HogeSecond,
    HogeMax
};
 
typedef NS_OPTIONS(NSUInteger, HogeFlag) {
    HogeFlagNone                  = 0,
    HogeFlagRed                   = 1 << 0,
    HogeFlagBlack                 = 1 << 1,
    HogeFlagWhite                 = 1 << 2,
};
```
手元の init.el を淡々と紹介する

さて、今回は手元の init.el のネタを淡々と紹介してみます。
みんな知っているよねというネタばかりだとは思いますが、逆に珍しかったりするものもあるかもしれないので、すこしでもお役に立てれば幸いです。

http://d.hatena.ne.jp/kiwanami/20121216/1355706256
TwitterやQiitaのような自動更新タイムラインをEmber.jsで作成

[TwitterやQiitaのような自動更新タイムラインをBackbone.jsで作成](http://qiita.com/items/8a79019270c5089b4368)

> Qiitaでは新しい投稿がある場合にその件数を表示し，クリックするとタイムラインに追加するということをやっています．TwitterやFacebookと同じ仕組みですね．
> これはBackbone.jsのBackbone.Collection#fetchを使うと簡単に実装できます．

便利な機能ですね！
Ember.jsでもfetchを実装してみました。

ソース:
https://github.com/kmdsbng/emberjs_fetch_sample/blob/master/js/app.coffee

ソースコードを抜粋します。

```coffeescript
App.tweets = Ember.ArrayController.create Ember.Fetchable,
  content: [],
  maxId: 3, # adhoc
  url: (->
    './item.json?after=' + @get('maxId')
  ).property('maxId'),
```

Controllerをcreateする際に、Ember.FetchableというMixinを継承するように指定します。
すると、Controllerインスタンスにfetchメソッドが生えます。
fetchメソッドはアイテムを取得するために url メンバを使用します。今回はafter以降のidのアイテムを取得するURLを生成するように指定しています。

```coffeescript
setInterval((->
  if App.tweets.get('recentCount') < 10
    App.tweets.fetch()
), 5000)
```

5秒ごとに新着情報を取得します。結果はApp.tweets.contentに追加されます。
次はテンプレートを見てみます。

```html
  <script type="text/x-handlebars" data-template-name="twitter_list">
    {{#if view.hasRecentItems}}
    <button {{action expandRecent}}>新着{{view.recentCount}}件を表示する</button>
    <br>
    {{/if}}
    <ul>
    {{#each view.items}}
      <li>
        <b>
          [{{id}} {{title}}]
        </b>
        <br>
        {{body}}
      </li>
    {{/each}}
    </ul>
  </script>
```

新着情報があるときだけ、「新着XX件を表示する」ボタンを表示します。
QiitaやTwitterでも実装されてるアレです。
このあたりの機能もEmber.jsのデータバインディング機能を利用すればスッキリ書くことができていい感じです。

最後に Ember.Fetchable のコードを見てみましょう。

```coffeescript
Ember.Fetchable = Ember.Mixin.create
  fetchItems: ((max_id) ->
    _this = @
    return $.Deferred((defer) ->
      return $.ajax(
        url: _this.get('url'),
        dataType: 'json',
        data:
          after: max_id
      ).done((res) ->
        return defer.resolve(res.results)
      )
    ).promise()
  ),
  fetch: ((callback) ->
    _this = @
    @fetchItems(@get('maxId')).done((tweets) ->
      items = tweets.map((v) ->
        v['recent'] = true
        Ember.Object.create(v)
      ).reverse()
      _this.get('content').unshiftObjects(items)
      if callback
        callback()
    )
  )

```

fetchItemsメソッドは、jQueryのajaxメソッドを利用して結果を取得してます。
fetchメソッドは取ってきた結果にrecentフィールドをセットし、contentに追加しています。

以下のページで実際の動作を確認することができます。

http://kmdsbng.github.com/emberjs_fetch_sample/
zshでよく使うキーバインドまとめ

# 概要
zshでよく使うキーバインドをまとめます。使ってる人からすると当たり前なんですけど、知らない人結構いる気がするんですよね。

# 内容
## まずはじめに
`Meta`について。
例えば`Meta+b`は`Escape`(or `Control+[`)を押してから`b`という意味。
僕は普段MacのiTerm2使ってるんですけど、それの設定で`Option`を押しながら`b`で同じ動作になるように設定してあります。（Preferences -> Profiles -> Keys ->Left(or Right) option key acts as +Esc）
多分Emacsユーザだとここらへん知ってるんですけど、viユーザは知らない人多そう。

## カーソル移動系

```
Control+f      # 右に移動
Control+b      # 左に移動
Meta+f         # 右に単語単位移動
Meta+b         # 左に単語単位移動
Control+e      # 行末へ移動
Control+a      # 行頭に移動
Control+n      # 下
Control+p      # 上
```

nとpはzshの場合カーソル移動ではない気もする

## 文字操作系

```
Control+h      # 左の文字を削除
Control+d      # 右の文字を削除。何も入力がない状態で使うと現在のシェルのログアウト
Control+k      # カーソルから行末までの文字を切り取り
Control+w      # 左の単語を切り取り
Meta+d         # 右の単語を切り取り
Control+u      # その行全部切り取り
Control+y      # ペースト
Control+/      # undo
```

## その他
その他でくくるのってどうなん、というのもありつつ

```
Control+m      # Enter
Control+j      # Enter
Control+g      # 現在の入力を破棄して新しい入力に
Control+r      # 過去のコマンドを検索。もう一度Control+rで遡る
Control+s      # 上のコマンドで戻りすぎた時に、最近のコマンドを検索
Control+l      # 今のコマンドラインをウィンドウの一番上に持ってくる
Control+i      # タブ補完
Control+c      # プログラムの強制終了
```

# あとがき
こんなもんでしょうか。普段から使ってるけど抜けてるやつあるかもしれません。
あと、色々カスタマイズしてるからどれが自分で設定したやつで、どれがデフォルトか把握出来てない感あるから、間違ってるところあるかも...
その他のキーバインドも知りたかったらおもむろに`bindkey`とコマンドを打つと吉。
オフラインリアルタイムどう書く第6回の参考問題をRubyで解く

問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord6lintersection/

```ruby
def rect_points(p1, p2)
  x1,y1 = p1.split('').map(&:to_i)
  x2,y2 = p2.split('').map(&:to_i)
  ([x1,x2].min..[x1,x2].max).map{|x| ([y1,y2].min..[y1,y2].max).map{|y| [x,y]}}.flatten(1)
end

def solve(q)
  q.split(",").map{|i| i.split('-')}
              .map{|j| (rect_points(j[0],j[1])|rect_points(j[0],j[2])).uniq}
              .inject{|a,b| a&b}.size
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t"
  print ans
  puts ans == a.to_i ? 'o' : 'x'
end
__END__
#1	23-94-28,89-06-51	11
#2	11-84-58,02-73-69	40
#3	18-41-86,77-04-32	26
```
zmvコマンドで複数ファイルの一括リネーム

zsh には、zmv という便利なコマンドがあります。この使い方をまとめます。

基本の使い方
============

```zsh
zmv '変換元' '変換先'
```

変換元には、zsh の glob パターンが指定できます。

例えば、次のように使います。

```zsh
zmv '(*).xxx' '$1.yyy'
```

このコマンドは、実際には次のようなコマンドを実行してくれます（マッチするファイルが3つあった場合の例）。

```zsh
mv -- hoge1.xxx hoge1.yyy
mv -- hoge2.xxx hoge2.yyy
mv -- hoge3.xxx hoge3.yyy
```

別の例として、次のように複数パターンの指定も可能です。

```zsh
zmv '(**/)(*).xxx' '$1$2.yyy'
```

より簡単に使うためのオプション
==============================

次のオプションを使うと、より簡潔に書けて便利です。

* `-W` : 変換元に含まれるワイルドカードは括弧がついているとみなす。また、変換先に含まれるワイルドカードは順に `$1`, `$2`, ... とみなす。

これを使うと、上に出てきた例は次のように書けます。

```zsh
zmv -W '*.xxx' '*.yyy'
zmv -W '**/*.xxx' '**/*.yyy'
```

さらに、`noglob` を使うと、シングルクォートも省略できます。
次のようなエイリアスを定義すると便利です。

```zsh
alias rename="noglob zmv -W"
```

こうすると、次のように直観的に書けます。

```zsh
rename *.xxx *.yyy
rename **/*.xxx **/*.yyy
```

僕は、簡単な変換の場合は `rename` を使い、複雑な変換の場合は `zmv` を生で使う、と使い分けています。

確認用のオプション
==================

複雑な変換の場合は、パターンが正しく指定できているか確認できるような、次のオプションが便利です。

* `-n` : 処理の表示のみ行い、実際には実行しません。
* `-v` : 処理を表示しながら実行します。
* `-i` : 対話的に実行します。

リネーム以外の処理を行う
========================

実は、リネーム以外の処理を行うこともできます。

* `-C` : `mv` の代わりに `cp` を実行します。
* `-L` : `mv` の代わりに `ln` を実行します。
* `-p コマンド` : `mv` の代わりに指定したコマンドを実行します。

参照
====

`zmv` については、`man zshcontrib` の OTHER FUNCTIONS に記載があります。
タブのピン留めをトグルする

タブのピン留めにはなぜかショートカットキーが割り当てられていないので，Vimperator からこれを実現することに．
p とか P は既にバインドされているので，そのとなりの @ に割り当てた．

```javascript:.vimperatorrc
javascript <<EOM
liberator.modules.commands.addUserCommand(["togglepin"], "add pin to current tab",
function(){
	var currentTab = gBrowser.mCurrentTab
	if(currentTab.pinned){
		gBrowser.unpinTab(currentTab)
	}
	else{
		gBrowser.pinTab(currentTab)
	}
});
EOM
nnoremap @ :togglepin <CR>
```
MotionModelを使ってデータ管理



##インストール

```ruby:Gemfile
gem 'motion_model'
```

```sh
bundle install --path vendor/bundle
```

```ruby:Rakefile
require 'bundler'
Bundler.require
```

##モデルの定義

``MotionModel::Model``モジュールをインクルードすることでモデルを使用することできる。
また、``MotionModel::Validations``を定義することでバリデーションを使用することも可能とあるけど``Uninitialize constatns``となって使用できなかった。

列の定義は``columns``メソッドに対し名前をキー、型を値としたハッシュを渡す。
Railsライクに``belongs_to``など使ったリレーションも設定できる。

```ruby
class Tag
  include MotionModel::Model
  columns name: :string, used_count: :int
end
```

##使い方

いたってRailsライクに使える。

```ruby
Tag.all

t = Tag.new(name: 'hoge', used_count: 10)
t.save

t = Tag.create(name: 'hoge', used_count: 10)
```

###主なクラスメソッド
- new
- create
- all
- where
- delte_all
- destroy_all

###主なインスタンスメソッド
- save
- delete
- destroy

##保存と展開

``save``メソッドを使用してもファイルなどには保存されないので``serialize_to_file``メソッドでファイルに保存する必要がある。

```ruby
Tag.serialize_to_file('hoge.dat')
```

ファイルに保存したデータを展開するには``deserialize_from_file``メソッドを使用する。

```ruby
Tag.deserialize_from_file('hoge.dat')
```

これらのメソッドはファイル名を与えて実行すると、以降は省略可能。

##検索

```ruby
Tag.where(:name).eq('hoge')
```

メソッドチェインで条件を追加することもできる。

```ruby
Tag.where(:name).eq('hoge').and(:used_count).gt(10)
```

``eq``のような演算子？は他にも以下のようなものがある

###contain

SQLで言うところの``like``。

###in

そのまま``in``。配列を渡す。

###gt, lt

``>``、``<``

###gte, lte

``>=``、``<=``

###ne

``!=``

##並び替え

##昇順

```ruby
Tag.order(:updateSequenceNum).all
```
##降順

```ruby
Tag.order {|x, y| y.updateSequenceNum <=> x.updateSequenceNum}.all
```

##通知

試していないけど``NSNotificationCenter``を使ってデータの変更などの通知を受け取る事もできる。

##使用上の注意

###保存時のファイル名

``serialize_to_file``メソッドは指定されたファイル名に対し``Documents``ディレクトリのパスを連結するので、パスを渡すとエラーになる。

##参考

[sxross/MotionModel · GitHub](https://github.com/sxross/MotionModel)
XMLをJSONに変換する


例えば http://hoge.com/data.xml というXMLを返すAPIがあったとして、ここからJSONデータに変換したいなら以下のコード。
ただしActiveSupportが必要なので、Rails以外の環境では、ActiveSupportを別途インストールすること。

	require 'active_support/core_ext'
	require 'open-uri'
	
	hash = Hash.from_xml open('http://hoge.com/ext/data.xml').read
	json = hash.to_json

ActiveSupportはこういったメソッド以外にも便利なものを大量に揃えている。
いとも簡単にMac OS XにSciPyをインストールする


SciPyは、インストールするのがやっかいだ、というイメージが強かったのですが、ScipySuperpackを使えばとても簡単に入ります。


```
git clone https://github.com/fonnesbeck/ScipySuperpack
cd ScipySuperpack
sh install_superpack.sh
```

以上です。
とても簡単で便利です。

##参考##
* http://nerdslearning.wordpress.com/2012/06/08/installing-scipy-on-mac-os-x-10-7-4-with-python-2-7-3/
* https://github.com/fonnesbeck/ScipySuperpack
メモ化を知った

# はじめに

あんまりRuby関係ないんですが、一応、The RSpec Bookを読んでいて知ったのがきっかけなので…。

# あらすじ

The RSpec Book のletの解説には以下のように記述されています。

```sample.rb
   describe "テストコードはてきとう" do
     let(:test) { "TEST" }
     it "test let" do
       test.should == "TEST"
     end
   end
```

> メソッドが最初に呼び出されたときに戻り値がキャッシュされ、それ以降、同じスコープ内でメソッドが呼び出されるたびにキャッシュされた値が返されることを意味します。

これをメモ化というそうです。で、メモ化って？

# 一番簡単なメモ化

調べてみると、だいたいフィボナッチ数を求める例が多い。なのでn番目のフィボナッチ数を求めるメソッドを書いてみる。

## 普通に書いた場合

```fib1.rb
def f(n)
  if n <= 1 then
    n
  else
    f(n-1) + f(n-2)
  end
end
```

実行していくと、己のPCスペックではf(30) = 832040 くらいからマシンがもたついてきた。

これを `メモ化` してみる。

## メモ化した場合

```fib2.rb
# こっちは変わらず
def f(n)
  if n <= 1 then
    n
  else
    f(n-1) + f(n-2)
  end
end
def f_memo(n)
  @cache ||= []
  @cache[n] ||= f(n)
end
```

実行すると、最初の一発目は同じくらい遅いんだけど、一回実行すればキャッシュとして `@cache` に格納されるので二回目以降はバク速で求められる。

# ||= とは

上の例の `@cache[n] ||= f(n)` は `@cache[n] = @cache[n] || f(n)` と同義。@cache[n]が真ならば@cache[n]を返す。偽ならnのフィボナッチ数を求める。 **@cache[n]が真ならば、f(n)は評価しない、実行しない** 。だから早い。

\|\|=の例。

```
irb(main):001:0> a          # 未定義の時はエラー
NameError: undefined local variable or method `a' for main:Object
from (irb):1
from C:/rubies/Ruby-193-p0/bin/irb:12:in `<main>'
irb(main):002:0> a ||= 500  # a || 500 a は偽なので500
=> 500
irb(main):003:0> a
=> 500
irb(main):004:0> b = 0
=> 0
irb(main):005:0> b
=> 0
irb(main):006:0> b ||= 500  # b || 500 b は真なので0のまま
=> 0
irb(main):007:0> b
=> 0
```

…って所まで調べて、初めてのRubyを読み返してみたらバッチリ書いてあるし！！

**初期化イディオム** として紹介されていました。。。
スクロールしたらメニューバーがトップに固定される方法

これは、[XOOPSアドベント・カレンダー2012](http://qiita.com/advent-calendar/2012/xoops-themes-templates/participants "XOOPSアドベント・カレンダー2012")のリレーブログ記事です。


#スクロールしたらメニューバーがトップに固定される方法

まずは、画像をご覧ください。私のサイトをテーマ tw_corp で表示させたものですが、１枚目がページトップが表示されており、グローバルメニューはヘッダー画像の下に表示されています。
そして、２枚目が少しスクロールさせたところ・・・グローバルメニューがブラウザ表示の一番上に固定されています。
![ページトップ](http://xoops123.com/uploads/wp-content/uploads/image002-300x213.jpg "ページトップ")　![スクロールした状態](http://xoops123.com/uploads/wp-content/uploads/image004-300x204.jpg "スクロールした状態")

これ、グローバルメニューをヘッダー画像の下などに配置しておき、下にスクロールしてメニュー部分がトップに来たらそこに固定される。最近、私が作っているテーマで良く利用している方法です。


デザインとして考えると、メニュー位置をブラウザ表示画面の一番上ではなく、真ん中とかに配置したいこともありますよね？　だけど、普通だったらスクロールするとメニューが見えなくなってしまいます。


そんなことを考えてると、javascriptを使うとスクロールしてトップ位置に来たらそこで位置を固定する方法を見つけて、応用することにしました。javascriptでブラウザの動作を判定して、それに応じたcssを適用させるという方法です。

##jQueryをtheme.htmlで利用できるように設定

使うのは最近流行のjQuery、XOOPS Cobe Legacy2.2（XCL2.2）がデフォルトで採用しているもので、ちょうど都合が良いですね。XCL2.2を利用しているなら、デフォルトで読み込んでくれるので、特にテーマ内で読み込まなくてもよいのですが、とりあえずtheme.htmlのヘッダに次の記述があるものとして話を進めます。

```html:jQueryの読み込み
<script type="text/javascript" src="<{$xoops_imageurl}>js/jquery-1.7.1.min.js"></script>
```

ここでは、最小サイズのものを読み込んでいます。

##theme.htmlのbodyにメニューの記述

 theme.htmlのbodyに次のようなメニュー用の記述をします。

```html:ナビゲーション（グローバルメニュー）
<nav>
<div class="nav">
<ul class="clearfix">
	<li>メニュー１</li>
	<li>メニュー２</li>
	<li>メニュー３</li>
</ul>
</div>
</nav>
```

詳しくは、私が配布しているテーマを見ていただくとして・・・ここでは、省略して書かせていただきますね。 まあ、たいしたことはしていませんが。

これ、html5のナビゲーションなので

```html:ナビゲーション（グローバルメニュー）
<nav>
<ul class="clearfix">
	<li>メニュー１</li>
	<li>メニュー２</li>
	<li>メニュー３</li>
</ul>
</nav>
```

でも良いようですが、上手く解釈してくれないブラウザもあるので、あえて div class="nav" も追加しています。（まあ、主にIEが問題なんですけど・・・jQueryでクラスを指定するので、そのためでもあります。）

ulには、変な回り込み防止用のclass="clearfix"を指定します。もちろん、cssで設定するということで。

##クラスnavのスタイルは？

ちょっとstyle.cssを見てみましょう。クラスnavはどんなスタイルが指定されているのでしょう？

```css:style.css　クラスnavの記述内容
.nav { padding: 0; margin: 0 auto 10px; width: 100%; } 
```

実は、特に変わったことはしていません。普通のdivです。

positionが書かれていないので、デフォルトのstaticと同じということになりますね。ということは、前の要素に対して普通のdivとして表示されるということで、これでtheme.htmlに記述したデザインどおりの表示になります。


##スクロールした時に上部に固定させる仕組みは？

では、スクロールしたときに上部に固定されるにはどうするか？　そう、cssのfixedを利用します。
「スクロールしてnavがトップの位置に来たらfixedにする」ということで、jQueryでこれを実現させてあげます。はい。こんな感じです。

###theme.htmlでjQUeryの動作を指定する

```html:jQueryの動作指定
<script type="text/javascript">
  jQuery(function() {
    var nav = jQuery('.nav');
    var navTop = nav.offset().top;
    jQuery(window).scroll(function () {
      var winTop = jQuery(this).scrollTop();
      if (winTop >= navTop) {
        nav.addClass('fixed')
      } else if (winTop <= navTop) {
        nav.removeClass('fixed')
      }
    });
});
</script>
```

クラスnavについて、ウィンドウのトップに来たら、fixedというクラスを追加、ウィンドウのトップよりも下ならそのクラスを削除するという動作になります。

###style.cssでトップに固定させるスタイルを指定

そうそう、cssはこんな感じです。


```css:style.css クラスfixed の記述内容

.fixed {
position: fixed;
top: 0;
left: 0;
width: 100%;
}
```

いかがですか？　他にも応用が利きそうですよね？

私のサイト [xoops123.com](http://xoops123.com "xoops123.com") にも是非ご訪問くださいね～(*^O^*)
TracのWikiをVimで書くときのはなし

## It's All Text
TracのWikiやTicketで長文を書きたい時は、Firefoxの [It's All Text](https://addons.mozilla.org/ja/firefox/addon/its-all-text/)を使ってVimで書いています。
*.tracという拡張子でファイルを作成できるように設定しています。

## シンタックスハイライト
TracのWikiはMoinMoinベースなので、MoinMoin用のシンタックスハイライトが使えます。

[moin.vim](http://moinmo.in/VimHighlighting?action=AttachFile&do=view&target=moin.vim) をsyntaxフォルダに置けばOK。
(参考) http://moinmo.in/VimHighlighting

拡張子moin、tracのファイルはMoinMoinとして扱われるように設定しておきます。

```vim
au BufNewFile,BufRead *.moin setf moin
au BufNewFile,BufRead *.trac setf moin
```

## おりたたみ

各見出しをおりたためるようにするために、以下のような設定をvimrcに追加しています。

```vim

au FileType moin setl foldmethod=expr foldexpr=FoldMoinHeading(v:lnum)

function! FoldMoinHeading(lnum)
    let line = getline(a:lnum)
    let match = matchstr(line, '^\zs\(=\{1,5}\)\ze\s\+.*\s\+\1\s*\(#.\+\)\=$')
    if len(match) <= 1
        return '='
    else
        return '>' . (len(match) - 1)
    endif
endfunction
```

こんな感じになります。
![folding](http://gyazo.com/9d3c0c43dca347b3d9d8e798ea99e237.png)

ちなみに、Tracとは関係ありませんが、同じように以下の設定でMarkdown形式の見出しを折りたためるようになります。

```vim
au FileType markdown setl foldmethod=expr foldexpr=FoldMarkdownHeading(v:lnum)

function! FoldMarkdownHeading(lnum)
    let line = getline(a:lnum)
    let match = matchstr(line, '^\zs\(#\{1,6}\)\ze\s')
    if len(match) <= 1
        return '='
    else
        return '>' . (len(match) - 1)
    endif
endfunction
```

##スニペット
rstブロック、とくにlist-tableディレクティブを多用するので、[neosnippet](https://github.com/Shougo/neosnippet)を使って以下のようなスニペットを定義しています。

```:moin.snip
snippet rst
	{{{
	#!rst
	${1}
	}}}

snippet ltbl
	{{{
	#!rst
	.. list-table::
	   :width: 
	   
	   ${1}
	}}}

snippet img
	[[Image(${1})]]

snippet rimg
	:code-block:`Image:${1}`
```
LS_COLORSを設定しよう

``ls``コマンドで出力されるファイルやディレクトリに色をつけたい場合、``LS_COLORS``という環境変数にカラー設定を記述することはよく知られていることと思います。

しかし、これをいちいち手動で設定したり追加したりするのは面倒です。
そこで今回は``dircolors``というコマンドを用いて、カラー設定を読み込む方法を紹介します。

今回読み込むカラー設定は[dircolors-solarized](https://github.com/seebi/dircolors-solarized)です。
名前の通り、みんな大好きsolarizedのカラー設定です。
今でもちょくちょく更新されていて、色々な拡張子のファイルを良い感じに色付けしてくれます。

##カラー設定の読み込み

では本題のカラー設定の読み込み方法についてです。
``dircolors-solarized``はcloneなりDLなりして持ってきてもらうとして、その中にある``dircolors.ansi-universal``というカラー設定を読み込んでみましょう。

```sh
eval $(dircolors /path/to/dircolors-solarized/dircolors.ansi-universal)
```

これだけで``LS_COLORS``が設定されます。
(``/path/to``の部分は適当に読み替えて下さい)

##Mac(BSD系)で使用する方法

続いてMacでも``LS_COLORS``を使用する方法です。

``LS_COLORS``はGNU版の``ls``にカラーを設定するための環境変数です。
しかし、MacにはBSD版の``ls``しか入っていないため、GNU版の``ls``を入れる必要があります。
(※ BSD版``ls``のカラー設定は``LSCOLORS``に記述します。ただし記述方法が異なります)

また``dircolors``コマンドについてもMacには入っていません。

そこでGNU系のコマンドを集めた``coreutils``をインストールします。
既にインストールしている方も多いと思いますが。。。
homebrewを使用している場合は、以下のコマンドでインストール可能です。

```
$ brew install coreutils
```

これで、GNU版lsの``gls``と``gdircolors``が使用可能になります。
``gls``を普段から使用したい場合は、``ls``にaliasを設定しておくと良いでしょう。

あとは同様にして``LS_COLORS``を設定します。

```sh
eval $(gdircolors /path/to/dircolors-solarized/dircolors.ansi-universal)
```

##zshの補完にも同じ色を設定

zshを使用している場合、補完候補として表示されるファイルやディレクトリにも``ls``と同じカラーを設定したいと思うでしょう。
そこで以下のように設定することで、簡単にカラー設定を一致させることができます。

```sh
if [ -n "$LS_COLORS" ]; then
    zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
fi
```

##個人的なおすすめとまとめ

最後は個人的なオススメです。
``dircolors``で読み込むカラー設定ファイルは、シンボリックリンクを貼ってそちらを読み込むようにすると良いと思います。
カラー設定を変更したい場合は、リンクを張り替えるだけですみます。

```sh
$ ln -s /path/to/dircolors-solarized/dircolors.ansi-universal ~/.dircolors
```

というわけで、最終的には以下の様な設定となります。

```sh
# デフォルト設定(別になくても良い)
LS_COLORS="デフォルトの色設定(ご自由に)"
export LS_COLORS

if [ -f ~/.dircolors ]; then
    if type dircolors > /dev/null 2>&1; then
        eval $(dircolors ~/.dircolors)
    elif type gdircolors > /dev/null 2>&1; then
        eval $(gdircolors ~/.dircolors)
    fi
fi
```

これを``.bashrc``や``.zshrc``などに書いておけばよいでしょう。
zshを使用している場合には、先の補完候補の色設定も追加しておきましよう。
GPGPUに手を出す前に検討すべき事について

この記事は[GPGPU Advent Calendar](http://atnd.org/events/34539)の16日目です。
***
さて、１回だけ書くという話だったのに、人が集まらなくて2回目を書かないといけなくなったので、無理矢理ネタを考えてみた。
自分の3回目はこのまま行くと最終日だが、山田が凄いのを代わりに書いてくれるらしいので、今回が最後だ。
***
今回はGPGPUに手を出す前に検討すべき事について。

GPUGPUに興味があって触ってみたい人や、GPGPUを研究のテーマにする人などはすぐにGPGPUに手を出すべきだ。
興味が伴うプログラミングは大きな学習成果を伴うだろう。

ただし、そうではなく業務上などで今あるプログラムを速く動かす必要がある人は、GPGPUに手を出す前に次のような事を検討すべきである。

まずは、プログラムを実行するワークフローを変えられないかどうか。
例えば、夜間にバッチ処理として実行して翌日に結果が取れれば良いなら、わざわざ高速化する必要は無いだろう。
まあ、高速化することで今までと違う使い方が出来るようになって、イノベーションが生まれることもあるので、高速化しないというのは正しくない場合も多いのだけど。

次にハードウェアを交換することで、必要十分な速度にならないかの検討。
CPUを交換したりメモリの量を増やしたり、データをSSDにおいてみたりだ。
ハードウェアの交換で必要な速度が達成できるなら、さっさとそうするべきだろう。

ハードウェアの交換で必要な速度が達成できるか自分では分からない場合。
プログラムのボトルネックが計算か、I/Oか、ネットワークかが判断できないなら、
高速化の得意なソフトハウスへの発注というのも手だろう。（ステマ）
GPGPUが始まる前から高速化を得意としているソフトハウスなら、GPUを利用した高速化に限らず、最適な実現方法を提案してくれるはずだ。（さらにステマ）

ここまでは、自分でプログラムに手を入れない方法だったが、次からは自分の手を動かす方法。

コンパイラオプションやコンパイラ自体を見直すというのも手だ。
コンパイラの最適化オプションが設定されていないなら、設定するだけでもかなりの性能向上があるはずだ。
オプションを変更するだけで、必要な性能が達成できるなら手間は殆ど無い。

もし高速化したい処理が、一般的な処理であるならば、既に高速化されたミドルウェアを利用するのも手だ。
処理によっては無償のものから有償のものまで、いろいろと有るかもしれない。
速度を売りにしているミドルウェアなら、同じ処理を普通のプログラマが書いて、速度で勝つのはなかなか難しいだろう。（少しだけステマ）

プログラムを全て見直すことになるが、使用言語を見直すことも必要かもしれない。
速度がクリティカルな処理にインタプリタな言語を使っているなら、C言語などの実行バイナリが生成される言語で書き直す事で、十分に速くなるかもしれない。
まあ、ぶっちゃけ後から言語変えるとかお勧めしないので、速度が必要なら初めから、ちゃんと言語を選ぼう。

OpenMPをサポートしている言語なら、OpenMPのディレクティブをループの頭に1行追加するだけで、十分速くなるかもしれない。
ループの中の処理の内容によっては、そんな単純な話では無いかもしれないが、
OpenMPでの高速化が難しい処理はGPGPUで高速化するもの、おそらく大変だろう。

依存関係の無い、同時に実行可能な、そこそこの規模のタスクが幾つか存在するなら、
マルチスレッド化というのも手だ。
依存関係があるタスクのマルチスレッド化は排他制御とかいろいろと考えないといけないが、依存関係がないなら、割と簡単に実現出来るだろう。

プログラムの重い部分はループになっている事が多い。
元々のループ内の処理の規模によるが、ループアンロールをしてやるだけで、そこそこ速くなることもある。
あるいは、ループの中で毎回行っている計算を、可能ならループ外に追い出すなど、
いろいろな高速化のテクニックを試して見るのも良いだろう。

さてループの中を眺めて、お互いの処理に依存関係がなく並列性が十分に高く(個人的には数千以上を推奨)メモリアクセスがランダムではなく、GPGPUに向いている処理だと判断できたらいよいよGPGPUへ手を出そう。

ただ、処理に必要なデータや処理の結果生成されるデータの量が多く、データの転送の時間が元の処理よりも長いなら、残念だが諦めよう。
（データ転送の時間を隠蔽するテクニックとかを試して見る価値はある）
サンプルプログラムで転送速度を測っておけば、後は計算でおおよその転送に掛かるおおよその時間は求められるので、GPGPUに手を出す前に求めておくのも良いだろう。

ところで、高速化したい処理がGPGPUに向いていなかったらどうするか。

クラスタが利用出来るなら、MPIによる高速化も良いかもしれない。
しかし初めからMPIを前提にしていないプログラムを、後からMPIを利用するように修正するのはそこそこ大変だろう。

GPGPUに手を出せるほどのスキルがあるなら、SSEやAVXといったSIMD命令を使った
高速化も検討してみると良いかもしれない。
SSEも便利な命令が増えて、だいぶプログラムが組みやすくなっている。
SSEやAVXでの高速化を行うなら、[ここ](http://software.intel.com/en-us/articles/intel-intrinsics-guide)からダウンロードできるIntel Intrinsics Guideは絶対に利用すべきだ。

さて、OpenMPやSIMD命令を使っても、まだ速度が足りない場合、2013年1月28日から購入可能な、[Xeon Phi](http://pc.watch.impress.co.jp/docs/news/20121113_572526.html)の購入するのも良いかもしれない。
512bitのSIMD命令を持つXeon Phiに載せることで、きっと性能は大きく上がるだろう。
ただしXeon PhiではSSEやAVX命令は動かないので、苦労してSSEやAVXを使った最適化をしているなら、元に戻すか512bitのSIMD命令に置き換えるのを忘れないように。

IntelによるとXeon Phiへのプログラムの移植は殆ど手間が掛からないらしい。（本当だろうか？）

というわけで、Xeon Phiはいろいろと楽しみである。

あっ・・GPGPU面白いですよ（汗）


***
上の記事中の検討の順番は適当でいいと思います。
意見が違っても許してやって下さい。
明らかに技術的に間違っている部分は修正するのでご連絡下さい。
Ember.js バリデーションサンプル

Ember.jsは自前ではバリデーションの仕組みを提供していません。ember-dataもバリデーションの機能は現在のところ、備えていません。バリデーションの仕組みが個々に提案されている状況です。

それらのうち、Viewを拡張してわりとスマートにバリデーションを実装しているサンプルがありましたので、紹介します。

https://gist.github.com/3301728

フォーカスが離れたタイミングで validate メソッドを呼び出し、結果を code と message にセットしています。codeとmessageはエラーメッセージ表示欄に表示されます。

サーバ側でないとバリデーション判定できない要素のために、ajaxでサーバに問い合わせ、結果が帰ってきた段階でバリデーション結果を表示することもできます。

実際に動くサンプルも用意されています。試してみてください。

http://jsfiddle.net/kTJCH/
MongoDBのシェルの操作方法メモ

# 便利ページ

公式

- [MongoDB Javascript API Docs](http://api.mongodb.org/js/current/)
  - mondodbのjsの仕様がわかる
- [Read — MongoDB Manual](http://docs.mongodb.org/manual/applications/read/)
  - findの基本的な使い方の例
- [Operator Reference — MongoDB Manual](http://docs.mongodb.org/manual/reference/operators/)
  - findの範囲指定などのオペレーターの例
- [SQL to MongoDB Mapping Chart — MongoDB Manual](http://docs.mongodb.org/manual/reference/sql-comparison/)
  - SQLでの操作とmongodbでの操作の対応表
- [高度なクエリー - Docs-Japanese - 10gen Confluence](http://www.mongodb.org/pages/viewpage.action?pageId=6029357)
  - 使えるオペレーター一覧、データ型一覧、より高度な使い方など日本語ドキュメント
- [mongo/jstests at master · mongodb/mongo · GitHub](https://github.com/mongodb/mongo/tree/master/jstests/)
  - jsで書かれたmongodbのテスト用スクリプトが大量にある

参考になったページ

- [コンソール画面でのコマンド操作 - matsukazの日記](http://d.hatena.ne.jp/matsukaz/20110418/1303144042)
  - help(), db.runCommands()の一覧
- [mongoインタラクティブシェルの使い方メモ - ペイパー・プログラマーズ・ダイアリー](http://d.hatena.ne.jp/naoyes/20110514/1305363160)
  - ファイルに保存したjsスクリプトを、コマンドラインから実行させたりmongodbのシェル内で呼び出す方法
- [MongoDBのshellを使い倒す - nifty engineer blog](http://tech.nifty.co.jp/2011/11/25/mongodbのshellを使い倒す/)
  - より発展的・実践的な使いかた、値のassert、組み込みオブジェクトの便利メソッド紹介など


----------

# 基本的な操作方法

`mongo`
`show dbs`
`use dbName`
`show collections`
`col = db[collectionName]`

`help`
`db.help()`
`col.help()`

以下、Twitter streaming apiのJSONを保存したコレクションの操作例

## ドキュメント数を表示

```js
db.collectionName.count()
db[collectionName].count()
```

- 英数字以外のコレクション名の場合`db[collectionName]`でアクセスする必要がある

## sort, limit

最新10件を表示

```js
col.find({}).sort({$natural:-1}).limit(10)
```

## findで一致したドキュメントの一部プロパティだけを取得

スクリーン名と本文だけを表示

```js
col.find({}, {_id:false, "user.screen_name":true, text:true }).sort({$natural:-1}).limit(10)
```

- 入れ子になったプロパティの直接指定は""で囲う

## findしたドキュメントに対してjavascript関数を実行して表示

スクリーン名と本文だけを表示

```js
col.find({}).sort({$natural:-1}).limit(10).forEach( function(a){print(a.user.screen_name, ":",  a.text)} )
```

## 特定のプロパティが存在しないドキュメントだけを表示

リツイートではない普通のツイートだけ表示

```js
col.find({retweeted_status:{ $exists: false }}).sort({$natural:-1}).limit(5).forEach( function(a){print(a.user.screen_name, ":", a.text )} )
```

## ある配列プロパティの内容が一定値以下のドキュメントだけを表示

リツイートではなくて、かつ、ハッシュタグが２つ未満のツイートだけ表示

```js
col.find( { retweeted_status:{$exists:false}, $where:"this.entities.hashtags.length < 2"  }).sort({$natural:-1}).limit(20).forEach( function(a){ print(a.user.screen_name, ':' , a.text); } )
```

- findの$sizeで指定した個数と一致するものが得られるが範囲指定はできないので、$whereをつかう

----------

# mongoコマンドの引数指定による操作方法

`mongo localhost:27017/dbName --eval 'db["collectionName"].count()' --quiet`

または

```bash
echo 'print(db["collectionName"].count());' > somescript.js
mongo --quiet localhost:27017/dbName somescript.js
```

のように操作できる

## クエリ結果のJSONを標準出力させてファイルに保存

```bash
echo 'shellPrint(db["collectionName"].find().limit(10)));' > query.js
mongo --quiet localhost:27017/dbName query.js > result.json
```

- shellPrint()で標準出力にでてくる

## クエリ結果を別のコレクションに保存する
Resqueの管理画面をRailsに統合する

routes.rbに以下を追加

```
mount Resque::Server, :at => "/resque"
```

Gemfileに以下を追加

```
gem 'resque', :require => 'resque/server'
```

すれば http://localhost:3000/resqueでresqueの管理画面が見れるように。

** 参考文献

ここから抜き出しただけ
http://railscasts.com/episodes/271-resque?language=ja&view=asciicast
Emacsでポモドーロテクニック

皆さん時間管理していますか。僕は正直いうとちゃんとできていません。
ちゃんとやらないとなと思って、いくつかその手の本を探していると、
ポモドーロテクニックというものがあることを知りました。大まかに
いうと 25分区切りで作業を進めていくというで、これならできるかなと
思って実践しています(現状あまりちゃんとできていませんが・・・)

作業メモは org-modeにしているので、どうせなら時間管理も Emacsで
したいよね、ってなりますよね。Emacsの拡張もいくつかあったのですが、
Emacs Lispでそういうのを作る場合どういうことをすればいいのかを
知りたかったので自作しました。そしてできあがった pomodoro.elについて
紹介します。


[http://d.hatena.ne.jp/syohex/20121215/1355579575](http://d.hatena.ne.jp/syohex/20121215/1355579575)
@interface内でのメソッドの宣言


```MyClass.m
@interface MyClass(){

}

- (void)myMethod;  // ←これ

@end
```

.mファイルの中で宣言されたメソッドは外で見られるのかという疑問。
結論としては当たり前で.hしか外からは見られないので、publicなメソッドとして利用したい場合は

```MyClass.h
@interface MyClass() : NSObject{

}

- (void)myMethod;

@end
```

としてやらないといけない。
いまいち、.mファイルの中でのMyClass() interface宣言って何なのか分からない。privateなメソッドを実装できるようにするため？
bundler-auto-updateの紹介

こんにちは [@sonots](https://twitter.com/sonots) ＠サンフランシスコ出張中です。今回私は [bundler-auto-update](https://github.com/versapay/bundler-auto-update) という gem の紹介をしてみようと思います。
# bundler-auto-update とは

bundler-auto-update を使うことでシステムを壊さずに Gemfile に記述してある gem のバージョンをアップデートすることができます。

Gemfile に記述されている gem のバージョンを１つあげてテストを実施し、システムが壊れないバージョンまで gem のバージョンをあげてくれます。


# 使い方

    gem install bundler-auto-update
    bundle-auto-update -c bundle exec rspec

実行すると、gem を１つバージョンアップしてテストを実行、git に自動 commit、以降この動作を限界まで繰り返します。全部終わって git log を実行すると

    $ git log
    02cfb8c Auto update parallel to version 0.5.9 (16 hours ago)
    ff39287 Auto update cucumber to version 1.1.0 (16 hours ago)
    3502a14 Auto update cucumber to version 0.10.7 (16 hours ago)
    2ff938c Auto update cucumber to version 0.9.4 (17 hours ago)
    800ad84 Auto update hpricot to version 0.8.4 (17 hours ago)
    5c92bf0 Auto update whenever to version 0.6.8 (17 hours ago)
    d83172d Auto update addressable to version 2.2.6 (17 hours ago)
    7dc3b72 Auto update fastercsv to version 1.5.4 (18 hours ago)
    08ae945 Auto update compass to version 0.11.5 (19 hours ago)
    fe17166 Auto update hoptoad_notifier to version 2.4.11 (20 hours ago)
    5875d1a Auto update hoptoad_notifier to version 2.3.12 (21 hours ago)
    4388e07 Auto update activeadmin to version 0.3.2 (21 hours ago)
    4cd1d0e Auto update haml to version 3.1.3 (22 hours ago)


みたいになっていたりします。あ、もちろん Gemfile の中でバージョンを絞っている場合は、その範囲内でしかバージョンアップが働かないので、場合によっては外して実行してください。

# 応用

これを Jenkins に仕込んでおくと、毎日 gem のバージョンアップをチェックしてもらえたりして良いのではないでしょうか？
hub コマンドを使うなどして自動で Jenkins 氏に github に pull request を送ってもらう、なんてこともできるでしょうね。

# まとめ

テストが壊れない範囲で gem のバージョンをアップデートしてくれる [bundler-auto-update](https://github.com/versapay/bundler-auto-update) gem の紹介でした。
Jenkins に仕込んでおいたりすると楽しそうなので、気が向いたら是非トライしてみてください！
Objectice-Cでのinitではまった


自前のObjectice-Cクラスを書くときにinitではまった。
当初下記のように書いた。

```
- (MyClass*)init:(double)paramA with:(double)paramB;
```

でもこれだとNo visible selectorってでる。
なんでかと思っていじっていると下記のように書いたらエラーが消えた。

```
- (MyClass*)initWithParamA:(double)paramA 
                    paramB:(double)paramB;
```

多分initメソッドとinit:with:は同じものとして見られるのだと思う。withはキーワードでしかないのでメソッドの名前を判断する上で必要とされているのはあくまでもinitのみなのではないだろうか。
なので自前でメソッドを作るときはキーワードでない先頭の名前を変更することが大事。
jsdomでスクレイピングするときjQueryifyできなくて困る

http://sakuratan.biz/archives/3393

この記事に書いてあるように、jsdomはデフォルトでscriptタグを処理するため、スクレイピング用途で使うときはオプションを指定してscriptタグを無効にしたほうが便利。
しかし、そうするとjQueryifyが使えなくなってしまう。jQuery使えないのはだるいので、何とかする必要がある。

上の記事では自前でjQueryをごりごりロードしている。だけど、実は2行追加するだけで十分。

``` javascript
var document = jsdom.jsdom(data, null, { features: { ProcessExternalResources: false, FetchExternalResources: false }})
  , window = document.createWindow();

window.document.implementation.addFeature('FetchExternalResources', ['script']);
window.document.implementation.addFeature('ProcessExternalResources', ['script']);

jsdom.jQueryify(window, "http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js", function (window, $) {
    // なんかやる
  });
});
```

##結局
最初はscriptタグを無効にしておき、jQueryifyする直前で無理やりscriptタグを有効にする。

``` javascript
window.document.implementation.addFeature('FetchExternalResources', ['script']);
window.document.implementation.addFeature('ProcessExternalResources', ['script']);
```
zsh の設定ファイルの置き場所をまとめる

zsh の設定ファイルって多いですよね。まず `.zshenv` があって、 `.zprofile` や `.zshrc` 、 `.zlogin` があって、その他に独自に `.zshrc.local` やら `.zshrc.ホスト名` を使っている方もいるでしょうし、人によっては `.zlogout` もあるかもしれません。

でも $HOME にファイルが ワサワサあると、`ls -a` した時に邪魔になりませんか。

そんな時にお勧めなのが、環境変数 ZDOTDIR です。

この環境変数に任意のディレクトリを設定しておくことで、zsh の設定ファイルを集めておくことができます。$HOME に置いておく必要があるのは `.zshenv` だけになります。

例えば以下のように `$ZDOTDIR` を設定すると、`.zshrc` や その他の zsh の設定ファイルを `$HOME/.dot/zsh/` にまとめられる、というわけです。

```sh:$HOME/.zshenv
export ZDOTDIR=$HOME/.dot/zsh/
```

zsh に関する設定ファイル群を一つのディレクトリにまとめられると、いろいろと便利に取り扱うことができるようになります。

- 何か探す時の grep 対象をそのディレクトリに限定できる
- そのディレクトリを cvs や git で管理することができる
- このディレクトリを tar して別ユーザの $HOME に展開するのもあり
- $HOME が NFS 上にある時も `.zshrc.ホスト名` を一箇所にまとめられる

「zsh の設定ファイルが増えてきたなぁ」と思う方は、ぜひお試しください。
オフラインリアルタイムどう書く第6回の参考問題

オフラインでリアルタイムに「どう書く」をやるイベント。
またやります
http://atnd.org/events/34368
で。例によって参考問題。
難易度と分量はこれを目安に。
参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題制作の参考になりますのでぜひ。

で。

いつもならここで問題を書くわけですが、画像なしでは表現しがたいので別URLに書きました。

http://nabetani.sakura.ne.jp/hena/ord6lintersection/

です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
sedのお勉強

# 概要
初めてsed触ったから、覚えたことまとめる

# 内容
## 基本
文法

```
cat before.txt | sed -e 's/before/after/gi'
sed -e 's/before/after/gi' begore.txt
```

beforeをafterに変換。gは全部変換。iは大文字小文字無視。-e はいくつでも繋げられる。

## マッチした文字列の利用
beforeの部分で、`\(`と`\)`でくくると、afterの部分で`\1`で取り出せる。beforeで複数`\(\)`を使うと、afterで`\2\3\4`な感じで取り出せる。
つまり

```bash
$ echo 'abcdefghijklmn' | sed -e "s/.*\(d.*g\).*\(l.*$\)/\1\n\2/g"
defg
lmn
```

こんな感じ。例がおそまつなのは気にしない。

## はまったところ
### `+`記号
sedでは`+`ではなく`\+`としないと、直前の文字1個以上の意味で使えない。
他にもバックスラッシュが必要なメタ文字が多い。
参考：[正規表現メモ](http://www.kt.rim.or.jp/~kbk/regex/regex.html#SED)

[追記] 手元のMacのBSDのsedだと`\+`でメタ文字として動いてくれなかった。みんなGNUのsed使えばいいと思う。

### 最短一致と最長一致
sedの正規表現は最長一致なので、最短一致させる時は [^] を使ってなんとかする。
参考：[Tech Tips: sedの最短一致﻿﻿](http://techtipshoge.blogspot.jp/2011/10/sed.html)

### シングルクォーテーションとダブルクォーテーション
-eの引数をシングルクォーテーションでくくって、その中でシングルクォーテーションを使おうとして、シングルクォーテーションをバックスラッシュでエスケープしても動かなかった。

```
cat before.txt | sed -e 's/.*\'\([^\']\)\'.*/\1/g' 
```

-eの引数をダブルクォーテーションにしたら解決した。

```
cat before.txt | sed -e "s/.*'\([^']\)'.*/\1/g"
```

あとで調べたら、`\'`はバッファの末尾、という意味のメタ文字だった。
参考：[正規表現メモ](http://www.kt.rim.or.jp/~kbk/regex/regex.html#SED)

## 参考

* [sed - ストリーミングエディタ](http://www.ksknet.net/linuxrz/sed.html)
* [シェル・スクリプト・リファレンス - 【 文字列を置換する「sed」 】：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231161/)
* [正規表現メモ](http://www.kt.rim.or.jp/~kbk/regex/regex.html#SED)
* [逆引きUNIXコマンド/sedを使ってスペースの文字列操作を行う - Linuxと過ごす](http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/sed%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E6%93%8D%E4%BD%9C%E3%82%92%E8%A1%8C%E3%81%86.html)

# 感想
色々調べたり読んだり試したりしたけど、まとめるとたいしたことないなあ。
しかも今まとめたのsedの機能のごく一部っぽいから、その内また調べたい。
データの登録・更新日の自動挿入

cakePHPだと標準でやってくれるテーブルの登録・更新日への自動セット。
標準ではないようなのでひとまずどんな方法があるのか、調べてみました。

その前に、テーブルに以下のフィールド作っておきます。
**created**
**modified**

#方法その1
beforeSaveをオーバーライド。一番直感的。

```php:user.php

　　protected function beforeSave()
    {
            if ($this->hasAttribute('modified'))
            {
                    if ($this->isNewRecord)
                            $this->created = new CDbExpression('NOW()');
                    else
                            $this->modified = new CDbExpression('NOW()');
            }
            return parent::beforeSave();
    }
```

#方法その2
user.php 内にあるrules()を変更する方法。
validationに関連しているところなので、デフォルト値をセットのような
イメージでしょうか。

```php:user.php

　	array(
　　　　　　'created,modified',
            'default',
        　　'value'=>new CDbExpression('NOW()'),
        　　'setOnEmpty'=>false,'on'=>'insert'
　　　　),

```

いや、変更時も入れてほしいよって時にはこのようにしてみた。
もうちょっとスマートな書き方がありそうですが。

```php:user.php

　　　　　array(
　　　　　　　　'created',
　　　　　　　　'default',
　　　　　　　　'value'=>new CDbExpression('NOW()'),
　　　　　　　　'setOnEmpty'=>false,
　　　　　　　　'on'=>'insert'
　　　　　),
　　　　　array(
　　　　　　　　'modified',
　　　　　　　　'default',
　　　　　　　　'value'=>new CDbExpression('NOW()'),
　　　　　　　　'setOnEmpty'=>false,
　　　　　　　　'on'=>'update'
　　　　　),
```

#方法その3
behaviors()を設定する。
setUpdateOnCreateのイベント時に呼び出されるように設定。


```php:user.php

public function behaviors()
{
    return array(
        'CTimestampBehavior' => array(
            'class' => 'zii.behaviors.CTimestampBehavior',
            'createAttribute' => 'created',
            'updateAttribute' => 'modified',
            'setUpdateOnCreate' => true,
        ),
    );
}

```

って英語の公式に
http://www.yiiframework.com/wiki/10/how-to-automate-timestamps-in-activerecord-models/
こんな記事がそのまま…！

まだまだYiiを触り始めたばかりですが、みなさんどうぞよろしく！
dotCloud で IP制限する

dotCloud の sandbox 環境は無料（いつの間にかアプリ数の制限もなくなってる）なので、ちょっとした社内ツールを動かす場所にも使えそうですね。

dotCloud では、アプリのディレクトリに `*nginx.conf` というファイルを置けばそれを `server` セクションで読み込んでくれます。

ただ、罠として、 nginx にはリバースプロクシされたリクエストが来るので `X-Forwarded-For` ヘッダを見るようにしないといけないのと、しかも IPv6 になってくるので `1.2.3.128/25` じゃなくて `::ffff:1.2.3.128/121` って書かないといけません。

```ipaddr-nginx.conf
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For;

allow 1.2.3.128/25;
allow ::ffff:1.2.3.128/121;
deny all;
```

ただし、リバースプロクシのIPアドレスが不明なので、 `set_real_ip_from` の範囲を広く設定してしまっています。
dotCloud のネットワーク構成を理解していないのですが、もし同じローカルネット内に他人の dotCloud 環境があれば、 `X-Forwarded-For` を使ってアクセスできてしまいそうです。
あくまでもカジュアルな対策にとどめておいて、ちゃんとした認証も組み合わせて使ってください。

IPアドレスリストが長い時にこの設定ファイルを生成するスクリプトを書きました. ``python3 make_ipaddr_conf.py < iplist.txt > ipaddr-nginx.conf`` みたいにして使ってください。

```python:make_ipaddr_conf.py
import sys

print("set_real_ip_from 10.0.0.0/8;")
print("real_ip_header X-Forwarded-For;")

for L in sys.stdin:
    L = L.strip()
    if not L or L[0] == '#':
        continue
    print("allow", L + ';')
    if '/' in L:
        v4, subnet = L.split('/')
    else:
        v4, subnet = L, None
    if subnet is not None:
        print("allow ::ffff:%s/%d;" % (v4, int(subnet) + 96))
    else:
        print("allow ::ffff:%s;" % (v4,))
    print()

print("deny all;")
```
Ember.jsが提供するEnumerableインターフェイス

Ember.jsは配列みたいなデータを便利に扱うための、Enumerable interfaceを提供しています。
rubyのEnumerableと同じようなやつです。

Ember.jsはArrayに対してEnumerable interfaceを組み込んでいます。なので、配列に対してEnumerableの機能を利用することができます。
配列の他には、Ember.ArrayProxy, Ember.SetなどにEnumerable interfaceが組み込まれています。

今日はEnumerableが提供するメソッドを紹介します。

## forEach, map, reduce

Ember.jsは、forEach, map, reduceが実行環境で組み込みで提供されていれば、組み込みのメソッドを使い、実装されてなければ独自の実装を提供します。
ブラウザ互換性を考えずに使えるので良いですね。


## invoke

invokeは、引数に渡された名前のメソッドを、各要素に対して呼び出します。
結果を得るためでなく、副作用のある処理を実行するために利用します。
玄人好みな感じのメソッドですね。

```js
Person = Ember.Object.extend({
  sayHello: function() {
    console.log("Hello from " + this.get('name'));
  }
});
var people = [ 
  Person.create({ name: "Juan" }), 
  Person.create({ name: "Charles" }), 
  Person.create({ name: "Majd" })
]
people.invoke('sayHello');
// Hello from Juan
// Hello from Charles
// Hello from Majd
```

## firstObject, lastObject

最初と最後の要素を返す。

```js
[1,2,3].get('firstObject') // 1
[1,2,3].get('lastObject')  // 3
```

## toArray

配列に変換します。

## setEach, getEach

setEachは、各要素のメンバに対して同じ値をセットします。
getEachは、各要素のメンバを取得します。
こういう処理を簡単に書けるのは嬉しいですね。

```js
var arr = [Ember.Object.create(), Ember.Object.create()];
// we now have an Array containing two Ember.Objects
arr.setEach('name', 'unknown');
arr.getEach('name') // ['unknown', 'unknown']
```

## filter

rubyでいうselectです。

```js
var arr = [1,2,3,4,5];
arr.filter(function(item, index, self) {
  if (item < 4) { return true; }
})
// returns [1,2,3]
```

## filterProperty

filterで値一致を行うための簡潔記法です。
第二引数を指定しないと、 !!value が真になるものを抽出します。

```js
Todo = Ember.Object.extend({
  title: null,
  isDone: false
});
todos = [
  Todo.create({ title: 'Write code', isDone: true }),
  Todo.create({ title: 'Go to sleep' })
];
todos.filterProperty('isDone', true);
// returns an Array containing just the first item
```

## every, some

rubyでいう all? と any? です。

```js
Person = Ember.Object.extend({
  name: null,
  isHappy: false
});
var people = [
  Person.create({ name: 'Yehuda', isHappy: true }),
  Person.create({ name: 'Majd', isHappy: false })
];
people.every(function(person, index, self) {
  if(person.get('isHappy')) { return true; }
});
// returns false
```

## compact

rubyでいうcompactです。
nullである要素を除去します。

```js
[1, null, undefined, 2].compact()
// [1, undefined, 2]
```

undefinedを除去しないのはダメな感じですね。


## uniq

重複する要素を除去します。

```js
var arr = ["a", "a", "b", "b"];
arr.uniq(); // => ["a", "b"]
```

## without

渡された値と一致する要素を除去します。

```js
var arr = ["a", "b", "a", "c"];
arr.without("a"); // => ["b", "c"]
```



以上です。
配列に組み込まれているので、特になにも考慮しなくても使えるのが嬉しいですね。
個人的には、思ってたより便利な機能が揃っているので、使えそうな感じだと思います。
ただ、prototypeは汚染されてしまうので、Ember.jsを使うときは、for in を使うときにはhasOwnPropertyに一致するものだけを対象にするように注意しないといけません。

> property汚染をしないようにするオプションも用意されています。この記事のコメント欄を参照してください。(ursm++!!)
Rails3.2Engineのコントローラーのspecについて


複数のプロジェクトで一つのモデルや共通のルーティングを取り扱う時なんかにとても便利なのがEngine。

RailsEngineのコントローラーをテストしてて、routingではまってしまったので、その解決策。

`rails g controller hoge index`
これで生成したcontrollerのspecは、そのままだとrspecを走らせた時に、以下の様な箇所でルートが見つからない旨のエラーを起こします。

	get 'index'

例えばEngine名がMyEngineだったとして、通常のRailsプロジェクトで言えばMyEngineモジュール内のコントローラーはMyEngine::Hoge#indexを参照するはずが、Engineの場合だと、それでは参照できない模様です。
解決策としては、:use_routeでエンジンを指定することがあげられます。

	get 'index', :use_route => :my_engine

毎回use_routeと書くのも面倒なので、以下の様なモジュールを書いて、spec_helper.rb内のconfigでincludeしています。

	module ControllerSpecHelper
  	  def get(action, parameters = nil, session = nil, flash = nil)
        process_action(action, parameters, session, flash, "GET")
  	  end
      
      def post(action, parameters = nil, session = nil, flash = nil)
        process_action(action, parameters, session, flash, "POST")
      end
      
      def put(action, parameters = nil, session = nil, flash = nil)
        process_action(action, parameters, session, flash, "PUT")
      end

      def delete(action, parameters = nil, session = nil, flash = nil)
        process_action(action, parameters, session, flash, "DELETE")
      end
      
      private
    
      def process_action(action, parameters = nil, session = nil, flash = nil, method = "GET")
        parameters ||= {}
        process(action, parameters.merge!(:use_route => :my_engine), session, flash, method)
      end
    end

config内でinclude

    ...
    RSpec.configure do |config|
      ...
      config.include ControllerSpecHelper, :type => :controller
      ...
    end
    ...
PlayFramework2.0 のWSライブラリを試してみる

## PlayFramework2.x のWS実装
これは極論<strike>WebSocket</strike>WebServiceの略(2012/12/15:totoshiさん指摘:
☓WebSocket○WebService)。

- play.api.libs.ws.WS

http://www.playframework.org/documentation/2.0.4/ScalaWS 

## WS ライブラリ
基本的にHTMLに対し特化していると思って良い。
そのため、[Idea](http://www.jetbrains.com/idea/)などで眺めると、urlとか、その先の、get/post/put/delete といったメソッドがあるのが見えるはずだ。

```qiita.scala
val qiita:Promise[Response] = WS.url("https://qiita.com/api/v1/items").get()
```

Promise は予約みたいなもので、Response は実通信データの戻り値だ。
また、Responseは body:String, json:JsValue, xml:scala.xml.Elem の形式で取得できる。

```qiita.scala
WS.url("https://qiita.com/api/v1/items").get().map(_.json).await
```

デフォルトでは上記形式だが、バイナリで拾いたいとかの場合、Responseには getAHCResponse 関数もある。
これは[ningの非同期HTTPクラアイアント](https://github.com/ning/async-http-client)のデータ型で、根っこはこれで実装されている。

## 制約

WSリブラリは、Playのアプリケーションが初期化済みでなければ正常に動作しない。
WS.scala の実装を眺めればわかるのだが、アプリケーション設定に依存する部分があるため、例えばテスト等でWSライブラリを使いたい場合、擬似的に[サーバを立てるテストを書く](http://www.playframework.org/documentation/2.0.4/ScalaFunctionalTest)必要がある。

## サンプル

基本的な使い方しかしていないものの、ザクッとサンプルを立てた。
Qiita より、記事を引っこ抜いてRSSに編集してるだけなのだが、、、、。

https://github.com/Sunao-Yoshii/qiita-rss

DBへのキャッシュとか記事の種別とかは後で追加する予定（1月位か？）
Ruby Simple HTTP Server With Rack

Using JavaScript, if it is a static page, Chrome AJAX request local files often problems.


`XMLHttpRequest cannot load`
`file:///*******. `
`Origin null is not allowed by Access-Control-Allow-Origin.`

Because Chrome security mechanisms do not allow AJAX to load local files.
So, I decide to use a new method with ruby.

+  Install the rack, and set rack profiles config.ru:


`gem install rack`
`echo "run Rack::Directory.new('')" > ~/config.ru`

+  Switch to any directory and run:

`rackup ~/config.ru`


If you think the command so long, establish alias `alias rp='rackup ~/config.ru'`

The default boot server port is 9292,`-p [port_num]` can modify the port number, now open the browser to get the current directory of the file list: `http://locahost:9292/`
バッチ実行時だけphpのmemory_limitを増加させたいなら-dオプション


定期実行するバッチ処理をphpで実装すると、けっこうメモリを必要とする処理になりがちです。

そんなときにphp.iniのmemory_limitはそのままに、バッチ実行時だけmemory_limitを増加させたくなります。

マニュアル（ [PHP: オプション - Manual](http://php.net/manual/ja/features.commandline.options.php) ）をみると、-dオプションでphp.iniで設定する各項目を設定できるそうです。


	$ php -d memory_limit=256M require_large_memory.php

こんな感じで、memory_limitを増加させてバッチ実行できるようです。

-cオプションを使うとカスタムしたINIファイル指定もできるようですが、そこまでしなくてもちょっとオプション設定するだけでOKってときは、-dオプション使ってみると良いかとおもいます。
gitで空白の違いだけの行を除いてaddする

これは感動した。

ファイル保存時にエディタの設定でtrailing whitespaceを削除している場合などで、
実際にコミットしたい変更と、ただの空白の違いだけの行が大量に混ざっていて
分けようとする際に、`git add -p`で何度も`y/n`を繰り返すのが大変なときに使える。

下準備としてまず`git diff -w`の結果がコミットしたい内容だけになっているか確認する。
次に

```shell:
$ git diff -w --no-color | git apply --cached
```

`git diff --cached`で確認

今後も使いそうと思う場合はgitのaliasを追加すると良い。

```shell:.gitconfig
  addw = !"git diff -w --no-color | git apply --cached"
```

普段はあまり使いたい機会が無いかもしれないが、
特にオープンソースのコードを直接修正している時や、
ド素人時代の自分のコード含め、レガシーコードを修正している時などに
使いたい機会は訪れる。


コミットする際に、空白の違いだけの行と、意味のある変更行をどの程度分けるべきかについては、コードレビューの観点からできるだけ分けるべきだと思う。
要するに将来自分でも他人でも見返したときにdiffがノイズに感じるレベルのものは必ず分けるべき。

個人的には空白による違いが2行程度までの場合のみコミットを混ぜても良いかなという考え。
ただ`git diff`の一塊の中に空白違いだけのものは結構ノイズになる。特に行末のやつ。分けるべき。

空白の違いだけのコミットはチームまたはプロジェクトレベルでコミットメッセージをある程度決めておくのも良いと思う。
自分の場合は`"War on trailing whitespace"`とか`"War against ..."`としている。
その前にチームであればエディタの空白除去の設定をそろえるべきだが。
(→ [プロジェクトで統一した方が良い空白設定](http://qiita.com/items/e29c42e49c6ab7c71da8))

分けるメリットでもう一つ思い浮かぶのは、マージでCONFLICTが空白のdiffにより半端なくてやってられない時に、分けておけば空白除去だけのコミットを諦めて削除して戻して、マージしやすくすることも簡単にできる。

[参考:StackOverflow(Git add only non-whitespace changes)](http://stackoverflow.com/questions/3515597/git-add-only-non-whitespace-changes)
スペクトラルクラスタリングの話

[Machine Learning Advent Calendar 2012](http://qiita.com/advent-calendar/2012/machinelearning) の15日目の記事になります．ここではクラスタリング手法の一つであるスペクトラルクラスタリングの紹介をします．まさかこんなガチカレンダーになるとは予想してなかったので，戦々恐々としておりますが，どうぞよろしくお願いします．

[スペクトラルクラスタリングの話](http://d.hatena.ne.jp/mr_r_i_c_e/20121214/1355499195)
iPhone 5にPJSIPを組み込む


一度記事を消してしまったので2度目の文章作成です。。。
あんまりObjective-Cらしくない内容ですが、ご愛嬌。


##PJSIPとは
オープンソースのSipStackです。
SIPについてはぐぐってくれると嬉しいんですが、VoIPとかあの辺の話ですね。
詳しくはぐぐって！
超超ざっくり言うとこれを組み込んだらIP電話が使えるよって話です。


##今回の流れ
iPhone5用にコンパイルして、Xcodeに組み込むまでをやってみようかと思います。
組み込んだ後のコーディングはまた機会があれば紹介しようと思います。
そんなにしっかりコード書いたことないけど。

というわけで、さっそく本題に移りましょう！


##環境
- Mac OS X 10.7.5
- Xcode 4.5.2


##PJSIPをダウンロードする

[Getting Started: Building for Apple iPhone, iPad and iPod Touch](http://trac.pjsip.org/repos/wiki/Getting-Started/iPhone "Getting Started: Building for Apple iPhone, iPad and iPod Touch")
ここを参考にして進めます。

まずはソースコードを落とします。
ターミナルを起動して以下を実行します。
（zipもあるようですが今回はsvnで）

```
svn co http://svn.pjsip.org/repos/pjproject/trunk/ pjsip
```


##PJSIPをコンパイルする
makeとかよく知らない自分にはここが一番の難所でした。
色々とファイル編集してからmakeするだけなんですけどね。。。

```
# Checkoutしたディレクトリへ移動
cd pjsip

# Vimでファイル編集
vim pjlib/include/pj/config_site.h
```

内容は以下をコピペ

```config_site.h
#define PJ_CONFIG_IPHONE 1
#include <pj/config_site_sample.h>
```

次にconfigureをいじります。
iPhone5用にコンパイルするので、`armv7`となっているところを`armv7s`に修正します。
「armv7」と検索したら1箇所だけヒットしたので、そこを書き換えただけです。

```
vim configure-iphone
```

```configure-iphone
       #export ARCH="-arch armv7"
       export ARCH="-arch armv7s"
```

修正できたら以下を実行します。

```
./configure-iphone
```

エラーがでなければmakeします。

```
make dep && make clean && make
```

エラーがでなければOK！


##Xcodeへ組み込む
Xcodeで新規にプロジェクトを作成します。
以下のディレクトリをプロジェクトに追加します。

- pjsip/
	- pjlib/
		- include/
		- lib/
	- pjlib-util/
		- include/
		- lib/
	- pjmedia/
		- include/
		- lib/
	- pjnath/
		- include/
		- lib/
	- pjsip/
		- include/
		- lib/
	- third_party/
		- include/
		- lib/

![pjsip4iPhone5](http://cdn-ak.f.st-hatena.com/images/fotolife/n/niyaty/20121215/20121215002253.png "pjsip4iPhone5")



上のディレクトリ全てを以下の追加します。

- Header Search Paths

![Header Search Paths](http://cdn-ak.f.st-hatena.com/images/fotolife/n/niyaty/20121215/20121215002059.png "Header Search Paths")

- Library Search Paths

![Library Search Paths](http://cdn-ak.f.st-hatena.com/images/fotolife/n/niyaty/20121215/20121215002101.png "Library Search Paths")


と思ってたら、プロジェクトにファイルを追加した段階でLibrary Search Pathsも追加されてました。
ライブラリの追加もできてました。
 `Build Phases` の `Link Binary With Libraries` から確認できます。

![Link Binary With Libraries](http://cdn-ak.f.st-hatena.com/images/fotolife/n/niyaty/20121215/20121215002309.png "Link Binary With Libraries")

あとはiPhone5を繋いで、
`AppDelegate.m`あたりに以下を追加してビルドしてみましょう。

```
#include <pjsua-lib/pjsua.h>
```

これでエラーなく**実機でビルド**できればOK！
iPhone5用にコンパイルしてるので、simulatorでは動きません。
エラー出て怒られると思います。


##最後に
実装の際はこのサンプルを見ながら書いてみると良いでしょう。
[Samples: Simple PJSUA](http://www.pjsip.org/docs/latest/pjsip/docs/html/page_pjsip_sample_simple_pjsuaua_c.htm "Samples: Simple PJSUA")

APIはここを参照。
[PJSUA API - High Level Softphone API](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSUA__LIB.htm "PJSUA API - High Level Softphone API")

言うのが遅くなりましたが、もちろん電話番号が必要です。
iptelなら無料で電話番号を発行してもらえます。
[iptel.org](http://www.iptel.org/service "iptel.org")

探せば他にもたくさんあるはずなので探してみては如何でしょう。


んで


ぼくはCもSIPも詳しくないので質問されてもわかりません！
むしろ教えて下さい。

ということで、お疲れ様でございました。

##参考にしたサイト
[PJSIPをXcodeに組み込む](http://labs.techfirm.co.jp/ipad/cho/626 "PJSIPをXcodeに組み込む")
SublimeText2 


in CyberAgent

## Basic

Twitter Bootstrap CSS Example

-- demo --

fetch  -> bootstr -> do.


### 選択楽になる

ass => cmd-D => Multi select.

### 基本

SublimeText2 ?

1. xs pratform
	
	Mac/Win

2. String Selection
3. ファイル/文章内の移動
1.コマンドパレット使えばいいよ 
4. パッケージ


### Window About


タブとかファイル一覧とかミニマップ。

### Config

- text file
- User 優先、Default 弄らない

Format: JSON

- SyntaxError だと保存されない



### 残念ながらただのテキストエディター

ショートカット

- Keymap でショートカット変えれる。

1. ctrl-space 入力補完
2. 「⌘/ctrl-D」単語選択
3. 「⌘-Ctrl-G (Alt-F3)」ページ内で検索して選択
4. 「Ctrl-shift-(↑↓)」 複数行にわたって選択

移動系

1. 「⌘/ctrl-P」 Goto Anything
1. 「⌘/ctrl-R」 シンボル移動
1. 「Ctrl-G」行番号移動
1. 「⌘/ctrl-shift-p」コマンドパレットを表示

コマンドパレット

1. コマンド実行系


### プロジェクト管理

フォルダをそのままドラッグ（要は普段使い）すればいい

メニューからプロジェクト。

### what is package

- Syntax Hilight

黙ってパッケージ管理ツール使おう
- sublime package control


→ アップデートは自動だから、たまに掃除してね
package directory の一つ上のバックアップにある

### パッケージ入れて効率化しませう


#### 必須系

- SideBarEnhancement
- ConvertToUTF8
	- EncodingHelper
- GotoRecent -- 「Ctrl-Shift-R」
- Clipboard History
	- SublimeText内専用
- Local History

#### Web 制作系

- Emmet & Hayaku
	- Emmet 昔はZen-Coding
	- CSS の入力特化でHayaku
- Placeholders
	- ダミーテキストを入れる
- zen garden
	- jQuery を CDN 経由にしたり。
- Nettuts + fetch
	- ライブラリとかフレームワークのダウンロード先を登録
	- 直接ダウンロード&展開
	- コマンドから「fetch」で呼び出す
- AutoFileName
	- 画像のファイル名をディレクトリから取得
- ColorPicker
	- HTML/CSS の色とか
	- LESS/SASS build をする（別途入れる必要あり）
- Goto CSS Decliaration
- OmniMarkupPreviewer
	- Markdown ビュワー
	- 呼び出しはコマンドパレット
- Sublime SFTP
	- 有償パッケージ
	- ダウンロード、アップロード、同期、差分表示とかとか
- Git/SideBarGit
	- [Git]コマンドパレットからgit コマンド実行
	- [SideBarGit]サイドバーから
	- Gist を使ってオンラインスニペット管理可
- Sublime Server
	- Python HTTP
- Sublime PHP Builtin Web Server
	- PHP 5.4.x running
- Node.js
	- npm install running

いっぱいあるんです…

まとめはここ: https://gist.github.com/4048934


---

## sublime text 2 for php document


### 好きなショートカットキー

「コマンド-D」

(((私はここで力尽きた)))


PHP Buil-in WebServer の話



### たまーにある変な不具合

- OSX ~/Library/Application Support/Sublime Text 2 ←削除

1. 流行ってるサイト

	http://sublimetext.userecho.com/

2. Twitter

	twitter/ST2PkgControl

---

個人的メモ書き。（他のテキストエディタでも動く）

- Ctrl-n カーソル下
- Ctrl-p カーソル上
- Ctrl-k カーソルから後ろ削除
- Ctrl-d カーソル後の一文字削除
- Ctrl-o カーソル後に改行追加
- Ctrl-e カーソルを行末に
- Ctrl-f カーソルを右に一文字移動
- Ctrl-b カーソルを左に一文字移動
- Ctrl-v １ページ下に移動
- Ctrl-Shift-v 選択しながら1ページ下に移動
- Ctrl-t カーソル前後の文字を入れ替える
- Ctrl-y よくわからん。ヤンクっぽいけどどの文字列をコピー？
gitでハッシュ値を取得

以下のようにするとHEADのハッシュ値が得られる

```shell:
$ git rev-parse HEAD
b5b862f5072d516a86e7c469bb015898e7cc631b
```

ユースケースとしてはスクリプトなどでgitのコミットのリビジョンを比べながら何かしたい時に使える

```ruby:
sha = `git rev-parse HEAD`
```

[参考:StackOverflow(How to retrieve the hash for the current commit in Git?)](http://stackoverflow.com/questions/949314/how-to-retrieve-the-hash-for-the-current-commit-in-git)