OmniAICreator/Qiita-1.07M huggingface dataset:
gitのdiffを見やすく表示する

GitHubのdiffがメソッド名表示されて見やすかったので、ローカルでも出来ないか調べたのでそのメモ。

例えばGitHubのdiffはメソッド名`def is_repo?`が出る
![Screen Shot 2013-11-21 at 7.17.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/4402/34d6ecf8-7437-b881-b1ff-80c90ec1689d.png)
https://github.com/github/hub/commit/87050ce94a97b0c382b99c975bde0c833332b38e

普通にしてるときのローカルのdiffはこんなかんじ。メソッド名出ない:confounded:
![Screen Shot 2013-11-21 at 7.20.04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/4402/b4942b6f-b522-50ac-3a7a-2234b55760b4.png)

ローカルでもGitHubのようにdiffにメソッド名を出すようにするにはプロジェクトルートに

```.gitattributes
*.rb diff=ruby
```

を置けば:ok_hand:

ローカルはこんなかんじなる:heart_eyes:
![Screen Shot 2013-11-21 at 7.29.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/4402/b02ab578-b778-048b-5607-877ae8a41ece.png)


`diff`で選択できるパターンは
 http://git-scm.com/docs/gitattributes#_defining_a_custom_hunk-header
に掲載されているので、必要に応じて変える。


**2013/11/22 13:40 追記**

グローバルな.gitattributesを指定したい場合は

```~/.gitconfig
[core]
      attributesfile = ~/.gitattributes_global
````

```~/.gitattributes_global
*.rb diff=ruby
```
のように設定すれば:ok_hand:
MacにRuby 1.8.7 を今あえてインストールする

OS X 10.9 Mavericksから Ruby 2.0.0になり、[Ruby 1.8.7のメンテも終了](https://www.ruby-lang.org/ja/news/2013/06/30/we-retire-1-8-7/)しました。
しかし、どうしても1.8系が必要になったので、インストールしたときのメモ；

#1．Command Line Tools（Xcode）、Homebrew、rbenv、ruby-buildのインストール
参考；
→・[Ruby 2.0.0 を Homebrew + rbenv で OS X Mountain Lion にインストール](http://blog.livedoor.jp/noanoa07/archives/1897747.html)

* Command Line Toolsのダウンロードは[こちら](https://developer.apple.com/downloads/index.action)から。（要 Apple ID）

```
#Homebrewは、[ホームページ](http://brew.sh)のインストールコマンドをコピーして、ターミナルで実行
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"  #最近のコマンドを使用すること
$ brew update  #Homebrew自体とformulaを最新版に
$ brew upgrade #更新のあるパッケージを再ビルド
$ brew doctor  #Homebrewの診断コマンド；エラーが出なければ OK
```
```
$ brew install ruby-build
$ brew install rbenv
```
rbenvを有効にするため、
~/.bash_profile に `eval "$(rbenv init -)"` の一行を追加する；
`$ open ~/.bash_profile  #openは、OS X 独自コマンド`
で、~/.bash_profile をエディタ（テキストエディットなど）で開いて、上の一行を追加して保存。
~/.bash_profile がまだない場合は；
`$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile`
で作成。
（他のエディタで設定しても可）
`$ source ~/.bash_profile #または、ターミナルを再起動`


#2．Ruby 1.8.7-p374 のインストール
Ruby 1.8.7 のインストールに必要な openssl、readline、apple-gcc42 のインストール

