OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのクラスメンバのスコープまとめ

Advent CalendarのPythonが過疎気味なので、昨日に引き続き何か簡単なネタを書こうと思います。

以前にまとめたPythonのクラスメンバのスコープまとめ紹介します。

具体的には、パブリックなメンバとメソッド、プライベートなメンバとメソッドの記述方法とアクセス方法です。

```py
# coding: utf-8

class Widget(object):

    # コンストラクタ
    def __init__(self, r, l):

        # 通常メンバ変数
        self.rval = r
        self.lval = l

        # プライベート変数
        self.__secret = 5

    # publicクラスメンバ変数
    classVal = 30

    # プライベートクラス変数
    # 外からは特別な記述でないとアクセスできない
    __SecretClassVal = 10

    # 通常メソッド
    def Calc(self):
        # ここでもメンバ変数を定義できる。
        self.top = 10
        return self.rval * self.lval * self.top

    # プライベートメソッド
    def __MyCalc(self):
        print "This is Private Method!"

    # クラスメソッド.
    @classmethod
    def SelfName(cls):
        # ここでもクラスメンバ変数の定義ができる。
        cls.number = 1

    # プライベートクラスメソッド.
    @classmethod
    def __PrivateSelfName(cls):
        print "This is Private Class Method!"

if __name__ == '__main__':

    # コンストラクタと通常メソッドの呼び出し。
    w = Widget(2, 4)

    # メンバ変数へのアクセス
    w.lval = 3
    w.rval = 4

    # プライベートメンバ変数にアクセス。
    # インスタンス._クラス名__変数名でアクセスできる。(推奨されない)
    print w._Widget__secret

    # パプリッククラス変数へアクセス。
    # インスタンス名でもクラス名でもどちらでもアクセス可能。
    print Widget.classVal
    print w.classVal

    # プライベートクラス変数にアクセス。
    # インスタンス._クラス名__変数名でアクセスできる。(推奨されない)
    print w._Widget__SecretClassVal

    # 通常のメソッドの呼び出し.
    print w.Calc()

    # プライベートメソッドの呼び出し(推奨されない)
    print w._Widget__MyCalc()

    # クラスメソッドの呼び出し.
    Widget.SelfName()

    # プライベートクラスメソッドの呼び出し(推奨されない)
    print w._Widget__PrivateSelfName()
```

```:出力
　5
　30
　30
　10
　120
　This is Private Method!
　None
　This is Private Class Method!
　None
```
Rspec + QuickRun でカーソル行のテストする

