OmniAICreator/Qiita-1.07M huggingface dataset:
before_validationの罠

```ruby:user.rb
class User < ActiveRecord::Base
  attr_accessor :fullname
  before_validation :split_name

  validate :email, presence: true

  def split_name
    if @full_name.include?(' ')
      array = @full_name.split(' ')
      first_name = array.first
      last_name = array.last
    end
  end
end
```

こんなコードを書いて、

```ruby:test.rb
@user = User.new fullname: 'Steve Jobs', email: 'jobs@example.com'
user.save
p @user.first_name # => "Steve"
p @user.last_name # => "Jobs"
```

こんなのよくありますよね。
ところが、こんな感じのコードで ```' '``` を含まないfull_nameを入れたら、バリデーションが通らなくてハマりました。
full_nameはバリデーションしていないし、@user.errors.full_messagesは空の配列で何も出てきません。
なのに@user.valid?はfalseを返し、@user.save!は例外になりました。しかし、rails consoleでバリデーションを個別に実行すると全部通ります。一体何なんだ？？？

実は、before_validationがfalseを返していると、実際には全てのバリデーションが通っているにも関わらず、vaid?もfalseを返し、バリデーションが失敗するのでした。
この場合、 ```@full_name.include?(' ')``` がfalseになると、split_nameメソッドの戻り値がfalseになり、従ってバリデーションも失敗します。
つまり、

```ruby:user.rb
# 省略
  def split_name
    if @full_name.include?(' ')
      array = @full_name.split(' ')
      first_name = array.first
      last_name = array.last
    else
      true
    end
  end
```

が正解。
全然知らなかった・・・