```
$ brew install openssl
$ brew install readline

$ brew tap homebrew/dupes
$ brew install apple-gcc42

$ source ~/.bash_profile #または、ターミナルを再起動
```
```
$ rbenv install -l #インストール可能な Ruby のバージョンを確認
$ CC=/usr/local/bin/gcc-4.2 RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 1.8.7-p374 #最新のRuby 1.8.7-p374 のインストール
```
```
$ rbenv versions #インストールされたRubyのバージョンを確認
* system (set by /Users/ユーザ名/.rbenv/version)
  1.8.7-p374
# *が現在有効なRubyのバージョン 
 
$ rbenv global 1.8.7-p374 #Ruby 1.8.7 に切り替える
$ rbenv rehash #切り替えた時は、有効にするために必ず実行

$ rbenv versions
  system
* 1.8.7-p374 (set by /Users/ユーザ名/.rbenv/version)

$ ruby -v #ターミナルでも Ruby のバージョンを確認
ruby 1.8.7 (2013-06-27 patchlevel 374) [i686-darwin13.0.0]
```
　
（→・[関連記事](http://blog.livedoor.jp/noanoa07/archives/1950136.html)）
StarRubyをHomebrewでMacにインストールする方法


Rubyの2Dゲームライブラリ[StarRuby](http://www.starruby.info/ja/)をMacにインストールしたときのメモ：

公式ページの「[Mac OS X で動かす](http://www.starruby.info/ja/documentation/how_to_run_for_mac_os_x)」はMacPortsで、Homebrewでインストールする情報が少なかったので；
→・[たった200行で作れるテトリス Ruby編 - a newcomer!](http://a-newcomer.com/53)

上記の記事の方法で、Homebrewを使ってインストール。
（OS X 10.9 Mavericks、Ruby 2.0.0-p247 で実行）

#0．準備
Homebrew、必要ならrbenv、ruby-buildでRubyのインストール
参考；
→・[Ruby 2.0.0 を Homebrew + rbenv で OS X Mountain Lion にインストール](http://blog.livedoor.jp/noanoa07/archives/1897747.html)
（Command Line Tools、Xcodeは、なるべく最新のものを選ぶ）

#1．SDL関連ライブラリのインストール
```
$ brew update  #Homebrew 自体と formula を最新版に
$ brew upgrade #更新のあるパッケージを再ビルド
$ brew doctor  #エラーがでなければ OK

$ brew install sdl
$ brew install sdl_mixer
$ brew install sdl_ttf
$ brew install fontconfig
#必要なら、libpng、freetype、libogg なども

$ gem update --system #Rubymsを最新に
$ gem install rsdl 
```

参考；
→・[StarRubyソースコード - hajimehoshi/starruby - GitHub](https://github.com/hajimehoshi/starruby)
→・[MacにRuby/SDL、rsdl、SGEを入れて、ゲームライブラリMyGameを動かす](http://qiita.com/noanoa07/items/88fefe232dc605720e09)

#2．StarRubyのインストール

```
$ brew tap homebrew/versions
$ brew install libpng12
$ brew link libpng12
#Starrubyのインストールにはデフォルトのlibpng15ではなく、libpng12が必要なため

$ git clone git://github.com/hajimehoshi/starruby.git
$ cd starruby
$ ruby extconf.rb
$ make
$ make install
```

（注；OS X 10.7.5 Lion、Ruby 1.8.7では、`ruby extconf.rb` でエラー）

　
（2014.5.29 追記；
　別の方法でインストールしている記事を見つけました。
→・[Star Rubyのインストール - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20140417/install_star_ruby)）

```
$ git clone git://github.com/hajimehoshi/starruby.git
$ cd starruby
$ ruby extconf.rb

#makeのエラーを回避する
$ cat Makefile | sed 's/-multiply_definedsuppress//' > Makefile~
$ mv -f Makefile~ Makefile

$ make
$ make install
```

#3．動作確認
注）MacでStarRubyのプログラム（foo.rb）を動かすときは；
`$ ruby foo.rb #ではなく`
`$ rsdl foo.rb`

##サンプルプログラム；

* 上記記事の[テトリス](https://github.com/daic-h/tetris-rb)

* StarRubyのフォルダの中のsamplesに入っているプログラム

* StarRubyのホームページの[サンプル](http://www.starruby.info/ja/documentation/samples)

* 『[日経 ソフトウエア 2012年2月号](http://www.amazon.co.jp/dp/B006ITKWHS/) 』の特別付録
「無料ツールで楽しく学ぶ！ ゲームプログラミングを始めよう」
「Part 3 Star Ruby で迷路ゲームを作ろう！」サンプルプログラム；
→ [バックナンバー紹介（2012年2月号）](http://itpro.nikkeibp.co.jp/article/MAG/20120123/379125/)の[ダウンロード](http://itpro.nikkeibp.co.jp/article/MAG/20111122/374786/?ST=nsw#201202)から（→[fu1202.zip]
(http://itpro.nikkeibp.co.jp/article/MAG/20111122/374786/fu1202.zip?ST=nsw)）
![b1ee7736-s.jpg](https://qiita-image-store.s3.amazonaws.com/0/26536/f1f3a688-afd9-017c-78ee-d862829f1bd8.jpeg)

　
注）
`Font.new("fonts/OANGEKI", 12)`
などでエラーが出たときは、OS Xのフォントをフルパスで指定する。
→ `Font.new("/Library/Fonts/Arial.ttf", 12)`

（2014.5.29 追記；
　または、./ を追加して、カレントディレクトリからの相対パス指定に変えればよい。
→ `Font.new("./fonts/OANGEKI", 12)`

　あるいは、Ruby の起動時に[コマンドラインオプション](http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2frubycmd.html) `-I directory名` を使ってファイルをロードするパスを追加する。カレントディレクトリを追加するには .（ドット）を追加する。
`$ rsdl -I. foo.rb` 
で実行。
→ ・[Star Rubyのインストール - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20140417/install_star_ruby) ）

　

StarRubyの開発が止まっているようなのが残念。

　
（→・[元記事](http://blog.livedoor.jp/noanoa07/archives/1949947.html)）
Qiitaでmarkdownのソースを書きたい

## 書きたい。Qiitaでmarkdownのソース

最初バッククオートを連続でつけるcode fences型で書こうとしたらプレビューがえらいことになったので、先頭にスペースを入れるインデント型で書いたらちゃんと出た。

    /*  
    ## cs-some-module

    description

    ```
    <div class="primary-header">
      <h2><span class="primary-header__body">Title</span></h2>
    </div>
    ```
    */

よかった。
compassのソース内で環境判別

## したいよ、環境判別

compass_env()で判別する関数用意。
例は開発環境かどうかを判別する関数。

```scss
@function is_development(){
  @return compass_env() == development;
}
```

## こんな使い方

環境によってコメントを出力する。スタイルガイドとか。


    @mixin cs-some-module($some-arg){

      @if is_development(){
    /*  
    ## cs-some-module

    description

    ```
    <div class="primary-header">
      <h2><span class="primary-header__body">Title</span></h2>
    </div>
    ```
    */
      }
    }

可読性は微妙ですね。
JavaScriptでHTMLタグを削除する正規表現

RSSを引っ張ってきて表示する時にテキストだけ取得したくて、データに含まれているHTMLタグを削除したかった。
メモ。

```js
var str = '今日は<strong>とても</strong>良い天気<br />だと思うよ？<img src="" alt="" />';
console.log(str.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,''));
```
今日はとても良い天気だと思うよ？

ちゃんと出た！(^o^)丿
Rubyのワンコールブロックがイケメンな話


またメタプログラミングRubyネタ。小ネタです。

著者がRubyは簡潔にかけていいけどイケてないと言っているのが

```ruby
name = ["i", "my", "me"]
name.map{|n| n.capitalize }
#=> ["I", "My", "Me"]
```
って感じのが、パイプとか中括弧とかでブロック作ってややこしい、と。
確かにその通りです。ちなみにこれをワンコールブロックというそうです。

ですが、これをRuby1.9以降ならSymbolのProc変換という方法で超簡潔にかけちゃいます！

```ruby
name = ["i", "my", "me"]
name.map(&:capitalize)
#=> ["I", "My", "Me"]

string_numbers = ["1", "2", "3"]
string_numbers.map(&:to_i)
#=> [1, 2, 3]
```

イケメン！！
ちなみに1.8系とかでも自分で簡単に実装できちゃいます。

なぜこれが動くかとかは下記のサイトが丁寧だったのでご参考まで。
http://d.hatena.ne.jp/kitokitoki/20120415/p1
UnboundMethodを使って他のモジュールからメソッドを借りる

ふと思い付いて、以下のようなコードを書いてみた。

```ruby
class Module
  def rental(method_name, from: nil, as: nil)
    unbound = from.instance_method(method_name)

    define_method(as || method_name, unbound)
  end
end

module SampleMethods
  def method1
    puts name
  end
end

module SampleMethods2
  def method2(a: nil, b: nil)
    p a
    p b
  end
end

module HasName
  rental :method1, from: SampleMethods, as:  :puts_name
end

class SampleClass
  include HasName
  attr_accessor :name

  rental :method2, from: SampleMethods2, as: :p_objects
end

sample = SampleClass.new
sample.name = "MyName"
sample.puts_name
sample.p_objects(a: [1])
```

モジュールはインスタンスを持たないけど、インスタンスの振舞いは持ってるのでちゃんと`instance_method`が取れる。
`instance_method`の戻り値は`UnboundMethod`。
`Module#define_method`は`UnboundMethod`を引数に取れるらしい。

Moduleクラスを拡張すれば宣言的に他のモジュールのメソッドの定義を借りてくるって事ができる。

うーん何か意味あるかな。Concernスタイルなモジュール書く時に役に立つかもしれないが…。
[git]マージ時のコンフリクトで片側の変更だけ適用する方法

２つのブランチをマージした際にコンフリクトしたとして、どちらかだけを全面的に適用したい場合はどうするか。

以下のように、`checkout --ours` と `checkout --theirs` を使い分ければ良い。

```
# ２つのブランチ間でコンフリクトしているファイル fileA.txt と fileB.txt があるとする

# fileA.txt を現在チェックアウトしているブランチ側の対応に合わせる場合
$ git checkout --ours fileA.txt
$ git add fileA.txt    # add を忘れずに

# fileB.txt をマージさせたブランチ側に合わせる場合
$ git checkout --theirs fileB.txt
$ git add fileB.txt

$ git commit
```
Chromeのコンソールで、クロージャーで使ってる変数が見えるようになってた

```js
var closure = (function() { 
  var outside;
  var andMore;
  return function() {
    var inside;
    return outside;
  };
})();
console.dir(closure);
```

![lexical.png](https://qiita-image-store.s3.amazonaws.com/0/10765/b517f63c-802e-5ed1-d2fa-e43e8c88b4d4.png)

いつの間に。
gitで過去のコミットを取り消してからもう一度同じ変更を加える方法

次のような流れのブランチで過去のコミットを取り消したい場合、

```
$ git log --pretty=oneline
ac2d70d95c63e856f284e3aa663adcb5e9c0c2df 関係ないコミット3
e778c654dd248936196724dd1787b0623aeba4ab 関係ないコミット2
16bb56ea998867f53522504a17cebe15271b384d xxx対応 その2
fc4564050e772e9a1338b4b5794793ad0829e1f0 関係ないコミット1
9d8466c81ab3614785457de4792f2cd2ca5e4b6a xxx対応1
ee804e6844eb75b8872b2a1497e1de55a4d8461e 関係ないコミット
（以下略）
```

`git revert`を2回して、`git rebase`すると。

```
$ git revert --no-edit 16bb56ea998867f53522504a17cebe15271b384d
$ git revert --no-edit 9d8466c81ab3614785457de4792f2cd2ca5e4b6a
$ git rebase -i HEAD~2
```

エディタが起動するので

```
pick 16bb56e Revert "xxx対応 その2"
pick 9d8466c Revert "xxx対応 その1"
```

の部分を

```
pick 16bb56e Revert "xxx対応 その2"
squash 9d8466c Revert "xxx対応 その1"
```

に変更してエディタを閉じると。

そうするとコミットできるようになるので、メッセージを適当に編集してコミット。

それからrevertした変更をもう一度適用したい場合は
`git cherry-pick`すれば適用できるので次のような感じで。

```
$ git cherry-pick 9d8466c81ab3614785457de4792f2cd2ca5e4b6a
$ git cherry-pick 16bb56ea998867f53522504a17cebe15271b384d
```

例えばmasterに一度mergeしたんだけどタイミングをやっぱり遅らせたいときとか、
別ブランチに移したいときとかに使うと便利、かもしれない。

参考: http://d.hatena.ne.jp/miau/20100709/1278699637
Railsで自動生成以外のrouteを追加する

毎回忘れるのでメモです。

## memberとcollectionを利用する

`GET /matomes/search` で search アクションを呼ぶには以下のように設定する。

```rb
# config/routes.rb
resources :matomes do
  collection do
    get :search
  end
end
```

:id 付きのルーティングの場合はmemberを利用する。  
`GET /matomes/:id/preview` とする場合。 

```rb
# config/routes.rb
resources :matomes do
  member do
    get :preview
  end
end
```

参考URL: http://akkunchoi.github.io/rails3-routes.html#member-collection---
NVIDIA SDK 9.52のサンプルを今更ビルド・実行する方法

# 以下のお話は、OpenGL/DirectXを使いこなす猛者または初学者のためのTipsです。

NVIDIAが開発者向けに公開している技術サンプル集で、『NVIDIA SDK 9.52』という古いものがあります。
これ、すでに技術的にはかなり時代遅れになっているものもあるんですが、中には今でも参考になるサンプルもあったりします。

で、試したいのですが、最新のVisual Studioだとどうもビルドがうまく通らなかったり、色々大変です。

そこで、NVIDIA SDK 9.52のサンプルが使用しているバージョンである、Visual Studio 2003を使って解決する方法が本記事です。

# 目的：NVIDIA SDK 9.52のサンプルをビルド・実行したい。
# 問題：最新のVisual Studioだとビルドがうまく通らない。
# 解決：Windows XP、Vistaまたは7に、Visual Studio 2003を無理やりインストールする。

（注意：XPはともかく、Vistaおよび７では、Visual Studio 2003のインストール・実行を本来サポートしていません。あくまで、自己責任でお願いします。何か問題が起きても、当方は責任を負えません）

# Visual Studio 2003を入手する

以下のいずれかの方法で入手してください。
・どこかに偶然売れ残っているパッケージを探し、購入する。
・MSDNサブスクリプションに契約し、期間内に旧バージョンの製品を入手する。
　http://www.microsoft.com/japan/msdn/subscriptions/
　今でも入手可能なのかは、すみませんが確認がとれていません。Microsoftに問い合わせるしかないですね。

このステップがうまくいかないと、この記事の意味がないですね。ええ（汗）
その場合はもうあきらめて、最新のVisual Studioでソースをごにょごにょしてなんとかビルド通してください。

# Visual Studio 2003をインストールする。
Windowsに、Visual Studio 2003をどうにかしてインストールします。

Windows 7の場合は、こちらのサイト様の情報を参考にしてください。
[http://n225fut.blog79.fc2.com/blog-entry-855.html](http://n225fut.blog79.fc2.com/blog-entry-855.html)

# NVIDIA SDK 9.52を入手する
以下のページからダウンロードした場合、インストーラーが32bit環境以外のWindowsを拒否してしまい、64bit環境のWindowsではインストールができません。
[https://developer.nvidia.com/nvidia-graphics-sdk-11](https://developer.nvidia.com/nvidia-graphics-sdk-11)

そこで、以下のページから、サンプルのzipファイルを個別にダウンロードします。面倒ですが、根気よくやってください。
http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html

# SDKの各サンプルをビルドする。

OpenGLのサンプルは問題なくビルド・実行できるかと思います。

問題は、DirectXのサンプルです。
NVIDIA SDK 9.52は、February 2006というバージョンを前提にしており、これ以外のバージョンのSDKでビルドすると実行に問題が発生する場合があります。
（実行時に「incorrect version of direct3d and/or d3dx」のようなエラーが出ます）

残念ながら、2013年11月時点で、Microsoft社から入手できるDirectXのバージョンはApril 2006からで、惜しい事に一つ違いでFebruary 2006はサイトから撤去されています。
（古くなったからって、べつに公開停止しなくたっていいじゃんねぇ？）

参考：各バージョンのダウンロードURL
[http://dench.flatlib.jp/dxsdkver](http://dench.flatlib.jp/dxsdkver)（HYPERでんち様）
[http://www.headcrash.us/blog/2010/07/directx-sdk-version-numbers-and-download-list/](http://www.headcrash.us/blog/2010/07/directx-sdk-version-numbers-and-download-list/)（head crash industries様）

しょうがないので、持っていない人は知人からコピーしてもらうか、検索しまくって二次配布している怪しいサイトを見つけてください。
（私は見つけることに成功して、ダウンロードできましたが、二次配布幇助になってしまうので、URLは記しません。申し訳ない^^;）

で、February 2006でビルドします。
しかし、DXUTを使っているサンプルの場合、また「incorrect version of direct3d and/or d3dx」エラーが出ます。
原因は、DXUTの互換性です
サンプルで使っているDXUTを使わずに、February 2006にあるDXUTを使うようにしてビルドすると、上手く動作します。

February 2006ベースとあるのに、使っているDXUTのバージョンが違うってどういうこと？
という疑問はあるのですが、とりあえず動作するようになったのでよしとしましょう。
Railsでpathを確認する

毎回忘れるのでメモ。  
erbでxxx_pathという書き方でpathを示すことが多い。  
どういったpathがあるのかを確認するにはコマンドラインで以下を入力する。

```
$ rake routes
```

ダラっと一覧でルーティングの内容を確認出来る。  

しかし、rake routesは表示に時間が掛かるので、
rails consoleを使ってるならrails consoleの中で以下のコマンドを実行したほうが、結果の表示スピードが断然早い。

``` bash
> show-routes # rails consoleの中で
```

参考: http://railsdoc.com/routes#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E7%A2%BA%E8%AA%8D
TypescriptはGruntで管理しないほうがよい？？


もとからコンパイル速度が遅いだけだと思いますがjsにすると6000行越えくらいなソースだと6秒ほどかかってしまいます。
環境はmacbook air 2012でnvmのnode 0.10.21でtypescriptが0.9.1.1

grunt-typescript経由6秒

```bash
time grunt typescript:dev
Running "typescript:dev" (typescript) task
File dist/main.js created.
js: 1 file, map: 0 files, declaration: 0 files

Done, without errors.

real	0m5.759s
user	0m5.456s
sys	0m0.345s
```

```bash
time tsc ./src/main.ts -out ./dist/main.js -d
real	0m3.935s
user	0m3.668s
sys	0m0.209s
```
直接tscだと4秒

tscの-wコマンドでwatchして生成されたjsなどの後処理をgruntでするほうがいいような気がします。（常駐する分ちょっと早い気がします）

やっぱtypescript遅いですね、ほかに早くなる方法ないのかな。
それでもいままでメンテナンスできてないJSを書き換えていくのには便利だと思います。
Gitでブランチを作るのを忘れてmasterにコミットしてしまったときの対処法

> （追記）すごくいいねがついていますが、コメントで皆さんが提案してくださっている方法の方が簡単なのでおすすめです。コメント欄を参照してください。

通常ブランチを作ってからブランチを切り替えて実装を始めますが、たまにはうっかりブランチを作るのを忘れてしまうことありますよね。
そんなときの対処法のメモです。要は新しく作った別のブランチにコミットを移動する方法です。

間違えて３つmasterにコミットしてしまっている状態で、新しくbranch01ブランチを作ってそこに移すというシナリオで書いていきます。

## branch01ブランチを作る

### ブランチを作るべきだった位置からブランチを作る

```
$ git branch branch01 origin/master
```

`origin/master`のところはコミット番号でも構いません。

### branch01ブランチに切り替え

```
$ git checkout branch01
```

## branch01ブランチに移動したいコミットをコピー

### コミット番号を調べる

```
$ git log --oneline --decorate --graph master
* m000003 (master) なんか修正3
* m000002 なんか修正2
* m000001 なんか修正1
* m000000 (origin/master, origin/HEAD) 作業開始地点
```

m000001からm000003までの3コミットがbranch01に移したいコミットとします。

### branch01ブランチに移したいコミットをcherry-pickコマンドでコピー

```
$ git cherry-pick m000001 
$ git cherry-pick m000002
$ git cherry-pick m000003 
```

### 確認

```
$ git log --oneline --decorate --graph master branch01
* b000003 (HEAD, branch01) なんか修正3
* b000002 なんか修正2
* b000001 なんか修正1
| * m000003 (master) なんか修正3
| * m000002 なんか修正2
| * m000001 なんか修正1
|/  
* m000000 (origin/master, origin/HEAD) 作業開始地点
```

branch01ブランチにコピーできてる。
コミット番号は新しく振られます。

## masterから移したコミットを削除する

### masterに切り替える

```
$ git checkout master
```

### コミットを3つ削除する

```
$ git reset --hard HEAD~3

HEAD is now at m000000 作業開始地点
```

`HEAD~3`は戻す数によって変えてください。

### 確認

```
$ git log --oneline --decorate --graph master branch01
* b000003 (branch01) なんか修正3
* b000002 なんか修正2
* b000001 なんか修正1
* m000000 (HEAD, origin/master, origin/HEAD, master) 作業開始地点
```

きれいになりました。

## 参考

* [gitで誤ったブランチに対して行った変更を正しいブランチへ移す(cherry-pick編) - TIM Labs](http://labs.timedia.co.jp/2010/12/git-moving-changes-with-cherry-pick.html)
concernを使ったおなじみルートの追加

確認画面とか、いろんなページで同じルートを設定する場合に便利。

例えばこんな感じで確認画面のルートを設定していた場合、

```ruby:routes.rb
resources :users do
  patch :confirm, :on => :member
  put   :confirm, :on => :member
  post  :confirm, :on => :collection
end

resources :information do
  patch :confirm, :on => :member
  put   :confirm, :on => :member
  post  :confirm, :on => :collection
end
```

concernを使うとこんなにスッキリ！

```ruby:routes.rb
concern :confirmable do
  patch :confirm, :on => :member
  put   :confirm, :on => :member
  post  :confirm, :on => :collection
end

resources :users, :concerns => :confirmable
resources :information, :concerns => :confirmable
```

こうすると、 ``rake routes`` ではこんな感じ。

```bash
$ rake routes | grep "users\|information"
                  confirm_user PATCH    /users/:id/confirm(.:format)       users#confirm
                                 PUT    /users/:id/confirm(.:format)       users#confirm
                   confirm_users POST   /users/confirm(.:format)           users#confirm
                           users GET    /users(.:format)                   users#index
                                 POST   /users(.:format)                   users#create
                        new_user GET    /users/new(.:format)               users#new
                       edit_user GET    /users/:id/edit(.:format)          users#edit
                            user GET    /users/:id(.:format)               users#show
                                 PATCH  /users/:id(.:format)               users#update
                                 PUT    /users/:id(.:format)               users#update
                                 DELETE /users/:id(.:format)               users#destroy
      confirm_system_information PATCH  /information/:id/confirm(.:format) information#confirm
                                 PUT    /information/:id/confirm(.:format) information#confirm
confirm_system_information_index POST   /information/confirm(.:format)     information#confirm
        system_information_index GET    /information(.:format)             information#index
                                 POST   /information(.:format)             information#create
          new_system_information GET    /information/new(.:format)         information#new
         edit_system_information GET    /information/:id/edit(.:format)    information#edit
              system_information GET    /information/:id(.:format)         information#show
                                 PATCH  /information/:id(.:format)         information#update
                                 PUT    /information/:id(.:format)         information#update
                                 DELETE /information/:id(.:format)         information#destroy

```
vim から :shell で抜けたときにわかりやすくする

\# VimShell 使ったりして `:shell` とか使ってない人が多いかもだけど。

`:shell` でシェルに抜けたときに，それを忘れていて，編集中のファイルをふたたび開こうとして怒られたり，気がついたら3つくらい vim を抜けたりしたりして困っていたので，vim からシェルに抜けている時はちゃんとハッキリ分かるようプロンプトにだすようにした。

```zsh
[[ -n "$VIMRUNTIME" ]] && \
    PROMPT="%{${fg[white]}${bg[blue]}%}(vim)%{${reset_color}%} $PROMPT"
```

最初はシェルの親プロセスの名前を調べていたんだけど， @thinca さんの[ご指摘](http://qiita.com/dayflower/items/06cba1bc3d8bf5403659#comment-9c27bdf8d78b5ec8257e)により，`$VIMRUNTIME` という環境変数 (あと `$VIM` という環境変数も設定されていた) を調べることにしました。格段にシンプルになりました。変数のローカリゼーションする必要もなくなりました。 @thinca さんありがとうございます！

これを `~/.zshrc` に書くことで

![](http://gyazo.com/af0e7706686357131be9da37c544eb6e.png)

このように表示されるようになった。


そもそも `:shell` つかわずに `CTRL-Z` を使って抜けている人も多いみたいです。

> @dayflower :sh 使うとそのへん面倒なので、自分は C-z でシェルに戻ってシェルを使い、あとプロンプトにジョブ数(%j)を表示してます。vimへはfgコマンドで戻ります。

https://twitter.com/todashuta/status/402718109833756672

わたしはどうしてもエディタを `CTRL-Z` するのに抵抗感があるので `:sh` に慣れてしまいましたが。
gruntで、Jadeで書いたテンプレートに、JSONで用意したデータを流し込んでページを量産する

ディレクトリ構造はこんな感じ。
納品時には_development/ 以下を外せばいい状態にしたくて、gruntは_development/ にインストールしている。sassファイルなんかも_development以下に設置している。

htdocs/
　_development/
　　jade/
　　json/
　　node_modules/
　　Gruntfile.js
　　package.json
　css/
　js/
　index.html
　...

そして、grunt-contrib-jadeをインストールする。
（node.js, gruntのインストールは端折ります）

```bash
npm install grunt-contrib-jade --save-dev
```

##gruntタスクを書く
Gruntfile.jsに以下のように書く

```js:Gruntfile.js
grunt.initConfig({
//...
jade: {
	compile: {
		options: {
			pretty: true, //htmlをインデント表記させる
			data: function(dest, src){ //dest が生成するhtml、srcが参照元jadeファイル
				var data_file = "./json/data.json";

				//生成するhtmlのファイル名によって、使用するJSONデータを変える
				if( dest.match('index') ){
					data_file = "./json/data_index.json";
				}else if( dest.match('page1') ){
					data_file = "./json/data_page1.json";
				}
				//...
				return require(data_file);
			}
		},
		files: {
			"../index.html": "jade/index.jade",
			"../page1.html": "jade/page1.jade"
		}
	}
}
//...
});

grunt.loadNpmTasks('grunt-contrib-jade');
```

何をしているかというと、
index.jade に書いたテンプレートに data_index.json というデータを流し込み、index.htmlを作る。
同じく、
page1.jade に書いたテンプレートに data_page1.json というデータを流し込み、page1.htmlを作る。
以下同様・・・

これで準備完了。gruntタスクを動かす。

```bash
grunt jade:compile
```

これで無事に各HTMLが生成されるはず。

##もうちょっとすっきりさせてみる
参照元Jadeファイルと生成htmlファイルの対照関係を記述する jade.compile.files と、
流し込むデータJSONを設定するjade.compile.options.data の部分が冗長なので、
別ファイルに分けてやる。

```js:Gruntfile.js
jade: {
	compile: {
		options: {
			pretty: true,
			data: require('./jade.js')
		},
		files: require('./json/pagelist.json')
	}
}
```

これで、いろいろタスクを書いてるGruntfile.jsはすっきり。
次に流し込むデータを指定する関数は jade.js という別ファイルにする。

```js:jade.js
//流し込むデータ(JSON)を指定してやる関数
module.exports = function(dest, src) {
	var data_file = "./json/data.json";
	if(dest.match('index')){
		data_file = "./json/data_index.json";
	}else if(dest.match('page1')){
		data_file = "./json/data_page1.json";
	}
	return require(data_file);
}
```

参照元jadeファイルと生成htmlのページリストはpagelist.jsonというJSONファイルを用意。

```json:pagelist.json
{
	"../index.html": "jade/index.jade",
	"../page1.html": "jade/page1.jade"
}
```

サーバサイドのフレームワークなどがない環境で、静的なページを大量に作成しなければいけないときも楽に量産できる。

ちなみに、私はJadeファイルをwatchして、変更後すぐさまコンパイルしてhtml生成させ、
さらに、htmlの変更をwatchして、livereloadするという環境にしている。
ruby2.0 + rbenv in centos


```sh

$ sudo yum -y update
$ sudo yum install -y zlib-devel libxml2-devel libxslt-devel openssl-devel readline-devel sqlite-devel mysql-devel libyaml-devel libffi-devel iconv-devel nkf pcre-devel

https://github.com/sstephenson/rbenv
 $ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

https://github.com/sstephenson/ruby-build
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ MAKE_OPTS="-j 4" rbenv install 2.0.0-p247

$ rbenv global 2.0.0-p247
$ rbenv exec gem install bundler
$ rbenv rehash
```
Django admin siteでアクションを追加する


django admin siteを利用するには、`mysite.appname.admin`内で **admin siteで管理したいモデル**と **Adminクラス（のサブクラス）** を登録する。

Adminクラスのサブクラスをカスタマイズすることで、admin siteでの挙動を変更することが出来る。ここでは特定のアクションを追加する方法を紹介。

```python
## アクションを実行した場合の処理
def update_lnglat(modeladmin, request, queryset):
    """Shopクエリセットを元に、Shopモデルの位置情報を更新する。
    """
    for shop in queryset.all():
        # 位置情報を更新する
        update_shop_lnglat(shop)

# アクションに表示する場合の名前
update_lnglat.short_description = _(u"Update shop location info by address")

## Admin
class ShopAdmin(admin.ModelAdmin):
    list_display = ('name', 'region', 'slug', 'email', 'phone', 'fax', 'lnglat')

    # callableなオブジェクトを渡す
    actions = [update_lnglat]

## admin siteへの登録
admin.site.register(Shop, ShopAdmin)
```

ShopAdminクラスのactionsプロパティで定義された関数がdjangoの管理画面上に表示される。コード中で`short_description`を定義しており、これが表示されていることが解る。

![スクリーンショット 2013-11-21 11.33.09.png](https://qiita-image-store.s3.amazonaws.com/0/29860/93bd1cae-3d29-f1c7-9e24-66840b40012a.png "スクリーンショット 2013-11-21 11.33.09.png")

関数には次の引数が渡る。

* ModelAdmin（この場合はShopAdmin）
* HttpRequest
* QuerySet


3番目はチェックを付けたオブジェクトが含まれるQuerySetが渡る。これをループで回せば「チェックを付けた対象に対して特定の処理を行う」というのが実現できる。


参考

* [Django Admin actions](https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/)
Railsでの、日本語対応の短縮曜日の表示

短縮された曜日を表示したい場合、`rails-i18n`を利用するのが一番楽。

```ruby
# Rails3系の場合
gem 'rails-i18n', '~> 3.0.0'
```

このgemをインストールすると、`rails-18n`内のyml経由で、date.abbr_day_namesの値を取得できる。

```irb
> I18n.t 'date.abbr_day_names'
=> ["日", "月", "火", "水", "木", "金", "土"]
```

この配列を`%w`の値に応じて、表示させる。

`2013年11月30日 (土) 00:00`のような日付の出力だけなら、下記のように設定しておくと、もっと簡単に表示できる。

```yaml
  ja:
    time:
      formats:
         full_date: "%Y年%m月%d日 (%a) %H:%M"
```

設定した書式を使用する際は、下記のようにフォーマットを指定するだけ。

```ruby
  I18n.l Time.zone.now, format: :full_date 
```
Railsサーバなのに「phpMyAdmin PHP Code Injection Exploit」に対応してみる

Railsだからほっとけばいいのかもしれないけど
/MyAdmin/scripts/setup.php とか
/phpmyadmin/scripts/setup.php とかへの攻撃うざいので対応してみた。

config/route.rb

  match ':dummy/scripts/setup.php', :to => 'errors#fuckyou'
  match '*a', :to => 'errors#routing'

errors_controller.rb

  def routing
    render :file => 'public/404', :status => 404
  end
  def fuckyou
    render :text => "F U C K Y O U :)", :status => 400
  end

そもそもRoutingError発生させないためにErrorsControllerを用意していました。

こういう対応するとむしろハッキングされる恐れが「高まる〜」なら指摘して下さい
Jenkinsからvagrant upしたあとジョブが終わってしまうと、status aborted になってしまう件


長いタイトルですみません…。

Vagrantを使ってChef-soloのデモをしようとして、なんどもVMを作ったり壊したりしているんですが、 **『３回以上同じことをするならJenkins化』** というマイルールにより、Jenkinsからvagrant up / vagrant destroyするようにしてみました。

VMのイニシャライズ、起動はうまくいって、レシピも適用されて、『いいねー』と思っていたのですが、Chefの実行 -> ジョブの完了後、JenkinsではなくターミナルからVMにアクセスしようとすると、アクセスできません…。

VirtualBoxの画面から見ると、確かにVMは起動しているようなんですが、VirtualBoxの画面からもアクセスができなくなってしまいます。

vagrant status すると、下記のような "aborted" な状態に…

> $ vagrant status
Current machine states:
>
default                   aborted (virtualbox)
>
The VM is in an aborted state. This means that it was abruptly
stopped without properly closing the session. Run `vagrant up`
to resume this virtual machine. If any problems persist, you may
have to destroy and restart the virtual machine.


せっかくレシピが適用されたんだから、そのままVMが起動してて欲しいこともあります。（レシピのテスト、serverspecの実行なら、毎回綺麗に作り直しでも良いと思いますが）

あれれ〜と思って、検索したところ、下記がHit.

* http://stackoverflow.com/questions/19736862/vagrant-aborted-at-end-of-jenkins-job
* https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller

JenkinsのProcess Killerによるものだそう。なるほど…。

で、上記の情報を頼りに、今回はJob単位でこの設定を切り替えたいので、ビルドのステップで

```
BUILD_ID=dontKillMe vagrant up
```
という設定としました。

これで幸せになりました(^^
Firefoxのコンソールに何か出てきた

```
             _.---.
           7''  Q..\
        _7         (_
      _7  _/    _q.  /
    _7 . ___  /VVvv-'_                                            .
   7/ / /-- \_\\      '-._     .-'                      /       //
  ./ ( /---/||'=.__  '::. '--'' {             ___   /  //     ./{
 V   V----| ||   __''_   ':::.   ''---.___.-'' _/  // / {_   /  {  /
  VV/-----|/ \ .'__'. '.    '::                     _ _ _        ''.
  / /----||VVV/ /  \ )  \        _ __ ___   ___ ___(_) | | __ _   .::'
 / (-----\\.-' /    \'   \::::. | '_ ` _ \ / _ \_  / | | |/ _` | :::'
/..\    /..\__/      '     '::: | | | | | | (_) / /| | | | (_| | ::'
vVVv    vVVv                 ': |_| |_| |_|\___/___|_|_|_|\__,_| ''

Hi there, nice to meet you!

Interested in having a direct impact on hundreds of millions of users? Join
Mozilla, and become part of a global community that’s helping to build a
brighter future for the Web.

Visit https://careers.mozilla.org to learn about our current job openings.
Visit https://www.mozilla.org/contribute for more ways to get involved and
help support Mozilla.
```

どういうタイミングで出てくるのかわかんないので、後でふと見たくなったとき用にメモ。
経過時間をconsoleで手軽に計測するJavaScript

```js
console.time('a');  // 識別子を与えないと動かない
// 処理…
console.timeEnd('a');
```

![console.time.png](https://qiita-image-store.s3.amazonaws.com/0/10765/35de906e-b9e1-f1c1-8197-ea5755b9cbac.png)

Chrome, Safari, Firefoxに加え、IEも11から利用可能。

## コンソールじゃないところに時間を出力するなら、

自前で計測する。

* [経過時間を順次取得するJavaScript - Qiita \[キータ\]](http://qiita.com/ginpei/items/5b384d5fb54997bc158c)
VagrantでXPのboxを使うときの注意点

VirtualboxにxpをインストールしてGuestAddonsをインストールしておくこと。

作成
-------------

```bash:
$ VBoxManage list vms
"xp" {242239e6-1ee6-4e90-ab9a-a2b45a058504}
$ vagrant package --base xp
[xp] Clearing any previously set forwarded ports...
[xp] Creating temporary directory for export...
[xp] Exporting VM...
[xp] Compressing package to: /Users/owner/package.box
```

Virtualboxから仮想マシンを削除。

起動方法
-------------

```bash:
vagrant box add package.box
vagrant init xp
vim Vagrantfile # 3389のポート接続を可能にしておく。
nohup vagrant up &
```

注意点
-----------
`vagrant up`が終了しないので仕方なく `nohup`か、`実行した端末を切り離す`か`終了する`かすればよい。

設定 -> ビデオ -> ディスプレイ

* 3Dアクセラレーションを有効化
* 2Dビデオアクセラレーションを有効化

上２つが有効になっていると`vagrant up`や`VBoxManage startvm "xp" --type headless`の起動失敗するので注意。
grunt のインストールから初回 grunt までコマンド一発で完了させるターミナルシェルスクリプト

grunt 便利ですね！
でもいちいちインストールするのめんどくさいんです！時間の浪費、ではなく、めんどくさいんです！

ということで、grunt のインストールから初回 grunt 実行まで一発で終わらせるシェルスクリプトです。あ、毎度のことながら Mac 環境です。Windows は分かりません！

# やりたいこと
- grunt のインストール
- 必要なファイルを作業フォルダに格納
- 初回 grunt

ということで、まず一式格納するコピー元となるフォルダを、例えばどこかに「grunt」という名前で作るとします。

# 各種必要なファイルを格納する
この「grunt」に以下のファイルを置いておきます。開発を始めるときの初期ファイルです。

- config.rb
- Gruntfile.coffee
- package.json
- README.md
- 各種 .sass
- 各種 .coffee
- 各種ウェブフォントのリソース
- 各種 .py など

「<a href="https://github.com/astronaughts/grunt-play" target="_blank" title="grunt-play">grunt-play</a>」は <a href="http://qiita.com/astronaughts" target="_blank" title="astronaughts">astronaughts</a> さんの grunt 実行後に音で教えてくれる神プラグイン、「mplus-1p-regular.ttf」はぼくがよく使う <a href="http://mplus-fonts.sourceforge.jp/webfonts/" target="_blank" title="M+WEBFONTS">M+WEBFONTS</a> さんのウェブフォント、「WebIconFonts」群は <a href="http://qiita.com/chibatch@github" target="_blank" title="chibatch">chibatch</a> さんの <a href="http://webiconfonts.appspot.com/" target="_blank" title="Web Icon Fonts">Web Icon Fonts</a> で使うウェブフォント、「fontello」群は <a href="http://fontello.com/" target="_blank" title="fontello">fontello</a> さんのウェブフォントです。

Gruntfile.coffee の中身は <a href="http://qiita.com/wings1685/items/8c38613a20c0d87e3f77" target="_blank" title="Gruntfile.coffee の中身をまとめてみた - Qiita">Gruntfile.coffee の中身をまとめてみた - Qiita</a> をご覧ください。

# grunt.command を作る
これを、grunt.command として「grunt」フォルダ内に格納します。

```sh::grunt.command
#!/bin/bash
sudo npm install -g grunt-cli
grunt_dir='/どこか/grunt/'
cp "${grunt_dir}config.rb" "${grunt_dir}Gruntfile.coffee" "${grunt_dir}package.json" "${grunt_dir}README.md" ./
sudo npm install grunt-contrib-coffee grunt-contrib-compass grunt-contrib-concat grunt-contrib-copy grunt-contrib-cssmin grunt-contrib-uglify grunt-este-watch grunt-play grunt-slim grunt-ssh --save-dev
mkdir css src js
cp "${grunt_dir}_include.sass" "${grunt_dir}common.sass" "${grunt_dir}fonts.sass" "${grunt_dir}mobile.sass" "${grunt_dir}reset.sass" "${grunt_dir}tablet.sass" ./src/
cp "${grunt_dir}desktop.coffee" "${grunt_dir}functions.coffee" "${grunt_dir}mobile.coffee" ./src/
cp "${grunt_dir}common.html" "${grunt_dir}config.yml" "${grunt_dir}data.py" "${grunt_dir}functions.py" "${grunt_dir}index.html" "${grunt_dir}index.py" "${grunt_dir}index.slim" "${grunt_dir}view.py" ./src/
cp "${grunt_dir}fontello.eot" "${grunt_dir}fontello.svg" "${grunt_dir}fontello.ttf" "${grunt_dir}fontello.woff" "${grunt_dir}mplus-1p-regular.ttf" "${grunt_dir}WebIconFonts.eot" "${grunt_dir}WebIconFonts.otf" "${grunt_dir}WebIconFonts.ttf" "${grunt_dir}WebIconFonts.woff" ./css/
grunt w
```

- grunt をインストールする
- 設定ファイル群を開発フォルダにコピーする
- grunt のプラグイン群をインストールする
- css・src・js フォルダを作成する
- sass などを src フォルダにコピーする
- ウェブフォント群を css フォルダにコピーする
- 初回 grunt

# 実行してみる
ターミナルで開発フォルダに cd します。その後、以下を実行すればそそくさと環境を整えてくれます。

```sh
$ /どこか/grunt/grunt.command
```

とっても楽になりますね！
FuelPHP で $ oil test --group=App したら「sh: phpunit: command not found」ってなる時の対処方法

# FuelPHP で $ oil test --group=App したら「sh: phpunit: command not found」ってなる時の対処方法

composer を使って、phpunit をインストールすると、パスが通ってないよ！と怒られる。

そんな時の対処方法のメモ。

## composer を使って phpunit をインストールする

まずは composer.json の編集とインストール

```$ vi composer.json```

```json
    "require": {
        "php": ">=5.3.3",
        "monolog/monolog": "1.5.*",
    	"fuelphp/upload": "2.0.1",
        "phpunit/phpunit": "3.7.*"
    },
```

```$ composer update```

これでインストールはおしまい。


## $ oil test --group=App してみる

```
$ oil test --group=App
Tests Running...This may take a few moments.
sh: phpunit: command not found
```

「sh: phpunit: command not found」は phpunit へのパスが通ってないから。

## パスを通すよりも、config で解決する

```
$ vi fuel/app/config/oil.php
<?php
return array(
	'phpunit' => array(
		'binary_path' => 'fuel/vendor/phpunit/phpunit/composer/bin/phpunit',// 個人的には bin/phpunit にエイリアス作って置いてる
	),
);
```

これで、ちゃんと動くはず。

```
$ oil test --group=App
Tests Running...This may take a few moments.
PHPUnit 3.7.28-12-g236f65c by Sebastian Bergmann.
Time: 815 ms, Memory: 14.50Mb

No tests executed!
```

とかになったら良し。
__halt_compiler() でキモいことしてみる

**【2021/10/15 追記】**
**この記事は更新が停止されています。現在では筆者の思想が変化している面もありますので，過去の記事として参考程度にご覧ください。**

（ノンフレームワークな小規模開発向けに）テンプレートクラスとテンプレートファイルを結合する荒業。あんまりこんなことしない方がいいけど、 <ins>公開ディレクトリにしかファイルを置けない</ins>環境で、テンプレートファイルに直接ユーザーにアクセスされて困る場合には重宝するかも。

## コード

```php:Template.php
<?php 

class Template {
    
    public $title = '';

    public function __construct() {
        ob_start();
    }
    
    public function __destruct() {
        $contents = ob_get_clean();
        eval(file_get_contents(
            __FILE__,
            false,
            null,
            __COMPILER_HALT_OFFSET__
        ));
    }
    
}

/* ここまでクラス定義 */
__halt_compiler();
/* ここからテンプレート*/

header('Content-Type: application/xhtml+xml; charset=utf-8');

?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
<head>
  <title><?=$this->title?> - サンプルサイト</title>
</head>
<body>
  <div id="container">
    <h1><?=$title?></h1>
    <div id="contents">
<?=$contents?>
    </div>
  </div>
</body>
</html>
```

```php:sample.php
<?php
require 'Template.php';
$tpl = new Template;
$tpl->title = "テストページ！";
?>
あ
い
う
え
お
```

## 結果

`header` 関数は最初に実行されています。

```html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
<head>
  <title>テストページ！ - サンプルサイト</title>
</head>
<body>
  <div id="container">
    <h1>テストページ！</h1>
    <div id="contents">
あ
い
う
え
お
    </div>
  </div>
</body>
</html>
preload directive

何かデータを取ってくるときにローディングメッセージを出してくれるdirective。

```js:preload.js
angular.module('hoge', []).directive('preload', function () {
return {
    restrict: 'EA',
    transclude: true,
    replace: true,
    scope: {
      isLoading: '@',
      loadingMessage: '@',
      onLoad: '&'
    },
    template:
      '<div>' +
        '<div class="preloader" ng-show="isLoading">' +
          '<div class="loading-message">{{loadingMessage || "Loading"}}</div>' +
        '</div>' +
        '<div ng-hide="isLoading" ng-transclude></div>' +
      '</div>',
    link: function (scope, element, attrs) {
      scope.$watch('isLoading', function (isLoading) {
        !isLoading && scope.onLoad && scope.onLoad();
      })
    }
  };
});
```

##使い方

```js:app.js
angular.module('foo', ['hoge']).controller('Ctrl', [$scope, $timeout, function ($scope, $timeout) {
  $scope.isLoading = true;
  $timeout(function () { $scope.isLoading = false; }, 1000);
  $scope.onLoad = function () { alert('hello world'); };
}]);
```

```html
<body ng-app="foo" ng-controller="Ctrl">
<div preload is-loading="{{isLoading}}" loading-message="Loading hogehoge" on-load="onLoad()">
  色々
</div>
</body>
```
pcall呼び出しのパフォーマンスへの影響

ネットで、pcallを使うと遅くなると書いているサイトがあった。
その仕組みからいえばパフォーマンスに大きな影響を与えないだろうという予想があったので、調べた。予想そのままな結果になったため新規性は無いが、記録として書く。

# 結論
pcallは呼び出しコストは使用しない場合と比較すれば高いが、驚くほどではない。
また、内容の処理時間自体は特に差が無い。

# 呼び出しコストを調べる
## ベンチマーク
pcallの呼び出しが通常の関数呼び出しと比較してどれくらいパフォーマンスに影響するかを調べた。
関数を繰り返し呼ぶコードの計算時間を、pcall呼び出しか否かで比較した。

```lua
function testfunc()
end

local start = os.clock()
for i = 0, 10000000 do
	-- with pcall
	pcall(testfunc)
	-- without pcall
	--testfunc()
end

print( os.clock() - start )
```

## 結果
pcallを利用すると、呼び出しコストはだいたい2倍弱になることがわかった。

| 回 | pcall使用 | pcall未使用 |
|----|----|----|
| 1 | 1.78 | 0.97 |
| 2 | 1.8 | 0.89 |
| 3 | 1.81 | 0.94 |

# pcall呼び出し内の実行効率を調べる
## ベンチマーク
まず、pcall内での呼び出しとそれ以外ではパフォーマンスに影響するかを調べた。
素数をブルートフォースで探すコードの計算時間を、pcall呼び出し内か否かで比較した。

```lua
function primechecker()
     local result = ""

     for num=2, 100000 do
          for i=2, num do
               if math.mod(num, i) == 0 then
                    break
               end
          end
          if num == i then
               result = result .. num .. ","
          end
     end

     return result
end

local start = os.clock()
local result = ""

-- with pcall
local bStat, bErr = pcall(
          function()
               result = primechecker()
          end )

-- without pcall
--result = primechecker()


--print( result )
print( "well done. time:", os.clock() - start )
```
## 結果
有意な差は無い。

| 回 | pcall使用 | pcall未使用 |
|----|----|----|
| 1 | 12.63 | 13.02 |
| 2 | 12.65 | 12.77 |
| 3 | 12.63 | 12.62 |
chrome dev tools / network

chromeでF12を押すと出てくる開発者向けのツール。htmlやcssを調べるのによく使いますが、ネットワークパネルを使うと通信にどのくらい時間がかかったかなどが分かります。使い方をよく知らなかったので調べて見ました。

### Resource Timing API
このパネルはJavascriptの[ResourseTimigAPI](http://www.w3.org/TR/resource-timing/)というAPIをもとに表示しているそうです。このAPIを使うことでhttpリクエストが始まる所からデータが届く所までそれぞれのタイミングでどのくらいの時間を要したかを知ることが出来ます。

### ネットワークパネル
パネルは開いたところから記録を開始するので、パネルを開いた上で調査したいページをリロードしましょう。リロードするとアイテムがどんどん追加されていきます。一番左の列がリソース(画像ファイルとかjsファイルとか)の名前を表しています。一番右のグラフはそれぞれのリソースをどのように取得していったかを表しています。加えて縦の青いラインは[DOMContentLoaded](http://docs.webplatform.org/wiki/dom/Event/DOMContentLoaded)を表していて、このタイミングでhtmlのロード&パースが完了したことを示しています。赤いラインは[load](http://docs.webplatform.org/wiki/dom/Element/load)でリソースのロードが完了したことを表しています。

下の方にImagesやらXHRやら有りますが、これはフィルタでその他のものも押してみたら動作は理解できると思います。上の方にはnameとかtypeとかありますが、左クリックするとソートすることができ、右クリックすると表示する項目を選択することができます。

参考
https://developers.google.com/chrome-developer-tools/docs/network
Ricoh thetaのJPGから角度を取り出すコード

RICOH SHETAから角度を取り出すコード@C#版
MIROさんから頂いたコードを元に改造しました。
UNITYで使用することを前提にしています。

```シータの角度読み出し:ViewPict.cs
using UnityEngine;
using System.Collections;
using System.IO;

public class ViewPict : MonoBehaviour 
{
	static int SerchAngle(string fileName)
	{
		BinaryReader br = new BinaryReader(new FileStream("Assets/Resources/" + fileName+".jpg", FileMode.Open));
		byte [] buf = br.ReadBytes((int)br.BaseStream.Length );
		br.Close();
		br = null;
		
		int ix;
		int offset;
		float compass;
		float zenith_x;
		float zenith_y;



		// check EXIF
		// find CompassEs
		ix = find_data(buf,new byte[] {0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x01});
		if (ix<0) 
		{
			return -1; 
		}
		offset = get_dword(buf,ix)+12;
		compass = parse_u_rational(buf,offset);

		// find ZenithEs
		ix = find_data(buf,new byte[] {0x00,0x03,0x00,0x0A,0x00,0x00,0x00,0x02});
		if (ix<0) 
		{
			return -1;
		}
		offset = get_dword(buf,ix)+12;
		zenith_x = parse_u_rational(buf,offset  );
		zenith_y = parse_u_rational(buf,offset+8);

		Debug.Log( "1:" + zenith_y.ToString() + ",2:" + zenith_x.ToString());
		return 0; 
		//sphere.transform.Rotate(0,0,-zenith_y);
		//sphere.transform.Rotate(zenith_x,0,0);
	}

	static int find_data(byte[] buf, byte[] pattern)
	{
		int max;

		max = buf.Length;
		
		if (max>64*1000) 
		{ 
			max = 64*1000; 
		}


		for (int i = 0; i < max; i++)
		{
			int iTemp = i;
			for (int p = 0; p < pattern.Length ; p++, iTemp++)
			{
				if (pattern[p] != buf[iTemp] || iTemp >= max)
				{
					break;
				}

				if (p == pattern.Length - 1)
				{
					return iTemp + 1;
				}
			}
		}

		return -1;
	}

	static int get_dword(byte[] buf, int offset)
	{

		return (buf[offset]<<24) | (buf[offset+1]<<16) | (buf[offset+2]<<8) | buf[offset+3];
	}

	static float parse_u_rational(byte[] buf, int offset) 
	{
		float a;
		float b;
		a = get_dword(buf,offset  );
		b = get_dword(buf,offset+4);
		return a/b;
	}
}
```
Objective-C でグローバルな文字列定数の定義を簡単にする


Objective-C では通知センターなどの通知キーとしてグローバルな文字列定数を定義して利用します。この定数を定義を簡単にする Tips について紹介します。

通常の定義は以下のようになります。

```objectivec:MyObject.h
extern NSString* const MyObjectDidChangeFooNotification;
extern NSString* const MyObjectDidChangeBarNotification;
extern NSString* const MyObjectDidChangeBazNotification;
```

```objectivec:MyObject.m
NSString* const MyObjectDidChangeFooNotification = @"MyObjectDidChangeFooNotification";
NSString* const MyObjectDidChangeBarNotification = @"MyObjectDidChangeBarNotification";
NSString* const MyObjectDidChangeBazNotification = @"MyObjectDidChangeBazNotification";
```

.h では extern 修飾子をつけて宣言し、.m で実体を定義するため、.h, .m それぞれに同じ変数名を記述する必要があり、冗長です。
また、実体として定義する値は単なる文字列ですが、通知キーにはユニークな値として定義するため、コピペしたまま同じ値にならないよう注意しなければなりません。

以下のようなマクロを利用することで簡単にグローバルな文字列を定義できます。

```objectivec:MyObject.h
#define Stringize(x) @#x


#undef  DEFINE_GLOBAL_STRING
#ifdef MY_OBJECT_DEFINE_GLOBALS
#define DEFINE_GLOBAL_STRING(name)  NSString *const name = @#name
#else
#define DEFINE_GLOBAL_STRING(name)  extern NSString *const name
#endif

DEFINE_GLOBAL_STRING(MyObjectDidChangeFooNotification);
DEFINE_GLOBAL_STRING(MyObjectDidChangeBarNotification);
DEFINE_GLOBAL_STRING(MyObjectDidChangeBazNotification);
```

```objectivec:MyObject.m
#define MY_OBJECT_DEFINE_GLOBALS

#import "MyObject.h"
```

.h では MY_OBJECT_DEFINE_GLOBALS が定義されているときは extern 宣言とし、そうでないときは値を定義するため、.h にのみ定義を記載すれば済みます。
DEFINE_GLOBAL_STRINGマクロは定数名 nameをパラメータとして受取り、名前が nameであり、値が同じく name である NSString型文字列定数として定義しています。

以上、文字列定数を簡単に定義する Tips でした。
AWS EC2インスタンス起動時にtag nameをホスト名にして末尾に番号をつける

オートスケールにしたときに全く同じタグホスト名で起動するのが気に入らないので起動時にタグ名を変更するスクリプトを仕込んでみました。
番号を重複させたくないのでIPアドレスの第３、４ブロックの数字を末尾に付加しています。

*web-012111*みたいなホスト名がAWSコンソールのインスタンス一覧に表示されるようになります。

Amazon Linuxの場合はec2コマンドラインツールがはじめからインストールされているので以下の環境変数を設定してコマンドラインツールを利用できるようにしておきます。
環境変数はローカルマシン全体に登録するとよろしくない（アカウントがあれば誰でも同じキーとシークレットを利用することになる）のでrootの.bashrcに記述しました。

```shell-session
export JAVA_HOME=/usr/lib/jvm/jre
export AWS_ACCESS_KEY="Your key"
export AWS_SECRET_KEY="your secret"
export EC2_HOME=/opt/aws/apitools/ec2
export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com
```

JAVA_HOMEはデフォルトのインストール状況なら/usr/lib/jvm/jre-1.6.0に設定するとそのまま動きます。私の環境はJDK 1.7.0を入れて切り替えできるように上記パスからリンクを貼っているのでこうしています。自分の環境に合わせて置き換えてください。

JDK1.7を入れた手順についてはこちら
http://qiita.com/mychaelstyle/items/2a5b26e80cd5b0559625

動作するか確認します。

```shell-session:confirm
ec2-describe-instances
```

インスタンス一覧が表示されたらOKです。

/root/bin/renamehostスクリプトを作ります。

```shell-session:/root/bin/renamehost
#!/bin/sh
#
# rename tag with ip for web servers 
#
# [required env]
# write to root .bashrc 
#
# export JAVA_HOME=/usr/lib/jvm/jre
# export EC2_HOME=/opt/aws/apitools/ec2
# export AWS_ACCESS_KEY=key
# export AWS_SECRET_KEY=secret
# export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com
#

# definitions
PREFIX="web-"

# Source global definitions
if [ -f /root/.bashrc ]; then 
  source /root/.bashrc
fi

# watch info of this instance
INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
LOCAL_IP=`curl -s http://169.254.169.254/latest/meta-data/local-ipv4`
HOSTNUM=`echo $LOCAL_IP | sed -e "s/10\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.//"`
HOSTNUM=`printf "%03d" ${HOSTNUM}`
HOSTRG=`echo $LOCAL_IP | sed -e "s/10\.[0-9]\{1,3\}\.//"`
HOSTRG=`echo $HOSTRG| sed -e "s/\.[0-9]\{1,3\}\$//"`
HOSTRG=`printf "%03d" ${HOSTRG}`
NAME="${PREFIX}${HOSTRG}${HOSTNUM}"
echo $INSTANCE_ID
echo $LOCAL_IP
echo $HOSTNUM
echo $HOSTRG 
echo $NAME

hostname $NAME
ec2-create-tags ${INSTANCE_ID} --tag Name=${NAME}

exit
```

実行権限付与して動作確認

```shell-session:command
chmod u+x /root/bin/renamehost
/root/bin/renamehost
```

ログインし直してホスト名がかわっていれば成功です。
/etc/rc.localファイルの末尾にこのスクリプト実行を追加します。

```shell-session:command
echo "/root/bin/renamehost" >> /etc/rc.local
```

インスタンスを起動し直して変更されているか確認してください。
mongooseでQueryを拡張してみる


たまに、mongooseのQueryで取得したオブジェクトをSQLのように1レコードにしたい時があるので、mongooseのQueryを拡張しようと試みたところ、意外と簡単に拡張することができた。
ただの遊びのつもりなので、今度本気でプラグインを作ってみたい。


```js:mongoose-plugin.js
var sync = require('synchronize');/*同期処理のモジュール*/
Query.prototype.flatten = function(key,callback){
	var docs = sync.await(this.find(sync.defer()));
	var data = docs;
	for(var i = 0,n = data.length; i < n; i++){
		var obj = data[i][key];
		for(var t in obj){
			if(t == "_id")
				data[i][key+t] = obj[t];
			else
				data[i][t] = obj[t];
		}
		delete data[i][key];
	}
	if(callback)
		return callback(null,docs);
	else
		return docs;						
}
```
```js:userSchema
{name:String,mail:String,pw:String,
target:{type:ObjectId,ref:'target'}}
```

```js:targetSchema
{targetname:String,kind:String}
```


```js:usage
user.find({username:name})
.populate("target").lean()
.flatten("target",function(err,docs){
	console.log(docs);
});
```

するとこのような結果になってdocsがかえってくる。

```js:result.json
[{name:"steelydylan",mail"XXX@gmail.com",pw:"****",
targetname:"ライフル部",kind:"文化部"},...]
```
boxen使ってみた

月一でOS再インストールしている自分には神ツール。
puppetの勉強にもなるしね。

準備
=======

```bash:
cd
git clone https://github.com/boxen/our-boxen
cd our-boxen
git remote rm origin
git remote add origin ~/our-boxen
git push -u origin master
```

設定
=======

```rb:Puppetfile追加分
github "vagrant",   "3.0.0"
github "chrome",    "1.1.2"
github "macvim",    "1.0.0"
github "virtualbox","1.0.9"
github "phpstorm",  "1.0.4"
github "vlc",       "1.0.5"
github "java",      "1.1.0"
github "wget",      "1.0.0"
```

```bash:manifests/site.pp以下コメントアウト
  #include nginx

  #include nodejs::v0_4
  #include nodejs::v0_6
  #include nodejs::v0_8

  #include ruby::1_8_7
  #include ruby::1_9_2
  #include ruby::1_9_3
```

```rb:modules/people/manifests/tukiyo.pp
class people::tukiyo {

  # Puppetfile で定義したもの
  include chrome
  include macvim
  include vagrant
  include virtualbox
  include phpstorm
  include vlc 
  include java
  include wget

  # homebrew でインストールするもの
  package {
    [   
      'tmux',
      'w3m',
      'nkf',
    ]:  
  }
  package {
    'Kobito':
      source   => "http://kobito.qiita.com/download/Kobito_v1.8.3.zip",
      provider => compressed_app;
    'GoogleJapaneseInput':
      source => "http://dl.google.com/japanese-ime/latest/GoogleJapaneseInput.dmg",
      provider => pkgdmg;
  }

  $home     = "/Users/${::boxen_user}"
  $dotfiles = "${home}/.dotfiles"

  file { $home:
    ensure  => directory
  }

  repository { $dotfiles:
    source  => 'tukiyo/dotfiles',
    require => File[$home]
  }
  exec { "cd ${dotfiles} && git checkout mac && sh ${dotfiles}/setup.sh":
    cwd => $dotfiles,
    require => Repository[$dotfiles],
  }
  exec { "xcode-select --install":
    unless => "/bin/test -e /usr/bin/xcodebuild",
  }

}
```

実行
======

```bash:
$ script/boxen --no-fde
```

30分くらいかかる。
実行中~/src/ が作られるが、これは`script/boxen --no-fde`にて使われるディレクトリのため消してはいけない。
(消したらエラーで止まった・・・。)