# QuickRunからrspecを呼び出す
1. [【vim】vimprocを使ってvim-quickrunからRspecを非同期実行！](http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/04/17/090805)
2.  [Hack #176: RSpecをquickrunする (2/2)](http://vim-users.jp/2010/10/hack176/ )

1.のサイトのソースコードをベースにして，2. のサイトを参考にカーソル行のみrspecのテストが実行されるように以下のように修正．

```
let g:quickrun_config['ruby.rspec'] = {'command': 'rspec', 'cmdopt': "-l {line('.')}", 'exec': ['bundle exec %c %o %s %a']}
```

しかし，現在行を実行しようとしても

```
Run options: include {:line_numbers=>[0]}

All examples were filtered out

Finished in 0.01496 seconds
0 examples, 0 failures

Randomized with seed 32968
```

と出てしまう．どうやら現在行がうまく取得できていないみたい．
# 式展開記法の変更
[quickrun 0.5.0がリリースされました](http://vim-users.jp/2011/07/release-note-quickrun-05/)
によるとquickrun 0.5.0から，式展開の記法が`{}`から`%{}`に変わった模様．

改めて，

```
let g:quickrun_config['ruby.rspec'] = {'command': 'rspec', 'cmdopt': "-l %{line('.')}", 'exec': ['bundle exec %c %o %s %a']}
```
としてみると，

```
Run options: include {:line_numbers=>[23]}
.

Finished in 0.59313 seconds
1 example, 0 failures

Randomized with seed 53001
```
カーソル行の指定ができた！

この記法変更については
>quickrun-syntax-option で {} が式展開になっていたものが、%{} に変更されました。多くの人は ~/.vimrc の変更が必要になります。これは大事なところなので、ぜひ一日三回はtweetしてください。
>[quickrun 0.5.0がリリースされました](http://vim-users.jp/2011/07/release-note-quickrun-05/)

とのことなので，1日3回ツイートするようにします．
（設定する必要がなかった！）homebrew で入れた go に GOROOT を設定する

*追記: go を homebrew で入れた場合 GOROOT は必要ありません。勘違いしていました！*

これまで `/usr/local/Cellar/go/{version}` だったようですが、go 1.2 では `/usr/local/Cellar/go/{version}/libexec` を指定しないと動きません。

[出回ってた ivanzoid さんのスクリプト](https://gist.github.com/ivanzoid/3477252)を [go 1.2 用に修正したのが以下](https://gist.github.com/shuhei/7804870)。.bashrc とか .bash_profile に置いとくといいです。

```bash
program_exists () {
	type "$1" &> /dev/null ;
}
if program_exists go; then
	function setupGOROOT()
	{
		local GOPATH=`which go`
		local GODIR=`dirname $GOPATH`
		local GOPATH_BREW_RELATIVE=`readlink $GOPATH`
		local GOPATH_BREW=`dirname $GOPATH_BREW_RELATIVE`
		export GOROOT=`cd $GODIR; cd $GOPATH_BREW/../libexec; pwd`
	}
	setupGOROOT
fi
```
JavaFX TreeViewにアイテム編集の機能を付ける

2013 年の [JavaFX Advent Calendar](http://www.adventar.org/calendars/146 "JavaFX Advent Calendar 2013") の5日目のエントリーです。
前日は [skrb](http://skrb.hatenablog.com/entry/2013/12/04/230000 "シェイプのストローク") さんでした!!
明日は [HASUNUMA Kenji](http://www.coppermine.jp/docs/programming/2013/12/efxclipse.html "e(fx)clipseで作るJavaFXアプリケーション") さんです。

TreeViewを操作するユーザにとっては、アイテムの編集・追加・削除、Drag and Dropによるコピーや移動はごく当たり前にできると思うかもしれません。でも、JavaFXのTreeViewにはもともとこれらの機能が備わっていないので、プログラマが自前でゴリゴリ作る必要があります。

TreeViewといっても大きく分けて4種類の部品があって、下図はMVCパターンで表現したものです。

![MVC002.gif](https://qiita-image-store.s3.amazonaws.com/0/33023/069742d4-d387-57c2-7432-7698638d2eaa.gif "TreeViewのMVCパターン")

TreeViewとTreeItemはJavaFXのをそのまま使うとして、背景色が黄色のものはプログラマが作る必要があります。
TreeViewコントローラはビューとモデルを制御するもので、ゼロから作ります。TreeCellはJavaFXにありますが、アイテムの編集やDrag and Drop操作をサポートしたければ派生クラスを作ります。「データ」はアプリケーションに必要な情報を保持するだけでなく、TreeCellの見せ方にも関与します。

たとえば、Windowsのエクスプローラのようなファイラでは、TreeViewはフォルダごとにアイコンとフォルダ名が表示されていますね。となると、「データ」には少なくともアイコンとフォルダ名に関する何らかの情報を持っている必要がある、、、というふうに設計するんでしょうね。

以上をふまえ、TreeViewで「アイテムの編集ができる」ようにカスタマイズする方法について、4回に分けて記事を書きましたのでご紹介します。
（Drag and Drop操作については、またあとで紹介できたらいいなと思っています）

1. [JavaFX TreeViewのカスタマイズ - その1：TreeItemのデータクラスの作成](http://qiita.com/sipadan2003/items/71ddbf0259ce89ba5243)
1. [JavaFX TreeViewのカスタマイズ - その2：TreeCellの作成](http://qiita.com/sipadan2003/items/4b909a294b039b0bfd2f)
1. [JavaFX TreeViewのカスタマイズ - その3：TreeCell用Graphicの作成](http://qiita.com/sipadan2003/items/9305e6c1f52e8e0621d7)
1. [JavaFX TreeViewのカスタマイズ - その4：TreeViewコントローラの作成](http://qiita.com/sipadan2003/items/d9afee2d6eb039f2b832)

[GitHub](https://github.com/sipadan2003/JFXTreeView201312 "JFXTreeView201312")にもソースコードを上げてあります。Java 8のJava FXで動作確認済みです。
rx.angular.jsでインクリメンタルサーチ

先日、[AngularJSの非同期処理をRxJSにつなげてみる](http://qiita.com/zoetro/items/6d69585b8e90e6e56198)という記事を書いたのですが、その数日後にReactive Extensionsの公式リポジトリにこんなのが作られてました。

* [rx.angular.js - Reactive Extensions Bindings for AngularJS](https://github.com/Reactive-Extensions/rx.angular.js)

AngularJSとRxJSを連携させるためのライブラリのようです。
ソースコードを覗いてみましたが、現状では下記の2つの関数が用意されていました。

* `$toObservable`
* `observeOnScope`

どちらも`$scope`の保持している変数の変更通知（すなわち`$scope.$watch`）をRxのObservableに変換するための機能です。
`$scope.$toObservable('xxx')`のように`$scope`のメソッドとして呼び出すか、`observeOnScope($scope, 'xxx')`のように関数の引数に`$scope`を渡すかが違うようですね。

さて、その[サンプルコード](https://github.com/Reactive-Extensions/rx.angular.js/blob/master/examples/%24toObservable)が面白かったのでご紹介。

~~~js:app.js
$scope.search = '';
$scope.results = [];

var search = function(term) {
  var deferred = $http({
    url: "http://en.wikipedia.org/w/api.php?&callback=JSON_CALLBACK",
    method: "jsonp",
    params: {
      action: "opensearch",
      search: term,
      format: "json"
    }
  });

  return Rx.Observable
    .fromPromise(deferred)
    .select(function(response){
      return response.data[1];
    });
};

$scope
    .$toObservable('search')
    .throttle(300)
    .map(function(data){
        return data.newValue;
    })
    .distinctUntilChanged()
    .select(search)
    .switchLatest()
    .subscribe(function(val){
        $scope.results = val;
    });
~~~

これは、サーバーに問い合わせるタイプのインクリメンタルサーチのサンプルです。
`$scope.search`がテキストボックスにバインドされていて、入力した文字列をWikipediaで調べて、その結果を`$scope.results`に出力するようになっています。

前半の処理は、`$http`でWikipediaに問い合わせをして、その結果のpromiseをRxJSで扱えるように変換しています。
面白いのは後半の処理なので、1行ずつ解説します。

* `$scope.$toObservable('search')`
  * `$scope.search`の変更通知をRxJSで扱えるように変換します。
* `throttle(300)`
  * 指定した時間（300msec）、新たな変更通知が発生しなかったら最後に発生した値を後続に流します。
  * テキストボックスに連続で文字を入力するときに、1文字入力するたびにサーバーに問い合わせるのはうれしくないですからね。
* `map(・・・)`
  * dataはnewValueとoldValueを持っているので、newValueだけ後続に流します。
* `distinctUntilChanged()`
  * 前回と値が同じだったら後続に流しません。
* `select(search)`
  * `$http`を使ってWikipediaに問い合わせを行います。
* `switchLatest()`
  * 同じタイミングでサーバーへの問い合わせが複数発生した場合、最後の問い合わせの結果だけを後続に流します。
  * `throttle()`は時間的に最後に発生した値を後続に流すものでしたが、こちらは最後の問い合わせの結果を後続に流します。最後に問い合わせたものが、時間的には先に返ってくることもありますからね。
* `subscribe(・・・)`
  * `$scope.results`に結果を入れます。

リアクティブプログラミングは最初はなかなか取っ付きづらいですが、慣れてくると複雑な処理がこんなにすっきり書けます。便利ですね！
中国でbundle installが動かない


グレートファイァーウォールのおかげで、中国国内でのRailsでの開発はストレスがたまります。。

少しでも、軽減するには

```ruby
#https://rubygems.org/ <--これを
http://ruby.taobao.org/#<--taobaoが提供してくれてるものに変えてみる。
IntelliJ IDEA で Scala + OpenCVの環境構築メモ (Mac)

色々不運が重なって？構築にものすごい時間をとられたので, 私のようなやつを増やさないためのメモです.


はじめに, Scala + IntelliJの環境構築ですが, suin 様が非常に丁寧に説明されておりますのでそちらをご覧ください. 
>[【図解】Scala 2.10 + IntelliJ IDEA 12 で｢Hello World｣する] (http://qiita.com/suin/items/33ba576b3a253d7fa709 )

##OpenCV導入準備
んじゃ本題ですが, OpenCVを[こちら](http://opencv.org/downloads.html)から持ってきます. [git](https://github.com/Itseez/opencv)からでも問題無いです. 

ダウンロードしたtar.gzファイルOpenCVを置いておきたいところに移動して,

```shell-session:shell-session
tar -zxvf hoge.tar.gz		(hogeはファイル名)
```

で解凍します. 
 <br>
同じ階層に同じ名前のフォルダができると思うので, その中に入ってbuildフォルダを作ります. 

```shell-session:shell-session
cd hoge
mkdir build
cd build
```
 <br>
んで, cmakeでビルド環境を生成します. cmakeはビルド条件を記述しておけば, 環境に依存せず自動的にビルド環境を作成してくれるらしいです.
 <br>
cmakeが入ってない場合は, brewで入れちゃいましょう.

```shell-session:shell-session
brew install cmake
```

cmakeで環境生成

```shell-session:shell-session
cmake -DBUILD_SHARED_LIBS=OFF ..
```

ビルド環境が整ったら, makeでビルドしましょう.

```shell-session:shell-session
make -j8 
```

-jオプションは並列高速化らしいですね. 今回はじめて知りました.
 <br>
build/binの中に.jarファイル, build/libの中に.soファイルがあるのが確認できたら準備は完了です. (はじめはこれが生成されてなくて, 何時間も悩んでました... )

##OpenCV導入
ここからIntelliJにOpenCVを導入していきます.

まず, 導入したいProjectを立ち上げます.
 <br>

メニューから
 File -> Project Structure を選びます.

そうすると下のような画面が出ると思うので, 矢印の先にある`1 Jar~`を選びます. 

![1.png](https://qiita-image-store.s3.amazonaws.com/0/27567/340a2f3b-79e5-9905-8638-941aae97944b.png "1.png")


ファイル選択画面が表示されるので先ほど生成した.jarファイルを選んでください. 
 <br>
このまま, OpenCVが利用されたプログラムを走らせると, 
>java.lang.UnsatisfiedLinkError: no opencv_java247 in java.library.path

.soファイルがみつからねーよと怒られてしまうので, VM optionで場所を教えてあげます.

メニューから
	Run ->　Edit Configurations を選びます.

そうすると下のような画面が出てくると思うので矢印の位置に,

	-Djava.library.path=.soファイルがあるディレクトリのpath

を入力します.
 
![2.png](https://qiita-image-store.s3.amazonaws.com/0/27567/3f773e68-c0f2-5584-dcae-f0876ff4a256.png "2.png")

 <br> <br> <br>
###これで構築完了です.
 <br>
ここまで読んでいただきありがとうございました！
なにか間違っていることを書いている可能性があるので, そのときは教えていただけると嬉しいです. 
環境構築で時間を費やしてしまう私みたいなやつがいなくなることを願います..
ではまた！
本日 Ruby でハマったカンマの罠

複数行で代入しているシチュエーションがあって、うっかりお尻のカンマを取り忘れてしまいました。

__さて、この場合 id には何が入るのでしょうか？__

```rb
id = 1,
name = "eccyan"
```

.
.
.
.
.

*** 

さて、上記の処理ですが、お尻のカンマが処理を継続させて以下の式の様に評価されます。

```rb
 id = 1, name = "eccyan" 
```
```rb
 id = [1, name = "eccyan"] 
```
`` name = "eccyan" `` が評価され

```rb
pry(main)> id = 1,
pry(main)* name = "eccyan"
=> [1, "eccyan"]
```

.
.
.
.
.

# (⸅̥᷇˲̎ͨ⸅̥᷆̾ ˒͋) < おいカツオ！

別に何も意図はありません。どうもありがとうございました。
jQueryプラグイン作成で気をつけたいところ１

#new Array()と[]どちらを使うか？
いつも[]を使ってるけど、new Array()使ってる人やプラグインも見るので違いを調べてみた。
サイズを指定することがなければ[]でいいっぽい。
速度的にも[]の方がよいみたい。
参考：http://qiita.com/Hiraku/items/d74690088dfa368875c9

#$(window).scrollの注意点
forなどループをまわすときは、パフォーマンスによってスクロール終了時のイベントに変更する。
スクロール終了時のイベントの書き方参考：http://satussy.blogspot.jp/2011/11/blog-post_25.html

#CSSを複数書くときは、書き方をそろえるとキレイ

```js
$(this).css({
	top: '50%';
	marginTop: '-100px'
});
//もしくは
$(this).css({
	'top': '50%';
	'margin-top': '-100px'
});
```

#キャメルケースや_などの使用は統一した方がキレイ
プログラマさん（java、phpとか）はキャメル、それ以外（デザイナー、コーダーとか）_を使ってることが多い気がする。
私はまぜまぜしちゃうので、注意したい。
タブ移動で戻ってくると検索窓にフォーカスしておく

Googleを開いたらChromeのJavascriptコンソールで以下を貼り付けておく。貼り付け終わったらデベロッパーツールは閉じておく。

````javascript:
document.addEventListener("webkitvisibilitychange", function(){
  if("visible" == document.webkitVisibilityState) {
    var q = document.querySelector("input[name=q]");
    q.focus();
    q.select();
  }
}, false);
````

# 後でChrome拡張にする
Google検索はAJAXで動いててリロードしないから一度実行しておけばずっと使えるけど。楽天の検索窓とかでも使おうとすると検索実行でリロードされてリスナが消えてしまうので、勝手にリスナ登録が出来るよう後でブラウザ拡張を作る予定。

## Chrome拡張にした
https://chrome.google.com/webstore/detail/focus-on-tabchanged/cncjnkphionepgfggbgdicdecbfamica/details

とりあえず自分がよく使うGoogle検索と楽天ブックス検索と楽天購入履歴検索に対応。

## ソースはこちら
https://github.com/kawaz/focus-on-tabchaged.crx

ところでroadchangeっていうCHANGELOGとROADMAPを綺麗に表示してくれるサービスを初めて使ってみたんだけど便利ねこれｗ
特定のディレクトリのみで使いたい環境変数


特定のプロジェクトのみで使いたい環境変数とかありますよね、特にherokuとか使ってると。

[direnv](https://github.com/zimbatm/direnv)というgoで書かれた便利ライブラリがあるんですがインストールすらめんどくさい時はshellの`chpwd`を使うと便利です。

```bash
function chpwd() {
  if [[ $PWD/ == ~/Projects/project_name/* ]]; then
    export VARIABLE
  else
    unset VARIABLE
  fi
}

if [[ $PWD/ == ~/Projects/project_name/* ]]; then
  export VARIABLE
fi
```
MacVimをインストール


下記、サイトからダウンロード

[macvim-kaoriya](https://code.google.com/p/macvim-kaoriya/downloads/list)

アプリケーションフォルダに突っ込んで、インストール完了。

CLIで使うために、.bash_profileに下記を追加

```
if [ -f /Applications/MacVim.app/Contents/MacOS/Vim ]; then
  alias vi='env LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim "$@"'
  alias vim='env LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim "$@"'
fi
```

まずは、カラーテーマを変えてみる
`$HOME/.vim/colors/`がなかったので、フォルダを作成。
下記、サイトからmolokai.vimを落としてきて、上記フォルダにコピー

[molokai : A port of the monokai scheme for TextMate](http://www.vim.org/scripts/script.php?script_id=2340)

`$HOME/.vimrc`と`$HOME/.gvimrc`に下記内容を追加

```
colorscheme molokai
syntax on
```

iTerm2の設定で[Preferences]-[Terminal]のReport Terminal Type を xterm-256colorにする。


***
参考サイト

* [プログラミングエディタをMacVimに換えた](http://kronus9.sblo.jp/article/70108109.html)
* [Vim のカラースキーマを変更する](http://www.yuichon.com/2013/04/vim-colorscheme/)
IntelliJ IDEAのPythonプラグインからもvirtualenvが使える

Pythonで開発環境を構築する上で、ベースのPython環境を汚さないようにvirtualenvを使用する方は多いかと思います。それに比べると利用者は少ないかと思いますが、IntelliJ IDEAのPythonプラグインでも、実は簡単にvirtualenvが使えるので、ご紹介します。

今回作成に使用した環境は下記の通り。Python 3.3にて標準機能となったvenvにも対応している模様です。事前にvirtualenvを入れることなしに試しています。

* IntelliJ IDEA 13 Ultimate Edition
* Python 3.3.3 (Windows-32bit版)

まずは試しに新規プロジェクトを作成します。モジュールは当然Python。

![スクリーンショット_120513_054519_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/2ad453ed-98fc-e6eb-919c-3d475acb5bd6.jpeg)

次にConfigure SDKの画面で、左上の+ボタンから、`Python SDK` → `Create VirtualEnv...` を選びます。

![無題クリップ_120513_055845_PM_120513_062731_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/dc4e496c-4aed-4a52-07a0-843ecd66f102.jpeg)

Create Virtual Environmentダイアログで、virtualenvの名前と保存先、そしてベースとなるPython SDKを選択すればOK。見事、venv-33というフォルダにPython 3.3.3の仮想環境が作られました。

![スクリーンショット_120513_060122_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/f8b612fe-4114-1c11-7fdc-f04fb2a7caca.jpeg)

あとは作った仮想環境を選択した状態で次に進めていってウィザードを完了させれば、今作った仮想環境での開発ができるようになります。
さて、早速SQLAlchemyが必要になったので、入れることにしましょう。
`import sqlalchemy`と書いてAlt+Enterし、`Install package sqlalchemy`を選べばモジュールのインストールが行われます。

![無題クリップ_120513_061013_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/692c6444-4487-5b0c-c968-5c764c445fd4.jpeg)

インストール完了。もちろん先ほど作った仮想環境にSQLAlchemyがインストールされます。

![スクリーンショット_120513_061413_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/f18d6fbe-8c05-4c20-06fa-243db02ce95a.jpeg)

簡単にvirtualenvで仮想環境が作れるのは便利ですね！

詳細はPyCharmではありますが、[PyCharmのヘルプ](http://www.jetbrains.com/pycharm/webhelp/creating-virtual-environment.html)もご参照ください。
また、既存のvirtualenv環境を利用することも可能とのことです。PyCharmですが、[Adding Existing Virtual Environment](http://www.jetbrains.com/pycharm/webhelp/adding-existing-virtual-environment.html)をご参照ください。
Gauche - 端末に入力されたキーごとに処理を行う方法


[Gauche](http://thinkit.co.jp/article/74/1/)とは、日本人ハッカー「川合 史朗」さんが作った`Lisp`の一種である、`Scheme`の処理系です。

特徴としては､簡単にWebアプリケーションを書けるらしいです。

今回は､この言語を使って、端末に入力されたキーを判別し、入力と同時に処理を行う方法を紹介します｡

##Gaucheのインストール

```bash:
$ sudo port install gauche
```

##Gaucheの使い方

```bash:
$ gosh

$ (exit)
```

##改行を待たずに端末から一文字読み取る

```el:read-single-char.gosh
#!/usr/bin/gosh
(use gauche.termios)
;; http://d.hatena.ne.jp/rui314/20070319/p1
;; 端末を非カノニカルモードに変更して1文字を読む手続き。
;; リターンするまえに端末のモードを元に戻す。
(define (read-single-char port)
  (let* ((attr (sys-tcgetattr port))
         (lflag (slot-ref attr 'lflag)))
    (dynamic-wind
      (lambda ()
        (slot-set! attr 'lflag (logand lflag (lognot ICANON)))
        (sys-tcsetattr port TCSAFLUSH attr))
      (lambda ()
        (read-char port))
      (lambda ()
        (slot-set! attr 'lflag lflag)
        (sys-tcsetattr port TCSANOW attr)))))

;; プログラムのエントリポイント
(define (main args)
  ;;(display "Press any key: ")
  ;; カレント出力ポートは行バッファリングなので、明示的にフラッシュする。
  ;; 上のdisplayは改行を含んでいないので、フラッシュしなければ何も出力されない。
  (flush)
   (let1 c (read-single-char (current-input-port))
    ;; (format #t "\ngot \"~a\" (UCS code 0x~X)\n"
    (format #t "\n~a ~X\n"
            c (char->ucs c)))
  0)
```

実行方法は以下の通りになります｡

```bash:
$ gosh read-single-char.gosh
```

ここで、何かのキーを押すと､そのキーのコードを取得してくれます｡

##入力キーによって処理を変更する

以下の様なシェルスクリプトを作ります｡

```bash:mac-key.sh
#!/bin/bash

key=`gosh read-single-char.gosh |col -bx| tr -d ''`
key=`echo $key`

case "$key" in
	"A")	echo "Enter";;
	"1B")	echo "Esc";;
	"20")	echo "Space";;
	"9")	echo "Tab";;
	"7F")	echo "Delete";;
	*)		exit 0;;
esac
```

ポイントは､`col -bx`です。これにより、エスケープシーケンスなどの余分な出力を排除しています。

また、`tr -d ''`は、空白削除のために多用されるコマンドです。`echo $hoge`も余分な空白を消してくれます｡

シェルスクリプトの実行は以下の様な感じです。

```bash:
$ chmod +x mac-key.sh

$ ./mac-key.sh
```

例えば､二文字の入力待ちにして、かつ入力完了後に、引数として渡すなら、以下の様な書き方ができます。

```bash:
for i in `gosh read-single-char.gosh | cut -c1`;for t in `gosh read-single-char.gosh | cut -c1`;do "任意のコマンド" $i$t;done
```

ポイントは､`cut -c1`です。これにより、アルファベット入力だけを出力しています。
リモートのファイルのシャーワンが知りたいときってあるじゃん？

具体的にはHomebrewにプルリク送るときに便利だろう。

```bash
$ curl http://mysql.mirrors.pair.com/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz | shasum
6cb1c547dec873a0afda825c83fd8e5a32b9a619  -
```

`curl` 便利！一番好きなコマンドです。
Gitで編集だけのログを表示したい

たとえば、すごいでっかいコミットがあったとして、
ファイル追加とかファイル削除とかを無視して、編集した部分だけを見たい、なんていうことがある。

そんなときは、`git log`に`--diff-filter`を使うとよい。

```shell-session
[rack#master] $ git whatchanged --diff-filter=M
commit 58c24bbafdd476d16d9c3778b2455625bb27f67e
Author: Martin Schürrer <martin@schuerrer.org>
Date:   Sun Jul 14 20:14:03 2013 +0200

    Fix bug in sendfile.rb
    
    The error message called `variation` without the env leading to an `ArgumentError`. It should call `type` instead.

:100644 100644 c247a3b... 8a67490... M  lib/rack/sendfile.rb

commit 977351595d7ff7d17cc4c4b2526922ef37b7c65e
Author: James Tucker <jftucker@gmail.com>
Date:   Thu Jul 4 16:17:43 2013 -0700

    Refactor rack static header rules application

:100644 100644 6b0762a... 41aec7f... M  lib/rack/static.rb

commit 65d3894224149ed3aee80293892bb368377913a1
Author: Garry Shutler <garry@robustsoftware.co.uk>
Date:   Wed Jul 3 19:43:50 2013 +0100

    Set HttpOnly for cookies using :http_only

:100644 100644 0c7091e... 43bbef3... M  lib/rack/utils.rb
:100644 100644 0ba17b1... 12b8b7b... M  test/spec_response.rb

commit cf13f31a74c46eb79032428d5efd176c4c35187c
Author: Prem Sichanugrist <s@sikac.hu>
Date:   Fri Jun 28 15:48:03 2013 -0400

    Add Response#unauthorized? helper
    
    This helper should come in handy when you want to test the authorization
    in your application.

:100644 100644 2beba7a... 2076aff... M  lib/rack/response.rb
:100644 100644 7ba1e0e... 0ba17b1... M  test/spec_response.rb
```

ちなみに、`M`は`Modified`の`M`である。他にも`Added`の`A`や、`Deleted`の`D`などがある。

…ところでこの機能、だれが使うんだろう。

## 追記(2013.12.06 16:31)

`M`は`Modified`なファイルのみのdiffを表示してくれる。
だけど、`Modified`なファイル **以外のファイルのdiff** を表示したい時はどうしたらいいんだろう。

と思ってたら、どうやら`m`と書けばよかったらしい。つまり、

```
$ git log --stat --diff-filter=m
```

である。
Mの逆だからmか。なるほど。
昔っぽいMySQLにmysql2とかからつなぎにいくと怒られる件の対処

```
Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) 
```

って言われる。これはRubyやActiveRecordがどうこうと言うかlibmysqlの問題の模様。

手元のMySQLのバージョンが5.6とかだと、それに添付されるソースでコンパイルしたgemはメッセージ通り `secure_auth` が有効になっているので古いMySQLのサーバにつなぎに行けないようだ。解決策としては、手元のMySQLも古くして再コンパイルするのが手っ取り早いようだ。

```bash
brew tap homebrew/versions
brew install homebrew/versions/mysql51
brew link --force mysql51
```

なお、12月現在mysql51.rbフォーミュラはインストールできない状態なので以下のようにするしか無い（TODO:プルリする）

```diff
diff --git a/mysql51.rb b/mysql51.rb
index 4604b27..1e12954 100644
--- a/mysql51.rb
+++ b/mysql51.rb
@@ -2,8 +2,8 @@ require 'formula'
 
 class Mysql51 < Formula
   homepage 'http://dev.mysql.com/doc/refman/5.1/en/'
-  url 'http://mysql.mirrors.pair.com/Downloads/MySQL-5.1/mysql-5.1.71.tar.gz'
-  sha1 'a71c77c43aa8374ccb6e09f0ad7f225846af59e6'
+  url 'http://mysql.mirrors.pair.com/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz'
+  sha1 '6cb1c547dec873a0afda825c83fd8e5a32b9a619'
 
   option :universal
   option 'with-tests', 'Keep tests when installing'
```

あとはgemを再度インストールするとかbundle installを消してやり直すとかする感じ。

## ___ここからあとで試す___

* http://yoku0825.blogspot.jp/2013/05/mysql56mysql50ioerror-2049.html

MySQL5.6でも、この記事にある感じのパッチ（mysql->options.secure_auth= FALSE; にする）を手元にあるはずのソースに突っ込んで、gemを再コンパイルすれば大丈夫になるかも？
逆引きReactiveCocoa: シグナルにイベント発生時に対する処理を挟み込む

[ReactiveCocoaのドキュメント](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/BasicOperators.md#injecting-effects)にもあるように、`-do...`系のメソッドを使用すると、シグナルを購読せずに副作用を挟み込むことができます。

```objc
RACSignal *newSignal = [[[signal 
	doNext:^(id x) {
		NSLog(@"next");
    }] 
	doError:^(NSError *error) {
		NSLog(@"error");
    }] 
	doCompleted:^{
		NSLog(@"completed");
    }];
```

シグナルを購読する終端であれば、各種処理を`-subscribe...:`系のメソッドのブロック内で行うこともできますが、シグナルに手を加えてシグナルを返すようなメソッドでは便利に使用することができます。

また、例えば`-doNext:`を重ねて記述した場合、記述順（lexical order）に処理が実行されます。

```objc
[[[signal
	doNext:^(id x) {
		NSLog(@"1st");
	}]
	doNext:^(id x) {
		NSLog(@"2nd");
	}]
	subscribeNext:^(id x) {
		NSLog(@"-subscribeNext:");
	}];
// 1st
// 2nd
// -subscribeNext:
```

シグナルの終了時の処理として正常系／異常系のどちらでも同じ処理を行いたい場合、`-finally:`が使用できます。

```objc
// 以下の2つは同義。

[signal finally:^{
	[self doSomeStuff];
}];

[[signal
	doError:^(NSError *error) {
		[self doSomeStuff];
	}]
	doCompleted:^{
		[self doSomeStuff];
	}];
```

## 補足

[ReactiveCocoa 3.0](https://github.com/ReactiveCocoa/ReactiveCocoa/tree/3.0-development)では`-finally:`は非推奨となり、`-doFinished:`が追加（としてリネーム）されています。
Windows7のNetbeans7.4でSass

Windows7のNetbeans7.4でSass

1-----------------------------------
rubyダウンロード・インストール
https://www.ruby-lang.org/ja/

2-----------------------------------
Sassインストール
http://sass-lang.com/
ruby.exe
↓
gem install sass

3-----------------------------------
Netbeans7.4のSass設定
C:\Users\***\AppData\Roaming\NetBeans\7.4\config\Preferences\org\netbeans\modules\css\prep
css-prep.propertiesを編集
sass.debug=true
↓
sass.debug=false

4-----------------------------------
Netbeans7.4
ツール→オプション→CSSプリプロセッサ
Sassパス
C:\Ruby***\bin\sass.bat

5-----------------------------------
Netbeans7.4
プロジェクトのプロパティ
CSSプリプロセッサのコンパイラ・オプションにUTF-8、LFを指定。
--unix-newlines -E UTF-8

6-----------------------------------
C:\Ruby***\bin\sass.batを編集
ruby.exe
↓
C:/Ruby***/bin/ruby.exe
（2箇所）
Getting Started - AngularJS

### 参考リンク

* [hiravgandhi/angularjs-rails](https://github.com/hiravgandhi/angularjs-rails)
* [AngularJS: API Reference](http://docs.angularjs.org/api)
* [今、AngularJSというフレームワークがヤバい - (ﾟ∀ﾟ)o彡 sasata299's blog](http://blog.livedoor.jp/sasata299/archives/51966228.html)

### セットアップ

Gemfile

```rb
gem 'angularjs-rails'
```

```
bundle install
```

app/assets/javascripts/application.js

```js
//= require angular
```

app/views/layouts/application.html.haml

```haml
%html{ 'ng-app' => true }
```

app/views/posts/_form.html.haml

* [Angular.jsでvalue=初期値を使いたいときは、ng-initを使いましょう - コロタエンヂニアリング](http://d.hatena.ne.jp/dai_yamashita/20130130/1359535779)

```haml
%div
  %label Name:
  %input{ "ng-model" => "yourName", "ng-init" => "yourName='You'", placeholder: "Enter a name here", type: "text" }
  %h1 Hello {{yourName}}!
```

* [AngularJS: ngInit](http://docs.angularjs.org/api/ng.directive:ngInit)

```
The only appropriate use of ngInit for aliasing special properties of ngRepeat, as seen in the demo below. Besides this case, you should use controllers rather than ngInit to initialize values on a scope.
```

----

### コントローラ

* 文字列をクリックする度、末尾に「Hello」を追加する

```js
function firstCtrl($scope){
  $scope.hello = "Hello Angular!";

  $scope.like_countup = function() {
    $scope.hello = $scope.hello + " Hello";
  };
};
```

```haml
%div{ "ng-controller" => "firstCtrl" }
  %p{ "ng-click" => "like_countup()" } {{hello}}
```

* カウントアップ

```js
function likeCtrl($scope){
  $scope.like_count = 1;

  $scope.like_countup = function() {
    $scope.like_count += 1;
  };
};
```

```haml
%p{ "ng-controller" => "likeCtrl" }
  %button{ type: 'button', "ng-click" => "like_countup()" } いいね
  %span x{{like_count}}
  %br
```
Bootstrap3でform-horizontalの中でテキストフォームを横に並べる

生年月日を入力させるフォームで年、月、日のテキストフォームを分けて横に並べました。
Bootstrap3だけでは記述しきれずに、下記のスタイルを追記しました。
style="width: 70px;display: inline-block;"
最終的にCSSは外部ファイル化します。

利用頻度が高そうなパターンですが、Bootstrap3だけで完結する方法は無いのかな？

```html
<form action="" class="form-horizontal">
  <div class="form-group">
    <label for="name" class="control-label col-md-3">氏名</label>
    <div class="col-sm-8">
      <input type="text" placeholder="氏名" id="name" class="form-control">
    </div>
  </div>

  <div class="form-group">
    <label for="kana" class="control-label col-md-3">フリガナ</label>
    <div class="col-sm-8">
      <input type="text" placeholder="フリガナ" id="kana" class="form-control">
    </div>
  </div>

  <div class="form-group">
    <label for="birth" class="control-label col-md-3">生年月日</label>
    <div class="col-sm-8">
      <input type="text" class="form-control" placeholder="年" style="width: 70px;display: inline-block;"><span style="margin: 0 5px;">年</span>
      <input type="text" class="form-control" placeholder="月" style="width: 50px;display: inline-block;"><span style="margin: 0 5px;">月</span>
      <input type="text" class="form-control" placeholder="日" style="width: 50px;display: inline-block;"><span style="margin: 0 5px;">日</span>
    </div>
  </div>

  <div class="form-group">
    <label for="adr" class="control-label col-md-3">住所</label>
    <div class="col-sm-8">
      <input type="text" placeholder="住所" id="adr" class="form-control">
    </div>
  </div>
</form>
```
Android NDK r8e で ndk-build clean がエラーになる修正

# はじめに
2013/05/21 にリリースされた Android NDK toolchain r8e の Makefile にバグがあり、ndk-build clean でエラーになります。その問題の解決方法です。

元ネタはこちら。

- Correcting a Bug in the Latest Google NDK r8e
 - http://www.appcelerator.com/blog/2013/03/correcting-a-bug-in-the-latest-google-ndk-r8e/
- PSA: Android NDK r8e is out!
 - https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/3wIbb-h3nDU

# 現象
ndk-build clean を実行すると以下のようなシェルスクリプトのシンタックスエラーが発生する。

    Clean: cpufeatures [armeabi-v7a] 
    /bin/sh: -c: line 0: syntax error near unexpected token `(' 
    /bin/sh: -c: line 0: `rm -rf (TARGET_OBJS)' 
    make: *** [clean-cpufeatures-armeabi-v7a] Error 2 

# 解決方法
android-ndk/build/core/build-binary.mk の 49 行目を変更してください。 

    -$(cleantarget): PRIVATE_CLEAN_FILES := ($(my)OBJS) 
    +$(cleantarget): PRIVATE_CLEAN_FILES := $($(my)OBJS) 

# おわりに
現時点での最新版は r9b なのでそちらを利用した方が良いです。
開発環境を変えられないとか、諸事情で r8e を使い続けている方の助けになれば幸いです。
rspecで無名モジュールを作ったテストで定数を指定するには


## 結論

`stub_const`が使えないので、`Module#const_set`を使いましょう

## 詳細

```ruby
let(:unit) do
  Module.new do
    def self.name do
      'TestUnit'
    end
  end
end

before { stub_const("#{unit.name}::FOO", 1) }
it { ... }
```

とかやろうとしてたんです。
(Module#nameは、通常[名前が必要になった時に決定される](http://docs.ruby-lang.org/ja/2.0.0/class/Module.html#S_NEW)ので、最初に定義が必要)

ところが、これをやると

```
RuntimeError:
undefined TestUnit::FOO
```

と言われてしまうわけです。

[@r7kamura](https://twitter.com/r7kamura) さんに相談した所、`stub_const`が実行されるときには、`TestUnit`があることを前提に定義しようとするため、この場合は見つからないと言われてしまうようです。
(ちなみに、 `let!(:unit)`で定義しても同様でした…。)

なので、このようにしました。

```ruby
let(:unit) do
  Module.new
end

before { unit.const_set("FOO", 1) }
it { ... }
```

```
1 examples, 0 failures
```

YATTA!
sinatraを`rails console`みたいにconsole起動

> 2018-12-01 当記事の内容では起動できませんでした。
もしrails consoleのように起動する方法をご存知でしたらコメント頂けると嬉しいです。

クラシックスタイルでapp.rbが起動ファイルだとして。

irb
`irb -r app.rb`

pry
`pry -r app.rb`

bundler使ってる場合のpry
`-bundle exec pry -r app.rb-`
追記：うそ。だめかも。


pry起動してからの場合

~~~ruby
bundle exec pry
> require './app'
~~~

---

参考

- [Shifting - Running A Sinatra Console][1]
- [Console for Sinatra][2]
- [Matthew Riddle : Rails console equivalent for Sinatra][3]

[1]: http://mikeebert.tumblr.com/post/29941784481/running-a-sinatra-console
[2]: http://adam.heroku.com/past/2009/4/19/console_for_sinatra/
[3]: https://coderwall.com/p/rqfeug

まあ、こんだけ検索でヒットするからきっと正しいのだろう…
capistrano2でcapistrano_rsync_with_remote_cacheを使ってみる

 * プッシュ式のリリースがやりたくてcapistrano_rsync_with_remote_cacheを使ってみた
  * 実行サーバーにソースコードを持って来てrsyncで差分を各デプロイ対象のサーバーに振りまける
  * 詳細はいろいろと書いてある記事があるので参照した

## 導入
 * Gemfilesに以下を追加

```rb
gem 'capistrano_rsync_with_remote_cache'
```

 * deploy/configに以下を追加

```rb
set :deploy_via, :rsync_with_remote_cache
```
 
## 問題:ssh_optionsがサポートされていない

### 問題の内容

 * 使ってみるとrsyncのオプションでuserとportしか使われず、ssh_optionsが設定されない([該当コード](https://github.com/vigetlabs/capistrano_rsync_with_remote_cache/blob/master/lib/capistrano/recipes/deploy/strategy/rsync_with_remote_cache.rb#L47))
 * 例えばsshの鍵認証したいからと思ってssh_optionsを設定しても反映されずにrsyncが失敗する

### 対処方法1

 * .ssh/configあたりで対象サーバーの設定を書いておく
  * => でも、動的にサーバーが変更になる場合に面倒くさい、外部環境に依存するのも嫌な感じ

### 対処方法2【今回採用】

 * githubリポジトリをforkしてきて修正([修正したリポジトリ](https://github.com/mechamogera/capistrano_rsync_with_remote_cache))
  * オリジナルリポジトリは3年前くらいから更新されておらず、pull requestも受け入れられていない感じなので
  * 修正内容1：[bundlerでgithubからinstallできるように](https://github.com/mechamogera/capistrano_rsync_with_remote_cache/commit/a6a953f4e50339b8e4445e6f3524e5abb73b908b)
  * 修正内容2：[ssh_optionsを利用するように](https://github.com/mechamogera/capistrano_rsync_with_remote_cache/commit/28ee9c22f78de4f79a9614ad4d8e2361cfde0653)(そんなに良い修正ではない)

 * Gemfileで修正したcapistrano_rsync_with_remote_cacheを指定

```rb
gem 'capistrano_rsync_with_remote_cache', :git => 'https://github.com/mechamogera/capistrano_rsync_with_remote_cache.git'
```

 * capistranoで以下のように利用

```rb
ssh_options[:keys] = ["test.pem"]
set :rsync_ssh_options, ENV['SOCKS5_USER'] ? %Q!-o ProxyCommand="/bin/env connect -S socks5.server:1080 %h %p" ! : ""
```

## おまけ:capistrano3でのプッシュ式のリリースについて

 * capistrano_rsync_with_remote_cacheも含めサポートされてないみたい
 * 自分で実装する必要があるみたい
  * [ruby - Capistrano 3 copy strategy equivalent - Stack Overflow](http://stackoverflow.com/questions/19508411/capistrano-3-copy-strategy-equivalent)
  * [Deploy fails without SCM (:scm, :none) · Issue #777 · capistrano/capistrano<](https://github.com/capistrano/capistrano/issues/777)
PHPUnit で静的メソッドのモックテスト


こんなかんじの関数があったとする。

```php
<?php
/**
 * 自動的に10文字のランダム文字列を生成して、ゴニョゴニョして、成功した場合はそのランダム文字列を返す
 * @return string ランダム文字列。失敗した場合、空白を返す。
 */
function appendNewString () {
	// getRandomString クラスの randomString メソッドはランダム文字列を任意の桁数、生成する
	$rand = getRandomString::randomString(10);
	// なんかゴニョゴニョ
	if (/* このランダム文字列は使えません無理でした */) {
		return "";
	}
	return $rand;
}
```

上記のような処理でランダム生成されたのが無理な処理が、ちゃんと動いているか確認したい場合、静的メソッドのモックを作って確認する。でも上記の状態だと`getRandomString`クラスのモックを渡せないので、引数に無理やりモックを渡すようにして実行させる。

```php
<?php
/**
 * 自動的に10文字のランダム文字列を生成して、ゴニョゴニョして、成功した場合はそのランダム文字列を返す
 * @param string $getRandomString ランダム文字列生成に使用するクラス名。（テストの場合のみ使用する）
 * @return string ランダム文字列。失敗した場合、空白を返す。
 */
function appendNewString ($getRandomString="getRandomString") {
	// getRandomString クラスの randomString メソッドはランダム文字列を任意の桁数、生成する
	$rand = call_user_func_array(array($getRandomString, "randomString"), array(10));
	// なんかゴニョゴニョ
	if (/* このランダム文字列は使えません無理でした */) {
		return "";
	}
	return $rand;
}
```

そしてテストは下記のようにする

```php
class RandomTest extends CakeTestCase {
	/** すでにデータがあっても、入るか確認 */
	public function test_create_Mock () {
		$getRandomString_mock = $this->getMock('getRandomString');
		// 固定文字列の使えない文字列を返して、失敗させる
		$getRandomString_mock->staticExpects($this->at(0))
			->method('randomString')
			->will($this->returnValue('abcdef'));
		// 固定文字列の使えない文字列を返して、失敗させる
		$getRandomString_mock->staticExpects($this->at(1))
			->method('randomString')
			->will($this->returnValue('abcdef'));
		// 固定文字列の使える文字列を返して、成功させる
		$getRandomString_mock->staticExpects($this->at(2))
			->method('randomString')
			->will($this->returnValue('Ynbcf1i8SU'));

		// 1回目2回目の時は失敗してるので空白文字が帰るが、三回目は成功する
		$this->assertEqual(0, strlen(appendNewStrings($getRandomString_mock)));
		$this->assertEqual(0, strlen(appendNewStrings($getRandomString_mock)));
		$this->assertEqual(10, strlen(appendNewStrings($getRandomString_mock)));
	}
}
```


参考: http://tkyk.name/blog/2012/10/11/phpunit-mock-for-static-methods/
逆引きReactiveCocoa: 毎時0分に処理を行う

元ネタ: [ios - Perform action on the hour, every hour, with ReactiveCocoa - Stack Overflow](http://stackoverflow.com/questions/16523571/perform-action-on-the-hour-every-hour-with-reactivecocoa/16535857#16535857)

-----

現在時刻から1時間毎だと毎時0分とならないので、まずは次の時までの分を得ておきます。

```objc
NSDateComponents *components = [[[NSCalendar sharedCalendar] calendar] components:NSMinuteCalendarUnit fromDate:[NSDate date]];
NSInteger minutesToNextHour = 60 - components.minute;

```

いったん現在時刻から次の時までのタイマーシグナルを生成し、1回限りで終了させた後に改めて60分間隔のタイマーシグナルを繋げて完成です。

```objc
RACSignal *updateEventSignal = [[[RACSignal
    // `+interval:`の引数は`NSTimeInterval`で秒単位。
    interval:(60 * minutesToNextHour)]
    take:1]
    concat:[RACSignal interval:3600]];
```
git logからAuthorリストを生成してくれるgrunt-git-authorsについて紹介するよ

# grunt-git-authorsとは
`git log`からAuthorのリストを`Name <email>`の形式で出力してくれるGruntプラグインです。

https://npmjs.org/package/grunt-git-authors
https://github.com/scottgonzalez/grunt-git-authors

私はjQueryのpackage.jsonを読んでいてこの存在を知りました。
https://github.com/jquery/jquery/blob/master/package.json#L40

# 何に使えるの？
AUTHORSファイルを作るのに使えます。
ソースを見てもらえば分かるんですが、`git log`でAuthorのリストを出力しているだけです。

## AUTHORSファイルって何よ？
プロジェクトへの作者・寄与者が列挙されたテキストファイルです。
ちなみにgrunt-contrib-coffeeプラグインのAUTHORSはこちら。
https://github.com/gruntjs/grunt-contrib-coffee/blob/master/AUTHORS

npmの場合は、package.jsonの仕様を見ると下記のように書かれています。
https://npmjs.org/doc/json.html

> "contributors": [...]
> 
> If there is an AUTHORS file in the root of your package, npm will treat each line as a Name <email> (url) format, where email and url are optional. Lines which start with a # or are blank, will be ignored.

package.jsonのcontributorsに寄与者の名前とメールアドレス、URLなどを列挙するんですが、もしAUTHORSファイルがルートにあれば、よろしく読み取ってくれるとなっています。

## contributorsを見てみる
例えば、`grunt-contrib-coffee`プラグインのcontributorsは下記のように確認できます。

```
% npm view grunt-contrib-coffee contributors
```

```
[ 'Eric Woroshow (http://ericw.ca/)',
  'Tyler Kellen (http://goingslowly.com/)',
  'Chris Talkington (http://christalkington.com/)',
  'Kyle Robinson Young (http://twitter.com/shamakry)',
  'Yegor Pomortsev (https://github.com/illicium)',
  'Sindre Sorhus (http://github.com/sindresorhus)',
  'Callum Locke (https://github.com/callumlocke)',
  'Scott Delamater (https://github.com/scottydawg)',
  'Colin Wren (http://cawren.com)' ]
```

jQueryの場合はauthorのnameを個人ではなくして、urlがAUTHORSファイルを指すようになってました。

```
{
  "name": "jquery",
  "title": "jQuery",
  "description": "JavaScript library for DOM operations",
  "version": "2.1.0-pre",
  "main": "dist/jquery.js",
  "homepage": "http://jquery.com",
  "author": {
    "name": "jQuery Foundation and other contributors",
    "url": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt"
  },
```

# 導入
## インストール
npm installでgrunt-git-authorsをインストールします。package.jsonのdevDependenciesに追加されるように--save-devオプションを忘れずに。

```
% npm install grunt-git-authors --save-dev
```

## Gruntfile.js
`grunt-git-authors` タスクをロードするように追記します。

```
module.exports = function(grunt) {
(略)
  grunt.loadNpmTasks('grunt-git-authors');
(略)
}; 
``` 

# 実行
下記のように実行するとコンソールにAuthorリストが出力されます。

```
% grunt authors
```

なので、リダイレクトしてAUTHORSファイルに出力されるようにすると良いと思います。
下記の例では、先頭/最終行のGruntログを削除しています。

```
% grunt authors | sed -e '1d' | sed -e '$d' > AUTHORS
```

# まとめ
ほとんどの人には役に立たないプラグインではありますが、AUTHORS, grunt-git-authorsについて紹介しました。
`npm install`や`git clone`してるだけだと見逃してしまいますが、たまにはAUTHORSの情報も見て作者・寄与者の方々に心の中で感謝してはいかがでしょう。

`git clone`して`git shortlog -se | awk -F'\t' '{print $2,$3}' `で、いいんじゃね？とか気にしない。

#Appendix
Grunt Plugins
http://gruntjs.com/plugins
capistrano2で非railsを配置してみる

capistrano 2.15.5使って非railsアプリをサーバ上に配置してみた。
capistrano3でやってみた記事はこちら [capistrano3.0で非railsを配置してみる - Qiita [キータ]](http://qiita.com/mechamogera/items/46cadbd300e2a7667353)

## 試してみた手順

```bash
$ bundle init
$ echo "gem 'capistrano', '~> 2.0'" >> Gemfile
$ echo "gem 'capistrano_colors'" >> Gemfile
$ echo "gem 'railsless-deploy'" >> Gemfile
$ bundle install --path vendor/bundle

$ bundle exec capify .
[add] writing './Capfile'
[add] making directory './config'
[add] writing './config/deploy.rb'
[done] capified!

$ tree -L 2
.
├── Capfile
├── Gemfile
├── Gemfile.lock
├── config
│   └── deploy.rb
└── vendor
    └── bundle
```

* config/deploy.rbを設定

```rb
set :application, "MyTips"
set :repository,  "https://github.com/mechamogera/MyTips"
set :scm, :git
set :keep_releases, 5

set :deploy_to, '/var/www/my_app'                                                                                     

default_run_options[:pty] = true
set :use_sudo, false

# No shared files
set :shared_children, %w()
# for No such file or directory Error
set :normalize_asset_timestamps, false

role :web, "[EC2のDNS名]"
set :user, 'ec2-user'
set :group, 'ec2-user'

before "deploy:setup" do
  run "sudo mkdir -p #{deploy_to}"
  run "sudo chown -R #{user}:#{group} #{deploy_to}"
end

# 念のためafterでも
after "deploy:setup" do
  run "sudo chown -R #{user}:#{group} #{deploy_to}"
end
```

* EC2(AmazonLinux)を作成 
* capistrano実行

```bash
$ bundle exec cap deploy:setup
$ bundle exec cap deploy
$ bundle exec cap deploy:cleanup
```

* EC2確認

```bash
$ tree /var/www/my_app/ -L 2
/var/www/my_app/
├── current -> /var/www/my_app/releases/20131205070710
├── releases
│   └── 20131205070710
└── shared
```
ワンクリックでGoのスニペットを試せる環境を作る!: CodeRunnerの設定方法



![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/889/21aef519-4948-fd7a-0230-56a7956df194.jpeg "01.jpg")



# CodeRunnerとは？

[CodeRunner]とは、クリックするだけでどんなプログラミング言語でさくっと実行できるエディタです。CodeRunnerを使えば、アルゴリズムやコードスニペットの簡単なテストや実験をサクッと行うことができます。Mac用のアプリでAppStoreにて$9.99で買うことができます。インストール時点で下記の言語に対応してます:

* AppleScript
* C
* C++
* Java
* JavaScript(Node.js)
* Lua
* Objective-C
* Perl
* PHP
* Python
* Ruby
* Shell Script

# GoをCodeRunnerで実行できるようにする

CodeRunnerは言語を追加することができます。ここではGoを追加して実行できるようにする方法を順を追って解説します。

![Screen Shot 2013-07-29 at 11.59.08 AM.png](https://qiita-image-store.s3.amazonaws.com/0/889/4030229b-751e-2f32-1786-c4455448954a.png "Screen Shot 2013-07-29 at 11.59.08 AM.png")

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/889/51cb2dd5-f42d-8d1b-0c63-86aa590847ab.png "Preferences.png")

![](https://dl.dropboxusercontent.com/u/949822/qiita.com/131205-go-coderunner/1.png)

"Run Command" は `go fmt $filename && go run $filename` としたが、フォーマットが要らなければ  `go run $filename` だけでいい。

また、brewでgoをインストールした場合、下記のように "Run Command" を設定しておくとGOPATHが通った状態にしておける

```
GOPATH=$(brew --prefix go) go run $filename
```

```go:テンプレート
package main

import (
	"log"
)

func main() {
	log.Print("Golang")
	%@
}

```

![](https://dl.dropboxusercontent.com/u/949822/qiita.com/131205-go-coderunner/2.png)

![](https://dl.dropboxusercontent.com/u/949822/qiita.com/131205-go-coderunner/3.png)



[CodeRunner]: http://krillapps.com/coderunner/
Wikipedia Mobile のようなスライドメニューを簡単に作る

Wikipedia を iPhone で見ると、左上にメニューボタンがあって、それをタップすると左からメニューが表示される、まぁよくあるタイプですが、簡単に実装しましょう。

開閉の制御は jQuery、アニメーションはヒマなんで CSS3 でやりましょう。

## HTML
```html
<nav>
	<a href="#">link</a>
	<a href="#">link</a>
	<a href="#">link</a>
</nav>
<div id="content">
	<button id="btn_menu">menu</button>
</div>
```

## Sass
```sass
nav {
	width: 200px;
	min-height: 100%;
	position: absolute;
	top: 0;
	left: 0;
	z-index: 0;
	background: rgb(180, 180, 180);

	a {display: block;}
}
#content {
	width: 100%;
	min-height: 100%;
	position: absolute;
	top: 0;
	left: 0;
	z-index: 1;
	background: rgb(220, 220, 220);
}
#content.menu_open, #content.menu_close {
	@include experimental('animation-duration', 0.5s, webkit);
	$animation-support: webkit;
	@include experimental('animation-iteration-count', 1);
}
#content.menu_open {
	@include experimental('animation-name', menu_on, webkit);
	left: 200px;
}
#content.menu_close {
	@include experimental('animation-name', menu_off, webkit);
	left: 0;
}
@-webkit-keyframes menu_on {0% {left: 0;} 100% {left: 200px;}}
@-webkit-keyframes menu_off {0% {left: 200px;} 100% {left: 0;}}
```

## JavaScript
```js
$(function() {
	$(document)
		.on('touchend', '#btn_menu', function() {
			var $content = $('#content');
			$content.attr('class', $content.hasClass('menu_open') ? 'menu_close' : 'menu_open');
		})
		.on('touchend', '.menu_open', function() {
			$('#content').attr('class', 'menu_close');
		})
	;
});
```

## 結果
### 普段の状態
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/p/primedesignworks/20131205/20131205152215.png" alt="" title="" />

### コンテンツ部分をタップすると元に戻る
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/p/primedesignworks/20131205/20131205152216.png" alt="" title="" />
コンテンツの高さに合わせたいサイドバー

要素を並べるって、普通 float させることが多いと思うんですけど、場合によっては position を使った方がいいことがあります。

そのひとつが、コンテンツの高さにサイドバーの高さも合わせたいって場合です。

## HTML
```html
<div id="wrapper">
	<div id="content">
		left<br />
		left<br />
		left<br />
		left<br />
		left<br />
		left<br />
		left
	</div>
	<div id="sidebar">right</div>
</div>
```

## CSS
```css
#wrapper {
	width: 200px;
	margin: 100px;
	position: relative;
	background: rgb(220, 220, 220);
}
#content {width: 150px;}
#sidebar {
	width: 50px;
	height: 100%;
	position: absolute;
	top: 0;
	right: 0;
	z-index: 1;
	background: rgb(180, 180, 180);
}
```

## 結果
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/p/primedesignworks/20131205/20131205152214.png" alt="" title="" />
node.jsのバージョンアップ、バージョン切り替え

node.jsのインストールやバージョンアップはnvm(Node Version Manager)をつかう
https://github.com/creationix/nvm

って書いたけど、そのあとnodebrewというものがあることを知った。
こっちのほうがオヌヌメ。
<a href="http://qiita.com/strsk/items/db64f4dd27484a875d20">nodebrewで手軽にnode.jsバージョンアップ - Qiita [キータ]</a>

### nvmのインストール
```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
```
### インストールされているnode.jsのバージョンを確認
```
$ nvm ls
```
### インストール可能なnode.jsのバージョンを表示
```
$ nvm ls-remote
```
インストールされているバージョンは青くなる
### 指定したバージョンをインストール
ビルド番号を指定しないと指定したマイナーバージョンのlatestなものがインストールされる

```
$ nvm install 0.11
```
### 使用するバージョンを切り替える
```
$ nvm use 0.11
```
### 確認してみる
```
$ node -v
v0.11.9
```
Go言語のpackageの作り方: 長くなったコードを別ファイルに切り出す方法


昨日『[PHPerだが今日初めてGo言語に手を出してみる試み]』というタイトルでGoの始め方を書いたが、Goを書き始めたら、あっという間に1ファイルのコードが長くなってきてしまった。長いコードは、関係性に応じてコードを小さな単位に分割したくなってくる。Go言語にはpackageという仕組みが有るので、簡単なpackageを作る方法を説明する。

# 記事のゴール

* 1ファイルに固まったコードを2ファイルに分割できるようになる

# 準備

適当にフォルダを作り、

```
mkdir ~/Desktop/go-package
cd ~/Desktop/go-package/
```

Goのソースファイルを作って、

```
touch main.go
```

好きなエディタで開き、まずは、Hello Worldするコードを書く。

```go:main.go
package main

import "log"

func main() {
	foo()
	bar()
}

func foo() {
	log.Print("Hello world from foo!")
}

func bar() {
	log.Print("Hello world from bar!")
}

```

とにかく実行してみる:

```
% go run main.go
2013/12/05 14:32:55 Hello world from foo!
2013/12/05 14:32:55 Hello world from bar!
```

# 分割してみる

ここでは、この中の `foo` 関数、`bar` 関数を別パッケージに切り出すことにする。

パッケージ名は `foobar` にします。

まず、foobarパッケージのディレクトリを作る

```
mkdir foobar
```

次に、2つの関数を書く場所として foobar.go を作る

```
touch foobar/foobar.go
```

ディレクトリ構成はこのようになる:

```
.
├── foobar
│   └── foobar.go
└── main.go
```

`foobar.go` に2つの関数を移植する。
この際、関数は大文字から始めるようにする。
大文字から始まる関数は外部に公開される。

```go:foobar/foobar.go
package foobar

import "log"

func Foo() {
	log.Print("Hello world from foo!")
}

func Bar() {
	log.Print("Hello world from bar!")
}

```

次に、 `main.go` を改修する。

* log パッケージは必要なくなったので削る。
* foobarパッケージをimportする。
* foo, barは関数が大文字になったので変える。

```go:main.go
package main

import "./foobar"

func main() {
	foobar.Foo()
	foobar.Bar()
}

```

動くか実行してみる。

```
% go run main.go
2013/12/05 14:33:49 Hello world from foo!
2013/12/05 14:33:49 Hello world from bar!
```

[PHPerだが今日初めてGo言語に手を出してみる試み]: http://qiita.com/suin/items/a0b7eb585eeb6bda4174
meta viewport を動的に切り替える際に気をつけること

pushstate 使用時など、jQuery などで meta viewport を書き換える場合、content 内の要素数が一致していないと、書き換え前の要素が引きずられてしまうので、一致させる必要があります。

## 一致してない例

```js:
$("meta[name='viewport']").attr('content',
	page == 'A'
		? 'width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no'
		: 'width=device-width,initial-scale=1.0,minimum-scale=1.0,user-scalable=yes'
);
```

これだと、一度ページ A ときはピンチアウトできませんが、その後ページ A 以外に移ったときに、「maximum-scale=1.0」が残ってしまい、結果「minimum-scale=1.0, maximum-scale=1.0」と解釈され、やはりピンチアウトできなくなります。

## 一致させて、いらないものは省きましょう。

```js
$("meta[name='viewport']").attr('content',
	page == 'A'
		? 'width=device-width,initial-scale=1.0,minimum-scale=1.0,user-scalable=no'
		: 'width=device-width,initial-scale=1.0,minimum-scale=1.0,user-scalable=yes'
);
```
Unix使いならフツーにコマンドラインで使うCtrl+A,Ctrl+eをWindowsで行うには

# Ctrl+a
Homeキー

aはaheadの略と覚えた気がする。

# Ctrl+e
Endキー

# ホームポジションから遠いが利点も

Excelでもセルの移動でこれが使える。
さらにEndキー+カーソルでその方向の末尾まで飛んでくれる

# あんまり関係しない記事
- [MacBookのキーボードでHomeキーを押すには](http://kjunichi.cocolog-nifty.com/misc/2013/08/macbookhome-ea9.html)
CeylonからJavaのクラスを使ってみる。(HttpServerコード)

今回は移行ではあるあるの状態になりそうな
Javaのクラスを利用しつつCeylonで書こうってことをやってみようと思います。

何を作ろうかなーと考えてたところ
JavaでHttpServerを手軽に起動する方法が
[こちらの記事](http://qiita.com/aya_eiya/items/92a7d6d530d6221d407f)  に書かれているのを見つけたので
これを参考にJavaのHttpServerのクラスを利用してCeylon上で書いてみます。


#まず設定
プロジェクトを右クリックして
Properties > Ceylon Compiler
にある
Enable java classes
にチェックを付けます。
（これをチェックするとおそらくJavaScriptエンジンでは利用出来なくなります）

![スクリーンショット 2013-12-05 13.34.44.png](https://qiita-image-store.s3.amazonaws.com/0/17213/e9df9fc7-9df8-8c53-9224-6d938b0d044c.png)

#今回使うライブラリをモジュール設定に足す

作成したモジュールで生成された
module.ceylonに
利用するパッケージの設定を追記します。

モジュールの作成などの基本的な方法は [こちら](http://qiita.com/newta/items/05150ed45fe99829b3e4)


```ceylon
module com.hello.jserver "1.0.0" {
    import ceylon.interop.java "1.0.0";
    import java.base "7";
    import oracle.jdk.httpserver "7";
}
````

今回はcom.sun.netなoracleから提供されているjavaライブラリを使うので
> import oracle.jdk.httpserver "7"

が一番重要な追記ポイントです。


#コード

という訳で、早速コードをどーん！

```ceylon

import com.sun.net.httpserver {
	HttpServer,
	HttpExchange,
	HttpHandler
}

import java.io {
	OutputStream
}
import java.net {
	InetSocketAddress
}
import java.util.concurrent {
	Executors,
	ExecutorService
}

void runServer(){
	
	HttpServer httpServer = HttpServer.create(InetSocketAddress("localhost" ,8080),8080);
	ExecutorService httpThreadPool = Executors.newFixedThreadPool(1);
	httpServer.executor = httpThreadPool;
	
    object httpHander satisfies HttpHandler {
      
      shared actual void handle(HttpExchange exc) {
          String response = "Hello HTTP Server" ;
          exc.sendResponseHeaders(200, response.size);
          OutputStream os = exc.responseBody;
          for ( Character i in response.characters) {
              os.write(i.integer);                              
          }
          os.close();
      }
    }
    httpServer.createContext( "/" , httpHander);
    httpServer.start();
    
}

````

[元のJavaの記事のコード](http://qiita.com/aya_eiya/items/92a7d6d530d6221d407f)  と見比べてもあまり変わらずさらっと読めるかなと思いますー。
少し違うのはoverrideのアノテーションが消えてactualがついていること。

意図的に変えた部分はテストじゃないのでサーバのシャットダウンはしないようにしてあります。
それとHttpHandlerのインスタンス生成とhttpServer.createContextで渡すときに
変数に１度代入してるとこくらいです。

それ以外の部分はクラスもそのまま使っていますし、
メソッドもそのままです。

Javaからやってもすぐ出来そうですよね！

という訳で実行してブラウザで
localhost:8080にアクセスすると

> Hello HTTP Server

と表示されました！

今回は以上ー。
次回はJavaのライブラリではなくCeylonのライブラリを使って
HTTPサーバを書いてみようと思います。
逆引きReactiveCocoa: @YES/@NOをトグルで送るRACCommandを用意する

元ネタ: [Command which sends alternating YES/NO values · Issue #767 · ReactiveCocoa/ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/767)

-----

ボタン・ジェスチャーなどのUI操作と`RACSignal`を仲介するクラスとして`RACCommand`があります。これを用いて、状態（フラグとなるインスタンス変数/プロパティ）を持たずにトグルボタンを表現するパターンです。

```objc
// ブロックの戻り値が`[command execute:senderOrValue]`の戻り値となる。
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^(id _) {
    return [RACSignal return:RACUnit.defaultUnit];
}];

RACSignal *alternating = [[[command.executionSignals // `-execute:`の度にその戻り値のシグナルを送るシグナル。
    flatten]
    startWith:RACUnit.defaultUnit] // ユーザー操作前に初期値がセットされるようにする。
    scanWithStart:@NO combine:^(NSNumber *previous, id _) {
        // 前回の値を反転したブール値を返し、
        // コマンドの実行によって得られた値は無視する（_ == RACUnit.defaultUnit）。
        //
        // 最初に`@NO`を反転するため、シグナルの初回の値は`@YES`となる。
        return @(!previous.boolValue);
    }];
RAC(self, onOff) = alternating;

// `UIControlEventTouchUpInside`のイベントで`-execute:`される。
button.rac_command = command;
```