[こちらのブログ](http://itakeshi.hatenablog.com/entry/2014/01/05/142533)が突破口になりました。ありがとうございました。
expect change を複数データ同時にTESTしたいときに


expect change を複数データ同時にTESTしたいときなどがあります。
そんな時には以下のようにするとできます。(例はあまり適切ではありません...)

```ruby
expect{ execute }.to change{ [User.find_by(id: 1).coin, User.find_by(id: 1).skill] }.from([100, 0]).to([0, 1])
```

### Ref.
* [Rspec expect to change record value](http://blog.houen.net/rspec-expect-change-record-value/)
サーバのデータ移行で使うコマンドをまとめる

# 利用するコマンド

* tar ->圧縮&解凍
* df  ->ディスクの容量チェック
* du  ->ディレクトリの容量チェック
* wget ->ファイル転送
* scp ->ファイル転送
* sync ->ファイル転送


# 実行例

**ファイルを圧縮**

```
tar zcvf backup.tar.gz file1 file2
```

**ファイルを解凍**

```
tar zxvf filename
```

**ディスクの容量チェック**

```
 df -h
# -h => 人間が読みやすいかたち
```

**ディレクトリの容量チェック**

```
du -s -h [ディレクトリ]
# -s =>引数の合計容量, -h =>人間が読みやすいかたち
```

**転送系(wget)**

```
wget http://xxx.xxx.xxx.xxx./[filename]
```

**転送系(scp)**

```
 scp -i ~/.ssh/id_rsa -P 2022 -r [ディレクリ名] user@xxx.xxx.xxx.xxx:/tmp/
```

**転送系(rsync)**

```
 rsync -avzhe "ssh -i /home/user/.ssh/id_rsa"  --progress --partial --append  [ディレクトリ名] user@xxx.xxx.xxx.xxx:/tmp/
```
Erlang开发环境在Mac中的配置

## 安装Erlang
[Erlang下载地址](http://www.erlang.org/download "")
Mac选择源码安装
```
cd erlangSourcePath
./configure
make
sudo make install
```
## 安装Idea
在插件处找到Erlang的插件，安装重启。
配置erlang
* [rebar配置与其他系统不同](http://zodiacg.net/2013/05/set-path-under-mac/),需要[配置Path](http://qiita.com/aliu/items/910a1e54159e7467bc3b)后重启电脑
  ```
vim /etc/launchd.conf
setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin 
```
あると便利かも: JSONからオブジェクトを作る部分をJavaScriptで書けるAndroid用JSONパーサーの代替


最近Androidアプリの人とプロトタイピングしてて、APIのモック的なものを静的ファイルで置いておくようなことをやった。

自分はJavaScriptのような、JSONを扱うのにあまり困らない言語の人なので、

> AのAPIとしてこのファイル使って、BのAPIとしてこのファイル使ってね。ちょっとJSONの形違うけどそこらへんよしなにお願い

みたいな感じでカジュアルに言ってAndroidの人が発狂しそうになってた。

別々のモデル定義してJSONパーサーに渡して本来のモデルに変換するということをしてたはずなので、そりゃ面倒だわというのは理解できるんだけど、そもそもJavaのような言語でJSONが扱いにくすぎるのをなんとかしたい。

そこで、JSONを受け取ってインスタンスに変換するような部分だけをJavaScript（など）で書けるようなパーサーがあっても良いのではないかと思った。

Javaよく知らないけどこんな感じかな？

```java
class FooModel
{
	/**
	 *
	 * @factory FooModel factoryByJson1
`
function(json, initializer) {
	obj = JSON.parse(json);
	return initializer(obj.a, obj.b.c, obj.b.d);
}
`
	 *
	 * @factory []FooModel factoryMultiByJson1
`
function(json, initializer) {
	ary = JSON.parse(json);
	return ary.map(function(obj){
		return initializer(obj.a, obj.b_c, obj.b_d);
	})
}
`
	 *
	 */	
	FooModel(String foo, String bar, Integer baz) {
		//
	}
}
```

使うときはこう

```java
String json = apiClient.getResponseText();
FooModel foo = FooModel.factoryByJson1(json);
```

JSONのパースというのはそもそも非決定的な処理なので、静的な言語側でJsonArrayとかJsonStringとか非決定的な要素を扱う機構を作るのではなく、どちみち非決定的なんだから「JavaScript呼び出し」のような非決定的な処理で包んでしまって、静的な言語のほうでは決定的になった部分だけを扱えばラクになるのかなーと。
cocos2d-xでコンパイルエラーが出た時の対応


## バージョン

cocos2d-x 3.2
Xcode 6.1

## コンパイルエラー その1

### 現象

Xcodeをバージョンアップした(勝手にバージョンアップされた)あとに、コンパイルエラーが発生

```
cocos2d/flappy-bird/cocos2d/cocos/base/CCRef.h:41:1: Unknown type name 'class'; did you mean 'Class'?
```

### 対応方法

Apple LLVM 6.0 - LanguageのCompile Sources AsをObjective-C++に設定

## コンパイルエラー その2

### 現象

```
Reference to “Point” is ambiguous in MacTypes.h
Reference to “Rect” is ambiguous in MacTypes.h
```

### 対応方法

cocos2d-xのPointとRectがMacType.hと重複しているので、USING_NS_CC を使わずにcocos2d::Sprite::createに全部変更する

面倒くせぇ…
なぜか夜中にヒンディー語の入ったファイルを修正しないといけない場合の対応策

人間長い間生きていると、一度くらい夜中にヒンディー語の入ったファイルを修正する必要がでてきます。

手持ち(Windows)のサクラエディタや、vimでは残念ながらインドの偉大な英知を表示してくれはしませんでした。

ここでは、夜中にヒンディー語を修正するはめになり、かつ、グーグル先生に聞いてクールな多言語対応のエディタを探してインストールする余裕もないときに、どう対応すべきかを記述します。


ここでは、ブラウザー経由でヒンディー語の入ったファイルを修正してファイルに保存するようにします。

```html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="./js/jquery-1.11.1.min.js"  type="text/javascript"></script>

<script type="text/javascript">
$(function() {
  $(document).ready(function(){
  });
}); 
function loadFile() {
  var fs = document.getElementById('inputFile').files;
  var f = fs[0];
  var reader = new FileReader();
  reader.onload = function(event) {
    $('#contents').val(event.target.result);
  };
  reader.onerror = function (event){
    // 読み込み失敗時の処理を指定
    alert('load error.');
  }; 
  console.log(reader.readAsText(f));
}

function saveFile() {
  var txt = $('#contents').val();
  window.location.href = 'data:application/octet-stream,' +
                         encodeURIComponent(txt);
}


</script>
</head>
<body>
<textarea id="contents" rows="4" cols="40"></textarea><br>
<input type="file" id="inputFile"  onchange="loadFile()" ><br>
<input type="button" value="save" onClick="saveFile()"/><br/>
</body>
</html>

```

このように、FileReaderを使ってファイルをブラウザのTEXTAREAに表示します。
ブラウザは流石、たいていの文字は表示・編集できるので、そこで、任意の編集を加えます。
最後は、data:application/octet-streamを使用して、TEXTAREAの中身をダウンロードします。
残念ながら、ファイル名の変更はできませんので、ダウンロード後、自分でリネームして上書きしてください。

http://needtec.sakura.ne.jp/mtm/multiLangEditor.html

![ヒンディー語.png](https://qiita-image-store.s3.amazonaws.com/0/47856/311f6f77-7d6c-7adc-31b1-56e61807dc79.png)

 **やったね、たえちゃん、ヒンディー語が保存できたよ！** 

たぶん、ロシア語だろうが、アラビア語だろうが、ブラウザが表示できるなら編集できると思います。


・
・
・
 **追記：** 
なお、MacOSのデフォルトのテキストエディタや、miだとヒンディー語表示できました。

Windowsの場合は、改行コードがCRLFになってしまうのと、UTF８のBOMがついてしまうのを気にしなければメモ帳でヒンディー語をひらいて編集できます。

もし、それが嫌な場合はVisualStudioでファイルを開くと、BOMなし、改行コードLFでヒンディー語を編集できます。
コマンドプロンプトでlinuxコマンドを使用できるようにしてみた

# 概要
普段、linuxで作業していると、
コマンドプロンプトが不便すぎてしょうがないと思う。
そこで、コマンドプロンプトで
linuxコマンドを使用できるツールがあるとのことで使ってみた。


## Linuxコマンドを使用できるようにする
「Gow」というツールをインストールします。
https://github.com/downloads/bmatzelle/gow/Gow-0.7.0.exe

環境変数のPathへの追加も自動でしてくれるため、
デフォルトインストールでOK。

インストール後、コマンドプロンプトを起動して下記コマンドを実行すると
使用できるLinuxコマンドが確認できます。

<pre>
C:\>gow -l
Available executables:

  awk, basename, bash, bc, bison, bunzip2, bzip2, bzip2recover, cat,
  chgrp, chmod, chown, chroot, cksum, clear, cp, csplit, curl, cut, dc,
  dd, df, diff, diff3, dirname, dos2unix, du, egrep, env, expand, expr,
  factor, fgrep, flex, fmt, fold, gawk, gfind, gow, grep, gsar, gzip,
  head, hostid, hostname, id, indent, install, join, jwhois, less,
  lesskey, ln, ls, m4, make, md5sum, mkdir, mkfifo, mknod, mv, ncftp, nl,
  od, pageant, paste, patch, pathchk, plink, pr, printenv, printf, pscp,
  psftp, putty, puttygen, pwd, rm, rmdir, scp, sdiff, sed, seq, sftp,
  sha1sum, shar, sleep, sort, split, ssh, su, sum, sync, tac, tail, tar,
  tee, test, touch, tr, uname, unexpand, uniq, unix2dos, unlink, unrar,
  unshar, uudecode, uuencode, vim, wc, wget, whereis, which, whoami,
  xargs, yes, zip

C:\>
</pre>


## bashに似たシェル環境を使用できるようにする
「clink」というツールをインストールします。
https://github.com/mridgers/clink/releases/download/0.4.2/clink_0.4.2_setup.exe

これもデフォルトインストールでOK。
このツールが備える機能は下記の通り。

<pre>
・GNU readlineを実装し、bashと同じショートカットキーを利用可能
・[Tab]キーによるパスおよびファイル名補完機能
・[Ctrl] + [V]によるクリップボードからの貼り付け機能
・環境変数を利用した実行ファイルの利用
・[Ctrl] + [_]キー or [Ctrl] + [X]キー→[Ctrl] + [U]キーによる「元に戻す」「やり直す」
・セッション間の保持や検索機能、ヒストリー展開をサポート
・スクリプト言語として「Lua」をサポート
</pre>

このツールのおかげで[Ctrl] + [L]キーで画面クリアや、[Ctrl] + [R]キーで後方検索ができるようになります。
補足として「clink」をインストールするとコマンドプロンプトの初期表示画面の文言が少し変わります。

![cmd_before_after.png](https://qiita-image-store.s3.amazonaws.com/0/53476/827d9fd3-d10f-68ad-8b9c-3d9f984c8711.png)


とりあえず、これで不便すぎてしょうがなかったコマンドプロンプトが使いやすくなると思います。

以上！
CLIでSPDYを利用してHTTPS通信がしたい

CLIでHTTPS(やHTTP)で通信したいときはcurlやwgetをよく使う。

```
$ curl https://127.0.0.1/index.html
$ wget https://127.0.0.1/download/hoge.zip
```

今回はちょっとCLIでSPDYを使ってデバッグしたいことがあったんだけど、手元のcurlやwgetだとまだサポートされてないようなので、CLIでSPDYを使って通信できるツールを探して使ってみた。(最新のcurlなら--http2というオプションがあるので使えるかもしれない)

## [spdylay](https://github.com/tatsuhiro-t/spdylay)

今回はspdylayというのを使ってみた。とりあえずビルド。

```
$ git clone https://github.com/tatsuhiro-t/spdylay
$ autoreconf -i
$ automake
$ autoconf
$ ./configure
$ make
```

srcディレクトリに`spdycat`というバイナリができるのでこれを使う。

```
$ cd src
$ ./spdycat --spdy3-1 https://127.0.0.1/
```

これでCLIでもSPDYで通信できるようになった。
楕円弧長計算

こんにちは。
楕円弧長は、下記の第二種不完全楕円積分で表されます。与えられた緯度に対し赤道からの子午線弧長です。

プログラムでは小さい扁平率を仮定し、倍精度浮動小数点数に現れない$n^7$（第三扁平率の冪乗）以上の級数展開項は近似で切り捨てています。このベッセルの級数式は優れた収束ですね。これの級数係数の計算については[分数の表示（リスト）](http://qiita.com/kkdd/items/d3eda81b69610201279d "浮動小数点数のリストの表示出力")。参考：https://en.wikipedia.org/wiki/Meridian_arc#Expansions_in_the_third_flattening_.28n.29


```math  
\textrm{An elliptic arc length formula from a modification of Bessel (1825)}\\
\begin{aligned}
m(\varphi) &= \int_0^\varphi M(\varphi) d\varphi \\ 
 &=\frac{a}{1+n}\left( \int_0^\varphi \sqrt{1+2n\cos2\varphi+n^2} \, d\varphi - \frac{2n \sin2\varphi}{\sqrt{1 + 2n \cos2\varphi + n^2}} \right) \\
 &=\frac{a}{1+n}\left( c_0 \, \varphi + \sum_{l=1}^\infty c_l \, l^{-1}  \sin 2 l \varphi - \frac{2n \sin2\varphi}{\sqrt{1 + 2n \cos2\varphi + n^2}} \right) \\
M(\varphi) &= \frac{a(1-e^2)}{(1-e^2\sin^2\varphi)^{3/2}} \\
e^2 &= \frac{4 n}{\left(1+n\right)^2} \\
c_l &= n^l \sum_{j=0}^\infty n^{2j} \binom{1/2}{j} \, \binom{1/2}{j+l}  
\end{aligned}
```

```python
import math
DEGREE = math.pi / 180
PIHALF = math.pi / 2

# Bessel (1825); elliptic (meridian) arc; incomplete integral
def meridanArc(lat, n):
    n2 = n * n
    coef = [1, 1/4., 1/64., 1/256.]
    ma = lat * poly(n2, coef)
    if lat != PIHALF:  # PIHALF: complete integral
        coef = [[1/2., -1/16., -1/128.], [-1/16., 1/64., 5/2048.], [1/48., -5/768.], [-5/512., 7/2048.], [7/1280.], [-7/2048.],]
        nn, cs, cslat2 = 1, csmake(0), csmake(lat*2)
        for c in coef:
            nn *= n  # n**(i+1)
            cs = csadd(cs, cslat2)  # cos(lat*2*(i+1))
            ma += nn * cs['sin'] * poly(n2, c)
        ma -= 2*n*cslat2['sin']/math.sqrt(1+2*n*cslat2['cos']+n2)
    return ma / (1 + n)

def poly(x, coef):
    sum = 0.0
    for a in coef[::-1]:
        sum = a + sum * x
    return sum

def csmake(arg):
    c, s = math.cos(arg), math.sin(arg)
    return {'cos': c, 'sin': s}

def csadd(cs1, cs2):
    c = cs1['cos']*cs2['cos'] - cs1['sin']*cs2['sin']
    s = cs1['sin']*cs2['cos'] + cs1['cos']*cs2['sin']
    return {'cos': c, 'sin': s}

def main():
    RE = 6378137.0  # GRS80
    f = 1/298.257222101  # GRS80
    n = f / (2 - f)   # the third flattening
    for lat in range(0,100,10):
        ma = meridanArc(lat*DEGREE, n)
        print "%4.1f degree: %12.3f m" % (lat, RE*ma)
```

出力結果

```
 0.0 degree:        0.000 m
10.0 degree:  1105854.833 m
20.0 degree:  2212366.254 m
30.0 degree:  3320113.398 m
40.0 degree:  4429529.030 m
50.0 degree:  5540847.042 m
60.0 degree:  6654072.819 m
70.0 degree:  7768980.728 m
80.0 degree:  8885139.872 m
90.0 degree: 10001965.729 m
```
イベント開催ツールとgoogleカレンダーを連動する(atnd,connpass)

atndがちょっとめんどくさかったのでメモ

こちらのブログ様を参考にしました。

<pre>
Keep on moving
ATNDの予定をGoogle Calendarに登録する多分一番簡単な方法
http://masahito.hatenablog.com/entry/20091225/1261758685
</pre>

# atndの予定をgoogleカレンダーに登録する
まずはatnd APIを使って自分のカレンダーをiCal形式で取得する。
<pre>
http://api.atnd.org/events/?user_id=[ATNDのユーザーID]&count=100&format=ics
</pre>

- 自分のATNDユーザIDを調べる方法
ATNDトップページの名前を押します。
![atnd1.png](https://qiita-image-store.s3.amazonaws.com/0/57077/ba64c087-7c8f-113a-5a77-ddd8a86407a2.png)

アクセスした先のURLの/users/***に入ってる数字です。
![atnd2.png](https://qiita-image-store.s3.amazonaws.com/0/57077/f158ce0d-798b-2b65-89b1-3fd8e4d11a1a.png)

APIのURLが出来たらgoogleカレンダーの
他のカレンダー→追加→URLで追加でAPIのURLを指定して追加すれば完了です。
![atnd3.png](https://qiita-image-store.s3.amazonaws.com/0/57077/03942487-8524-d37e-ec2d-bb03fcdd0baf.png)

# connpassの予定をgoogleカレンダーに登録する
こちらは簡単。まずは使いたいgoogleカレンダーのgoogle+にログインします。

connpassのトップから「利用設定」を押します。
![cnps.png](https://qiita-image-store.s3.amazonaws.com/0/57077/c61c7164-16f5-0c39-17ce-d6a903a5589f.png)

画面中部の「カレンダー連携」より「googleカレンダーと連携する」

![cnps2.png](https://qiita-image-store.s3.amazonaws.com/0/57077/3b3da5d9-5952-7e88-0471-7c03fba9e308.png)

これだけで完了です。
Heroku に master 以外のブランチをpushする

Herokuに特定のブランチをpushしました。やり方としては以下のようにブランチを指定します。

# Heroku にブランチを push 
ブランチをpushする書き方は以下のようになります。

```bash:ブランチをpushする書き方
git push app名 ブランチ名:master
```
実際に指定した場合の例です。

```bash:ブランチをpushする例
git push pugi-02 pugi-branch:master
```
pushしたらちゃんとpugi-branchがpushされました(☝ ՞ਊ ՞)
Bacon.jsを利用した実装にコールバックベースの処理を組み込む

## 何が問題か
Bacon.jsで何らかの実装をする時、同期的なAPIのライブラリなどなら普通にsubscriberなどの中で使ってストリームに流していけばいいのだが、非同期処理のためのコールバックベースなAPIの場合Bacon.Observable.onValueやmapなどの基本的な利用だけではうまく組み込むことができない。

例えば、File APIのFileReaderはBacon.jsでどうやって扱えばよいか?

## 指針
Bacon.jsで何か困ったら、基本的には「やろうとしていることを、どうやってストリーム(とプロパティ)という概念で解決することができるか」と考えると考えやすい。やりたいことを逐次的に実行し相互に呼び合うような処理を実装するというよりも、常に、入力―変換―出力(―消費)を行うストリームを定義していきそれを接続していくような考え方になる。

なので、きれいに書かれたBacon.jsのコードは処理の記述というよりは配線図に近い印象になる。あるいはピタゴラ装置。

FileReaderであれば、「ファイル名を入力としてファイルの内容を出力するストリーム」を定義すればよさそうだ。では、コールバックベースのAPIを利用してBacon.jsでどうすればそれを実現できるのか?

## Bacon.fromCallback
Bacon.jsは、色々なシチュエーションに応じて新しくストリームを生成するfrom***系のAPIを提供している。端的に言って、大体コールバックベースのAPIの場合はBacon.fromCallbackを利用すれば問題を解決できるだろう。

例えば、FileReaderとBacon.fromCallbackを用いて「ファイル名を入力としてファイルの内容を出力するストリーム」の最低限の定義をするなら以下のような実装が考えられるだろう。やっていることは、Promise系の実装からのキャッチアップとほぼ同じになる。

```js
function readFile(fileName) {
    return Bacon.fromCallback(function(callback) {
        var reader = new FileReader();
        reader.onload = function() {
            callback(reader.result);
        };
        reader.onerror = function() {
            callback(new Bacon.Error(reader.error));
        };
        reader.readAsText(fileName);
    });
}
```

readFileは、fileNameで指定されたファイルの内容を出力するストリームを生成して返す。Bacon.fromCallbackの指定した関数の引数であるcallbackは、このreadFileが生成したストリームのsubscriberとして指定(つまりBacon.Observable.onValueやmapなどに指定)された関数と考えればよい。読み込みに失敗した場合のcallbackは、Bacon.Observable.onErrorやmapErrorなど異常系のsubscriberが実行される。

これでFileReaderはBacon.jsのコンテキストで使えるようになったので、例えば以下のようにシームレスに組み込むことができるようになる。

```js
var fileSelectionStream = $('fileSelection')
    .asEventStream('change')
    .map('.target.files.0')
    .flatMap(readFile);

fileSelectionStream.onValue(function(contents) {
    // something about file contents...
});

fileSelectionStream.onError(function(e) {
    // error handling...
};
```

## 終わり
Bacon.jsを用いてあらゆるものをストリーム化しましょう。
Yosemiteにアップデートで出たエラー達

Yosemiteにアップデートしたら周知の通りエラーが山ほど出たのでその対処法をいくつか抜粋して記載。

##brewまわり

**エラー１**
brew doctorで出た。

```:エラー
Error: Permission denied - /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-14
```

```:対処法
sudo rm -rf /Library/Ruby/Gems/*
sudo gem update –system
```

**エラー２**
brew doctorで出た。

```:エラー
Warning: Some installed formula are missing dependencies.
You should `brew install` the missing dependencies:

    brew install icu4c

Run `brew missing` for more details.
```

```:対処法
brew install icu4c
```

**エラー３**
brew doctorで出た。

```:エラー
Warning: Your Xcode (6.0) is outdated
Please update to Xcode 6.1.
Xcode can be updated from the App Store.
```

これに関してはXcodeをアップデートすればよい。

**エラー４**

apacheが動かない。
というかhttpd以下が消えていたのでインストールし直した。
せっかくなのでapache2.4をいれる。

```:対処法
brew tap homebrew/dupes
brew tap homebrew/apache
brew install httpd24

```

##gruntまわり

**エラー１**

grunt-contrib-compassでビルド時にエラーが出る。
これはgrunt-contrib-compassに限らずgemがうまく動いていないよう。

```:エラー
Warning: Command failed: /Library/Ruby/Site/2.0.0/rubygems/dependency.rb:298:in `to_specs': Could not find 'compass' (>= 0) among 4 total gem(s) (Gem::LoadError)
	from /Library/Ruby/Site/2.0.0/rubygems/dependency.rb:309:in `to_spec'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_gem.rb:53:in `gem'
	from /usr/bin/compass:22:in `<main>'

/Library/Ruby/Site/2.0.0/rubygems/dependency.rb:298:in `to_specs': Could not find 'compass' (>= 0) among 4 total gem(s) (Gem::LoadError)
	from /Library/Ruby/Site/2.0.0/rubygems/dependency.rb:309:in `to_spec'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_gem.rb:53:in `gem'
	from /usr/bin/compass:22:in `<main>'
Warning: ↑
```

rbenvを使っていれば以下のようにしてrubyを入れなおす。
rubyのバージョンは多分任意。

```:対処法
RUBY_CONFIGURE_OPTS="--without-gcc --disable-install-rdoc" rbenv install 2.1.3
rbenv global 2.1.3
gem install compass
```
Ansible の設定ファイルを見てみる

※Ansible を始めて日が浅いので最新のバージョン（1.7.2）でしかチェックしていません。
※CentOSでしか確認していません。誰か他のOSでチェックしたらコメントに残してくれるとみんな助かっていいと思う。

日本語でAnsibleの情報をぐぐってると設定ファイルについてわかりやすく説明してくれてるところが見当たらなかったので誰かそのうち見るかもしれないと思ってメモしてみる。

http://docs.ansible.com/intro_configuration.html

書いてあることはこれで全部のはずだと思うけど、英語読むのが面倒だから日本語でぐぐるんだよね。

こまけぇこたぁいいんだよ、ばりに、こうしとけって書いてくれればいいのに、と常々思ってたので、その通り書いてみる。

とりあえず、設定ファイルは ansible.cfg って名前で、検索順序が決まってるみたいだけど、/etc とかに置かれても作業が面倒なので、自分のプロジェクトディレクトリ（管理するサーバ群のプロジェクトでgitリポジトリくらい作るでしょ？）に、おもむろに下記をコピー。

https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
(先のリンクに乗ってます)

あとはこの ansible.cfg を置いたディレクトリで、ベストプラクティスどおりにファイルを構成すればよろしい。
要は<a href="http://docs.ansible.com/playbooks_best_practices.html">ベストプラクティス</a>のページの一番上に ansible.cfg って書いておけばいいじゃんよって話。

そしたらこの設定ファイルの修正ポイントを書いておく（先の英語のページに書いてあることだけど）

* hostfile = ./inventory/dev

この設定ファイルから見て相対位置に Inventory ファイル（インベントリーファイルって書くなら設定名もinventoryfileとかにすればいいと思うのはダメなのかな）のパスを書いておくと、実行時にいちいち -i とかしないで済む（これは楽でいい。そしてこれがこの記事の一番おいしいところだ）

個人的に、環境毎にファイルを分けて作って、実行ミスを減らしたいので、ベストプラクティスのディレクトリ構成に、 inventory ディレクトリを作って、環境ごとのファイルを作って切り替えて使ってる。dev,sandbox,staging,share,prod など。

* timeout = 1800

ssh のタイムアウトらしい。初期構築のつもりで長いインストールを含む処理をしてると切れた時があったので、適当に長い値にした。

* log_path = /tmp/run_ansible.log

実行時ログを残す。/var/log でもいいんだけど、テスト段階では /tmp のほうが早く捨ててもらえるので位置を変えた。

* pipelining = True

sudo の設定しておかないといけないけどこっちのほうが早いらしいので。

* ansible_managed = Ansible managed: {file} modified by {uid} on {host}

日付をけずった。
値的には修正のないファイルでも変更扱いになってしまって、<a href="http://qiita.com/raki/items/297b245800f63b000797">前記事</a>で書いた md5 による比較が効かなくなってしまったので。

とりあえずこれ以外の値は弄らないでも問題ないみたい。むしろ弄るなって感じだけども。
Elixir Functions returns Functions

# Elixir Functions returns Functions

## 概要
Elixir の Functions から Functions の返却について。

## サンプル
2つの数値を合計して、基数を指定して返却する関数を返却する
関数を作成します。

~~~
sum_to_s_f = fn (base) -> 
  fn (a, b) ->
     Integer.to_string(a + b, base)
  end
end
IO.puts sum_to_s_f.(10).(10, 6)
IO.puts sum_to_s_f.(2).(10, 6)
IO.puts sum_to_s_f.(8).(10, 6)
IO.puts sum_to_s_f.(16).(10, 6)
IO.puts sum_to_s_f.(36).(10, 6)
~~~

* 出力

~~~
16
10000
20
10
G
~~~
heroku openしたときにMultiple apps in folder and no app specified.と言われる解決方法

herokuにおいてあるサービスをブラウザで見たいと考えました。

# heroku openができない
heroku openコマンドでブラウザで確認します。

```bash:openが失敗
heroku open
 !    Multiple apps in folder and no app specified.
 !    Specify app with --app APP.
```
appが複数あるので--appでAPPを具体的に書けと言われます。

# app名をリストで表示
そもそも現在appが何個あるかわからないので確認します。

```bash:アプリを確認
heroku list
=== My Apps
pugi
pugi-01
pugi-02
```
どうやら3つappがあるみたいです。

# appを指定してheroku open
--appを指定してheroku openを試します。

```bash:appを指定してopen
heroku open --app pugi-01
```
ちゃんとブラウザで表示できました(☝ ՞ਊ ՞)☝
仮想DOMライブラリの「virtual-dom」だけでMV*なビューを書く



[virtual-dom](https://github.com/Matt-Esch/virtual-dom/)という、（その名の通り）仮想DOMの生成とdiffを行うシンプルなJavaScriptのライブラリがあります。

[GitHubのexample](https://github.com/Matt-Esch/virtual-dom/#example)を見るとわかるのですが、このライブラリのみでも、シンプルな形で動的なビューを実現することができます。

このシンプルさがとても魅力的で、実際に使ってみたのですが、
分かったことをまとめたいと思います。

# 仮想DOMって？

[React](http://facebook.github.io/react/)などで以前から採用されていて、最近流行している感じの **仮想DOM** ですが、

* 重い本物のDOMとは別に、仮想のDOM（ただのJSオブジェクトなので軽い）のツリーを構築する
* 仮想DOMの構築を状態が変更されるたびに行って、前回の仮想DOMとのdiffをとって実DOMに適用する

という形で動的なビューの実現に利用されます。

仮想であるので、ブラウザ上だけではなくサーバーサイドのHTMLレンダリングにも使えます。

# 例

## カウンタの例

* カウンタのview model `counter`を用意する
* データを元にビューをレンダリングする処理 `render` を記述
* 最初に仮想DOMから実DOMを生成
* 次からは仮想DOMの変更を調べてパッチを当てる

という流れでMV*っぽいシンプルなカウンタを記述してみます。

[![view on requirebin](http://requirebin.com/badge.png)](http://requirebin.com/?gist=ff41f66988bc5b478ca1)

```js
var h = require('virtual-dom/h');
var diff = require('virtual-dom/diff');
var patch = require('virtual-dom/patch');
var createElement = require('virtual-dom/create-element');

// ビューをアップデート
function update() {
	var newTree = render(counter);
  var patches = diff(tree, newTree);
  patch(node, patches);
  tree = newTree;
}

// 仮想DOMを生成（レンダリング）
function render(counter) {
  return h('div', [
    h('p', String(counter.value)),
    h('button', {onclick: function () { counter.increment(); }}, 'Increment')
   ]);
}

var counter = {
  value: 0,
  increment: function () {
    this.value += 1;
    update();
  }
};

var tree = render(counter);
var node = createElement(tree);
document.body.appendChild(node);
```


# 使い方

virtual-domはnpmからのインストールが前提となっているようなので、Browserifyやwebpack経由でインストールします。

すぐに試したいなら、Browserifyを使ったコードをオンラインですぐ実行できる[RequireBin](http://requirebin.com/)がすごく便利です。

# わかったこと

主に **Vue.jsやKnockout.jsなど、直接DOMにデータバインドする形のライブラリ・フレームワークとの比較** で書いていきたいと思います。

## シンプルでやっていることがわかりやすい

直接DOMにデータバインドするライブラリの実装はブラックボックスになりがちですが、
virtual-domは仮想DOMの生成・比較・適用だけでビュー操作のすべてが表されるので、とても明快です。
virtual-dom自体も小さなライブラリで、すぐにコードを読めてしまいます。

## ビューに渡すデータの構造が自由

データバインド系フレームワークだと、データの変更を検知し、他の値に依存した値(computed propertyのような)を追従させるために、
ビューに渡すデータに制約が加わることが多いと思うのですが、(Vue.jsだとJSONとして有効なデータに制限される、Knockout.jsだと`ko.observable`のような特別な値を使わないといけない、など…)

virtual-domの場合、何かしらの値が変わった時に全ビューを手動更新するだけでよいので、その制限が取り払われるのが便利です。

特に、木構造のような複雑なデータ構造を扱いたい場合、素のJSのデータが扱えるのがすごく有り難くなります。

## エラーがわかりやすい

ビューの生成プロセスが、実DOMや複雑なデータバインドの絡まないレンダリング処理に集約されるので、エラーが非常にわかりやすくなるのが嬉しいです。
これは仮想DOM自体の大きな利点だと言われているようです。

## サーバーサイドのHTMLレンダリングに似てる？

毎回ビューを生成するという考え方は、サーバーサイドのHTMLテンプレートのレンダリングに似ているので、サーバーサイドの人にとって分かりやすいかもしれません。

## JSでビューを記述しないといけない

データバインド系ライブラリの場合、動的なビューの記述はHTML上に宣言的に行うことができるのとは対照的になります。
自由度が高くなる反面、ビューに複雑なロジックが入って来てしまい可読性を保つのが難しくなりそうです。

# まとめ

virtual-domを使ってプリミティブな動的ビューを記述するような手法はメジャーな方法とは言いがたいですが、メリットも多くあることがわかりました。

virtual-domのような仮想DOMシステムをベースに色々なものを作ってみるのも面白そうと感じました。(virtual-domをベースに作られたフレームワークの[mercury](https://github.com/Raynos/mercury)などが代表例ですね)
RubyでSTDINやSTDOUTを活用できるCLIツールを書く

CLIツールを作るとき、UNIX哲学が好きな人は、
パイプを活用できるように、STDINから入力を取得したいし、STDOUTへ出力したいですよね。

サンプルとして、STDINから取得した文字列をキャメルケースにしたり、スネークケースにしたりしてSTDOUTに出力するコマンドを作ってみます。

こんなイメージのCLIツールを作ってみます。

    $ cat 'hello_world' | mycommand camelize
    HelloWorld

    $ cat 'HelloWorld' | mycommand snake
    hello_world

パイプでつなげるので

    $ cat 'hello_world' | mycommand camelize | mycommand snake
    hello_world

という無駄なこともできます。

## bundler gem で雛形を作成する

まずは`bundler gem`コマンドで雛形を作成します。

    $ bundler gem mycommand

CLIツールを簡単に作れるgemの[Thor](http://whatisthor.com/)を利用するので、`mycommand.gemspec`ファイルに`thor`を追加します。

    spec.add_dependency "thor"

とりあえず`bundle`を叩いてThorをインストールしておきます。

    $ bundle

`lib/mycommand.rb`を書きます。コマンドは`camelize`と`snake`を作ります。

```ruby
require "mycommand/version"
require "thor"

module Mycommand
  class CLI < Thor

    desc "echo 'hello_world' | mycommand camelize", "Camelize STDIN"
    def camelize()
      stdin = stdin_read
      puts stdin.split('_').map{|s| s.capitalize}.join('')
    end

    desc "echo 'HelloWorld' | mycommand snake", "Snakecase STDIN"
    def snake()
      stdin = stdin_read
      puts stdin.split(/(?![a-z])(?=[A-Z])/).map{|s| s.downcase}.join('_')
    end

    private
    def stdin_read()
      return $stdin.read
    end

  end
end
```

`bin/mycommand`も書きます。

    #!/usr/bin/env ruby

    require 'mycommand'
    Mycommand::CLI.start

## コマンドを試してみる

`bin/mycommand`に実行権限を与えます。

    $ chmod +x bin/mycommand

コマンド実行を試してみます

    $ echo 'hello_world' | bundle exec bin/mycommand camelize
    HelloWorld

    $ echo 'HelloWorld' | bundle exec bin/mycommand snake
    hello_world'

    $ echo 'hello_world' | bundle exec bin/mycommand camelize | bundle exec bin/mycommand snake
    hello_world'

できました！

あとは、必要に応じて`mycommand.gemspec`ファイルのTODOを修正して `bundle exec rake install` なりしてしまえばSTDINを入力として受け取れる`mycommand`ができます。

## というわけで

良いCLIツールライフを！

## 参考URL

- http://whatisthor.com/
- http://blog.cles.jp/item/3178
【備忘録】オブジェクト指向を理解してみる【参考例まとめ】



本格的にObjective-cでiosアプリを作ろうぜ！
ということになりまして、Titaniumから飛び出してxcodeを触っているのですが

真剣にオブジェクト指向の言語を触るのは実は初めてで
なんとなーくのコピペでjavaを使っていてはなんともなりません（でした）。

自分で調べたり、人に聞いたりして結構理解が深まったので
参考になった例えとかを備忘録的に纏めました。

エンタープライズ様が出しているこの記事が苦なく読めるようになれば、かなり理解が深まっていると思います。
[5分で絶対に分かるオブジェクト指向](http://www.itmedia.co.jp/im/articles/0703/06/news125.html)

僕も最近学び始めて思い違いや、この解釈違うでしょってのがあると思います。
そんな時はバンバンコメントで指摘して頂けますと助かります。
宜しくお願い致しますm(_ _)m

注：文字ばっかり記事です。

##オブジェクト指向をとりあえず感覚値で理解してみよう。

### html例え
divタグの中に、divタグがあって、その中にimgタグがある。

んで、cssがそれぞれに効果を及ぼすみたいな感覚値でいいと思います。
親のタグ部分を子も引き継いで使っていける。
それがもっと大規模になったような物。

### 既成品での例え。＞リモコン

結構な物がオブジェクト指向的な見方をすることが出来ます。
objectとは物ですから、何でもオブジェクトと言い表すことが出来ますって聞きません？
あれって、分かりやすい反面ややこしい記述だと僕は思います...。

それを解決できるかどうかはわかりませんが、
例えばリモコンを一つのプログラムの完成品としてみてみましょう。

リモコン本体がブレインです。（親）
そして、それぞれのボタンが手足です。（子）

リモコンは本当に多彩な機能が有りますよね。
ボタンの数的には30個くらいですかね。
この数を一つの頭がやたらめったら処理していたら、大変です。
プログラム的には、全てをif文で処理している感じです。ソースも汚くて大変です。


でも、似たような機能もありますよね。
チャンネルボタン。4色ボタン。メニューを開いて選択肢を出す系のボタン。

この辺りはちょっと内容変えたもののコピーで実装できてしまいそうですよね？

ブレインとそれぞれのボタンの間に、小さなブレインを設けてそこで処理して、大元のブレインが処理する量が少なくて助かります。

プログラム的には関数を設けている感じですね。

##オブジェクト指向ってなんだろう。ざっくり編。

オブジェクト指向入門時3大意味不明用語

- クラス
- クラスのインスタンス化
- 継承

ここの理解が出来るかどうかが勝負だと思います。
後々出てくる単語なんて全部この辺の動きにもっと柔軟性を持たせたいってだけの話なんです。

クラスは設計図。
クラスをインスタンス化すると完成品。
継承は設計図を引き継いで新しい設計図を作る。

そんなニュアンスで説明されます。
どゆこと？って方のために例を複数用意しました。

どうぞ。

###ロボットの例え
壱号機の設計書があるとします。（壱号機のクラス）
この設計書にはロボットの概観とか、重量とか、身長とかの情報が入っています。

これを元に物を作ると
それは壱号機になります。（インスタンス化）

でもこのままだと動きません。

そこで、弐号機を作るために、壱号機の設計図を引き継いで
加えて動作を記述する必要があります。
そこで、壱号機の設計書を受け継いで、弐号機設計書には「歩く、掴む、殴る」の動作が記述します。

弐号機設計書には壱号機の概観情報が直接記述されていませんが、
壱号機の情報を引っ張ってきている状態です（継承）

###細胞の例え
DNA１には、人間の設計書があるとします。（人間のクラス）
人間というのは、手があって、脚があって、頭があって....

しかし、どんな形なのかは記述されていません。

そんな時、DNA２が手、DNA3が足の形状の情報を持っていれば、人間を形作ることが出来ます。

DNA１が、２と３を継承することで人間を形成（インスタンス化）することが出来ます。

###哺乳類での例え

生物学的に色んなのがいますよね。

例えば
脊椎動物 - 哺乳類 - 人間

的な感じです。

背骨がある - 胎生 - 手足のある生物

のような解釈ですね。
これらは全て繋がって（継承されて）います。

プログラム的
「人間」＝「手2本、足2本のある生物」
という認識ですが、じゃあ猿も人間なの？って話になってしまいます。
そんな時、
人間は背骨があって、胎生の生物ですという情報が引き継げていれば、より人間というものに近くなります。

脊椎動物という設計書から哺乳類という細かな設計書を作って
仕上げに人間という設計を書き加えてあげれば出来上がり☆

###まとめ

結構色んな例えば見聞きすると
なんとなくですが分かってきます。

色んな例が出てきましたが
１，基板がある。
２，基板を引き継いで新たな基板を作る。
３，基板を元に形を作る。

というのが多いですね。

##インスタンス化したやつの例

実体化とか言いますけど、結局実体化したって何？

つまりインスタンス化ってなに？っていう話です。

###re:リモコン例え

優れた機能のボタン、綺麗なリモコンの形状。

そんな物の設計を作りました。じゃあ使うためには物にしなきゃ（実体化）。

実体化したものに命令を送ると、その通りに動く！

###re:細胞の例え

優れたDNAを用いて（クラス）
手足を作って体も作って素晴らしい体を生み出しました！（実体化）

しかし実体化しても脳からの命令（例えばmainからの指示）がないと体は動きません。


###re:ロボットの例え

歩くということと、ロボットの概観の設計図（クラス）を用いて作り上げたロボット（実体化）。
勿論設計図通りなので設計図の書いてあることは出来ます！

クラスに歩けと言う命令が書いて有れば歩くロボットが出来ます。

しかし、このままだと歩くだけのロボットです。

歩くという機能を持ったロボットの設計図を引き継いだ、
走るという機能のみが記述された設計図（クラスの継承）。

走るという機能のみが記述された設計図にはどんなロボットを作るかは記述されていませんが、
継承を行うことで、その設計図は継承元のロボットの概観を用いてロボットを作ることが出来ます（実体化）

もちろんこのロボットに歩く、走る、どちらの命令をしてもきちんと動かすことが出来ます。

##全体まとめ

これだけ書いといてあれなんですが、

お時間が有れば下記の例えがとても参考になります。これを熟読すると
かなり理解が深まると思います。
[Javaのオブジェクト指向をエヴァで例えると超わかりやすい](http://blog.livedoor.jp/itsoku/archives/38228939.html)

個人的には色んな例えの話を聞いた後で
このスレを見るとより理解が深まりました。


この記事で同じくオブジェクト指向初心者様の勉学が捗れば幸いです。
CentOSでJenkinsインストール＆プロキシ設定

CentOS7にJenkinsインストール
プロキシ設定のところでハマってイライラしたので書き置き
<br>

#Javaインストール
JenkinsではJavaを利用するため、java-1.7.0-openjdkをインストール

```text:
# yum -y install java-1.7.0-openjdk
```

#httpdインストール
webインターフェースの利用するため、もちろんhttpdインストール

```text:
# yum -y install httpd
```

#Jenkinsインストール

CentOSではいきなりJenkinsをyumでインストールすることができないので、
レポジトリとか公開鍵をとってきます。

```text:
# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
# rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
```

そしてインストール

```text:
# yum -y install jenkins
```

#プロキシ設定

デフォルトでは`http://localhost:8080`でJenkinsのホーム画面にアクセスできますが、
なんかみっともないのでプロキシ設定することに。

Jenkinsの設定ファイルである`/etc/sysconfig/jenkins`をいじる。

```bash:/etc/sysconfig/jenkins
#ポート番号変えたい方は
JENKINS_PORT="8008"

#urlに/jenkinsさんを見せるため
JENKINS_ARGS="--prefix=/jenkins"
#設定なし http://localhost:8008
#設定あり http://localhost:8008/jenkins

```

apacheの設定ファイルもいじります

```bash:/etc/httpd/conf/httpd.conf
#ファイルの最後に追加
ProxyPass /jenkins http://localhost:8008/jenkins
ProxyPassReverse /jenkins http://localhost:8008/jenkins
ProxyRequests Off
```

サービスを再起動します。

```text:
# systemctl restart jenkins
# systemctl restart httpd
```

きっとこれでどうにかなる、はず。
`http://localhost/jenkins`へアクセス！！
BLEについて今更調べてみた


# BLEについて今更調べてみた

## そもそもBLEとは？

* Bluetooth Low Energyの略でBluetoothの拡張仕様の1つ
* Bluetooth4.0の仕様に基づいている
* 消費電力が小さい
  * 電池1個で1年持つと言われている
* 受信時間が短い


## 登場人物

### ペリフェラル(Peripheral)

* 周辺機器
* 発信する側
* アドバタイジングパケットを発信
* アドバタイジングパケットを一定の距離に常時発信している
* 1つ以上のサービスを提供している

### セントラル(Central)

* 中心機器
* 受信する側
* アドバタイジングパケットを受信
* ペリフェラルが発信しているデータを受け取ることができる

### アドバタイジングパケット(advertising packet)

* ペリフェラルから発信されるパケットデータ
* ペリフェラルの名前・機能・データの情報が入っている

### GATT(Generic Attribute Profile)

* BLEの通信のベースとなるプロファイル
* 他のプロファイルと組み合わせて使う
* データ構造の最小単位をattributeとして扱う
* 3つの要素で構成されている
  * サービス(Service)
  * キャラクタリスティック(Characteristic)
  * ディスクリプタ(Descriptor)

#### サービス(Service)

* attributeを集めてセットにしたのがサービスである

#### キャラクタリスティック(Characteristic)

* ユーザデータを格納するのに用いられる
* 宣言とvalueのattributeを持つ

#### ディスクリプタ(Descriptor)   

* キャラクタリスティックの追加情報を持つ
* 1個のattributeで構成されている

## GATTによる通信アクションの種類

### write

* セントラルからペリフェラルに書き込みデータを渡す

### read

* セントラルからペリフェラルに読み込みデータを要求

### notify

* ペリフェラルからセントラルに通知
instagramの特定のユーザーのフォロワー数を取得する（だけ）

## 0.アプリ作成
アクセストークンの取得などは以下で。
http://qiita.com/zurg/items/4c423b93b6a7f1ac737d


## 1.ユーザーIDを取得
```
https://api.instagram.com/v1/users/search?q=USERNAME&access_token=ACCESS-TOKEN
```


```
例：
https://api.instagram.com/v1/users/search?q=okamuradesu&access_token=4342120.85bf38d.874fab866d314be9a74bdda41d318bb0
※アクセストークンはダミー
```


```
{
meta: {
	code: 200
},
data: [{
	username: "okamuradesu",
	bio: "",
	website: "",
	profile_picture: "http://photos-a.ak.instagram.com/hphotos-ak-xpf1/10362107_259935804209424_970933642_a.jpg",
	full_name: "okamuradesu",
	id: "1386028045"
}]
}
```

　
## 2.ユーザー情報を取得
```
https://api.instagram.com/v1/users/USERID/?access_token=ACCESS-TOKEN
```

```
例：
https://api.instagram.com/v1/users/1386028045/?access_token=4342120.85bf38d.874fab866d314be9a74bdda41d318bb0
※アクセストークンはダミー
```

```
{
meta: {
	code: 200
},
data: {
	username: "okamuradesu",
	bio: "",
	website: "",
	profile_picture: "http://photos-a.ak.instagram.com/hphotos-ak-xpf1/10362107_259935804209424_970933642_a.jpg",
	full_name: "okamuradesu",
	counts: {
		media: 78,
		followed_by: 116844,
		follows: 23
	},
	id: "1386028045"
}
}
```
テキトーな値を取る

テキトーな値がほしい
=====

PHPでフレームワークを使おうとすると大体のフレームワークで
**セキュリティー用のtokenを用意してください**
みたいな項目が出てくる．

キーボードをガチャガチャ鳴らして用意するのも問題ないけど，
大文字が無かったり，キーボードの配置的に偏ったりするのがなんとなく嫌．
あと，何文字打ってるか分かりづらいのも難点．

ってことで簡単にランダムな文字列作れないかな〜と思って探してみた．
そんなパスワード生成用のコマンドもあった気がしたけど毎回インストールされている訳じゃないので
できるだけデフォルト装備のコマンドが望ましい...

って調べて出てきたのが次のサイト

> 10 Ways to Generate a Random Password from the Command Line
> http://www.howtogeek.com/howto/30184/10-ways-to-generate-a-random-password-from-the-command-line/

メッセージのチェックを行うsha256sum等を使ったり，base64を使って変換した値をランダム値として活用したり，/dev/urandom という擬似デバイスから文字列を取ってきて tr コマンドで欲しい文字タイプのみに整形するのが一般的なよう．

たった一つの「指定文字数を切り出す」という処理が色々な方法で書かれているのがなかなか面白いｗ

特徴として

* sha256sum や md5sum などは16進数で表された計算値なので0-9a-zの値のみになる のでレパートリー少なめ
* base64は + や / といった記号も出てくるし色々な文字列が大文字小文字どちらも現れる けど末尾が必ず =
* /dev/urandom はtrコマンド次第で好きに使われている文字や記号等を決める事ができる けどコマンドが長くて面倒くさくなる

といった感じ．

今日はここらへんで

ちょっと追記

これが楽なんでね？
=====

md5sum とか sha256sum は[0-9a-f]だけだからなんとなく心もとない
/dev/urandom だとなんだか長くなりがちだし，自分でコマンドを組もうにも仕組みをあまり理解できてないから四苦八苦しそう (さっき適当に試してみようとしたらターミナルに文字がアホみたいに出力されて慌ててたり ^^; )
base64 だといい感じのができそうだけど，実際は文字列の変換なだけでランダムな文字列を生成するのは苦手

ってな感じで一長一短...

まぁサイトみた限りシンプルだったのは

```bash
$ date | md5sum
```

ここはsha256sumとかにも変えられるし，1秒違うだけでも結構変わるのでオススメ．
そこをもっといい感じの文字列にしたければ

```bash
$ date | md5sum | base64
```

とすればok

md5sum の仕様上末尾に必ず '  -' って文字列がくっつくから base64の文字列も固定になるけどそこはあまり気にしなくても問題無いだろうし

ちなみに base64 には `-w` オプションがあって，改行する文字数を指定できたりするのでそこで文字数調整も可能だったり．

自分で考えたつもりが，気づけばサイトの一番上のと同じになってたのは秘密．

そんな感じで
[android] v17 Leanback Libraryをeclipseで使う方法

## 概要
android 5.0から新しくはいったsupport libary Leanback をeclipseで使う方法の説明。

## 前提条件
1. SDK versionを24.0以上にしておく
2.  Android 5.0以上のSDKをいれておく
3.  AndroidManifest.xmlのtargetをAPI level 21に設定

## 導入
1. eclipse > File > Import
2. Android > Existing Android Code Into Workspace > Next
3. Browse... > SDKディレクトリ/extra/android/support/v17/leanback
4. Finsh > Package Explorerにandroid-support-v17-leanbackが追加される
5. libs/フォルダをクリック > android-support-v17-leanback.jarを右クリック > Build Path > Add to Build Path
6. 再度 libs/フォルダにある android-support-v17-leanback.jarを右クリック > Build Path > Configure Build Path
7. Order and Exportのタブを選択 > android-support-v17-leanback.jarをクリックして選択
8. Android Dependencies の選択を解除
9. OKで完了

## ハマった点
* android-support-v17-leanbackを追加した時点でresがエラーとなってしまっていた、エラー内容は以下。
<pre>
No resource found that matches the given name: attr 'android:actionModeShareDrawable'
</pre>
* 解決策
android-support-v17-leanbackフォルダにあるproject.propertiesを開いて*target=android-19*となっている行を*target=android-21*に変更。その後、Project > Clean...で解決

## 使ってみる
1. leanback libararyを使いたいプロジェクトを右クリック > Properties
2. Projectsタブを選択 > Add > android-support-v17-leanbackを選択
3. OKで完了
vSphere 5.5の管理者パスワード要件

# 概要

vSphere 5.5のESXi、vCenter Server、vCenter Server Appliance、vCenter Single Sign-On（SSO）のパスワード要件。

# 詳細

vSphere製品であるESXi、vCenter Server、vCenter Server Appliance、vCenter Single Sign-On（SSO）のパスワード要件をまとめておく。

## ESXi

管理者は`root`。パスワードの要件は[vSphereセキュリティガイド](http://pubs.vmware.com/vsphere-55/topic/com.vmware.ICbase/PDF/vsphere-esxi-vcenter-server-552-security-guide.pdf)の「パスワードの要件」に記載されている。

> ユーザー パスワードの長さは、次の要件を満たしている必要があります。
> (a)1 つまたは 2 つの文字クラスを使用するパスワードの場合、最低 8 文字が必要。
> (b)3 つの文字クラスを使用するパスワードの場合、最低 7 文字が必要。
> (c)4 つの文字クラスを使用するパスワードの場合、最低 6 文字が必要。
> パスワードを作成するときは、小文字、大文字、数字、および特殊文字 （アンダースコアやダッシュなど） の 4 つの文字クラスの文字を混ぜます。どのような形式であれ、`root`、`admin`、または`administrator`という語をパスワードに含めることはできません。
> 注意 パスワードの先頭の大文字は、使用されている文字クラスとしては数えられません。パスワードの末尾の数字は、使用されている文字クラスとしては数えられません。

パスフレーズも使用可能。

> パスフレーズを使用することもできます。その場合、フレーズは長さ 8 ～ 40 文字の単語を最低 3 語含んでいる必要があります。

[VMware KB: ESX、ESXi 4.x および 5.x でのパスワードの要件と制限 (2079822)](http://kb.vmware.com/kb/2079822)でも確認できる。

## vCenter Server

Windows環境へインストールされるコンポーネントなので、Windowsの`administrator`が管理者になる。パスワード要件も、Windowsに準じる。

## vCenter Server Appliance

管理者は`root`。パスワード要件は見つけられていない。

## vCenter Single Sign-On（SSO）

管理者は`administrator@vsphere.local`。パスワード要件は[vSphereインストールとセットアップガイド](http://pubs.vmware.com/vsphere-55/topic/com.vmware.ICbase/PDF/vsphere-esxi-vcenter-server-552-installation-setup-guide.pdf)の「Simple Install を使用して vCenter Single Sign-On、 vSphere Web Client 、vCenter Inventory Service、vCenter Server をインストール」項に記載されている。

> デフォルトでは、パスワードは 8 文字以上で、小文字、大文字、数字、特殊文字がそれぞれ 1 つ以上含まれている必要があります。パスワード ポリシーの変更については、vSphere セキュリティ ドキュメントを参照してください。ASCII 以外の文字、セミコロン （`;`）、二重引用符 （`"`）、一重引用符 （`'`）、サーカムフレックス （`^`） およびバックスラッシュ （`\`） はパスワードに使用できません。

# 参考

* [VMware vSphere のドキュメント | VMware 日本](http://www.vmware.com/jp/support/support-resources/pubs/vsphere-esxi-vcenter-server-pubs/)
  * [vSphere 5.5 update 2 インストールとセットアップガイド](http://pubs.vmware.com/vsphere-55/topic/com.vmware.ICbase/PDF/vsphere-esxi-vcenter-server-552-installation-setup-guide.pdf)
  * [vSphere 5.5 update 2 セキュリティガイド](http://pubs.vmware.com/vsphere-55/topic/com.vmware.ICbase/PDF/vsphere-esxi-vcenter-server-552-security-guide.pdf)

本投稿はSphere 5.5 update2のガイドを元に作成されているが、実際には使用バージョンするのドキュメントで、該当箇所を確認すること。
Sprayで列挙型/objectをJSONにエンコード・デコードしたい



以前、[Scalaで列挙型(enum)を作る]で`Enumeration`を使わずに`sealed trait`と`object`を使って列挙型を実現する方法を紹介した。今回はこの列挙型をspray-jsonを使って`object`をJSONに変換する方法を紹介する。基本的なspray-jsonの使い方は[ScalaでJSONをエンコード・デコードしたい]で少し説明している。

spray-jsonで`object`をJSONにエンコード・デコードするには、自前で読み書きの処理を定義する必要がある。下のサンプルコードでは`TestResultStatusFormat`がそれに当たる。

```scala
// ドメインオブジェクト(参加者招待システムの例)
case class Invitee(name: String, status: AttendingStatus) // 招待客
sealed trait AttendingStatus
case object Going extends AttendingStatus // 参加
case object NotGoing extends AttendingStatus // 不参加
case object Maybe extends AttendingStatus // 未定

// JSONのマッピングを定義する
import spray.json._
object MyJsonProtocol extends DefaultJsonProtocol {
  implicit object TestResultStatusFormat extends RootJsonFormat[AttendingStatus] {
    override def read(json: JsValue): AttendingStatus = json match {
      case JsString("going")     => Going
      case JsString("not_going") => NotGoing
      case JsString("maybe")     => Maybe
      case x                     => deserializationError("Expected AttendingStatus as `going`, `not_going` or `maybe`, but got " + x)
    }
    override def write(obj: AttendingStatus): JsValue = obj match {
      case Going    => JsString("going")
      case NotGoing => JsString("not_going")
      case Maybe    => JsString("maybe")
    }
  }
  implicit lazy val InviteeFormat = jsonFormat2(Invitee)
}

def jsonに変換する() = {
  import MyJsonProtocol._
  val invitee = Invitee("alice", NotGoing)
  assert(invitee.toJson.compactPrint == """{"name":"alice","status":"not_going"}""")
}

def jsonから変換する() = {
  import MyJsonProtocol._
  val jsonData = """{"name":"bob","status":"maybe"}"""
  assert(jsonData.parseJson.convertTo[Invitee] == Invitee("bob", Maybe))
}

jsonに変換する()
jsonから変換する()
```

[Scalaで列挙型(enum)を作る]: http://qiita.com/suin/items/5e514e8edef7aba4a0fa
[ScalaでJSONをエンコード・デコードしたい]: http://qiita.com/suin/items/f69e1e9ca638538e6e27
Delphi テキストファイルに追加書き込みする。

### とりあえずテキストに吐きだしたい時に使う。 
既存のファイルに上書き。

```pas
var
  txtFile: TextFile;
  str, path: string;
begin
  str := Format('%s %s', ['hoge', 'hoge']);
  path := 'D:\hoge.txt';
  AssignFile(txtFile, path);
  if FileExists(path) then begin
    Append(txtFile);
  end else begin
    Rewrite(txtFile);
  end;
  Writeln(txtFile, str);
  CloseFile(txtFile);
end;
DataTables(jQuery Plugin)で、thをクリックした時の列番号(column index)の取得方法

この記事は、jQueryのプラグイン、DataTablesについての記事です。
なんかC#のDataTableとかと間違えるかもと思って書いておきます。

テーブルのtdタグをクリックした時の列番号の取得とかは、こんな例が載ってたりします。
http://datatables.net/reference/api/cell().index()

でもなぜか、theadのthタグの列番号の取得方法がありません。
というわけで作りました。

```
var table = $('#example').DataTable();
$('#example thead').on( 'click', 'th', function () {
  var columnIdx = table.column(this).index();
  console.log(columnIdx);
});
```

これでヘッダをクリックした時の列数が取得し放題です。
ソート処理をカスタマイズしたい時とかは便利です。
How to run Ruby script as FastCGI on Apache on Mac


I'm using Homebrew as package manager.

# Install

Install FastCGI module for Apache.

```sh-session
brew install homebrew/apache/mod_fcgid
```

You couldn't?
brew tap it.

Install common headers and libraries of FastCGI.

```sh-session
brew install fcgi
```

Install fcgi Gem

```sh-session
gem install fcgi
```

# Setting
## Apache
User's own site files on Mac is below.
/Users/\<your name\>/Sites
Make your config file on /etc/apache2/users directory. You need root permission.

```sh-session
cd /etc/apache2/users
vi your.conf
```

```your.aconf
<Directory "/Users/<your name>/Sites/">
    Options All
    AllowOverride All
    Order allow,deny
    Allow from all
    AddHandler cgi-script .cgi
    <IfModule fcgid_module>
        AddHandler fcgid-script .fcgi
    </IfModule>
</Directory>
```

There is no security. I recommend you more strict configuration. See Apache's docs.
I assumed your CGI excutable file name is *.cgi. Also I think FastCGI is *.fcgi too.
I don't support any language specific extention (like *.rb, *.py ...) currently.

### put mod_fcgid into your Apache

```aconf
LoadModule fcgid_module <path to>/mod_fcgid.so
```

brew command would tell you where mod_fcgid installed.
You have to add follow line in /private/etc/apache2/httpd.conf

### rbenv
If you are using rbenv, you have to set up more configuration (also me).

Most googled sites tell us 'set up envvars file for Apache'. But on Mac, that's not right.
You have to edit '/System/Library/LaunchDaemons/org.apache.httpd.plist'. offcourse you have to edit as root.

```sh-session
sudo vi /System/Library/LaunchDaemons/org.apache.httpd.plist
```

```text
...
<key>EnvironmentVariables</key>
<dict>
    <key>PATH</key>
    <string>/usr/local/var/rbenv/shims:/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
...
```

You have to tell Apache a PATH where your favorite Ruby executable is. If not, Apache process can not find where your gem files are.

and then, restart apache.

```sh-session
sudo /usr/sbin/apachectl restart
```

# Ruby script with FCGI
Write your Ruby CGI script like this.

```rb
require 'fcgi'
...
FCGI.each_cgi do |cgi|
  ...
end
```

So I assumed file name of FastCGI executable ends with fcgi suffix and I am enabling FollowSymlinks on Apache setting. As you know, this is **not good** for better security.
virtualenvをinstallすると端末を開くたびにlsする問題の解決


####環境
OS yosemite10.10
brew python 2.7.8
pip install virtualenv
zsh

##問題点
virtualenvをinstallすると端末を開くたびにlsする。
chpwdでautols化している場合で発生。
端末を開く時に下記のようにlsしてしまう。

```Bash
.                ..               get_env_details  initialize       postactivate     postdeactivate   postmkproject    postmkvirtualenv
postrmvirtualenv preactivate      predeactivate    premkproject     premkvirtualenv  prermvirtualenv  py3
$
```

##調査
zshをトレースする。

```Bash
$ zsh -x
```

cdを使っていることがわかる。

```Bash
+virtualenvwrapper_run_hook:11> virtualenvwrapper_cd /Users/username/.virtualenvs
+virtualenvwrapper_cd:1> [ -n '' ']'
+virtualenvwrapper_cd:4> [ -n 5.0.7 ']'
+virtualenvwrapper_cd:6> cd /Users/username/.virtualenvs
+chpwd:0> ls -alG -x
.                ..               get_env_details  initialize       postactivate     postdeactivate   postmkproject    postmkvirtualenv
postrmvirtualenv preactivate      predeactivate    premkproject     premkvirtualenv  prermvirtualenv  py3
```

##解決法
`.virtualenvs`のフォルダ場合、lsをしないようにする。
`chpwd`をやめて`function cd`をzshrcに記述。

参考url
http://stackoverflow.com/questions/18212540/avoid-an-ls-style-listing-on-actvation-virtualenv-wrapper

```Bash
cd(){
if [ -n "$1" ]; then
    case "$1" in
        "$HOME/.virtualenvs")
            :
        ;;
        *)
            builtin cd "$@"&&ls -x
        ;;
    esac
else
    builtin cd ~&&ls -x
fi
}
```

##感想
pythonのvirtualenvに関してあまり知識がなかったので入れてみたらこうなっちゃた。
また、zshの読み込みにvirtualenvがcdを使ってることが少し驚いた。
もしかしたら、自分のzshrcやaliasの記述がおかしいのかもしれない。
検索しても同じ様な問題になってる人があまりいない。
この方法はあまりにも気持ち悪いけど、他の方法がなかったので仕方なかった。
すっきりした修正の仕方を知っている人いたら教えて下さい。
一部Androidの機種でブラウザバックするとJavaScriptが動かない


Androidの一部機種でブラウザバックした際に、バックしたページでJavaScriptが動かない現象が発生。

##対応内容

```JavaScript:JavaScript
window.onunload = function() {};
```

上記を追加して対応。

##原因

戻るボタンで戻った場合、一部機種ではJavaScriptを含めて前回の状態を復元するらしい。
それを上記のJavaScriptで無効にする。

***
##参考サイト

* [戻るボタンが押された際、ページのJavaScriptを途中の状態から実行させない方法](http://nmi.jp/archives/273)
Swift で stringByReplacingCharactersInRange がコンパイルエラーになる件

## 環境

- Xcode 6.1

## 起きたことと解決策

`UITextFieldDelegate` の `textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String)` で、これまで Objective-C で当たり前のように記述していたコードが Swift ではコンパイルエラーになりました。

```swift:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let replacedText = textField.text.stringByReplacingCharactersInRange(range, withString: string) // 'NSRange' is not convertible to 'Range<String.Index>'

    // ...

    return true
}
```

以下のように一度 `NSString` にキャストした文字列に対して `stringByReplacingCharactersInRange` を実行すれば大丈夫でした。

```swift:
    let text = textField.text as NSString
    let replacedText = text.stringByReplacingCharactersInRange(range, withString: string)
```

一行で書きたかったら

```swift:
    let replacedText = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
```

こんな感じで。
Ubuntu14.04でシリアルポートでmgetty待ち受けの設定方法

PPP Sevrer on Linuxではシリアルポートの待受設定を/etc/inittabに書くようになっているがUbuntuにはinittabがない。
一部ネットの情報では/etc/event.d/にinittabと同じような設定ファイルをおけばいいと書かれているがそもそも/etc/event.dがない。
よくよく調べてみると/etc/init/hogehoge.confに起動時の設定が書かれている。

設定手順は以下のとおり

1. /etc/init/tty1.confをコピーして/etc/init/ttyS0.conf（**使用するシリアルポート番号**）とする
2. /etc/init/ttyS0の最下行を以下のように変更する

`exec /sbin/getty -8 38400 tty1`
↓
`exec /sbin/mgetty ttyS0 -D /dev/ttyS0 `

ちなみに起動時にモデムやTAの初期化が必要な場合は以下のように書く

`exec /sbin/mgetty ttyS0 -D /dev/ttyS0 -m '"" ATコマンド OK'`

ちなみに`init q`ではなぜかうまく反映してくれなかったので再起動したところきちんとモデムからのRAS接続に応答してくれるようになった。

いやーどこにこの設定を書いていいかがわからなくてたどりつくまでが大変だった
Scala: joda-timeで日付をyyyy-MM-dd HH:mm:ss形式にフォーマットしたい



Scalaでjoda-timeライブラリを用いて、現在日時を`yyyy-MM-dd HH:mm:ss`形式で整形する方法。
MySQLの`DATETIME`型に保存する際の変換などに使う。

```scala
import org.joda.time.DateTime
import org.joda.time.format._

val dateTime = new DateTime()
// dateTime: org.joda.time.DateTime = 2014-10-30T09:29:29.899Z

val dateString = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").print(dateTime)
// dateString: String = 2014-10-30 09:28:09
```

上の例では実行環境のタイムゾーンになる。UTCでフォーマットしたい場合は、タイムゾーンをUTCに指定したDateTimeオブジェクトを渡す。

```scala
import org.joda.time.DateTime
import org.joda.time.format._
import org.joda.time.DateTimeZone

val dateTime = new DateTime()
// dateTime: org.joda.time.DateTime = 2014-10-30T09:30:11.634Z

val dateString = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").print(dateTime.withZone(DateTimeZone.UTC))
// dateString: String = 2014-10-30 09:30:11
```


なお、joda-timeを使うためには、build.sbt の `libraryDependencies` に `joda-time` と `joda-convert` を書いておく。

```scala:build.sbt
libraryDependencies ++= Seq(
  "joda-time" % "joda-time" % "2.3",
  "org.joda" % "joda-convert" % "1.6"
)
```
DataTablesのorderイベントのサンプルが間違えている

jQueryでデータテーブルを使うとしたらほぼ一択しかないと思われる DataTables ですが、ドキュメントの間違いを見つけたので報告です。
http://datatables.net/reference/event/order

こんな感じのExampleがあるんですが、

```
$('#example').dataTable();
 
$('#example').on( 'order.dt', function () {
    // This will show: "Ordering on column 1 (asc)", for example
    var order = this.api().order();
    $('#orderInfo').html( 'Ordering on column '+order[0][0]+' ('+order[0][1]+')' );
} );
```

これ、こうしないと動かないです。

```
var table = $('#example').DataTable();
$('#example').on( 'order.dt', function (e,setting) {
    //var order = this.api().order();
    var order = table.order();
    $('#orderInfo').html( 'Ordering on column '+order[0][0]+' ('+order[0][1]+')' );
}
```
QAITで教えて貰ってやっと解決した。
これが出来なくて2時間も残業したお…
(´･ω･`)