OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby | アノテーションコメント（TODO、FIXME、OPTIMIZE、HACK、REVIEW）

# Ruby | アノテーションコメント（TODO、FIXME、OPTIMIZE、HACK、REVIEW）

## 概要

Rubyのソースコード中に

~~~ruby
# ANNOTATION: comment
~~~

のようなフォーマットで記述して、残タスクや要改善個所に関するコメントを残します。

具体例

~~~ruby
# FIX: hogeメソッドがnilに対応していないので修正する
tmp = hoge(name)
~~~

Railsでは `rake notes` でこのアノテーションコメントをリスト表示してくれる機能がついています。
(対象は *OPTIMIZE* , *FIXME* , *TODO* )。

任意のキーを追加したい場合は、環境変数 *ANNOTATION* に追加しておきます。

~~~bash
$ rake notes
app/controllers/people_controller.rb:
  * [6] [TODO] todo
  * [7] [FIXME] fixme
~~~

※最初の括弧内の数字は行数

### 一覧

よく使われるアノテーションコメントは下記です。（Ruby Style Guildeより）

|キーワード|内容|
|:-----|:---|
|TODO|あとで追加すべき不足している機能を記す|
|FIXME|修正すべき壊れたコードを記す|
|OPTIMIZE|パフォーマンスに影響を与える最適化すべき箇所を記す|
|HACK|リファクタリングすべきコードの臭いのする箇所を記す|
|REVIEW|レビューすべき箇所を記す|

## 参照
* Ruby Style Guide

https://github.com/bbatsov/ruby-style-guide

* Railsのrakeタスクのソースコード

https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/annotations.rake
Mac OS XのNotificationに定時を教えてもらう

なるべくなら定時に帰りたい！
最近は気付いたら定時過ぎてる！！
そうだ、画面に定時だって表示しよう！！

↓

