OmniAICreator/Qiita-1.07M huggingface dataset:
カレンダー出力の練習

#問題
>
年と月を入力してカレンダーを出力する

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答
```ruby:calendar.rb
# 入力された年の月の1日の曜日を計算
# ツェラーの公式を使用
# year:入力された年
# month:入力された月
# d:日にち（今回は1で固定）
# 返り値：曜日（1:日 2:月 3:火 4:水 5:木 6:金 0:土）
def calc_day(year, month, d = 1)
  # 1月, 2月は前年の13月, 14月として計算 
  if month == 1 || month == 2
    month += 12
    year  -= 1
  end
  
  # ツェラーの公式用の数を求める
  h = year / 100
  y = year % 100
  m = month
  
  # 曜日計算
  (y + (y / 4) + (h / 4) - (2 * h) + ((13 * (m + 1)) / 5) + d) % 7
end

# うるう年かどうか判定するメソッド
# year:入力された年
# 返り値：うるう年ならtrue, 平年ならfalse
def leap_year_judge(year)
  case
  when (year % 400).zero?
    true
  when (year % 100).zero?
    false
  when (year % 4).zero?
    true
  else
    false 
  end
end

# 日にちを1日から描画
# year_date:1ヶ月の日にちが入った配列
# month:表示する月
# current_day:曜日
def print_date(year_date, month, current_day)
  (1..year_date[month]).each do |date|
    # 日にちを描画
    print format("%3d ", date)
    current_day += 1
    # 土曜にになったら改行
    if current_day % 7 == 0
      print "\n"
    end
  end
end

# カレンダーを表示
def show_calendar(year, month, day)
  # うるう年じゃない年の日数（後で参照しやすいように0月の0日を設定）
  year_days      = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  # うるう年の年の日数
  leap_year_days = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  # ツェラーの公式の曜日だと扱いにくいから日曜を0にする
  # 土曜は6
  day -= 1
  day += 7 if day < 0
  
  # うるう年判定
  # うるう年ならtrue, 平年ならfalse
  leap_year_flag = leap_year_judge(year)
  
  puts "カレンダーを表示します"
  puts "Sun Mon Tue Wed Thu Fri Sat"
  
  # 1日の位置を決める
  # 1日の曜日になるまでスペース表示
  day.times do
    print "    "
  end
  
  # うるう年かどうかで最終日が違ってくる（2月だけだけど…）
  if leap_year_flag
    # 日にちを表示
    print_date(leap_year_days, month, day)
  else
    print_date(year_days, month, day)
  end
end

# ===========================================
#                ここから開始
# ===========================================

puts "任意の年と月のカレンダーを表示します"

# 西暦を入力
print "西暦を入力してください : "
input_year = gets.to_i
# 月を入力
print "月を入力してください : "
input_month = gets.to_i

# 入力した年の月の曜日を計算
first_day = calc_day(input_year, input_month)

# カレンダーを描画
show_calendar(input_year, input_month, first_day)
```

#結果
```
任意の年と月のカレンダーを表示します
西暦を入力してください : 2015
月を入力してください : 1
カレンダーを表示します
Sun Mon Tue Wed Thu Fri Sat
                  1   2   3 
  4   5   6   7   8   9  10 
 11  12  13  14  15  16  17 
 18  19  20  21  22  23  24 
 25  26  27  28  29  30  31 
```

#参考
[ツェラーの公式-wikipedia](http://ja.m.wikipedia.org/wiki/ツェラーの公式)
.gitignoreを作成する前にgit addしてしまった場合

どちらかというと個人的メモ。

## 現象

.gitignoreを作成する前に`npm install`をしてしまい、`git add .`でnode_modules以下を全てインデックスに登録してしまった。

## やりたいこと

インデックスからnode_modules以下を全て消したい。

## 手順

### まずはミスってしまった経緯

```

$ git add .

$ git status                                                           
On branch master



Initial commit



Changes to be committed:

  (use "git rm --cached <file>..." to unstage)



new file:   .gitignore

new file:   app.js

new file:   index.jade

new file:   node_modules/.bin/jade

new file:   node_modules/express/History.md

new file:   node_modules/express/LICENSE

new file:   node_modules/express/Readme.md

new file:   node_modules/express/index.js

new file:   node_modules/express/lib/application.js
.
.
.
```

### .gitignoreを作成する

```

$ subl .gitignore

node_modules/

```

### インデックスからnode_modules以下を削除する

```

$ git rm -r --cached node_modules  


$ git status

On branch master



Initial commit



Changes to be committed:

  (use "git rm --cached <file>..." to unstage)



new file:   .gitignore

new file:   app.js

new file:   index.jade

new file:   package.json

```

この段階で、再び登録しようとしてもnode_modules以下は登録されなかった。

```

$ git add .

$ git status

```



**これにて一件落着。**
multiprocessing.pool.Pool.mapの挙動


[multiprocessingパッケージ](http://docs.python.jp/3.4/library/multiprocessing.html)はプロセスを利用して並行処理を行うためのライブラリです。で、タイトルの`multiprocessing.pool.Pool.map`はmapの並行処理版です。

以下の様な使い方になります。


```python
from multiprocessing import Pool
import time

def iter():
    for i in range(100):
        print("{0} : iter {1}".format(time.time(), i))
        yield i
    time.sleep(2)
    print("{0} : iter finished".format(time.time()))

def fun(n):
    print("{0} : {1}".format(time.time(), n))

with Pool(4) as p: #4プロセスでmapを行う
    p.map(fun, iter())

```

さて、これを実行するとどうなるでしょうか。結果は以下のように、iter関数で生成されるイテレータがすべてのイテレーションを終了し終えてから、マルチプロセスで関数を適用しています。

```sh
$ python mp.py  | sort -n
1424411166.882628 : iter 0
1424411166.882708 : iter 1
1424411166.882714 : iter 2
1424411166.882725 : iter 3
1424411166.88273 : iter 4
1424411166.882734 : iter 5
1424411166.882738 : iter 6
1424411166.882741 : iter 7
1424411166.882745 : iter 8
1424411166.882748 : iter 9
1424411166.882752 : iter 10
1424411166.882755 : iter 11
1424411166.882758 : iter 12
1424411166.882763 : iter 13
1424411166.882766 : iter 14
1424411166.88277 : iter 15
1424411166.882773 : iter 16
1424411166.882776 : iter 17
1424411166.88278 : iter 18
1424411166.882784 : iter 19
1424411168.884807 : iter finished
1424411168.890891 : 0
1424411168.891006 : 2
1424411168.891053 : 1
1424411168.891174 : 3
1424411168.891351 : 4
1424411168.891527 : 5
1424411168.891707 : 8
1424411168.89173 : 9
1424411168.89206 : 10
1424411168.892085 : 11
1424411168.892139 : 12
1424411168.892162 : 13
1424411168.892473 : 14
1424411168.892483 : 16
1424411168.892495 : 15
1424411168.892506 : 17
1424411168.892599 : 18
1424411168.892619 : 19

```

実装を見てみると以下のようになっていました。

```python:multiprocessing/pool.py
    def map(self, func, iterable, chunksize=None):
        '''
        Apply `func` to each element in `iterable`, collecting the results
        in a list that is returned.
        '''
        return self._map_async(func, iterable, mapstar, chunksize).get()
		:
		:
    def _map_async(self, func, iterable, mapper, chunksize=None, callback=None,
            error_callback=None):
        '''
        Helper function to implement map, starmap and their async counterparts.
        '''
        if self._state != RUN:
            raise ValueError("Pool not running")
        if not hasattr(iterable, '__len__'):
            iterable = list(iterable)

        if chunksize is None:
            chunksize, extra = divmod(len(iterable), len(self._pool) * 4)
            if extra:
                chunksize += 1
        if len(iterable) == 0:
            chunksize = 0

        task_batches = Pool._get_tasks(func, iterable, chunksize)
        result = MapResult(self._cache, chunksize, len(iterable), callback,
                           error_callback=error_callback)
        self._taskqueue.put((((result._job, i, mapper, (x,), {})
                              for i, x in enumerate(task_batches)), None))
        return result


```

`if not hasattr(iterable, '__len__')`で__len__プロパティがなければ、`list(iterable)`によってイテレータをリストに変換しているようですね。なので、一旦関数を適用する前に、イテレータがすべて終了しているのですね。
シェルスクリプトを関数にするか実行可能ファイルにするか


## 悩み
* 最初は全部関数として~/.bashrcに書いていた。
* ~/.bashrcが長大化しすぎたので分割したりした。
	* [Emacs - 設定ファイルを複数ファイルに分割して管理する構文のまとめ - Qiita](http://qiita.com/skkzsh/items/20af9affd5cc1e9678f8)
* それでも長くなったので実行可能ファイルにしてパスを通したディレクトリに置いたりした。
* あれ、どっちがいいんだろう……

## ログイン時の読み込み時間
- ログイン時には毎回~/.bashrcが読み込まれる。
- 読み込むものが多いと当然時間がかかる。
- 実行可能ファイルにしておけば、実行時にパスが通ったところから該当するファイルを探すだけ。
- 長大なスクリプトは、基本的に実行可能ファイルにすべき。

## 関数でないとできないこと
### 現在のシェルに影響を及ぼす
- 例えば以下のようなコマンド。

```bash
cd ~/Documents # ディレクトリを移動
source ~/.bashrc # 設定ファイルを再読み込み
```

- これらのコマンドを実行可能ファイル内に記述しても、現在のシェルには反映されない。
- 実行可能ファイルだと、別プロセスで実行されるため。

### 現在のシェルを参照する
- 例えば以下のようなコマンド。

```bash
history 2 | head -n 1
```

- 関数として実行しなければ、現在のシェルの情報を参照できない。

### コマンドを群として管理
- 関連する小さなスクリプトを大量に書く必要がある場合、関数の方が書くのも管理も楽。
- 用途ごとに定義ファイルを分けることも可能。
    - 定義ファイルを手動で`source`することで、任意に有効化することも可能。

## 実行可能ファイルでないとできないこと
### 特定のディレクトリでのみ有効なコマンド
- 環境変数PATHに**相対パス**を追加することで実現できる。

```bash
#~/.bash_profile
export PATH="$PATH:./bin"
```

- 上記のように設定した場合、カレントディレクトリ内のbinディレクトリにパスが通り、その中のスクリプトが実行できる。
    - `./bin/hoge`があれば、 `hoge`で実行。
- でも、そういうところでこそcdしたくない？
    - [作業ディレクトリを切り替えるシェルスクリプト | Basic Werk](http://basicwerk.com/blog/archives/924)

### スクリプトの編集を即時に反映する
- 関数だと`source`しなければ変更が反映されないが、ファイルなら保存するだけ。

### `xargs`で引数を得る
* 関数でできなくもないが大変。
    * [xargsにbashのfunctionを渡す方法 - Weballergy](http://d.hatena.ne.jp/wristed/20120603/1338691396)

## そうは言ってもファイルを作るのがめどい
- 実行可能ファイルを作るスクリプトを作っておくべき。
    - 指定ディレクトリにデプロイとか、
    - 実行権限を付けるとか、
    - shebangを入れるとか、
    - これには入れてないけどパスの通ったディレクトリにシンボリックリンクするとか、
- 自動化してしまえば思いついたときすぐ作れる。

```msh
#!/bin/bash
SHEBANG="#!/bin/bash"
DIRPATH=~/bin
usage () {
  echo "Usage: $0 [-i] [language] [-lh]"
}
while getopts li:h OPT
do
  case $OPT in
    l)
      DIRPATH="$(pwd)/bin"
      mkdir -p "$DIRPATH" >& /dev/null
      ;;
    i)
      case "$OPTARG" in
        osa*|ap*)
          SHEBANG="#!/usr/bin/osascript"
          ;;
        ru*)
          SHEBANG="#!/usr/bin/ruby"
          ;;
        *)
          echo "$OPTARG is undifined language" 1>&2
          exit 1
      esac
      ;;
    h)
      usage
      exit 0
      ;;
    ?)
      usage
      exit 1
      ;;
  esac
done
shift $((OPTIND - 1))
if [ -n "$1" ];then
  NAME="$1"
else
  echo "Input script NAME/path" 1>&2
  read NAME
  if [ -z "$NAME" ]; then
    echo "No NAME" 1>&2
    exit 1
  fi
fi
FILEPATH="$DIRPATH/$NAME"
if [ -f "$FILEPATH" ];then
  echo "Same file is existing" 1>&2
  exit 1
fi
if [ ! -d "$(dirNAME "$FILEPATH")" ]; then
  mkdir -p "$(dirNAME "$FILEPATH")"
fi
touch "$FILEPATH" && chmod +x "$FILEPATH" && ( echo "$SHEBANG"; echo "" ) > "$FILEPATH"
mvim +2 "$FILEPATH"
```
Sphinx入門。Sphinxでdocstringの生成


Sphinx-apidocでpythonのdocstringを自動生成させる
OSX 10.9.4使用。Sphinx v1.1.3使用。
sphinxをインストールした後。さあどうするか。

## ディレクトリ構成
```
├── documents_source/
├── publish/
└── src/
    └── main.py
```

``` main.py
# -*- coding: UTF-8 -*-
import sys

def main(name, age=None):
    """Greeting function.

    :param name: Your name.
    :param age: Youre age. (option)
    """
    print "hello, " + name

    if age is not None:
        print "You are " + age
```

## ドキュメントひな形の生成
sphinx-apidocコマンドを実行する。
``$ sphinx-apidoc -F -o ./documents_source ./src ``

上記は初回時のみ。-Fオプションによって構成一式を生成させる。二回目以降はこう実行する。
```$ sphinx-apidoc -f -o ./documents_source ./src```


``documents_source/``以下にファイルがたくさんできる。これが生成するドキュメントの元になる。

## 対象モジュールをimportできるようにする
``documents_source/conf.py``を開いて、コメントアウトされているこの箇所を編集し有効にする。autodocモジュールは対象ファイルをimportして読み取るので場所を教える。

``` conf.py
#sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath('../src'))
```

## ドキュメント出力
sphinx-buildコマンドを実行する。
``$ sphinx-build -a ./documents_source ./publish``

``publish/``ディレクトリ以下に閲覧できるドキュメントとして出力されるので確かめる。

以下のように表示される。

![4ebcad1ef56765133d31fcfaa75fe0b0.png](https://qiita-image-store.s3.amazonaws.com/0/9658/b94b3a63-6273-a18b-95a1-96fe78a52bb2.png "4ebcad1ef56765133d31fcfaa75fe0b0.png")

この流れを抑えてから公式ドキュメントを読むと理解しやすい。
http://docs.sphinx-users.jp/index.html
KnockoutjsでDOM要素にバインドされてるViewModelを取得する

KnockoutjsのViewModelとかデバッグ中に参照したくなるわけですが、
たいていconsoleとかからはインスタンスの変数はどっかのスコープで隠れてて見えない。

でも、なんとかしたい。そんな時。

# contextFor

`ko.contextFor(<element>)`

で、バインドされてるcontextが取れる。

# $root

`ko.contextFor(<element>).$root`

すれば、applyBindingに渡したViewModelが取れる。

# chromeでデバッグ中に便利な$0

devツールでelementを選択している状態で、
consoleで `$0` だけ打ってみるとそのDOM要素の参照が取得できる。

なので、デバッグ中は
`ko.contextFor($0).$root`
こうしてViewModelを取ると楽。


# contextForを知るまで

debug版使ってる時は
`ko.storedBindingContextForNode(<element>)`で取れてた。

min にした時は

```js
var vm = new ViewModel();
window.vm = vm;
```

をデバッグ時だけ埋め込んでた。
もちろんcommitとかはしない。
Vagrantの初期設定・基本コマンド[極めるVagrant その1]

ローカル環境開発に便利なVagrantをインストールから初期設定、基本コマンドなどを紹介していきます。

## VitualBox,Vagrantのインストール
Vagrantを使うためにはVagrantとVirtualBoxのインストールが必要です。
下記のサイトからダウンロード、インストールしましょう。

- VitualBox: https://www.virtualbox.org/
- Vagrant: https://www.vagrantup.com/

## Vagrantの一連の流れ
Vagrantによる開発のおおまかな流れを説明します。

- ボックスの追加：仮想マシンの設計書のようなものです。最初に一回追加すればずっと使えますので毎回追加しなくても結構です。
- ボックスから仮想マシンを作成・起動：作業用ディレクトリで、vagrant init で先ほど追加したボックスをもとにして仮想マシンを作り、vagrant up で仮想マシンを起動する。あらかじめ、mkdirコマンドで新しいディレクトリを作成し、そこを作業用ディレクトリとすることでVagrantの動きが把握しやすくなります。
- ssh接続で仮想マシンに接続：vagrant sshで仮想マシンに接続します。接続した後はapache,MySQLなどの各アプリケーションをインストールしていきます。

### サンプルコード
```
$ vagrant box add myCentOS6.5 https://vagrantcloud.com/nrel/CentOS-6.5-x86_64/version/4/provider/virtualbox.box
$ mkdir sample
$ cd sample
$ vagrant init myCentOS6.5
$ vagrant up
$ vagrant ssh
```

- CentOSのボックスを追加（ボックスの名前をmyCentOS6.5とした）
- 作業用ディレクトリを作成する（ディレクトリ名をsampleとした）
- 作業用ディレクトリに移動する
- ボックスを仮想マシンとして初期化する
- 仮想マシンを立ち上げる
- 仮想マシンにsshで接続する

## WEBサーバー（Apache）の導入
VagrantでWEBサーバーを動かしてみたいという事象はよく出てきますので、
とりあえずApacheの導入・起動・初期設定をしてしまいましょう。

sshに接続し、
[vagrant@vagrant-centos65 ~]$
という表示になった後、次のような手順で行うととりあえずApacheが動作します。
```
sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on
sudo service iptables stop
sudo chkconfig iptables off
```

- yumでApacheをインストール
- Apacheを起動する
- Apacheを次回から自動で起動するように設定する
- iptablesを停止させる
- iptablesを次回から自動で停止するように設定する

### IPアドレスの変更
学ぶべき事柄は他にもたくさんあるのですが、まず初めに知っておくべき設定としてIPアドレスの設定があげられます。IPアドレスはsshで接続する前のディレクトリにあるVagrantfileというファイルに記述されています。これをviコマンドで編集することで、IPアドレスを自由に変更することができます。Vagrantfileを編集したあとには必ずvagrant reloadで仮想マシンを再起動することが必要です。

Vagrant仮想マシンを起動している状態ではデフォルトでは192.168.33.10となっています。お使いのブラウザーでURLバーに192.168.33.10と入力してEnterを押すと見事Apacheの初期画面が表示されると思います。

これを変更するときにはVagrantfileにあるprivate_networkの箇所をいじります。

```
$ vi Vagrantfile
$ vagrant reload
```

- Vagrantfileをviエディタで編集する。エディタでprivate_networkについて記述してある行があるので、その行の#（コメントアウト）を削除して好きなIPアドレスに書き換える。:wqをして上書き保存してviエディタを終了させる。
- 仮想マシンを再起動させる。再起動後はブラウザーで変更したIPアドレスにアクセスすると例のApacheの画面が表示されます。


# 基本コマンド一覧

## 1.Boxの追加・一覧取得に関するコマンド

### Boxの追加
```
vagrant box add NAME URL
```
URLを指定してボックスを追加します。追加するボックスには名前をつけることができます。

- NAME:ボックスの名前。自分で好きなように名前をつけることができます。なるべく何のボックスかがわかるような名前をつけると良いでしょう。
- URL:ボックスをダウンロードするために必要なURL。　
http://www.vagrantbox.es/ からダウンロードしたいボックスを探して、URLをコピーしましょう。

### Boxの一覧取得
```
vagrant box list
```
今までに追加したボックスの一覧を表示します。

## 2.仮想マシンの起動・停止に関するコマンド

### 仮想マシンを起動する
```
vagrant up
```
### 仮想マシンを停止させる
```
vagrant halt
```
### 仮想マシンを再起動する
```
vagrant reload
```
なにかうまくいかなかったらとりあえずreloadしてもよいかもしれません。
### 仮想マシンの状態を確認する
```
vagrant status
```
### 仮想マシンを停止し削除する
```
vagrant destroy
```
仮想マシンが消えてしまうので注意してください。
### 仮想マシンを保留（スリープ）状態にする
```
vagrant suspend
```
### 仮想マシンを中断（保留など）状態から再開する
```
vagrant resume
```
##おわりに
順次記事を追加していきますので、少々お待ち下さい。


*****

Edited by Takashi Yamaguchi

株式会社Candleでは向上心のある若くて熱いエンジニアを募集しています。
【Ruby On Rails】クラウドIDEのCloud9が素晴らしい

##Cloud9とは？
ブラウザで利用するIDEです。
色々な開発環境が利用可能ですが、私は今のところRubyOnRailsでしか利用していません。
https://c9.io/

無料の場合はメモリ容量がちょっと厳しいですが、それ以外では不満な点はありません。
※そもそも無料で使わせてもらって不満も何もないですが


##そもそもどんな感じか？
○　レスポンスは問題ない
○　無料で利用可能
○　GitHub、BitBucketと連動可能
×　なんかプロジェクトを作成したあとに作成中のまま進まない＠MacBookPro
　　⇒適当な時間でリロードすれば開けるようになってます。
　　　SurFace pro 3 で利用するときはならないみたい？？
○　デザインがかっこいい
×　クラウドIDEなのでもちろんオフラインでは利用できない


##開発するためには？
1．サイトにて利用登録を行います。

2．CreateNewWorkspaceを選択してプロジェクトの名前を決めてどの環境かを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/f8e218e6-fa02-1a0e-a2ec-dbf0c2e92e01.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/69919/d47da796-40d3-5a66-c74d-0dd6b26c1a75.png)

こんな感じでどの言語のプロジェクトを作成するか選択します。
また、GitリポジトリからCloneしてプロジェクトを作成することもできます。

3．しばらく待つと環境が出来上がってます！
   作成したプロジェクトを選択してStartEditingをクリックすれば開発ができます！
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/817719a9-2c16-14f1-44f5-b96c7a85043b.png)



私の設定の画面
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/5f9643eb-09d0-f444-1d28-56d427d4296d.png)

色々な設定、機能がありますが以下のようなものがあります。
（※設定方法は後日追記）
・テーマの設定
・メイン画面のスプリットの設定（横分割、縦分割、四分割など）
・チームでの開発（Readのみ設定など）
・非表示ファイルの表示設定
・実行コマンドの履歴照会
・ターミナルからコマンドの実行
・PostgreSQL利用可能※外部からのデータ照会は不可
・変更履歴の確認
　すごい面白いです。再生でコードが変更されているのが動画みたいに見れます。
・ワークスペースの再起動



##備考
Gem書き換えてbundle installばっかりしてるとメモリを食ってる気がしました。
いろんなOSS試してる時が一番メモリエラーになったので・・・・
個人的なAWS CLIメモ - EC2編

個人的なメモです。
とりあえず試したものを備忘録として残していく予定です。
ポリシーとしてはaws-cliのみでがんばる！

## はじめに
困ったら以下のコマンドを実行すると幸せになれるはず…！

```bash
aws help
aws ec2 help
```
後は以下URL先を参照してみるのも良いかも。
[Discussion Forums - AWS CLI](https://forums.aws.amazon.com/forum.jspa?forumID=150)

### 環境
```bash
$ cat /etc/system-release
Amazon Linux AMI release 2014.09
$ aws --version
aws-cli/1.7.5 Python/2.6.9 Linux/3.14.33-26.47.amzn1.x86_64
```
### EC2インスタンス情報を取得（全て）
```bash
$ aws ec2 describe-instances
--- 結果 ---
{
    "Reservations": [
        {
            "OwnerId": "xxxx",
            "ReservationId": "xxx",
            "Instances": [
    < 出力されすぎるので省略 >
            ]
        }
    ]
}
```
### EC2インスタンス情報を取得（InstanceStateがrunningのもの）
```bash
$ aws ec2 describe-instances --filter "Name=instance-state-name,Values=running"
--- 結果 ---
{
    "Reservations": [
        {
            "OwnerId": "xxxx",
            "ReservationId": "xxx",
            "Instances": [
    < 出力されすぎるので省略 >
            ]
        }
    ]
}
```
NameやValuesの値を変更することで他の条件でフィルタリングすることも可能

### EC2インスタンス情報を取得（Name、InstanceID、InstanceType、InstanceState情報のみ）
```bash
$ aws ec2 describe-instances --query 'Reservations[].Instances[].[join(`,`, Tags[?Key==`Name`].Value), InstanceId, InstanceType, State.Name]'
--- 結果 ---
[
    [
        "srv01",
        "i-xxx",
        "t2.micro",
        "running"
    ],
  < 省略 >
    [
        "srv10",
        "i-yyy",
        "m3.medium",
        "stopped"
    ]
]
```
### EC2インスタンス情報をtext形式で取得（Name、InstanceID、InstanceType、InstanceState情報のみ）
```bash
$ aws ec2 describe-instances --query 'Reservations[].Instances[].[join(`,`, Tags[?Key==`Name`].Value), InstanceId, InstanceType, State.Name]' --output text
--- 結果 ---
srv01        i-xxx      t2.micro       running
srv02        i-aaa      m3.medium      running
srv03        i-bbb      m3.medium      stopped
    < 省略 >
srv10        i-yyy      m3.medium      stopped
```
### EC2インスタンス情報を取得（Name、InstanceID、InstanceType、InstanceState情報のみ && InstanceStateがrunningのもの）
```bash
$ aws ec2 describe-instances --query 'Reservations[].Instances[].[join(`,`, Tags[?Key==`Name`].Value), InstanceId, InstanceType, State.Name]' --filter "Name=instance-state-name,Values=running"
--- 結果 ---
[
    [
        "srv01",
        "i-xxx",
        "t2.micro",
        "running"
    ],
  < 省略 >
    [
        "srv09",
        "i-ggg",
        "t2.small",
        "running"
    ]
]
```

--queryと--filterの組み合わせで大体取得可能のようですね！
R3.1.3 & RStudio 0.98.1102で発生する".rs.httpdPort()"のエラーについて

### RStudio起動時の`.rs.httpdPort()`エラー
先日R3.1.3が公式リリースされました。ミーハーな私としては速攻で入れてみてRStudioを起動させたのですが、起動時に以下のエラーが出るようになりました:

```r
以下にエラー .rs.httpdPort() : 関数でないものを適用しようとしました
```
ちなみにこのエラー、RStudioで発生しますが通常のRを起動させても出てきません。つまりRStudio側のエラーです。

さすがに起動時にエラーがでるようになったのは初めてだったので調べてみました、というメモというかアピールみたいなものです。

### .rs.httpdPortの中身など

```r
> .rs.httpdPort
function () 
{
    if (.rs.httpdPortIsFunction()) 
        as.character(tools:::httpdPort())
    else as.character(tools:::httpdPort)
}
```

条件に設定してある関数がわかりませんでした。聞いてみます。

```r
> .rs.httpdPortIsFunction
function () 
{
    .rs.haveRequiredRSvnRev(67550)
}
```

さらに長い関数がでてきました。仕方ないので聞いてみます。

```r
> .rs.haveRequiredRSvnRev
function (requiredSvnRev) 
{
    svnRev <- R.version$`svn rev`
    if (!is.null(svnRev)) {
        svnRevNumeric <- suppressWarnings(as.numeric(svnRev))
        if (!is.na(svnRevNumeric) && length(svnRevNumeric) == 
            1) 
            svnRevNumeric >= requiredSvnRev
        else FALSE
    }
    else {
        FALSE
    }
}
```

どうやらRのバージョンに関することを取得してますね。ちょっと試してみましょう:

```r
> R.version$`svn rev`
[1] "67962"
> R.version
               _                           
platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          3                           
minor          1.3                         
year           2015                        
month          03                          
day            09                          
svn rev        67962                       
language       R                           
version.string R version 3.1.3 (2015-03-09)
nickname       Smooth Sidewalk   
```

なるほど、`R.version`というのがあったんですね。(初心者)

要するにRのバージョンチェックをして、それによって`tools:::httpdPort()`にするか`tools:::httpdPort`を分岐させてるのが、今回問題の`.rs.httpdPort()`のお仕事みたいです。

ちなみに、この環境では`.rs.httpdPortIsFunction`はこうなってました:

```r
> .rs.httpdPortIsFunction()
[1] TRUE
```

よって、`tools:::httpdPort()`が選択されています。でもどうやらこれがまずいようです。

### 解決策
なんとRStudio0.98.**1103**で対策済みでした:
[Error with new R 3.1.3 version](http://stackoverflow.com/questions/28967242/error-with-new-r-3-1-3-version)

そこでRStudio0.98.1103にアップデートしてRStudioを起動させたらエラーが消えました。せっかくなので調べてみたら、`.rs.httpdPortIsFunction`が修正されてました:

```r
> .rs.httpdPortIsFunction
function () 
{
    getRversion() >= "3.2" && .rs.haveRequiredRSvnRev(67550)
}
```
近々リリースされるR3.2がらみでのバグっぽいですね。これによって`.rs.httpdPort()`では`tools:::httpdPort`が私の環境では選択されるようになって解決したみたいです。こういうのがわかるのも楽しいですね。

### まとめ
RStudioのバージョンには気をつけよう。

Enjoy!
ui.bootstrapのTypeaheadでselect後のコールバック

ui.boostrap には typeahead があるので、オートコンプリート機能（文字を入力すると候補をプルダウンで表示してくれるアレ）が実現出来ます。

■ドキュメント
http://angular-ui.github.io/bootstrap/#/getting_started#typeahead

##ハマりポイント
ちょっとハマったのが、プルダウンから候補を選択後に何か処理をさせたい場合。
ng-changeではなく、typeahead-on-select を使うのが良いようです。

##サンプル
```html:hoge.html
<input type="text" autocomplete="off"
       ng-model="selectedUser"
       typeahead="user as user.Name for user in searchUser($viewValue)"
       typeahead-loading="loadingLocations"
       typeahead-on-select="addUser($item)">

```

```coffeescript:test.coffee
$scope.addUser = (hoge) ->
  alert hoge.Name
  # do something...
```
.NetMicroFrameworkの次バージョン(4.4)がCodeplexからGitHubに移動。


それにともないSDKの提供方法変更が
変更された様子。

http://netmf.github.io/netmf-interpreter/


---


前準備
1. https://github.com/NETMF/netmf-interpreter
　　に移動後、Clone か Forkでコードを落としてください。
2. ここ(http://netmf.github.io/downloads/build-tools.zip) からビルドツールを取得する。
3. Clone or Fork 先のフォルダの１つ上の階層に2. で取得したzipファイルの展開したフォルダを置くようにとのこと。 

SDKの生成について
1. インストーラ や vsix作成を支援するVisual Studio の SDK
(https://visualstudiogallery.msdn.microsoft.com/842766ba-1f32-40cf-8617-39365ebfc134) を
インストール後、コンソールを立ち上げて
GitHub の Clone or Fork先のフォルダで「build_sdk.cmd」を呼び出す。

ファームウェアのビルドに関しては、各CPU 毎のツールの設定が
あるのでそちらを確認する。(CodePlex のPortingKitのドキュメントなどを確認)

余談
Fork後、AppVeyor で Build設定をCMDに変更し
「build_sdk.cmd」を設定した後ビルドすると
NetMFのインストーラ生成までのビルドは通ったので、
Visual Studio SDKを入れたくない人は
Deployするなりして持ってきてもいいかも？
FuelPHPからWordpressの関数を利用する

CodeIgniterからWordpressを呼び出す際((wordpressのthemeとかを使わずに呼び出す)
に苦労したから、FuelPHPからはどうだろうと思いやってみた。とりあえずということでまずは投稿された記事などを呼び出せるか試してみました。


まずは、フォルダの構成。今回あまり深く考えず、ドキュメントルートにwordpressを置いてみた。

ドキュメントルートのはwpplus(適当）
wpplus (root)
　|---docs
　|----fuel
　|---public
　|---wordpress


この状態でwordpressのインストールを実行。


次に、 /fuel/app/bootstrap.php の編集を行う。
ポイントは「 require '../wordpress/wp-load.php';　」の部分。
「require COREPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php'; 」の部分より、
前に呼び出す必要がある。

```php:bootstrap.php

require '../wordpress/wp-load.php';

// Load in the Autoloader
require COREPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';
class_alias('Fuel\\Core\\Autoloader', 'Autoloader');

// Bootstrap the framework DO NOT edit this
require COREPATH.'bootstrap.php';
Autoloader::add_classes(array(
// Add classes you want to override here
// Example: 'View' =&gt; APPPATH.'classes/view.php',
));

// Register the autoloader
Autoloader::register();

/**
* Your environment. Can be set to any of the following:
*
* Fuel::DEVELOPMENT
* Fuel::TEST
* Fuel::STAGING
* Fuel::PRODUCTION
*/
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

// Initialize the framework with the config file.
Fuel::init('config.php');

```


次に、Controllerの作成。
ポイントは「 require_once '../wordpress/wp-blog-header.php'; 」の部分。
後はWordpressの関数を呼び出すことで記事の一覧を取得出来る。

```php:test.php
<?php

class Controller_Test extends Controller
{
	public function action_index()
	{
		require_once '../wordpress/wp-blog-header.php';

		// クエリ
		$the_query = new WP_Query('post_type=any');

		// ループ
		while ( $the_query->have_posts() ) : $the_query->the_post();
			echo '<li>';
			//何かする
			the_permalink();
			echo '</li>';
		endwhile;

		// 投稿データをリセット
		wp_reset_postdata();

	}
}

```

というわけで、codeigniterに比べると非常に簡単でした。
(ちなみにcodeigniterでは解決できず、頓挫しましたorz)
Cocos2d-x 3.4 がAndroid上で実行できないとき

## Cocos2d-x 3.4 がAndroid上で実行できないとき

現在（2015/03/12）のところ、いちばん分かりやすい導入方法の解説サイトはこちらだと思う。

[ぎじゅつめも Android開発環境の構築](http://wiki.xsqi.net/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%2FAndroid%2FAndroid%B3%AB%C8%AF%B4%C4%B6%AD%A4%CE%B9%BD%C3%DB)
[ぎじゅつめも Cocos2d-x開発環境の構築](http://wiki.xsqi.net/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%2FCocos2d-x%2FCocos2d-x%B3%AB%C8%AF%B4%C4%B6%AD%A4%CE%B9%BD%C3%DB)

ところが私の場合、上記サイトの通りに設定を行いEclipseから実行しようとすると、
"proj.android" にバツ印が付き、修正するまで実行できないとEclipseに怒られてしまった。

よく見てみると、proj.android>src>org.cocos2dx.cpp>AppActivity.java内でエラーが出ていた。

## 解決方法
proj.androidのプロパティを開き、プロジェクト・ビルド・ターゲットのいずれかにチェックを入れる。
（デフォルトではチェックが入っていない）

![proj.android.property.png](https://qiita-image-store.s3.amazonaws.com/0/53260/e71c4e71-a6e8-978c-e492-25b296fe012d.png)

その後proj.androidを右クリック --> 実行 --> Androidアプリケーションで実機デバッグができるようになった。
iPhoneシミュレータのスクリーンショットを任意の場所に保存する


ご存じの通り、iPhone/iPadのシミュレータのスクリーンショット（コマンド + s）はデスクトップに保存される。
頻繁にスクリーンショットを保存するとデスクトップが散らかる&削除がめんどくさいので、Automator + Rubyで、任意の場所に保存するようにしてみた。

# やり方

## 1. Automatorを起動 > フォルダアクションを選択
![スクリーンショット 2015-03-12 21.33.39.png](https://qiita-image-store.s3.amazonaws.com/752/30441/d088c439-a9a7-e71c-484e-3f158db137b0.png "スクリーンショット 2015-03-12 21.33.39.png")

## 2. フォルダアクションの項目をDesktopに変更する
![スクリーンショット_2015-03-12_21_34_19.png](https://qiita-image-store.s3.amazonaws.com/752/30441/79e6ddcf-2b1a-64a4-5467-ce22552b32fa.png "スクリーンショット_2015-03-12_21_34_19.png")

## 3. アクションからシェルスクリプトを実行を選択する
![スクリーンショット 2015-03-12 21.35.07.png](https://qiita-image-store.s3.amazonaws.com/752/30441/7752cedf-c097-8d1f-8175-7718f1df87a0.png "スクリーンショット 2015-03-12 21.35.07.png")

## 4. シェルの項目を/usr/bin/rubyに変更 > 下記のプログラムをコピペして適当な名前で保存

```ruby
require 'fileutils'

fromDir = ENV['HOME'] + '/Desktop'
toDir = ENV['HOME'] + '/Desktop/iOSSimulatorScreenShot' #保存先を変えたい場合はこの部分を変更する

FileUtils.mkdir_p(toDir) unless FileTest.exist?(toDir)

FileUtils.mv(Dir.glob(fromDir + '/iOS\ Simulator\ Screen\ Shot*.png'), toDir);

```

## 5. Finderからデスクトップを右クリックしフォルダアクションを設定を選択
![スクリーンショット_2015-03-12_21_36_51.png](https://qiita-image-store.s3.amazonaws.com/752/30441/7a128df8-c60f-a8b8-df8f-dcc02940b944.png "スクリーンショット_2015-03-12_21_36_51.png")

## 6. フォルダアクション設定で保存したスクリプトを選択
![スクリーンショット 2015-03-12 21.55.16.png](https://qiita-image-store.s3.amazonaws.com/752/30441/85b15c3a-4128-55b9-84da-752e1754ac83.png "スクリーンショット 2015-03-12 21.55.16.png")

## 7. 実行してみる
PCを再起動して、シミュレータでスクリーンショットを保存すると、デスクトップに`iOSSimulatorScreenShot`というフォルダが作成され、そこにどんどん保存される。不要になったらフォルダ毎削除する。再度保存してもフォルダが自動的に作成されて保存されていく。
linuxメモ

## ディズトリビューションを調べる

``` cat /etc/os-release ```

/etc/os-releaseか、/usr/lib/os-releaseに、OSの識別情報が入ってます
それをcatコマンドなどで出力させて確認します

```
NAME="CentOS Linux"
VERSION="7 (Core)"
...
```
### アーキテクチャを調べる
``` arch ```

* 64bitの場合
 * X86_64
* 32bitの場合
 * i686

## 設定
### iptables
なんらかのサービスをサーバーに導入し、クライアントからもアクセスできるように
ポートを開ける
(家のドアを開けておくようなイメージなので、むやみに開けない)
``vi /etc/sysconfig/iptables``
記述例
``-A INPUT -s XXX.XX.XX.XX/XX -p tcp -m tcp --dport 8080 -j ACCEPT``

* **オプション**
 * -A・・・ルールの追加
* **チェイン**
 * INPUT・・・入力パケット
 * OUTPUT・・・出力パケット
* **パラメータ**
 * -s・・・パケットの送信元の指定
 * -p・・・プロトコル指定
 * -m・・・モジュール指定(-pで指定されるので省略可)
 * --dport・・・ポート指定
 * -j・・・ターゲットの指定
* **ターゲット**
 * ACCEPT・・・パケット許可
 * DROP・・・パケット破棄
 
**変更の反映**
``/etc/init.d/iptables restart``

**通信許可されてるか確認**
``iptables -L``
8080の場合はwebcacheが表示される
/etc/servicesにIP接続ポート番号とサービス名の対応が書かれているので
lessで表示し、8080を検索
``less /etc/services``で``/8080``

### ランレベル
システムの動作モードのこと
サービスの一覧情報を見る
``chkconfig --list``

サービス名 0:off〜6:offとサービス名と0から6の数字が表示される
サービスによって異なるかもですが、jenkinsなどでは3と5がonになってれば大丈夫です
iptablesに追加した後ランレベルをチェックして動作できてるかの確認で使ったりも...

* 0・・・システムの停止
* 1・・・シングルユーザーモード(rootのみログイン可能)
* 2・・・ネットワークなしのマルチユーザーモード
* 3・・・マルチユーザーモード（CUI）
* 4・・・未使用
* 5・・・マルチユーザーモード(GUI)
* 6・・・システムの再起動
* Sまたはs・・・シングルユーザーモード(rootのみログイン可能)

(ディストリビューションによって若干異なるようです.といってもレベル4がマルチモードで使われてるか使われていないぐらい)
neosnippet.vimのabbreviationは複数書ける

スーパー小ネタ。

以下のように書けます。

```sh.snip
snippet bashd
abbr #!/bin/bash
abbr #@(#)
options head
alias sbd
	#!/bin/bash
	#@(#)${1:#Descriptions}
	${0:TARGET}
```

ただし、展開時は1行にまとめて表示されるので、特に意味はありません。
iOSとAndroidのアプリ公開までの時間についての公式情報

公式情報を毎回探している気がするので、備忘のためにも書く。

iOSとAndroidを同日同時刻に公開する、というのは不可能です。

## iOSの公式情報
https://help.apple.com/app-store-connect/#/dev34e9bbb5a
にあるように、審査を通過してからも、最大24時間かかります。

ステータス毎の詳細については、下記に資料があるそうです。
https://help.apple.com/app-store-connect/#/dev18557d60e
「App Store への処理中」になっていれば、
> ビルドが処理中であり、24 時間以内に配信準備が完了します。

とのことです。

## Androidの公式情報
https://support.google.com/googleplay/android-developer/troubleshooter/3055196?hl=ja&ref_topic=6075687#ts=3055315,3055203
にあるように、最大24時間かかります。

## つまり
上記は、最大であって、もしかしたら1hかからず公開されるかもしれません。
通常、ノンプロモーションで発見してもらえるのは、IPモノや大型デベロッパーだけだと思います。
通常は
iOS申請（Android準備）→iOS審査通過→iOS公開と同時にAndroidアップロード
として、両方のストアで検索に引っかかるようになったことを確認し、公式ホームページやSNSで発表、という流れではないかと思います。

### 補足

Androidの方では、 [Google Play Developer Consoleの時限公開機能を試してみた - Qiita](https://qiita.com/konifar/items/4f8da43e98c573ceb7c4) に記載されている機能もありますが、こちらもストア側の処理を先にやってもらうだけで、公開タイミングを確定させる（12:00ちょうどにリリースとか）ことは出来ないようです。
ドラッグアンドドロップでファイルに更新日付を付加してバックアップするbatファイル

# ソース

```bat:backup.bat
@echo off
setlocal EnableDelayedExpansion
 
pushd %~dp0
 
REM 出力先
set outdir=_backup
set log_file=_log.txt
 
REM バックアップ日時
set bk_date=%DATE:~0,10%
::set bk_date=%bk_date:/=%
set bk_time=%TIME: =0%
set bk_time=%bk_time:~0,5%
::set bk_time=%bk_time::=%
 
if not exist %outdir%\nul mkdir %outdir%
 
if exist %outdir%\%log_file% (
	set /p log="変更ログ: "
	echo %bk_date% %bk_time%>>%outdir%\%log_file%
	if not #!log!# == ## (
		echo !log!>>%outdir%\%log_file%
	)
)
 
::for %%a in (%*) do ( call :Backup %%a )
:loop
if #%1# == ## goto break
call :Backup "%~1"
shift
goto loop
:break
 
if exist %outdir%\%log_file% (
	echo.>>%outdir%\%log_file%
)
 
exit
 
:Backup
REM ファイル更新日時
set upd_datetime=%~t1
set upd_date=%upd_datetime:~0,10%
set upd_date=%upd_date:/=%
set upd_time=%upd_datetime:~11,5%
set upd_time=%upd_time::=%
set target=%outdir%\"%~n1_%upd_date%_%upd_time%%~x1"
 
if exist %1\nul (
	xcopy /i /e /Y %1 %target%
) else (
	copy /Y %1 %target%
)
 
if exist %outdir%\%log_file% (
	echo %target%>>%outdir%\%log_file%
)
 
exit /b
```

最新ソースは [Gist](https://gist.github.com/tAkihiko/b8c3430e7ce0d9f55a67) にあります。

# 使い方

メモ帳でコピペしてファイル名を`backup.bat`とかにすれば使えます。外部ツールは基本的には不要（のはず）です。

batファイルに任意のファイルをドラッグアンドドロップすることで、ファイル名に**更新日付**を付加して指定のフォルダ（`_backup`）にファイルやディレクトリをコピーできます。

`hoge.xls`が`hoge_20150312_1931.xls`になって`_backup`フォルダにコピーされる感じです。

出力先のフォルダはおそらく自動生成されます。

`pushd`しているので、（試してないけど）UNCパス上でも動くかもしれません。

出力先のフォルダにログファイル（`_log.txt`）を予めおいておくことで、任意でログも書けます。（ログファイルは自動生成されません。）

# Gitでいいじゃん、なんで作ったの？

諸事情でSubversionやGitを入れられない（or リポジトリ作成が手間）な状況でもお手軽にバージョン管理したい。

Windowsだし、batファイルならばメモ帳さえあれば作れる！

これだけならば外部ツールは要らない！

# 外部ツールを使うなら…

[ここ](http://sevenzip.sourceforge.jp/download.html) から`7za.exe`（コマンドラインツール）をダウンロードしておいて、

    xcopy /i /e /Y %1 %target%

を

    7za a %target%.zip %1

として僕は使ってます。

こうすれば`_backup`フォルダにできるのはフォルダのコピーではなくzipファイルです。

# 追記（2015/4/9）
半角括弧に対応させるため、
```
for %%a in (%*) do ( call :Backup %%a )
```
を
```
:loop
if #%1# == ## goto break
call :Backup "%~1"
shift
goto loop
:break
```
に変えました。
どうも`for in (%*)`だと半角括弧が入った時に挙動がおかしくなるようです。
gulp-jst-concatでテンプレートを分割

## 作戦
 1. [gulp-jst-concat](https://www.npmjs.com/package/gulp-jst-concat)でビルド時にtemplateをjsファイルにコンパイルする．
 2. テンプレートのネストもしたい


## 1.テンプレートを使う

```html:show_name.html
<p>
  <%- name %>
</p>
```

上記のファイルを`gulp-jst-concat`でビルドすると`jst.js`というファイルが生成される．これを読み込むと`JST`というグルーバル変数経由でHTMLを生成する関数を取り出せる．

```js:script.js
var data = { 'name': '舞川あや' };
var template = JST['show_name']; //バインドするデータを引数にとる関数
var compiledDOM = $(template(data));
```



## 2.テンプレートのネスト
テンプレート中で`__include('template_name')`という関数でテンプレートを読み込めるようにする．

```html

<%= __include('part.html') %>
```

テンプレートのコンパイルを以下のように工夫すればよい．

```js

var compile = function(name, data){
  data.__include = function(name){
     return compile(name);
  };
  return JST[name](data);
};

```
Presto で JSON の ARRAY を集計する

効率よい方法ではないですが、Fluentd 経由で S3 に送り込んだ JSON のログを Presto で集計するときにこんなやり方もできるというメモ。

下記のような構造のログが S3 に置いてあり、Hive の external table として raw_impressions というテーブルを定義して読めるようになっているとします。

```json
{
  "user_id": 12345,
  "data": {
    "imp_ids": [1,2,3,4,5]
  }
}
```

ここで下記のように view を定義してあげます。view を定義しなくてもできますが、可読性がよくなるので、今回はそうしてます。

```sql
CREATE VIEW impressions AS
  SELECT
    cast(json_extract(json, '$.user_id') as bigint) as user_id,
    cast(json_extract(json, '$.data.imp_ids') as array<bigint>) as imp_ids
  FROM raw_impressions
;
```

ここまで来れば [UNNEST 構文](https://prestodb.io/docs/current/sql/select.html)を使って、集計できます。

```sql
SELECT id, count(id)
FROM impressions
CROSS JOIN UNNEST(imp_ids) AS t (id)
GROUP BY id;
```

JSON のパースに時間がかかって、ログ量によってはだいぶツラいので、実用上は必要に応じてサンプリングしてみたりするといいのかもしれません。

```sql
SELECT
  link_id, count(link_id)
FROM impressions
CROSS JOIN UNNEST(imp_ids) AS t (id)
WHERE user_id % 1000 = 0
GROUP BY id;
```
フィルタを追加する

##Play FrameworkでHTTPフィルタを追加する##
未ログイン時はログイン画面を表示するようなフィルタを追加する。
ログイン状態の判定はセッション(実体はCookie)にて行う。


```scala:AuthenticateFilter.scala
package controllers.filter

import play.api.mvc.EssentialFilter
import play.api.mvc.EssentialAction
import play.api.mvc.RequestHeader
import play.api.libs.iteratee.Done
import play.api.mvc.Results

class AuthenticateFilter extends EssentialFilter {
  
  def apply(next: EssentialAction) = new EssentialAction {
    def apply(req: RequestHeader) = {
      // 認証チェック
      req.session.get("key").map(
        // 認証に成功したら普通に処理を流す
        value => next(req)
      ).getOrElse(
        // 認証エラー
        Done(Results.Redirect(controllers.login.routes.Login.login))
      )
    }
  }
}
```
```scala:Global.scala
import play.api.GlobalSettings
import play.api.mvc.WithFilters
import controllers.filter.AuthenticateFilter

/**
 * Globalオブジェクト
 */
object Global extends WithFilters(new AuthenticateFilter) with GlobalSettings 
```
マクロの扱いには気を付けろ！ ver.2

昨日の続きです。

[【cocos2d-x】マクロの扱いには気を付けろ！ ver.1](http://blog.dalt.me/1109)

## マクロはテキスト置換である(続き)
昨日書き忘れたことがあったので一つ追加します。
(しばらくしたら前の記事に追加しようかな。)

マクロはテキスト置換であると前回の記事で述べました。
マクロが使われた時はプリプロセッサがそれを解釈し、置換を行います。
これはつまり<strong>値のコピーがその都度行われる</strong>と言う事です。
一般的に、これもマクロを使う人が想定している事態ではないでしょう。

## マクロにはスコープと言う概念がない

※参考
[Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)](http://www.amazon.co.jp/gp/product/4894714515/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4894714515&linkCode=as2&tag=dalt1003-22)

例えばヘッダファイル内に#defineで定義したマクロがあるとします。
これはこのヘッダファイルをインクルードさえすれば使えてしまうということです。
なので、クラスの定数と言う意味合いで作ることは出来ません。

なので、<strong>マクロを作成した人が想定した用途以外で使われうる事</strong>を念頭に置いておくべきかもしれませんね。

## 例えば・・・

以下の様なクラスがあったとします。

```cpp
#define MARGIN 20
class MarginedBox {
  // ...
};
```

MarginedBoxは二つのボックスを一定のMARGINで置くためのクラスだとしましょう。
このMARGINは20だと決まっていました。
もちろんこのクラスで使うことしか考えていません。

ある日、全く別のプログラマが全く別のNode上にラベルとラベルの間をmargin20で配置したいと考えました。
マジックナンバーは嫌なので定数化したいと考えます。
調べてみたらMARGIN 20があった。
よし、これを使おう。

...しばらくするとデザイン変更があり、MarginedBoxのMARGINは30にしようとなりました。

もうどうなるかわかりますね。


かなり極端な例ですが、自クラス内だけで使う定数はprivateに抑えておくべきで、外から使えるようにすべきではありません。
どうすれば良いかというとこの例だとprivateのconstで定数化するのが良いですね。

```cpp
class MarginedBox {
  private:
    static const int margin = 20;
};
```


誰かのお役に立てば。
Fx0 で vintageJS を使ってみたい


#■はじめに

jQuery のプラグインの vintageJS でもエフェクトを掛けられるみたいなので試してみました。

https://github.com/rendro/vintageJS



#■vintageJS

[vintageJS の公式サイト](http://vintagejs.com/)でエフェクトの確認が出来ます。

vintage, sepia, greenish, reddish と 自分で自由にパラメータを設定できるカスタムがあります。

__エフェクト無し__
![lena_normal.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/483c2a15-ebe6-e71c-e09a-6e7b68d3e487.jpeg "lena_normal.jpg")


__vintage__
![lena_vintage.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/4a394ed7-49d6-6f52-8a9a-2bd03a408ecb.jpeg "lena_vintage.jpg")

__greenish__
![lena_greennish.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/3368c55a-aecd-53ec-9833-c98f4d6c6c55.jpeg "lena_greennish.jpg")

__カスタム__
![lena_custom.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/9b31000d-fbbd-547b-6454-3333c81b798b.jpeg "lena_custom.jpg")


#■jQuery を Firefox OS で動かしてみる

ボタンをクリックするとテキストの「表示/非表示」を行う、Hello World的なアプリを作成してみました。

[jQuery のサイト](http://jquery.com/download/)から jquery-2.1.3.min.js を DL し、アプリを作成。

単純なコードなので一部のみ抜粋。 

``` index.html
<script src="jquery-2.1.3.min.js"></script>

....

<body>
  <button id="btn_show_text">Show</button>
  <button id="btn_hide_text">Hide</button>
  <p style="display: none">Hello</p>
</body>
```

``` app.js
$(function () {

  $("#btn_show_text").click(function () {
    $("p").show();
  });

  $("#btn_hide_text").click(function () {
    $("p").hide();
  });

});
```

作成したコードを Fx0 にインストールしてみる。

![jquery.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/8bcceb25-eaf9-9861-1b38-70397571bc59.jpeg "jquery.jpg")

ちゃんと動きました!

次は、 vintageJS でエフェクトを掛けてみたいと思います。
Railsの非推奨を分かっているものはあえて無視する


rails_adminで警告が出て五月蝿かったので、
把握しているものは表示しないようにしてみました.

## `initializers`に配置

`payload[:message]`に非推奨のメッセージが入っているので、
適当に判定して`next`でブロックから抜けるようにしています.

```ruby:config/initializers/notifications.rb
ActiveSupport::Notifications.subscribe 'deprecation.rails' do |name, start, finish, id, payload|

  # OPTIMIZE あえて非推奨の警告を無視
  next if payload[:message].include? 'config/initializers/rails_admin.rb'

  if Rails.env.test?
    $stderr.puts(payload[:message])
  else
    logger = Rails.logger
    logger.warn payload[:message]
    logger.debug payload[:callstack].join("\n  ") if logger.debug?
  end
end
```

## `:notify`するように設定

コンフィグで以下のように`:notify`を指定するだけです.

- `config/environments/development.rb`
- `config/environments/test.rb`


```ruby
config.active_support.deprecation = :notify
```

プロダクションには何度も非推奨の警告を表示しても仕方ないので`:silence`を指定しておけばいいと思います.

- `config/environments/production.rb`

```ruby
config.active_support.deprecation = :silence
```
CentOS6.5 + rbenvでrubyを2.2.0にUpdateする際のメモ 

local上でRubyのVersionをあげて、
そろそろサーバーも上げていくかーっと行った際のツボった場所とメモ

* いつもどおりrbenvとruby-buildのUpdate

```bash
$ cd "$(rbenv root)"/ && git pull
$ cd "$(rbenv root)"/plugins/ruby-build && git pull
```

* rbenv より2.2.0のRubyをインストール

```bash

$ rbenv install 2.2.0
```

```bash

 Downloading ruby-2.2.0.tar.gz...
 ->  http://dqw8nmjcqpjn7.cloudfront.net/7671e394abfb5d262fbcd3b27a71bf78737c7e9347fa21c39e58b0bb9c4840fc
 Installing ruby-2.2.0...
 
 BUILD FAILED (RedHatEnterpriseServer 6.5 using ruby-build 20130628-472-g7f3cc01)

 Inspect or clean up the working tree at /tmp/ruby-build.20150312191821.1322
 Results logged to /tmp/ruby-build.20150312191821.1322.log

 Last 10 log lines:
 compiling ossl_pkey.c
 compiling ossl_engine.c
 compiling ossl_bio.c
 compiling ossl_x509crl.c
 compiling ossl_ssl_session.c
 installing default openssl libraries
 linking shared-object openssl.so
 make[2]: ディレクトリ `/tmp/ruby-build.20150312191821.1322/ruby-2.2.0/ext/openssl' から出ます
 make[1]: ディレクトリ `/tmp/ruby-build.20150312191821.1322/ruby-2.2.0' から出ます
 make: *** [build-ext] エラー 2
```

* [build-failure-of-fiddle-with-ruby-220](https://github.com/sstephenson/ruby-build/wiki#build-failure-of-fiddle-with-ruby-220)に対処方法が乗ってました

* CentOS, Fedora, try to install libffi-devel via yum.

```bash

$ yum install libffi-devel

```

or enabled --enable-shared option

```bash

$ RUBY_CONFIGURE_OPTS=--enable-shared rbenv install 2.2.0
```


それでも治らないようだったら前提のモジュール群が古いあるいは入っていない可能性があるため
上のリンクにある[CentOS/Fedora:](https://github.com/sstephenson/ruby-build/wiki#suggested-build-environment)をやってみると治るかもしれない。

```bash
$ yum install -y gcc openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel
```
Capistranoでroleとserverの一覧を出力するタスクを書いた

Capistranoの`server` or `role` DSLで設定したサーバ、ロールの一覧を確認したいので以下のタスクを書いた。

`roles(ロール名)`というDSLが用意されているのでこれを使う。ロール名は`:all`をセットすることで全部取れる。

```ruby:lib/capistrano/tasks/util.rake
namespace :util do
  desc 'List roles'
  task :list_roles do
    roles(:all).map{ |server| server.roles_array }.flatten.uniq.sort.each do |role|
      puts role
    end
  end

  desc 'List servers'
  task :list_servers do
    roles(:all).map(&:hostname).sort.each { |hostname| puts hostname }
  end

end
```

こういう感じで実行する

```bash
$ cap production util:list_roles
db
log
nagios
web
.
.

$ cap production util:list_servers
myserver1.local
myserver2.local
.
.

```

自分はサーバとロールを外から取ってきたデータで動的設定していて、そのデバッグ用途で書いてみた。
PHP Fatal error: Call to undefined function imagecreatetruecolor()というエラーの解決方法

PHPを使用していて、`PHP Fatal error: Call to undefined function imagecreatetruecolor()`というエラーが発生しました。GDがないとこのエラーが発生するみたいなのでGD周りの設定を見直すと解決するとおもいます。

# GDをインストール
CentOSの環境にGDがインストールされていなかったのでインストールしました。

```bash:GDのインストール
sudo yum -y install php-gd
```
php-gdをインストールしたところエラーが消えました。
UICollectionViewで、HeaderをtwitterみたいにNavigationBarの高さまでスクロールした所で固定する

###twitter　プロフィールページ風のNavigationBarを作る
右側のプロフィールのビューのNavigationBar（に見える部分）は、左側のビューのNavigationControllerが引き継がれていないようだったので、
NavigationBarとは別の方法を使って作成しました。

![twitter.png](https://qiita-image-store.s3.amazonaws.com/0/67504/4cc75130-a610-3801-50ca-fc4940ec42cd.png)


##使ったライブラリ
UICollectionViewでHeaderを固定すれば近い見た目になりそうだったので、
Headerを固定するこちらのライブラリを使いました。

[CSNFloatingHeaderViewFlowLayout](http://qiita.com/griffin_stewie/items/7e8b9ef40481af18286f)

```lang:cocoapod
pod 'CSNFloatingHeaderViewFlowLayout', '~> 0.0' 
```

```lang:before
origin.y = MIN(
                MAX(
                    contentOffset.y + cv.contentInset.top,
                    (CGRectGetMinY(firstObjectAttrs.frame) - topHeaderHeight - sectionInset.top)
                    ),
                (CGRectGetMaxY(lastObjectAttrs.frame) - bottomHeaderHeight + sectionInset.bottom)
                );
```
NavigationBarと同じ高さで固定するよう座標を少しいじりました。

```lang:after
CGFloat statusHight = [[UIApplication sharedApplication] statusBarFrame].size.height/2;

origin.y = MIN(
               MAX(
                   //２、sectionHeaderがNavigationBarの高さに達し固定された後〜次のsectionHeaderのbottomが見えるまで
                   contentOffset.y + cv.contentInset.top -topHeaderHeight +statusHight,
                   //１、ビュー表示初期〜sectionHeaderがNavigationBarの高さに達するまで
                   (CGRectGetMinY(firstObjectAttrs.frame) - topHeaderHeight - sectionInset.top -cv.contentInset.top)
                   ),
                   //３、次のsectionHeaderのTopが、既に固定されているsectionHeaderのbottomに接した時〜
                   (CGRectGetMaxY(lastObjectAttrs.frame) - bottomHeaderHeight + sectionInset.bottom)
                   );
```
下にスクロールするにつれて、sectionごとに１→２→３の順に座標が選択されます。
１で、Headerの初期表示位置を決めています。
２で、Headerの固定位置を決めています。


######補足メモ
* CGRectGetMinY(firstObjectAttrs.frame)
section内にアイテムが１個以上ある時：読み込んでいるsectionの中で最上部にあるCellのy座標を取得する

* CGRectGetMaxY(lastObjectAttrs.frame)
section内にアイテムが１個以上ある時：読み込んでいるsectionの中で最下部にあるCellのy座標を取得する
Azureのサービスで独自ドメイン+SSLなシステムを組む時に気をつけたいこと

## これは何？

2015/03/12時点の情報です。

Microsoft Azureでは、独自ドメイン＋SSLの構成が意外とできなかったりします。

特に、

Amazon S3やCloudfrontのように、独自ドメイン+SSLなコンテンツ配信システムを組むことができません。

(正確にはできる。けど今はできない)

ブランディングの都合上、サービスを展開するドメイン名に縛りがあるシステムの場合はご注意を。




## 独自ドメイン, SSL対応表

利用したサービスのみを載せています。

独自ドメインをCustom domainと記載しています。


| | Azure Websites | Traffic Manager | Azure Storage BLOB | Azure CDN | 
|:---|:---:|:---:|:---:|:---:|
| Default Domain | azurewebsites.net | grecipehoge.trafficmanager.net | blob.core.windows.net | msecnd.net |
| Default Domain + SSL | ◯(※1) | ◯ | ◯(※1) | ◯(※1) | 
| Custom Domain | ◯ | ◯(※2) | ◯ | ◯ |
| Custom Domain + SSL | ◯(※2) | ◯(※3) | ☓ | ☓(※4) |


----
※1

各サービスのドメインにwildcard証明書が用意されています。

　Websites なら *.azurewebsites.net 

詳細はドキュメントを確認してください。


----
※2

DNSのCNAMEをサービスに向けてから、ドメインを紐付けてやればOK。

CNAMEを設定しないとドメインを紐付けできません。

----
※3

Traffic ManagerにDNSのCNAMEを向けてやると、エンドポイント側でドメインを紐付けられるようになります。

現状SSLアクセラレータのような機能はありません。将来実装予定だけど、まだ先みたい。

サーバーサイドSSL=エンドポイントにSSL証明書を設置してあげればOK。

多数のエンドポイントをぶら下げる場合は、SSL証明書更新運用がめんどくさくなるので早く対応してほしいなー。


----
※4

将来的に提供される予定らしいがまだ先のようです。



-----
Carbonでstrtotimeではなくstrftimeを使いたい

### 概要
年を西暦ではなく和暦で表示したいという要望があったりしますよね。
そんな時は`strftime`を使っているかと思いますが、Carbonを導入してるからCarbonでという場合は `formatLocalized()` を使うとよいです。

### コードサンプル
```php:
use Carbon\Carbon;

date_default_timezone_set('Asia/Tokyo');
setlocale(LC_TIME, 'ja_JP.utf8');

$format = '%Y年 (%EC%Ey年)';
$currentYear = Carbon::now()->formatLocalized($format);

// string(21) "2015年 (平成27年)"
var_dump($currentYear); 
```


### 備考
明治以降しか表示されません。


### 参考リンク
http://carbon.nesbot.com/
http://jp.php.net/strftime
listings中で単語の切れ目以外の場所でも自動改行させる

listings.styを使ってコードブロックを記述する場合、長い行を改行させることが問題になります。

長い行を改行させる設定は以下のようになります。

```tex
\lstset{
  breaklines=true,
  (...)
}
```

しかし、この設定だけでは、「 」や「+」などの文字がある場合はその辺りで改行してくれるのですが、英数字だけが長く続く場合には改行してくれません。

単語中など、どんな文字の並びでも文字数を超えた時には改行させる、ということを実現するには、以下のような設定を`\begin{document}`の前に記述します。

```tex
\makeatletter
\def\lst@lettertrue{\let\lst@ifletter\iffalse}
\makeatother
(...)
\begin{document}
```

これで、ちょうど文字幅に収まるように改行されます。

参考: http://tex.stackexchange.com/questions/65743/listings-package-does-not-break
ShinobiLayer: サーバーキャンセル時のRECLAIM_WAITとは

#はじめに

サーバーをキャンセルしたのに、いつまで経っても以下のような時計マークが出てサーバーが消えない！！！って不安になったことないですか？

![reclaim_wait.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6f9213d9-b23c-6ffa-37ce-9519c5d3aec7.jpeg)

#RECLAIM_WAITステータスとは
実はこの状態はStatus欄に書かれているとおり、**RECLAIM_WAIT**という状況になっており、キャンセル自体はちゃんと完了しています。
疲れてサーバーを間違ってキャンセルしてしまった際に、万が一「やばい！間違って消しちゃった！」って青ざめてしまう状態を想像してみて下さい。こういう事態になった際に、急いでチケットで駆け込んだら、回復できるかもしれない状態を指しています。つまり、キャンセルしたからといって直ぐにサーバーイメージの実体を消去してしまうのではなく、キャンセルのキャンセルに備えてしばらくサーバーイメージを保持してくれている状態なんですね。

ちなみに、このRECALAIM_WAIT状態はリソース状況によっては、記載の予定時刻よりずっと早めに解消されてしまうこともあるようですし、即時に消去されてしまうこともあるようなので、これに頼り切った運用は避けた方が良いでしょう。あくまで「運良く残っていたら」というぐらいに考えておいた方が良さそうです。

#終わりに
というので、キャンセル自体は終了していますので安心してください！
hubot + http proxy メモ

hubot は heroku にデプロイして動かすのがメインのユースケースらしく、社内環境とかの HTTP プロキシ越しに動かすのは茨の道っぽい。
hubot API が提供する HTTP クライアントは `node-scoped-http-client` というライブラリがベースになっているので、HTTP クライアントを利用するようなプラグインをプロキシ環境で動かしたいときは、プラグイン自体を書き換えて `new ScopedClient url, options` の options.agent に tunnel-agent のエージェントを渡すように修正する必要がある。

* [Hubot behind a proxy · Issue #287 · github/hubot](https://github.com/github/hubot/issues/287 "Hubot behind a proxy · Issue #287 · github/hubot")
* [node-scoped-http-client/index.coffee at 4d0807defe6e65a022cca0a6302e1cc895a1f86c · technoweenie/node-scoped-http-client](https://github.com/technoweenie/node-scoped-http-client/blob/4d0807defe6e65a022cca0a6302e1cc895a1f86c/src/index.coffee "node-scoped-http-client/index.coffee at 4d0807defe6e65a022cca0a6302e1cc895a1f86c · technoweenie/node-scoped-http-client")
* [Using hubot behind a proxy server · Issue #731 · github/hubot](https://github.com/github/hubot/issues/731 "Using hubot behind a proxy server · Issue #731 · github/hubot")
SwiftのRangeは配列ではない

## map

少しおもしろい実験をしてみましょう。
以下のようなコードが動きます。

```swift
let range = (1...10).map { i in i * 2 }
for i in range {
    println("i: \(i)")
}
```

以下のようなコードはコンパイルエラーとなります。

```swift
let range = (1...10).filter { i in i % 2 == 0 }
for i in range {
    println("i: \(i)")
}
```

## SwiftのRangeとは

こういう`1...10`や`1..<10`のことをRangeと呼びます。
`...`は`ClosedInterval<T>`型に、`..<`は`HalfOpenInterval<T>`型になります。

```swift
for i in 1...10 {
    println("i: \(i)")
}
```

`ClosedInterval<T>`型も、`..<`は`HalfOpenInterval<T>`型も、`map`メソッドを実装していますが、`filter`メソッドは実装していません。
そのため、先ほどのコードはコンパイルエラーとなったのです。

## Rangeに対してfilterしたいとき

`map`メソッドを噛ますと`Array`になるのでmapしてからfilterしてあげると動きます。
※もっと良い方法があれば教えてください :)

```swift
let range = (1...10).map { i in i }.filter { i in i % 2 == 0 }
for i in range {
    println("i: \(i)")
}
```
SRAのファイルのパス取るのだるすぎる


よくある（俺調べ）。ファイルパスのリストを作ります。

## 下準備

まずID変換用のファイルを取ってくる（このファイルは毎日更新されます）

```sh
lftp -c 'open ftp.ncbi.nlm.nih.gov/sra/reports/Metadata && pget -n 8 SRA_Accessions.tab'
```

## fastqファイルが欲しい場合

Submission ID (prefix) - Submission ID - Experiment ID - Run ID と階層が深くなる感じで置いてある。たとえば

`/usr/local/ftp/public/ddbj_database/dra/fastq/SRA108/SRA108897/SRX369002/SRR1019460_1.fastq.bz2`

こんな感じ。

#### ポイント

- 全てのデータがfastqに変換されているわけではない
  - ~~DDBJ的には全部fastqに変換するポリシーだったけどストレージが足りなくなってやめた~~
  - [2015/6/11追記] ストレージは今のところ大丈夫だけど、データ数が多すぎてfastqへの変換が追い付いていないとのこと
- SRX〜のディレクトリ中に DRR000001.fastq.bz2 DRR000001_1.fastq.bz2 DRR000001_2.fastq.bz2 とかが入っている
- 圧縮形式はほとんどがbz2だがgzの時もある
- pairedかsingleかは対応表だけからは区別できないのでディレクトリ以下のファイルを\*.fastq\*とかで丸ごと取ってくるのがよい

#### 全てのRunのfastqの入ってるディレクトリ一覧を作成する

```sh
awk -F '\t' '$1 ~ /^.RR/ { OFS="/" ; print "/usr/local/ftp/public/ddbj_database/dra/fastq", substr($2,1,6), $2, $11}' SRA_Accessions.tab
```

## SRAファイルのリストが欲しい場合

実際のパスはこんな感じだ。

`/usr/local/ftp/public/ddbj_database/dra/sralite/ByExp/litesra/ERX/ERX576/ERX576901/ERR620130/ERR620130.sra`

#### ポイント

- sraは全部ある（はず）
- 取ってきたら SRAToolkit の fastq-dump でfastqに変換するとかするのがよい
    - https://github.com/ncbi/sra-tools/wiki
        - 知らぬ間にprefetchコマンドとか実装されてた

```sh
awk -F '\t' '$1 ~ /^.RR/ { OFS="/" ; print "/usr/local/ftp/public/ddbj_database/dra/sralite/ByExp/litesra", substr($11,1,3), substr($11,1,6), $11, $1, $1 ".sra"}' SRA_Accessions.tab
```

なおコマンド中に書いてあるファイルパスはSRAのディスクがマウントされた裏口管理者用ノードでしか見られないのでこの覚え書きはほとんどの人には役に立たない。