[zshのプロンプトに定時を教えてもらう](http://qiita.com/bilyakudan/items/6bf6c103e7b6f8dd5575)





_zsh使ってないし常にコンソール開いてる訳じゃない！！！_

# Notification Centerとlaunchd使おう

Mac OS X 1.8以降にはNotification Center（通知センター）という機能があります。
昔はGrowlとか使って出してたアレです。画面の隅に、アプリケーションからのお知らせを出すことができます。

launchdはMac OSにおけるプロセス制御のためのデーモンらしいです。全てのプロセスはlaunchdの子プロセスになるらしい。へー。

一定時間ごとにプログラムを実行する、指定時刻にプログラムを実行する、などといったことが行えます。高機能crontabみたいな感じ？

# 表示させる

## 1. terminal-notifierをインストールする

[terminal-notifier](https://github.com/alloy/terminal-notifier)は、引数に与えられたメッセージをNotification Centerに表示してくれるだけのシンプルなツールです。

サクッと入れちゃいます。

```
$ [sudo] gem install terminal-notifier
```

or

```
$ brew install terminal-notifier
```

インストール先のフルパスを調べておきましょう。後で使います。

```
$ which terminal-notifier
```


## 2. launchd用のplistファイルを作る

以下のファイルを適当に編集して、`~/Library/LaunchAgents/`に保存してください。
月〜金曜日の18:00に通知が出るようにしています。


```~/Library/LaunchAgents/定時.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>net.kikuchy.teiji</string>
	<key>LimitLoadToSessionType</key>
	<string>Aqua</string>
	<key>ProgramArguments</key>
	<array>
		<string> (terminal-notifierのフルパス) </string>
		<string>-title</string>
		<string>定時だ帰るぞ！</string>
		<string>-message</string>
		<string>そろそろ定時</string>
	</array>
	<key>StartCalendarInterval</key>
	<array>
		<dict>
			<key>Minute</key>
			<integer>0</integer>
			<key>Hour</key>
			<integer>18</integer>
			<key>Weekday</key>
			<integer>1</integer>
		</dict>
		<dict>
			<key>Minute</key>
			<integer>0</integer>
			<key>Hour</key>
			<integer>18</integer>
			<key>Weekday</key>
			<integer>2</integer>
		</dict>
		<dict>
			<key>Minute</key>
			<integer>0</integer>
			<key>Hour</key>
			<integer>18</integer>
			<key>Weekday</key>
			<integer>3</integer>
		</dict>
		<dict>
			<key>Minute</key>
			<integer>0</integer>
			<key>Hour</key>
			<integer>18</integer>
			<key>Weekday</key>
			<integer>4</integer>
		</dict>
		<dict>
			<key>Minute</key>
			<integer>0</integer>
			<key>Hour</key>
			<integer>18</integer>
			<key>Weekday</key>
			<integer>5</integer>
		</dict>
	</array>
</dict>
</plist>
```

## 3. launchdに登録する

今作ったplistファイルをlaunchdに読みこませます。

```
$ launchctl load ~/Library/LaunchAgents/定時.plist
```

これで準備完了です。
18:00になると、こんな感じになります。

![定時になると](https://qiita-image-store.s3.amazonaws.com/0/41896/ccbe7f35-12bf-9147-00e7-e84a9bd702df.png)


# さいごに

これで定時に帰れたら苦労しない
読みをポケベル入力数字に変換するPokebell gem

#きっかけ
>文字列をポケベルの数字列で暗号化、またポケベルの数字列から文字列に復号化する、というものが載っていたので自分で、コードを書いてみました。
[Rubyで暗号化、復号化 - Qiita](http://qiita.com/AlgoSystem/items/051fc9e6f5517ec3d2f7)

「暗号化とは言えんと思うなぁ、数字のまま読める人種が居たし（解説：メッセージを表示できるポケベルが出た当初は **数字しか表示できなかった** ので、脳内で復号化した）。それにしても、これをハッシュのテーブルで扱うのは上手くないような気がする…文字コードでうまく扱えないだろうか」
と思ったのがきっかけです。
しかしドツボに嵌まりました。
なぜなら……五十音順になっている文字コードは半角カナだけだったからですw
#インストール
rubugemsでインストールしてください。

```
$ gem install pokebell
```

#ソース
Github に上げてます。
[riocampos/pokebell](https://github.com/riocampos/pokebell)

#使い方
ひらがな、カタカナ、数字、Alphabet（大文字/小文字、全角/半角）、記号の一部をポケベルの二桁数字に変換します。濁点や半濁点も問題なく変換します（半角カナ変換時に用いたNKFライブラリのおかげです）。

```ruby
pokeberu = Pokebell.new("ぽけべる")
pokeberu.pokebell #=> "650524640493"
pokeberu.code     #=> "650524640493"
pokeberu.str      #=> "ぽけべる"
pokeberu.to_a     #=> "ぽけべる"
```

#変換テーブル
このテーブルを参考にしました。
>![table](http://www.kuboyama.com/column/2touch.jpg)
[ベル打ちのすすめ　―2タッチ入力― (It's fine today!)](http://www.kuboyama.com/column/2009/09/post_10.html)


あとで検索したらこういうのもありました。
>![table](http://pc.watch.impress.co.jp/img/pcw/docs/489/609/table1_s.jpg)
[【武蔵野電波のプロトタイパーズ】ピポパ音を解読するDTMFデコーダを作ってポケベル打ちに挑戦!](http://pc.watch.impress.co.jp/docs/column/musashino_proto/20111110_489609.html)

なお、テーブルの右部分が違うものもありました。

>![table](http://blogimg.goo.ne.jp/user_image/69/2f/76d7123c1e1d6df15e829cdcfba80beb.jpg)
>[お盆休み。。。４ - うめちゃんのしょ～もない毎日♪](http://blog.goo.ne.jp/dan-_-huku/e/0206c7c26e7cafcdda16d22ee9113fc2)

DoCoMoとそれ以外（テレメッセージ系）の会社で異なったのではないかと思われますが、今回 Pokebell gem で取り上げた変換テーブルがどちらのものなのかは不明です（おそらく DoCoMo でしょうが）。
#変換テーブル部分
結局、一部はハッシュテーブルになりました、とさ。

```ruby
class Pokebell
  def encode(code)
    code2pokebell_hash = {
      166 => "02", # を
      63 => "67", # ？
      33 => "68", # ！
      45 => "69", # −
      304 => "69", # ー
      47 => "60", # ／
      92 => "76", # ￥
      38 => "77", # ＆
      40 => "82", # （
      41 => "84", # ）
      42 => "86", # ＊
      35 => "87", # ＃
      32 => "88", # 全角スペース
      350 => "04", # ゛
      351 => "05", # ゜
    }

    case code
    when 167..171 # ぁ-ぉ
      code = code + 10
    when 172..174 # ゃ-ょ
      code = code + 40
    when 175 # っ
      code = code + 19
    when 97..122 # a-z
      code = code - 32
    end
    
    case code
    when 177..211 # あ-も
      digit(code, 177, 1, 1)
    when 215..220 # ら-わ
      digit(code, 215, 9, 1)
    when 221..223 # ん゛゜
      digit(code, 220, 0, 2)
    when 212..214 # や-よ
      second_digit, first_digit = (code - 212).divmod(3)
      "#{(second_digit + 8) % 10}#{first_digit * 2 + 1}"
    when 65..90 # A-Z
      digit(code, 65, 1, 6)
    when 49..57 # 1-9
      digit(code, 49, 9, 6)
    when 48 # 0
      "00"
    when *code2pokebell_hash.keys
      code2pokebell_hash[code]
    else
      raise "out of aiming charactor area"
    end
  end

  def digit(code, base, first_digit_base, second_digit_base)
    second_digit, first_digit = (code - base).divmod(5)
    "#{(second_digit + first_digit_base) % 10}#{(first_digit + second_digit_base) % 10}"
  end
end
```

#TODO
* 絵文字対応（?, ☏, ?, ♡）
* 復号化メソッド作成

#rubygems の作り方手順
[Jewelerで作ったGemをGithubとRubygemsに登録 - Qiita](http://qiita.com/riocampos/items/c7cbdc36eba156f573d2)
TreeFrogでJSONデータを返す

TreeFrog で作ったWebアプリから、REST なインターフェースで JSON データを返す。
まずは１件だけ返すことに絞ります。

* ちなみに TreeFrog Framework は C++ の Web フレームワークです

要件として、Qt は **バージョン5.0** 以上。

あらかじめ、アプリのプロジェクトは作っておいて下さい。例えば、コマンドラインからこんな感じ。

```bash
$ tspawn new booksite
$ cd booksite
```

MySQLデータベースにテーブルを作ります。この例は、「本」の情報を保存するテーブルだと思ってください。本のタイトル、出版社、ISBNのフィールドがあります。

```mysql:mysql
mysql> CREATE DATABASE bookdb;
mysql> CREATE TABLE book (id INTEGER AUTO_INCREMENT PRIMARY KEY, title VARCHAR(20), pages INTEGER, isbn VARCHAR(20), publisher VARCHAR(50), created_at TIMESTAMP, updated_at TIMESTAMP) DEFAULT CHARSET=utf8;
```

*config/database.ini* を編集して、データベース情報を記述します。

編集が終わったら、このテーブルに対する足場をつくります。

```bash
$ tspawn s book
DriverType:   QMYSQL
DatabaseName: bookdb
HostName:     
Database opened successfully
  created   models/sqlobjects/bookobject.h
  created   models/book.h
  created   models/book.cpp
  updated   models/models.pro
  created   controllers/bookcontroller.h
  ：
```

アクションを宣言します。引数にはIDを渡すことにします。

```c++:bookcontroller.h
void json(const QString &pk);
```

実装を書きましょう。

```c++:bookcontroller.cpp
void BookController::json(const QString &pk)
{
    Book book = Book::get(pk.toInt());
    QVariantMap jsonBook = book.toVariantMap();
    renderJson(jsonBook);
}
```

ビルドして、APサーバを起動。

```bash
 $ qmake -r
 $ make
 $ treefrog -e dev
```

１件以上データを保存した状態で、[http://(hostname):8800/Book/json/1](http:/) にアクセス。

```
{"createdAt": "2014-06-26T14:34:20","id": 2,"isbn": "B00IAXXXXX","pages": 200,"publisher": "イディ","title": "TreeFrog Framework入門","updatedAt": "2014-06-26T14:34:20"}
```

レコードの情報がJSONとして表現されます。
もし返したくない情報（フィールド）があれば QVariantMap オブジェクトから取り除き、renderJson()を呼べば良いです。

　
CURDなアクションを実装し、ルーティングを定義すれば、RESTful な実装が可能です。
よく使うショートカットメモ


よく使うけどど忘れした時のメモ

## ウィンドウ周り

- Ctrl-0: サイドバーに移動する
- Cmd-T: ファイルを新しいタブで開く
- Ctrl-R: 指定した行に移動
- Cmd-Shift-N: 新規ウィンドウ
- Cmd-R: メソッドに移動
- Cmd-w : ファイルを閉じる
- Cmd-Shift-w : ウィンドウを閉じる

### ウィンドウレイアウト周り

- Cmd-Opt-Shift-<数字>: <数字>分に縦で分割する。1の時だと1画面に戻る
- Cmd-Opt-<数字>: <数字>分に横で分割する。1の時だと1画面に戻る

## 編集まわり

- Ctrl-↓ / Ctrl-↑ : ページ単位でカーソル移動
- Ctrl-e : 行末尾に移動
- Ctrl-a : 行先頭に移動
- Ctrl-→ / Ctrl-← : ワード単位でカーソル移動
- Ctrl-<Enter> : カーソルのある位置からではなく、新規に改行をする
- Ctrl-k : カーソルから行末まで消す
- Ctrl-/ : コメント
- Cmd-{ / Cmd-} : 選択した状態で、その選択範囲のタブ幅を増やしたり減らしたりする

## 検索

- Cmd-F : 検索
- Cmd-Shift-F : すべてのファイルから検索。検索範囲は where で絞れる
MacBookProでHHKBを尊師スタイルで使う


↓みんなでKarabiner-elementsの開発を応援しよう！寄付はこちらから！↓
https://karabiner-elements.pqrs.org/docs/pricing/#supporting-this-project

---

##尊師スタイルとは？
![2014-11-04 13.21.15.jpg](https://qiita-image-store.s3.amazonaws.com/0/19519/42df2f60-be56-d277-2143-fb9bf6a2b198.jpeg)


誰が呼んだか、ノートパソコン内蔵のキーボードの上にHHKBを置いて使うスタイルです。
(参考：[OLPCの上にHHKBを置いて使用するRMS尊師](http://www.flickr.com/photos/lawrencelry/2540914602/in/photostream/))


##問題
当たり前ですが、HHKBをそのままMacBookProの上に置くと、内蔵キーボードのキーが押されて意図しないキーが勝手に入力されます。

---
##解決法(Sierraの場合)

Sierraの場合は、Karabiner-Elementsをインストール。

HHKBを接続した状態で
Karabiner-Elementsの Preferences->Devices を開くと下の図のように表示されているかと思うので、
Disable the built-in keybord while one... のチェックを入れるだけ。easy。

![スクリーンショット 2017-03-17 18.04.29.png](https://qiita-image-store.s3.amazonaws.com/0/19519/308d3e7a-b93e-a982-6a34-6e1c9c3e61d9.png)



---
##解決法(El capitanの場合)

この記事を書いてから見つけたのですが、↓こちらの方法のほうが便利ですのでお勧めします。

- [外付けキーボードを接続したときだけ MacBook の内蔵キーボードを無効化する](http://qiita.com/shuhei/items/fcaee827b9bf256820b6)

---

本体のキーボードを無効にするためには以下のコマンドをターミナルで実行します

```
% sudo kextunload /System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/
```

本体のキーボードを再び有効にするには以下のコマンドを実行

```
% sudo kextload /System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/
```

##便利
.zprofileなり.bash_profileに

```
alias onkeyboard="sudo kextload /System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/"
alias offkeyboard="sudo kextunload /System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/"
```
とaliasを設定しておくとべんりです。

##参考リンク
- [Can I disable internal keyboard/trackpad on MBP?](http://forums.macrumors.com/showthread.php?t=433407)
- [Richard Stallman and OLPC by Lawrence R.Y. Li, on Flickr](http://www.flickr.com/photos/lawrencelry/2540914602/)


##今回の環境
MacBookPro 2010 mid
OS X 10.9.3
zshell
Apache Tika

事情があって、各種ファイルからテキストから抜き出して、Solrに入れるという作業をすることになりました。
Solrにもファイルを渡して、解析をしてくれるI/Fがありますがタイミングをプログラムでコントロールしたかったので、Solrにやらせず文書登録機能からSolrをアップデートさせる方向で考えました。
どうせなら同じライブラリを使おうと思い、Apache LuceneのサブプロジェクトのApache Tikaを使うことにしたのですが、情報が少ないのでテストプログラムを書いてみました。

## pom.xmlでの依存関係

```xml:pom.xml
		<dependency>
			<groupId>org.apache.tika</groupId>
			<artifactId>tika-core</artifactId>
			<version>1.5</version>
		</dependency>

		<dependency>
			<groupId>org.apache.tika</groupId>
			<artifactId>tika-parsers</artifactId>
			<version>1.5</version>
		</dependency>
```

Parseする場合にByteArrayInputStreamの形に変換する必要があるので、手っ取り早くやるために、Commons-IOを使うために以下も追加しました。

```xml:pom.xml
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
```

## 例外処理を除いたコード片
実際にパースするだけであれば、簡単で、以下のコードで取得できます。分割しているのでJUnitコードをほとんど載せます。ファイルパスをタイプごとに管理しているMapの詳細は割愛します。

```java:TikaTest.java
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.WriteOutContentHandler;
import org.junit.Test;
import org.xml.sax.SAXException;

public class TIkaTest {

	@Test
	public void test() throws IOException, SAXException, TikaException {
		Parser parser = new AutoDetectParser();
		Metadata metadata = new Metadata();
		StringWriter writer = new StringWriter();

		ByteArrayInputStream bytes = getTestData("doc");
		
		parser.parse(bytes,
		             new WriteOutContentHandler(writer),
		             metadata,
		             new ParseContext());

		//このcontentが目的の文字列。Solrの形態素解析をおこなうフィールドに格納して、解析させる。
		String content = writer.toString();


	}
	
	
	private ByteArrayInputStream getTestData(String type) throws IOException{

		//ファイル種別をキーとして、テスト用のファイルパスを値とするMapからパスを取り出して、読み込む。		
		return read(TYPES.get(type));
		
	}
	
	private ByteArrayInputStream read(String path) throws IOException{

		File file = new File(path);

		return new ByteArrayInputStream(FileUtils.readFileToByteArray(file));
		
		
	}
```
post-receiveとpost-mergeを使うときのメモ

いままでfixできないバグをfixできたので、メモする。

いつもの環境:

```text
local: git push origin master
↓
remote(bare): post-receiveでgit pull
↓
remote(cloned): post-mergeでpythonスクリプト実行
```

こういう環境設定で、 `post-merge` スクリプトを実行して、
そのスクリプトの中にサードパーティ製のモジュールを `import` しているとき
（そのモジュールはちゃんと `pip install` してある）、
何故か `git push` すると そのサードパーティ製モジュールが **ImportError** がraiseされる

ということがあって、なんでそういうエラーがでるかというと、`remote` に複数のPythonがインストールしてあって、意図していないPythonが実行されている（すなわち `pip install` した場所を使わないPythonが使われている)らしい。

たとえば

1. `/usr/bin/python`
2. `$HOME/.pythonbrew/pythons/Python-2.7.3/bin/python`

の２つがあるときに、 **2** のPythonを使いたいのに、 **1** のPythonが実行されている。

ので、 `post-merge.py` をそのまま動かすんじゃなくて、
**shellscript** をかませて実行させると、うまく実行できた。

つまり


```sh:post-merge.sh
#!/bin/sh

BIN="$HOME/.pythonbrew/pythons/Python-2.7.3/bin/python"

$BIN $HOME/path/repo/post-merge.py
```

```py:post-merge.py

import flask


```

あー、よかった、これでうまくいくわー
jsオブジェクト存在チェック

##オブジェクト存在チェック##

###if-in

```js
var hoge = {aa : 'good'};
if ('aa' in hoge) {}
```

```js
var myObj = {a: 1, b: 2, c: 3}, myKeys = [], i=0;
for (myKeys[i++] in myObj);
console.log(myKeys);
```

上記のやり方は賢いw、以下のリンクをご参照
[Exploring JavaScript for-in loops](http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/)


###hasOwnProperty()

```js
obj.hasOwnProperty();
```

上記の違いは以下のストックをご参照
[in と hasOwnProperty() の違い](http://qiita.com/shuhei/items/dabf0ca097f05264baf9)

###注意点###

for .. inの場合はhasOwnPropertyの判断を入れた方が安全、原因は
>
Some frameworks (e.g. Prototype.js and Mootools) add a lot of custom prototype augmentation and using for-in to iterate Arrays and Strings is generally considered a bad idea. Using a regular for loop is a good alternative for Array and String iteration. In addition, ES5 defines a bunch of custom Array iterators (forEach, map etc). Unfortunately non of these alternate iteration strategies work with regular Objects – which is why its considered very bad practice to augment Object.prototype.

例：

```js
var arr = ['a','b','c'], indexes = [];
Array.prototype.each = function() {/*blah*/};
 
for (var index in arr) {
    indexes.push(index);
}
 
indexes; //["0", "1", "2", "each"] whoops!
```

###if

```js
var hoge = {aa : 'good'};
if (hoge['aa'])
```

ifもfor .. inと同じくhasOwnPropertyで判断必要あり

##結論##

>
Arrayの場合はfor文かArray.forEach(every,some)で使うベキ
Objectの場合はfor .. in + hasOwnPropertyでやる
SwiftでCoreDataを使うときのメモ

いろいろ記述に迷ったのでメモメモ
==========

~~~swift
// CoreDataの取得
var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context:NSManagedObjectContext = appDel.managedObjectContext

var request = NSFetchRequest(entityName: "Setting")
request.returnsObjectsAsFaults = false;
request.predicate = NSPredicate(format: "key = %@", "myid")
var results = context.executeFetchRequest(request, error:nil)

if(results.count > 0){
    // データがあった場合
    var userdata : AnyObject = results[0]
    var uid = userdata.valueForKey("value") as String
    println(uid)
}else{
    // データが無かった場合
    var Setting = NSEntityDescription.insertNewObjectForEntityForName("Setting",inManagedObjectContext:context) as NSManagedObject
    Setting.setValue("myid",forKey:"key")
    Setting.setValue("dsdsdsssdsd",forKey:"value")
    context.save(nil)
}
~~~
iOS7でもUITraitCollectionを使いたい

UITraitCollection Reference
https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UITraitSet_ClassReference/index.html

「iOS8のUITraitCollectionを使って、Adaptiveにインタフェイスを設計する！！」
と息巻いても、現実にはiOS6, iOS7のサポートも続けなくてはいけません。
そんなわけで、iOS7以前ではUIUserInterfaceIdiomを使う方法を考えてみました。あくまでも簡易的な方法ではありますが、僕の作っているアプリではなかなか便利に使えています。

```objc
#import <objc/message.h>

- (BOOL)isCompact
{
    SEL traitCollectionSelector = NSSelectorFromString(@"traitCollection");
    if(![self respondsToSelector:traitCollectionSelector]){
        // Do not support traitCollection
        return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone;
    }
    id traitCollection = objc_msgSend(self, traitCollectionSelector);
    SEL horizontalSizeClassSelector = NSSelectorFromString(@"horizontalSizeClass");
    NSInteger sizeClassNum = (NSInteger)objc_msgSend(traitCollection, horizontalSizeClassSelector);
    return sizeClassNum == 1; // UIUserInterfaceSizeClassCompact
}

- (BOOL)isRegular
{
    return !self.isCompact;
}
```

iOS8 SDKを参照しない状態でもビルドできるようにobjc_msgSendを使用しています。
rails4系でcreate or updateをするアレ

実はデフォルトのメソッドではなかったりします。

where.(id: 100).first_or_createとかはあるんですけどね。。
きっとRails5が出る頃には実装されているのでしょう。

これがあるとバッチで請求情報とか作る時にいいですよね！
請求情報なんて様々な事情で何度も作り直しすることもありますし（白目）

```rb
cutoff_date = Time.now.end_of_month
User.all.each do |user|
  invoice = Invoice.find_or_initialize_by(
    user_id: user.id,
    cutoff_date: cutoff_date.strftime('%Y-%m-%d'),
  )
  invoice.user_id = user.id
  invoice.price = 10000
  invoice.cutoff_date = cutoff_date.strftime('%Y-%m-%d')
  invoice.save!
end
```

これで何回バッチを回しても安心です（爆）
Composerのインストール

# Composerをインストールする

最近流行り？のパッケージ管理ツール Composer をインストールする。
後々の作業のことを考えて、パスが通っているところにダウンロード&インストールしたほうが良いだろう。

今回は以下のディレクトリにした。

```sh
cd /usr/local/bin
```

ダウンロード＆インストール

```sh
curl -sS https://getcomposer.org/installer | php
```

## トラブル発生

ダウンロードだけなら楽勝だぜ！と息巻いていたら、さっそくトラブルに遭遇しました。

```
All settings correct for using Composer
Downloading...
Could not create file /usr/local/bin/composer.phar: fopen(/usr/local/bin/composer.phar): failed to open stream: Permission denied
Download failed: fopen(/usr/local/bin/composer.phar): failed to open stream: Permission denied
fwrite() expects parameter 1 to be resource, boolean given
Downloading...
Could not create file /usr/local/bin/composer.phar: fopen(/usr/local/bin/composer.phar): failed to open stream: Permission denied
Download failed: fopen(/usr/local/bin/composer.phar): failed to open stream: Permission denied
fwrite() expects parameter 1 to be resource, boolean given
Downloading...
Could not create file /usr/local/bin/composer.phar: fopen(/usr/local/bin/composer.phar): failed to open stream: Permission denied
Download failed: fopen(/usr/local/bin/composer.phar): failed to open stream: Permission denied
fwrite() expects parameter 1 to be resource, boolean given
The download failed repeatedly, aborting.
```

書き込み権限で怒られている様子。ちゃんと curl実行時にsudoをつけたんだけどなぁと数分悩んでいると原因に気が付きました。
phpにはsudoが付いていない…。

### 対策
phpにもsudoを付加してあげる

```sh
curl -sS https://getcomposer.org/installer | sudo php
```

もう一度実行。

```
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /usr/local/bin/composer.phar
Use it: php composer.phar
```
Haskell備忘録(cgi作ってみる)

すごいH本を途中まで読み進め、HaskellをWebで使ってみる。
簡単なcgiを作成。
環境はSL 6.5、ghc 7.0.4。

```hs:index.cgi.hs
import Network.CGI

inputForm :: String -> String
inputForm script = concat [
    "<form action=\"", script, "\" method=\"GET\">\n",
    "  <p>What your name?</p>\n",
    "  <input type=\"text\" name=\"name\">\n",
    "  <input type=\"submit\" value=\"send\">\n",
    "</form>\n"]

putName :: String -> String
putName name = concat ["<h3>Hello, ", name, "!</h3>"]

body :: Maybe String -> String -> String
body name script = 
  case name of 
      Just x  -> putName x
      Nothing -> inputForm script

html :: Maybe String -> String -> String
html name script = concat [
    "<!DOCTYPE html>\n",
    "<html>\n",
    "<head>\n",
    "<meta charset=\"UTF-8\">\n",
    "<title>Hello</title>\n",
    "<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n",
    "<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">\n",
    "<meta name=\"format-detection\" content=\"telephone=no\">\n",
    "<meta name=\"viewport\" content=\"width=device-width, minimum-scale=1.0, maximum-scale=0.6667, user-scalable=no\">\n",
    "<meta name=\"robots\" content=\"noindex,nofollow\">\n",
    "</head>\n",
    "<body>\n",
    body name script,
    "</body>\n",
    "</html>"]

cgiMain :: CGI CGIResult
cgiMain = do
    setHeader "Content-type" "text/html; charset=UTF-8"
    script <- scriptName
    name <- getInput "name"
    output $ html name script

main :: IO ()
main = runCGI $ handleErrors cgiMain
```

コンパイルする。
`ghc -o index.cgi index.cgi.hs`

Haskellの作法に沿ってないと思うけど、とりあえず動いた。

以下のURLを参考にさせて頂きました、というかパクっ・・・有り難う御座います。
[http://d.hatena.ne.jp/shunsuk/20090803/1249300625](http://d.hatena.ne.jp/shunsuk/20090803/1249300625)

次はhamlet使ってみようかな。
例外発生時にアプリを一時停止する


エディタでアプリを実行している場合、例外が発生したらそこで実行を停止して欲しいので以下のようなスクリプトを書いた。

```csharp:Autorun.cs
using UnityEngine;
using System.Collections;

/// <summary>
/// Editorでのスクリプト起動時に初期化処理を実行
/// </summary>
[UnityEditor.InitializeOnLoad]
public class Autorun : MonoBehaviour {
	static Autorun() {
		Debug.Log ("*** Debug.Log hooked by Autorun.LogCallbackHandler()");
		Application.RegisterLogCallback(LogCallbackHandler);
	}
	
	static void LogCallbackHandler(string condition, string stackTrace, LogType type) {
		if (type == LogType.Exception) {
           // Unity Editor 上で実行中の場合のみ実行を一時停止する
			if (UnityEditor.EditorApplication.isPlaying) {
				UnityEditor.EditorApplication.isPaused = true;
			}
		}
	}
}
```



参考： [Uncaught exception doesn't kill the application - Unity Answers](http://answers.unity3d.com/questions/485595/uncaught-exception-doesnt-kill-the-application.html)
vagrant-centos-docker

vagrant-centos-docker
=====================

VirtualBox で Docker を使える CentOS な仮想PCを動かす Vagrantfile です。

プロキシー環境の人は
`$ vagrant plugin install vagrant-proxyconf`
をインストールした上で Vagrantfile にプロキシーの設定をしてください。

https://github.com/contents-p/vagrant-centos-docker

残念ながらproxy環境では vagrant up の最中の docker provisioner による docker pull などはできません。vagrant up して vagrant ssh して、コマンドラインから docker pull してください。
proxy の設定をデーモンに反映させるために、service docker restart する必要があるかもしれません。
離散型確率分布

覚書です。

# 離散型の確率分布

## 離散一様分布

確率変数 X が 1,2, ... ,n をとるとするとき

```math
P(X = x) = \frac 1 n \\
(x = 1,...,n)
```

このとき平均と分散はそれぞれ (n+1)/2 及び (n^2-1)/2 。


## ベルヌーイ分布

確率変数 X が 0 または 1 のとき

```math
P(X = x) = p^x(1-p)^{1-x} \\
(x = 0, 1)
```

このとき平均と分散はそれぞれ p 及び p(1-p)

## 二項分布

```math
B(n, p)
```

## ポアソン分布

```math
P(X = x) = exp(-\lambda)\frac {\lambda^x} {x!} \\
(x = 0,1, ...)
```

期待値及び分散が等しくなる (E[X] = Var[X] = λ)

## 幾何分布


```math
P(X = x) = p(1 - p)^x \\
(x = 0,1, ...)
```

他にもありますが省略します。
Spring Roo チュートリアルをやってみた　1

Spring Roo のチュートリアルをやってみます。

まずは、環境からです。

JDKやMavenはすでに設定済みです。
今回は、Eclipseではなく、Srping Tool Suite(STS)には、Spring Roo は同梱されているとのことでしたので、STSを使うことにしました。
しかし、インストールしてみるとSTS 3.5.1には、見当たりませんでした。標準から外れてマイナーになったようです。

STSを起動し、Dashboard の Manage 枠内の IDE EXTENSIONS をクリックして
Spring Extensions を表示します。
![spring_roo_1.gif](https://qiita-image-store.s3.amazonaws.com/0/27710/869d2466-2219-c732-29c7-0c11e72da22e.gif)


Languages and Frameworks の欄に、Spring Roo がありました。
一緒にLanguages and Framework Toolingの欄にある、Spring IDE - Roo Extension もチェックして、Install ボタンをクリック。
![spring_roo_2.gif](https://qiita-image-store.s3.amazonaws.com/0/27710/a3f93f87-5323-2228-a376-174e539f32c3.gif)

インストールが完了したら、再起動して、確認。
やっと、はじめられます。
Zabbix、Jenkinsユーザの権限を調べてみた

Zabbixの外部スクリプトが動かない（怒）
Jenkinsのスクリプトが動かない（怒）

ということで調べてみました。
実際の動きは下記シェルをzabbixやjenkinsで実行すると表示できるかと思います。

```kengenGet.sh
#!/bin/sh
MY_NAME=`whoami`

# 実行ユーザの権限をログ出力
echo "ユーザ名:"$MY_NAME > env.txt

# 環境変数をログ出力
env >> env.txt
```

実行します。
`touch env.txt
chmod 777 env.txt
sudo -u 実行したいユーザ名 kengenGet.sh`

表が・・・・はみ出てる

|EC2-user|zabbix|jenkins|
|:-------|:-----|:------|
|ユーザ名:ec2-user|ユーザ名:zabbix|ユーザ名:jenkins|
|LESS_TERMCAP_mb=|||
|HOSTNAME=ホスト名|HOSTNAME=ホスト名|HOSTNAME=ホスト名|
|rvm_bin_path=/usr/local/rvm/bin|||
|LESS_TERMCAP_md=|||
|LESS_TERMCAP_me=|||
|GEM_HOME=/usr/local/rvm/gems/ruby-2.1.2|||
|SHELL=/bin/bash|SHELL=/bin/bash|SHELL=/bin/bash|
|TERM=xterm|TERM=xterm|TERM=xterm|
|HISTSIZE=1000|HISTSIZE=1000|HISTSIZE=1000|
|SSH_CLIENT=IPアドレス|||
|EC2_AMITOOL_HOME=/opt/aws/amitools/ec2|||
|IRBRC=/usr/local/rvm/rubies/ruby-2.1.2/.irbrc|||
|LESS_TERMCAP_ue=|||
|MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.1.2|||
|SSH_TTY=/dev/pts/1|||
|USER=ec2-user|USER=zabbix|USER=jenkins|
|LS_COLORS　～　省略　～|LS_COLORS　～　省略　～|LS_COLORS　～　省略　～|
|_system_type=Linux|||
|EC2_HOME=/opt/aws/apitools/ec2|||
|rvm_path=/usr/local/rvm|||
|LESS_TERMCAP_us=|||
|rvm_prefix=/usr/local|||
|PATH=:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin|PATH=/sbin:/bin:/usr/sbin:/usr/bin|PATH=/sbin:/bin:/usr/sbin:/usr/bin|
|（続き）/usr/local/rvm/gems/ruby-2.1.2/bin|||
|（続き）/usr/local/rvm/gems/ruby-2.1.2@global/bin|||
|（続き）/usr/local/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin|||
|（続き）:/opt/aws/bin:/usr/local/rvm/bin:/home/ec2-user/bin|||
|MAIL=/var/spool/mail/ec2-user|MAIL=/var/spool/mail/ec2-user|MAIL=/var/spool/mail/ec2-user|
|PWD=/usr/lib/zabbix/externalscripts|PWD=/usr/lib/zabbix/externalscripts|PWD=/var/lib/jenkins|
|JAVA_HOME=/usr/lib/jvm/jre|||
|AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon|||
|LANG=en_US.UTF-8|LANG=en_US.UTF-8|LANG=en_US.UTF-8|
|_system_arch=x86_64|||
|AWS_IAM_HOME=/opt/aws/apitools/iam|||
|_system_version=2014.03|||
|HISTCONTROL=ignoredups|||
|rvm_version=1.25.27 (stable)|||
|HOME=/home/ec2-user|HOME=/var/lib/zabbix|HOME=/var/lib/jenkins|
|SHLVL=2|SHLVL=1|SHLVL=1|
|AWS_PATH=/opt/aws|||
|AWS_AUTO_SCALING_HOME=/opt/aws/apitools/as|||
|LOGNAME=ec2-user|||
|CVS_RSH=ssh|||
|SSH_CONNECTION=IPアドレス出ます|||
|AWS_ELB_HOME=/opt/aws/apitools/elb|||
|GEM_PATH=/usr/local/rvm/gems/ruby-2.1.2:/usr/local/rvm/gems/ruby-2.1.2@global|||
|AWS_RDS_HOME=/opt/aws/apitools/rds|||
|LESSOPEN=|/usr/bin/lesspipe.sh %s|||
|_system_name=Amazon|||
|LESS_TERMCAP_se=|||
|_=/bin/env|_=/bin/env|_=/bin/env|
||SUDO_USER=ec2-user|SUDO_USER=ec2-user|
||SUDO_UID=500|SUDO_UID=500|
||USERNAME=zabbix|USERNAME=jenkins|
||SUDO_COMMAND=./test.sh|SUDO_COMMAND=./env.sh|
||LOGNAME=zabbix|LOGNAME=jenkins|
||SUDO_GID=500|SUDO_GID=500|
deviseでパスワード認証をする

# やりたいこと
ログインはせず、該当emailとパスワードのユーザーを取得したい
emailだけではなく、パスワードの一致まで確認したい

```rb
user = User.find_by_email(params[:user][:email])
user.valid_password?(params[:user][:password])
```

# 参考
http://stackoverflow.com/questions/4320921/how-verify-user-password-in-devise
ローカルテスト用にaws-sdkでElasticMQに接続するNode.jsサンプル




```coffeescript

SQS = require('aws-sdk').SQS

# クライアントを生成
client = new SQS
  accessKeyId: 'アクセスキーIDを記述...'  # ElasticMQの場合は不使用
  secretAccessKey: 'シークレットアクセスキーを記述...'  # ElasticMQの場合は不使用
  apiVersion: '2012-11-05'
  region: 'リージョンを記述...'  # ElasticMQの場合は不使用

# キュー名
queueName = 'キュー名を記述...'

# ローカル開発環境用(ElasticMQ)
queueUrl = "http://localhost:9324/queue/#{queueName}"
# 本番環境用(AWS SQS)
# queueUrl = "https://sqs.リージョン.amazonaws.com/xxxxxxxxxx/#{queueName}"

# ElasticMQ用にコレを設定する必要がある
client.setEndpoint 'http://localhost:9324'

# キューを作成
client.createQueue {QueueName: queueName}, (err) ->

  if err
    console.log "### エラー", err
    return

  # 送信用パラメータ
  sendParams =
    QueueUrl: queueUrl
    MessageBody: 'This is a test'
    DelaySeconds: 0

  # メッセージ送信
  client.sendMessage sendParams, (err) ->
    if err
      console.log "### エラー", err
      return

    # 受信用オプション
    recvOptions =
      QueueUrl: queueUrl
      MaxNumberOfMessages: 10
      VisibilityTimeout: 60
      WaitTimeSeconds: 20

    # メッセージ受信
    client.receiveMessage recvOptions, (err, data) ->
      if err
        console.log "### エラー", err
        return

      # メッセージがあれば
      if data?.Messages?.length > 0

        # メッセージ件数分処理
        for message, i in data.Messages
          console.log "### メッセージ[#{i}]", message.Body

          # 削除用パラメータ
          delOptions =
            QueueUrl: queueUrl
            ReceiptHandle: message.ReceiptHandle

          # メッセージ削除（ElasticMQは必要ない？？）
          client.deleteMessage delOptions, (err, data) ->
            if err
               console.log "### エラー", err
               return


```
asが失敗したときのXCode(β版)の挙動について

asが失敗すると EXC_BAD_INSTRUCTION シグナルが上がって落ちますが、
XCodeが違う所で落ちたような見た目になることがありました。

確認したバージョンは XCode6-Beta2 です。

*追記：Appleへバグ報告済みです。*

```swift
// as 失敗で違う場所にエラー表示が出るサンプル
func Hoge() -> AnyObject {
	return NSObject()
}

func Fuga() {
    var x = "abc"
    switch x {
    case "abc":
        println(x)  // ここで落ちたみたいな表示が出る
    default:
        println("default")
	}

    let a = Hoge() as NSInteger // ほんとはココで落ちてる
}

Fuga()
```

違うケースでも同じような見た目になることがあります。
今回はSwift + Cocoaでいろいろ試している時だったので
なかなか何が起きているのかわかりませんでした。

## (対策)as?を使う
失敗するかもしれないキャストには as? を使うようにします。

```swift
// as の場合
var dic  = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.AllowFragments, error: nil) as NSDictionary

// 失敗したら終わり
```

```swift
// as? の場合
var dic  = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.AllowFragments, error: nil) as? NSDictionary

// 失敗したか調べられる
if dic {
    // ...
}
```
読み込んだJSONをLabelに改行付きで表示する


```json
{
	"text": "改行A\\n改行B"
}

```

```mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx">
	<fx:Script>
		<![CDATA[
			protected function btnLoad_clickHandler( event:MouseEvent ):void {
				var loader:URLLoader = new URLLoader();
				loader.addEventListener( Event.COMPLETE, loadComplete );
				loader.load( new URLRequest( "./sample.json" ) );
			}

			private function loadComplete( event:Event ):void {
				var loader:URLLoader = event.target as URLLoader;
				var obj:Object = JSON.parse( loader.data );
				var value:String = obj.text as String;
				var reg:RegExp = /\\n/g;
				lblText.text = value.replace( reg, "\n" );
			}
		]]>
	</fx:Script>

	<fx:Declarations>
		<!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 -->
	</fx:Declarations>
	<s:VGroup>
		<s:Button id="btnLoad" click="btnLoad_clickHandler(event)"/>
		<s:Label id="lblText"/>
	</s:VGroup>
</s:Application>
```

RegExpを使って正規表現で\\nを\nに置換することでLabel内で改行して表示される
AFHTTPSessionManagerをPromiseKit化するメモ


swiftナニソレなのでコードはObjective-Cです。

ほぼ[公式](http://promisekit.org/)の`AFHTTPRequestOperation`によるサンプルのまんま。

GETのPromise版オーバーロードを作る。

```objectivec

@interface AFHTTPSessionManager (PromiseKit)

- (PMKPromise *) GET: (NSString *) URLString parameters: (NSDictionary *) parameters {
  return [PMKPromise new:^(PMKPromiseFulfiller fulfiller, PMKPromiseRejecter rejecter) {
    NSURLSessionTask *task =
      [self GET: URLString
       parameters: parameters
          success:^(NSURLSessionTask *task, id responseObject) {
            fulfiller(PMKManifold(task, responseObject));
      }
          failure:^(NSURLSessionTask *task, NSError *error) {
            rejecter(error);
      }
      ];
    [task resume];
  }];
}

@end

```

fulfillerが成功時に渡す結果、rejecterが失敗時に渡す結果とかそんな感じっぽい。
PMKManifoldを使うことで、一つ以上のオブジェクトの受け渡しにも対応出来る。

こんな感じで使える。

```objectivec
[manager GET: @"nnaaaa" parameters:nil]
  .then(^(NSURLSessionTask *task, id responseObject) {
    NSLog(@"%@", responseObject);
  });

```

`POST`とかも同様な感じですね。

すげー簡単に使えるのでPromiseKitすばらしいですね。
Carrierwaveでuploadした画像のサイズを変更する

recreate_versionsというメソッドを見つけるまでに一苦労だったので、ここで共有します。

####例:Userが持つimageのサイズを100*100から150*100にしたい。

````app/uploader/image_uploader.rb
 version :thumb do
-  process :resize_to_fill => [100, 100]
+  process :resize_to_fill => [150, 100]
 end
````

下記のコマンドをコンソールで入力します

```
bundle exec rails c
User.all.each{ |u| u.image.recreate_versions! if u.image.present? }
```

以上です。
間違いなどがありましたら、指摘していただけると嬉しいです。

####参考：
http://www.rdoc.info/github/jnicklas/carrierwave/CarrierWave/Uploader/Versions#recreate_versions!-instance_method
http://stackoverflow.com/questions/21233836/carrierwave-recreate-version
byobu導入+操作メモ

自分の理解をまとめるのと、チートシートを兼ねたドキュメント。

# About

http://byobu.co/

仮想端末(仮想スクリーン)ソフト。screenより高機能で手軽なこちらをオススメ。特にscreenではパッチが必要な画面の縦分割がすぐ出来る。(重要)

# Install

各環境でのインストールは、http://byobu.co/downloads.html このページにあるとおり。

| OS | Command |
|:---|:--------|
|Debian | apt-get install byobu |
|Ubuntu | apt-get install byobu |
|Fedra | yum install byobu |
|CentOS (7) | yum -y install epel-release && yum install byobu |
|MacOS X(Home brew) | brew install byobu |


# Start, Exit

セッション名無しで起動

```console:
$ byobu
$ byobu --
```

セッション名 `"XXX"` で起動。

```console:
$ byobu new -s XXX # バックエンドがtmuxの場合(デフォルト)
$ byobu -S XXX     # バックエンドがscreenの場合
```

終了は、byobu内でスクリーンを全て`exit`。

デタッチは、byobu内で`Ctrl+a d`。
アタッチは、コマンドラインから`byobu`、セッション名があるなら`byobu -r XXX`。

# Keybindings(作成中)

コマンドの`ctrl+a`のキーコマンドは、コンフィグで変更可能。
(注意 : putty経由では、Shift+ファンクションキー, Ctrl+ファンクションキーが標準では効かない。)

| コマンド  | 機能 |
|:---------|:-----|
| F2       | 新しいウィンドウ(スクリーン)を作る |
| F3       | 前のウィンドウに移動 |
| F4       | 次のウィンドウに移動 |
| F5       | Reload profile     |
| F6       | デタッチ |
| F7       | コピー、スクロールモードに移行 |
| F8       | 現在のウィンドウ名を変更 |
| F9       | コンフィグメニュー表示 |
| F12      | ターミナルをロック |
| shift+F2 | 横に画面分割 |
| ctrl+F2  | 縦に画面分割 |
| shift+F3 | 分割した画面内を移動。前のスクリーンに移動。 |
| shift+F4 | 分割した画面内を移動。次のスクリーンに移動。 |
| shift+F5 | Join all splits |
| ctrl+F6  | 現在の画面分割を削除。|
| ctrl+F5  | Reconnect GPG and SSH sockets |
| shift+F6 | 現在のスクリーンをデタッチ。(ログアウトはしない) | 
| alt+pgup | スクリーンの上にスクロール(Page Up) |
| alt+pgdn | スクリーンの下にスクロール(Page Down) |
| ctrl+a $ | show detailed status |
| ctrl+a R | Reload profile |
| ctrl+a ! | Toggle key bindings on and off |
| ctrl+a k | 現在のスクリーンをキル(終了) |
| ctrl+a ~ | Save the current window's scrollback buffer |

**todo**

* 未確認のキーコマンドの説明文を修正。
* 機能の種類毎に表を分割 or 並び替え。
* scrollback, copy, pasteモードの説明追加。
Supervisor経由でunicornを立ち上げている環境にCapistrano3で自動デプロイ


前回の続きです。前回はCapistrano3の導入について書きました。
[【入門】Capistrano3で自動デプロイ](http://qiita.com/mr-myself/items/2769676e6dcf43db41ef)


★★★

私の環境ではsupervisor経由でunicornを監視しているのですが、supervisorをリスタートしてしまうとhot deploy出来ない問題がありました。

そちらに関しての解決策としては下記を参考にしてください。
[supervisord ＋ unicornでhot restart (deploy) する](http://qiita.com/kazuph/items/55a5f74b9dca2d17bd65)

--

さて、今回は上記を踏まえて

* capistrano3
* unicorn
* supervisor
* Rails4
* Ruby2.1.1(ここのバージョンはあまり関係ない)

という環境で自動デプロイしたいと思います。

```ruby
# config/deploy.rb

# config valid only for Capistrano 3.1
lock '3.2.0'

set :application, 'アプリ名'
set :repo_url, 'git@hogehoge:hogehoge/application.git'
set :branch, 'master'
set :scm, :git

set :format, :pretty
set :log_level, :info # :info or :debug
set :keep_releases, 3

set :rbenv_type, :user
set :rbenv_path, '~/.rbenv'
set :rbenv_ruby, '2.1.1'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
set :rbenv_roles, :all


namespace :deploy do

  task :stop do
    on roles(:app) do
      execute 'kill -USR2 `cat tmp/pids/unicorn.pid`'
    end
  end

  task :graceful_stop do
    on roles(:app) do
      execute 'kill -USR2 `cat tmp/pids/unicorn.pid`'
    end
  end

  task :reload do
    on roles(:app) do
      execute 'kill -USR2 `cat tmp/pids/unicorn.pid`'
    end
  end

  task :restart do
    on roles(:app) do
      stop
    end
  end

  after :finishing, 'deploy:cleanup'
end

```

capistranoが通常の方法でリスタートしにいくところを上書きしに行ってるような感じです。

あとは環境ごとの設定を好きなように。

```ruby
# config/deploy/production.rb

set :stage, :production

set :rails_env, 'production'
set :bundle_gemfile, -> { release_path.join('Gemfile') }
set :bundle_dir, -> { shared_path.join('bundle') }
set :bundle_flags, nil
set :bundle_without, %w{development test}.join(' ')
set :bundle_binstubs, nil
set :bundle_roles, :all

role :app, %w{ユーザー名@デプロイ先IP}
role :web, %w{ユーザー名@デプロイ先IP}
role :db,  %w{ユーザー名@デプロイ先IP}

set :deploy_to, '/home/ユーザー名/アプリ名'
set :ssh_options, {
  port: ポート番号,
  forward_agent: true
}

namespace :db do

  task :db_create do
    on roles(:db) do |host|
      execute "mysql -uroot -e 'CREATE DATABASE IF NOT EXISTS production_db;'"
    end
  end
end
```

ポイントが有るとすると、Rails4からbinstubsが原因でバグる可能性が出てくるので、
binstubsオプションにnilを渡してコマンドを作らないようにしている。
（Rails3まではrailsのサブコマンドがscriptディレクトリ以下だったが、Rails4からbin以下になったため）
⇛参考 [railsのサブコマンドが使えなくなる問題の原因はbinstubs](http://xoyip.hatenablog.com/entry/2013/12/14/203805)

--

 あとはデプロイするのみです。通常通り行ってください。

```console
$ bundle exec cap production deploy
```

ちなみに後ろに--traceオプションをつけると、より詳細のログが見れます。
[JavaScript] 配列(Array)の合計値, 平均値, 中央値をモダンに求める

**よかったらこっちで見てください -> http://phiary.me/javascript-array-sum-average-median**

<br />
<br />


モダンといっても ECMAScript 5 から追加されたメソッドを使ってるってだけです...

サンプルは[こちら](http://jsdo.it/phi/aJZp).

![js-logo.png](https://qiita-image-store.s3.amazonaws.com/0/7756/896cc145-3ab2-2d98-fe60-d6c0d4198324.png)

## 合計値を求める

### イケてない実装



普通に for 文回す.

```js
var sum  = function(arr) {
	var sum = 0;
	for (var i=0,len=arr.length; i<len; ++i) {
		sum += arr[i];
	};
	return sum;
};

var arr = [1, 2, 3, 4, 5];
console.log( sum(arr) ); // 15
```


### ちょっと今風

`Array.prototype.forEach` 使ってます.

```js
var sum  = function(arr) {
	var sum = 0;
	arr.forEach(function(elm) {
		sum += elm;
	});
	return sum;
};

var arr = [1, 2, 3, 4, 5];
console.log( sum(arr) ); // 15
```

### モダンな感じ

`Array.prototype.reduce` ってやつ使ってます.
隣り合う要素に関数を適応していく関数です.

```js
var sum  = function(arr) {
    return arr.reduce(function(prev, current, i, arr) {
        return prev+current;
    });
};

var arr = [1, 2, 3, 4, 5];
console.log( sum(arr) ); // 15
```

### さらにモダンっというか多機能

関数渡せるようにしてみました.
fn を省略した場合普通のが呼ばれます.

```js
var sum = function(arr, fn) {
	if (fn) {
		return sum(arr.map(fn));
	}
	else {
		return arr.reduce(function(prev, current, i, arr) {
				return prev+current;
		});
	}
};

var arr = [1, 2, 3, 4, 5];
console.log( sum(arr) ); // 15
console.log( sum(arr, function(elm) {
	return elm*2;
})); // 30
var arr2 = ['a', 'b', 'c'];
console.log( sum(arr2) ); // abc
console.log( sum(arr2, function(elm) {
	return elm.charCodeAt();
}) ); // 249
```


## ついでに平均値と中央値求めるのも作ってみた

### 平均値

sum 使い回し.

```js
var average = function(arr, fn) {
    return sum(arr, fn)/arr.length;
};
var arr = [1, 2, 3, 4, 5];
console.log( average(arr) );    // 3
```

### 中央値

fn は sort 用関数です.

```js
var median = function(arr, fn) {
    var half = (arr.length/2)|0;
    var temp = arr.sort(fn);

    if (temp.length%2) {
        return temp[half];
    }

    return (temp[half-1] + temp[half])/2;
};

console.log(median([1, 2, 3, 4, 5]));       // 3
console.log(median([1, 2, 3, 4, 5, 6]));    // 3.5
console.log(median([6, 6, 1, 2, 3, 4, 5])); // 4

```


Qiita もっと下書き残せるようにしてくれー!><
TreeFrogでクエリ文字列(URLパラメータ)を取得する

` Blog/index?p=2&s=0`のような形式のパラメータを取得する方法です。

##クエリ形式のパラメータの取得
```cpp:C++
int p = httpRequest().queryItemValue("p").toInt();
int s = httpRequest().queryItemValue("s").toInt();
```

###パラメータが存在するか確認
```cpp:C++
if (httpRequest().hasQueryItem("p"))
{
	// pというパラメータが存在する
	int p = httpRequest().queryItemValue("p").toInt();
}
```
ランダムな16進数文字列を得るワンライナー


```
ruby -r securerandom -e "puts SecureRandom.hex(16)"
```

参考
[Rubyでランダムな数値を得る方法 -- ぺけみさお](http://www.xmisao.com/2014/03/11/how-to-get-a-random-number-in-ruby.html)
Gulpでウェブアプリ作る際のスケルトン

[gulpでbrowserify使ってcoffee-scriptの監視とコンパイル - Qiita](http://qiita.com/mizchi/items/10a8e2b3e6c2c3235e61 "gulpでbrowserify使ってcoffee-scriptの監視とコンパイル - Qiita") の続編

同じ物何度も書くの馬鹿らしいので、スケルトン作った。それなりに満足している。

[mizchi-sandbox/gulp-webapp-skeleton](https://github.com/mizchi-sandbox/gulp-webapp-skeleton "mizchi-sandbox/gulp-webapp-skeleton")

## 特徴

- CoffeeScript
- Browserify
- jade
- sass(libsass)
- bower依存を結合して出力
- タスクごとに監視

## gulpfile.coffee

```coffee
gulp       = require 'gulp'
rename     = require 'gulp-rename'
plumber    = require 'gulp-plumber'
concat     = require 'gulp-concat'
sass       = require 'gulp-sass'
bowerFiles = require "gulp-bower-files"
source     = require 'vinyl-source-stream'
browserify = require 'browserify'

gulp.task 'js', ->
  browserify
    entries: ['./app/initialize.coffee']
    extensions: ['.coffee','.jade', '.js']
  .transform 'coffeeify'
  .transform 'jadeify'
  .bundle()
  .pipe plumber()
  .pipe source 'app.js'
  .pipe gulp.dest 'public'

gulp.task 'vendor', ->
  bowerFiles()
    .pipe plumber()
    .pipe concat('vendor.js')
     .pipe gulp.dest('./public')

gulp.task 'css', ->
  gulp
    .src './app/styles/*.scss'
    .pipe plumber()
    .pipe sass()
    .pipe gulp.dest './public'

gulp.task 'watch', ['build'], ->
  gulp.watch 'app/**/*.coffee', ['js']
  gulp.watch 'app/**/*.jade', ['js']
  gulp.watch 'app/styles/**/*.scss', ['css']
  gulp.watch 'bower_components/**/*.js', ['vendor']

gulp.task 'build', ['vendor', 'js', 'css']
gulp.task 'default', ['build']
```

ディレクトリ

```
$ tree
.
├── README.md
├── app
│   ├── application.coffee
│   ├── initialize.coffee
│   ├── styles
│   │   └── main.scss
│   └── template.jade
├── bower.json
├── gulpfile.coffee
├── package.json
└── public
    ├── app.js
    ├── vendor.js
    ├── main.css
    └── index.html
```

public/index.html

```html
<!DOCTYPE html>
<html>
  <head>
    <title>app</title>
    <meta charset="UTF-8">
    <script type="text/javascript" src="vendor.js"></script>
    <script type="text/javascript" src="app.js"></script>
    <link rel="stylesheet" href="main.css" />
  </head>

  <body>
    <h1>App Skeleton</h1>
  </body>
</html>
```

テストがない。
そういえば、Kobito1.9.2をhomebrew caskでインストールできるようにしときましたよ

タイトル通りなんですが、 homebrew caskで Kobito 1.9.2をインストールできるようにしておきました。
1.9.1のままになってたので。
技術共有じゃなくて、ただの報告です。
以上。
Swiftに関するメモ - Table of contents


* [
Swiftに関するメモ その1 - Overview](http://qiita.com/takkyun/items/080a81a43111387c01fd)
* [Swiftに関するメモ その2 - クラスと構造体](http://qiita.com/takkyun/items/384013e52f404773893b)
* [Swiftに関するメモ その3 - プロパティの監視・メソッドなど](http://qiita.com/takkyun/items/25ae60d0db3c2e531f3b)
* [Swiftに関するメモ その4 - 継承](http://qiita.com/takkyun/items/ddacd2cd8fb5c56a66d9)
* [Swiftに関するメモ その5 - 初期化処理・終了処理](http://qiita.com/takkyun/items/afde067c08bc046ffe53)
* [Swiftに関するメモ その6 - メモリ管理と Optional Chaining](http://qiita.com/takkyun/items/60bd1bbabac60b0706ba)
* [Swiftに関するメモ その7 - 型変換](http://qiita.com/takkyun/items/41a04f37132dbb025c1b)
* [Swiftに関するメモ その8 - ネストされた型](http://qiita.com/takkyun/items/77f356c3133d6e933eef)
* [Swiftに関するメモ その9 - Extensions](http://qiita.com/takkyun/items/7cddea08b87f0671f046)

https://developer.apple.com/swift/ より

[The Swift Programming Language (iBooks Store)](https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11)をざっくり目を通してつらつらと。
CoffeeScript で AngularJS のテストを書くときに気をつけること


module の引数に関数を指定する場合は関数の末尾に null を書かないと死ぬ

## 例

HttpInterceptor のテストを書く場合

```coffee:sample-http.coffee
'use strict'

angular.module('sample.http', [])
  .factory 'sampleHttpInterceptor', ($q) ->
    request: (config) ->
      config or $q.when config
```

```coffee:spec/sample-http.coffee
'use strict'

describe 'Service: sampleHttpInterceptor', ->

  $httpProvider = null

  beforeEach module 'sample.http'
  beforeEach module (_$httpProvider_) ->
    _$httpProvider_.interceptors.push 'sampleHttpInterceptor'
    $httpProvider = _$httpProvider_
    # ここに null とか undefined とか入れないと落ちる
    null

  it 'defined', inject (sampleHttpInterceptor) ->
    expect(sampleHttpInterceptor).toBeDefined()

  it 'intercepted', ->
    expect($httpProvider.interceptors).toContain 'sampleHttpInterceptor'
```

module に渡す関数で null を返さなかった場合はこんな感じのエラーになる

```
 Error: [ng:areq] Argument 'fn' is not a function, got $HttpProvider
        http://errors.angularjs.org/1.3.0-beta.7/ng/areq?p0=fn&p1=not%20a%20function%2C%20got%20%24HttpProvider
```

module に渡す関数でオブジェクトとか返すようにするとダメっぽい。
CoffeeScript だと暗黙的に最後の行を return するので普通に書くと死ぬ。


## 参考

[Mock dep to test service error - Google グループ](https://groups.google.com/forum/#!msg/angular/gCGF_B4eQkc/XjkvbgE9iMcJ)
stubを使ったらDeprecation Warningが出た

```
Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from
```

こんなメッセージが出て、stub使うと怒られる。

```rb
controller.stub(:current_user).and_return(user)
```

こんなstubがあったら

```rb
allow(controller).to receive(:current_user).and_return(user)
```

こんな感じで変更すればOK

追記

raiseしたい場合は

```rb
allow(User).to receive(:find).and_raise(ActiveRecord::RecordNotFound)
```
Xamarin.Forms ページ遷移時のデータ受け渡しについて

Xamarin.Forms では、`NavigationPage(new Firstpage())` でページを呼び出すと、`Navigation.PushAsync(new SecondPage())` でナビゲーションすることができます。`PrepareForSegue` や `StartActivity` は当たり前ですが使いません。

データの受け渡しについて正しい方法かは分かりませんが、引数でデータを渡せましたので、メモとして残します。簡単なアプリであれば単純に渡す方法として大丈夫そうです。

```csharp:FirstPage.cs
var editorName = new Entry {
        Keyboard = Keyboard.Text,
        Placeholder = "Input your name.",
    };
var editorAge = new Entry {  
        Keyboard = Keyboard.Numeric,
        Placeholder = "Input your age.",
    };
var button = new Button {
        Text = "Push me",
        HorizontalOptions = LayoutOptions.Fill,
    };
button.Clicked += (sender, e) =>
    {
        string[] yourData = { editorName.Text, editorAge.Text };
        Navigation.PushAsync(new SecondPage(yourData));
    };
```

Android の EditText、iOS の Text Field に相当する Entry の Text を引数として次のページに渡してみました。

```csharp:SecondPage.cs
public SecondPage(string[] str)
{
    this.Content = new Label { 
        Text = "Your name is " + str[0] + " Your age is " + str[1],
        VerticalOptions = LayoutOptions.Center,
        HorizontalOptions = LayoutOptions.Center
    };
}
```

一応データの受け渡しが出来てます。

![スクリーンショット 2014-06-26 13.33.04.png](https://qiita-image-store.s3.amazonaws.com/0/32453/becc0388-fd26-521d-f875-200a258bc670.png)

![スクリーンショット 2014-06-26 13.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/32453/e4dba855-2a76-0b14-d47d-1a628fcd747e.png)

いいのかな… 

[xamarin-forms/XamarinForms_Navigation at master · ytabuchi/xamarin-forms](https://github.com/ytabuchi/xamarin-forms/tree/master/XamarinForms_Navigation)
にアップしておきましたので、こうじゃね？ってのが分かる方は是非教えて下さい＞＜


 
2014/6/27 追記

[増田さん](http://twitter.com/moonmile) にコメントいただきました。しっかりやる場合は当然 MVVM でやった方が良いとのこと。

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/ytabuchi">@ytabuchi</a> <a href="https://t.co/1L715rsx3S">https://t.co/1L715rsx3S</a> こんな感じでどうでしょう？&#10;App.Model をひとつだけにして、First/Second に取り回すパターン。SetBinding のところは XAML で書くともう少し楽になります。</p>&mdash; Tomoaki Masuda (@moonmile) <a href="https://twitter.com/moonmile/statuses/482060975055437824">2014, 6月 26</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p>xamarin-forms/XamarinForms_NavigationMvvm at master · moonmile/xamarin-forms -- XAML バージョンを追加。こっちのほうが解りやすいと思う。 <a href="https://t.co/1L715rsx3S">https://t.co/1L715rsx3S</a></p>&mdash; Tomoaki Masuda (@moonmile) <a href="https://twitter.com/moonmile/statuses/482096260791287811">2014, 6月 26</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

以上です。
Swiftで文字列長

追記２
っていう追記も古くなりまして。。
Swift2 ではもっとシンプルですね。
aString.characters.count

追記１
下記の記事はちょっと古いです。
Swift 1.2 では count 関数を使って文字列長を求めます
```
println( count( aString ) ) 
```

##utf16count と countElements
NSString にあった```length``` プロパティがSwintのStringには存在せず、代わりに```utf16count```で文字列長を取得するっぽい。
もしくはStringの```bridgeToObjectiveC```メソッドでNSStringに変換して```length```プロパティにアクセスしても同等の挙動になる。

ただ、絵文字が入ってるとちょっと厄介

```
var st = "?"
//NSStringとしてlengthプロパティにアクセス
println( st.bridgeToObjectiveC().length ) //2
//あるいは utf16count
println( st.utf16count )//2
```
ん、2文字？

```
println( st.lengthOfBytesUsingEncoding( NSUTF16StringEncoding )) //4
```

4バイトで表現される絵文字は utf16count ( または NSStringのlength ) プロパティ経由だと2文字としてカウントされてる...
ちょっと調べてみたところ、NSStringのlengthはUTF-16を2バイトコードとみなしてカウントしちゃってるっぽい。これはObjective-C NSStringの元々の挙動であり、Swiftでも互換性を保ってるという事らしいね。

```
println( countElements( st3 ) ) // 1
```
Swiftでは```countElements```というグローバル関数が提供されており、文字列の各文字それぞれが、2バイト or 3バイト or 4バイト であるのかをチェックしてカウントしてくれるそうな。
ただ、重たそうなので長い文字列のカウントは注意したほうが良いとの事。