OmniAICreator/Qiita-1.07M huggingface dataset:
WebStorm 10でTypeScript 1.5を使う方法

WebStormでは、TypeScriptのコンパイラーが内蔵されているため、WebStormさえインストールすればTypeScriptが使えるようになります。
ですが、**WebStorm 10におけるデフォルトのコンパイラーはTypeScript 1.4です。TypeScript 1.5を使う場合は、以下のようにして設定します**。
#必要ファイルをダウンロード
https://github.com/Microsoft/TypeScript/tree/master/lib より、typescriptServices.js、lib.d.ts、lib.es6.d.tsをダウンロードして任意の場所にフォルダを作成し、保存しておきます。

#WebStorm側の設定
[WebStorm]→[Preferences]→[Languages & Frameworks]→[TypeScript]を選択し、TypeScriptの設定画面を開きます。[Enable TypeSCript Compiler]にチェックを入れ、TypeScriptのコードが自動でコンパイルされるようにしておきます。
![スクリーンショット 2015-08-19 19.39.15.png](https://qiita-image-store.s3.amazonaws.com/0/67884/1f734540-5ad4-69c7-6a79-b48d18e19e28.png)

[Compiler version]の箇所で、[Edit]を選択し、コンパイラーの設定画面から[Custom directory]にチェックを入れ、先ほどダウンロードしたファイルが含まれるフォルダを指定します。
![スクリーンショット 2015-08-19 19.39.30.png](https://qiita-image-store.s3.amazonaws.com/0/67884/9922b35a-2283-f94f-f88c-80025ea7c235.png)

[OK]を押して設定画面に戻り、[apply]を押すとすると設定終了です。以上でWebStormでTypeScript 1.5が使えるようになります。

> 参考: [Transpiling TypeScript to JavaScript](https://www.jetbrains.com/webstorm/help/transpiling-typescript-to-javascript.html)
TypeScriptを一番手軽に書けるエディターはWebStormである

TypeScriptはJavaScriptを安全に書ける強力な言語です。しかし、TypeScriptを使うには、コマンドラインからtscコマンドを使ったり、GruntやGulpなどのタスクラナーでコンパイル処理を記述するなど、**何かと面倒**です。TypeScriptを始めようと思っても、準備段階で心が折れる方も多いのではないでしょうか。

JavaScriptのIDE「WebStorm」では、**TypeScriptのコンパイラーが内蔵されているため、WebStormさえインストールすればTypeScriptが使えるようになります**。設定も簡単です。

# WebStormでTypeScriptを手軽に使う方法
まず、[公式サイトからWebStormをインストール](https://www.jetbrains.com/webstorm/)します。WebStormはシェアウェアですが、試用期間が30日あります。HTMLやCSSの開発環境としても非常に優秀なので、使ってみて気に入った場合は購入するとよいでしょう。
起動したらEmpty Projectで新規プロジェクトを作成し、任意の場所にプロジェクトファイルを作ります。
![プロジェクト設定画面](https://qiita-image-store.s3.amazonaws.com/0/67884/07750e8d-bafe-6ea3-4cad-4786c5597d2a.png)

画面左のファイルエクスプローラー画面で右クリックし、[New]→[TypeScript File]を作成し、任意の名前で保存します。ここでは、hoge.tsというファイルを作っています。
![TypeScriptの新規作成](https://qiita-image-store.s3.amazonaws.com/0/67884/af1d3bea-1513-5edb-4afb-9ab485c4aae8.png)

すると、画面上部に[TypeScript Compiler]と表示されるので、[Enable]を力強く押します（※）。

![TypeScript Compiler](https://qiita-image-store.s3.amazonaws.com/0/67884/18ad8a9d-df1b-1539-9243-d854c56e5d49.png)

※ もしこの画面が出ない場合は、[WebStorm]→[Preferences]→[Languages & Frameworks]→[TypeScript]→[Enable TypeScript Compiler]にチェック

設定が終わったら、早速TypeScriptのコードを書いてみましょう。変数aをnumber型で宣言します。

```lang:TypeScript
var a:number = 1;
```

記述が終わると、自動でTypeScriptのコンパイルが実行され、JavaScriptファイルが生成されているのがわかります。

![JavaScriptへのコンパイル](https://qiita-image-store.s3.amazonaws.com/0/67884/84039145-6aa9-0875-a41f-30bd749d3a58.png)

中身を見てみましょう、先ほどTypeScriptで記述していた「number」という文字が消え、正常にJavaScriptに変換されているのがわかります。

```lang:コンパイル後のJavaScript
var a = 1;
```

# 最後に
簡単ですよね。筆者はいくつかTypeScriptを書くためのエディターを試してみましたが、結局一番WebStormが手軽だなと思って使い続けています。今回は導入部分だけでしたが、WebStormはコード入力補完やデバッグ機能など、**TypeScriptを記述するのに便利な機能が揃っています**。WebStormを使いこなして快適なTypeScriptコーディングを。
EclipseでjQueryのエラーを回避する方法

EclipseだとjQueryの本体jsファイルが構文エラーになってしまう。
特に編集とかしていないオリジナルファイルが。

Eclipse上でjqueryのJSファイルの構文チェックを除外設定にすればOKです。
EclipseでのjQueryファイルを除外設定

プロジェクト右クリック、プロパティー
↓
[Javascript]
↓
[インクルードパス]、[ソース]タブ
↓
フォルダ指定、[除外]クリック、[編集]ボタンクリック
↓
除外パターンテキストボックス横の[追加]ボタンクリック
↓
[参照]ボタンクリックし、***/jquery**.jsを指定しOK、完了
↓
念のため、更新、クリーン起動でOKなはず

（参考サイト）
eclipseで外部JSが構文エラーになるときの対処
ui > 緑色と赤色どちらがON? 

引用: 失敗から学ぶユーザインタフェース by 中村聡史さん

> 一方、右ページ下図（右）は、とある工場の大型機械の起動および停止ボタンです。起動には赤色、停止には緑色のボタンが割り当てられています。
...
工場で使うような大型機械の場合、稼働中にこうした機械に近寄ったり、周囲でうかつな行動を取るのは危険です。一方、停止しているときは安全と言えます。そのため、「赤色は危険、緑色は安全」という意味（信号と同じ）でこのような色が割り振られていると思われます。

これまで「停止：赤色」というのが自分の経験としてほとんどだったので、上記のような記載があった時に「なるほど」と思った。

また、こういう事情を知らずに（あるかどうかわからないが）工場の機械(ソフト)のUIを設計することになったとき、停止を赤色とする失敗をしそうと思った。


どこかの本に書いてあったが、人は赤いものを危険と思うらしい。だから注意をひきたいものには赤色をつけることが多い。一方で、緑色は安全という認識がされやすいらしい。
赤色は火から来ているのではないかと思う。緑は自然から？
ui > グループ分け > 近接の法則 / 類同の法則 / 共通運命の法則 / 良い連続の法則 / 閉合の法則 / 面積の法則 / 対称の法則


UIの本を読んでいて見つけたキーワードを元に、以下のサイトを見つけた。
グループ分けの種々の法則の説明がわかりやすい。

http://blog.creativeflake.com/2014/05/web.html#.VdT7VSztlBc

種々の法則について以下の例があげられている
- リモコン
- Macのドック
- Webデザイン
ui > 類同の法則 > 同じ形、同じ色、同じ向きなど、共通の特徴をもつ図形同士は、グループとして認知されやすい

引用: 失敗から学ぶユーザインタフェース by 中村聡史さん

> 類同の法則というのは「同じ形、同じ色、同じ向きなど、共通の特徴をもつ図形同士は、グループとして認知されやすい」というものです。

以下のサイトの紹介が図付きでわかりやすい。
http://blog.creativeflake.com/2014/05/web.html#.VdT7VSztlBc
クラス設計 > メンバ関数の呼び出し順番の対処法 > 制御役のクラスをとおして動作するように、クラスを再設計する

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん
2.2 クラス設計のコツ

[クラス設計 > コンストラクタで完全な状態にする](http://qiita.com/7of9/items/af7d04f146129d439787)
と関連して

> どうしてもメンバ関数の呼び出し順に制約がある場合には、順番どおりに呼び出されることを設計上のしくみで保証する必要があります。
> 呼び出し順を保証するには、呼び出し順の制御をするクラスを新しく作成する必要があります。制御役のクラスをとおして動作するように、クラスを再設計します。

```cpp
class Game {
public:
  void run() { // 実行順番を保証する関数
    initialize();
    while (isRunning()) {
      update();
      draw();
    }
    finalize();
  }
private:
  virtual void initialize() = 0;
  virtual bool isRunning() const  = 0;
...
````
クラス設計 > コンストラクタで完全な状態にする

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん
2.2 クラス設計のコツ

> オブジェクトは、コンストラクタが呼び出された時点で完全な状態を生成しなければいけません。
> 初期化関数を呼び出してから動作する場合や、setterを使ってメンバ変数に値を設定してから動作するクラスがある場合は要注意です。...どのような順番でメンバ関数が呼ばれても安全に動作するようにしてください。

Code Completeだったかにも「複数の関数を順番に使用するような設計はだめ」のような記載があったかと思う。
こういう関数郡を作った場合、作った直後は覚えているのでいいが、半年後や一年後などになるとそういう「手続き」の情報というのはわからなくなりやすい。ドキュメントとしてきちんと残しておかないと使用順番を変更するなどして気付きにくいバグを含むことになってしまう。
クラス設計 > 抽象インターフェース > 利用方法 > クラスの共通化 / 実装手段の交換 / 変化しやすい部分の分離 / 不適切な結合関係の分離 / パッケージ境界の分離

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん
2.2 クラス設計のコツ

> 抽象インターフェースの活用方法を整理してみます。

> - クラスの共通化 
- 実装手段の交換
- 変化しやすい部分の分離
- 不適切な結合関係の分離
- パッケージ境界の分離
電子回路 > npn形トランジスタ2SC1815の静特性

参考: 入門オペアンプ by 家村道雄・村田勝昭さんら

グラフの4つの象限を使ってトランジスタの静的特性を１つの図にまとめている描き方が載っていた。

軸の取り方
- 横軸(正方向) : V_CE [V]
- 横軸(負方向) : I_B [uA]
- 縦軸(正方向) : I_C [mA]
- 縦軸(負方向) : V_BE [V]

各象限の値
- 第１象限 : 出力アドミタンス h_oe (出力特性)
- 第２象限 : 電流増幅率 h_fe (電流伝達特性)
- 第３象限 : 入力インピーダンス h_ie (入力特性)
- 第４象限 : 電圧帰還率 h_re

以下の10枚目の図が近い。第4象限のh_reの線が以下のものにはない。
http://www.slideshare.net/512___/ss-30334451
Pepper(一般販売初版)開発開始

とりあえずQiitaデビュー＆共有連携テスト。
Twitterじゃ限界があるので、多くの情報が共有されているQiitaに引っ越してみました。
よろしくお願い致します。

[https://twitter.com/_XICK_/](https://twitter.com/_XICK_/)
Go 1.5 出た！

とりあえず，メモ。

- [Go 1.5 is released - The Go Blog](https://blog.golang.org/go1.5)
- [Go 1.5 Release Notes - The Go Programming Language](https://golang.org/doc/go1.5)

[ブックマーク](http://qiita.com/spiegel-im-spiegel/items/98d49ac456485b007a15)からこちらも挙げてくか。

- [Go言語のDependency/Vendoringの問題と今後．gbあるいはGo1.5 | SOTA](http://deeeet.com/writing/2015/06/26/golang-dependency-vendoring/)
- [Heroku、Go言語の正式サポートを発表 － Publickey](http://www.publickey1.jp/blog/15/herokugo.html)
- [Google App Engineも「Go言語」の正式サポートを発表 － Publickey](http://www.publickey1.jp/blog/15/google_app_enginego_1.html)
- [golang - GVM で go1.5rc1 のインストール - Qiita](http://qiita.com/msaito3/items/3aef86e9864990b16b4c)

## Windows では上書きインストールできない？

Windows 版（64bit）のインストールパッケージでインストールしようとしたらエラーになった。

[![Install Error](https://farm6.staticflickr.com/5759/20692976166_a38bee50d8_o.png "Install Error")](https://www.flickr.com/photos/spiegel/20692976166/)

この場合は，コントロールパネルの「プログラムと機能」で既存のバージョンをアンインストールしてから最新バージョンをインストールし直せば OK。ただし，バージョンアップによる副作用のほどは不明。（きっと識者の方がそのうち記事を出すだろう）

```shell
C:>go version
go version go1.5 windows/amd64
```
RxJSとkeypressを使いfpsフレーム内で1キーだけ受け付ける処理

## ゴール

Node.js で [RxJS](https://www.npmjs.com/package/rx) と [keypress](https://www.npmjs.com/package/keypress) を使い、「fps の 1 フレーム内で先頭の 1 キー入力のみを受け付ける」という処理を作ること。


## サンプルコード

```
var keypress = require('keypress');
var Rx = require('rx');

var FPS = 2;

keypress(process.stdin);
process.stdin.setRawMode(true);
process.stdin.resume();

var pauser = new Rx.Subject();

var timerSource = Rx.Observable
  .timer(0, 1000 / FPS)
  .timeInterval()
  .map(function(data) {
    pauser.onNext(true);
    return data;
  })
;

var wrappedHandler;
var keypressSource = Rx.Observable
  .fromEventPattern(
    function addHandler(handler) {
      wrappedHandler = function(chr, key) {
        handler(key);
      };
      process.stdin.addListener('keypress', wrappedHandler);
    },
    function removeHandelr(handler) {
      process.stdin.removeListener('keypress', wrappedHandler);
    }
  )
  .pausable(pauser)
  .filter(function() {
    var isStopped = pauser.isStopped;
    pauser.onNext(false);
    return !isStopped;
  })
;

timerSource.subscribe(
  function(data) {
    console.log('Frame count:', data.value);
  }
);

keypressSource.subscribe(
  function (key) {
    console.log('Input key:', key.name);
    if (key && key.ctrl && key.name === "c") {
      process.stdin.pause();
      process.exit(0);
    }
  }
);
```

`node` コマンドで実行して適当にキーを連打すると、以下の様な出力になると思います：

```bash
$node ./filename.js
Frame count: 0
Input key: j
Frame count: 1
Input key: j
Frame count: 2
Frame count: 3
Input key: n
Frame count: 4
Input key: n
Frame count: 5
Input key: k
Frame count: 6
Input key: k
Frame count: 7
Input key: k
Frame count: 8
Frame count: 9
Frame count: 10
Input key: c
```

同フレーム内で、2回以上のキー受付をしていないことがわかると思います。
なお、抜けるには `Ctrl-C` を押して下さい。


## 参考リンク

- [「RxJS」初心者入門 – JavaScriptの非同期処理の常識を変えるライブラリ](http://liginc.co.jp/web/js/151272)
- [Bridging to Events](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/events.md)
- [Rx.Observable.fromEvent(element, eventName, [selector])](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md)
- [Rx.Observable.fromEventPattern(addHandler, [removeHandler], [selector])](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromeventpattern.md)
- [Rx.Observable.prototype.pausable(pauser)](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/pausable.md)
- [Rx.Observable.timer(dueTime, [period], [scheduler])](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timer.md)
- [おしゃれCLIを作るためのnpmモジュール達](http://yosuke-furukawa.hatenablog.com/entry/2013/12/14/230653) の keypress の項目


## 所感
- 元々はゲーム的な入力受付を作りたいという趣旨でしたが、おそらく実際は、例えば格闘ゲームであれば[先行入力](http://kakuge.com/wiki/pages/%E5%85%88%E8%A1%8C%E5%85%A5%E5%8A%9B)などの仕様もあるため、こんなに単純ではないとは思います。
- `pausable` によるフラグ管理ではなくて、それを一発で解決してくれる [operator](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators) がありそうな予感もしたのですが、自分には見つけることができませんでした。
【Swift】enumerateを使ったときの値の受け取り方

#はじめに

[【Swift】インデックス付きでmap, reduce, filterを使ってみる](http://qiita.com/ken0nek/items/4a29d3dc55bff5201e1c)
[Swift 2.0でのenumerateの使い方](http://qiita.com/ken0nek/items/67631f9b85bebb9026a8)
の記事を上げる中で気づいたことがあったのでこれも記事にしようと思いました。

~~Swift 2.0で書きました。~~
Swift 3.0で書きました。（2016/09/28）

# やること
map関数でインデックス(index)と要素(element)のペアを作る。

```swift

[1, 2, 3, 4] -> ["0:1", "1:2", "2:3", "3:4"]
```

# 方法一覧
詳しい書き方から順に紹介していきます。

## 値の受け取り方 その1

enumerateした結果、インデックスと要素のタプルで返ってきます。
タプル内のそれぞれの変数に、型付きで名前を付け、戻り値の型まで記述しました。


```swift

let array = [1, 2, 3, 4]
let pairList = array.enumerated().map { (tuple: (i: Int, ele: Int)) -> String in
    return "\(tuple.i):\(tuple.ele)"
}
```

## 値の受け取り方 その2

受け取る変数名だけ記述。
型推論により```(Int, Int)```型のタプルになります。

```swift

let array = [1, 2, 3, 4]
let pairList = array.enumerated().map { tuple in
    return "\(tuple.0):\(tuple.1)"
}
```


~~自動で```(index: Int, element: Int)```の名前付きタプルにもなりました。~~
Swift3では、自動で```(offset: Int, element: Int)```の名前付きタプルになりました。

```swift

let array = [1, 2, 3, 4]
let pairList = array.enumerated().map { tuple in
    return "\(tuple.offset):\(tuple.element)"
}
```
## 値の受け取り方 その3

タプル内のそれぞれの要素を型付きで直接取得します。

```swift

let array = [1, 2, 3, 4]
let pairList = array.enumerated().map { (i: Int, ele: Int) in
    return "\(i):\(ele)"
}
```

## 値の受け取り方 その4

タプル内のそれぞれの要素をそのまま取得します。

```swift

let array = [1, 2, 3, 4]
let pairList = array.enumerated().map { (i, ele) in
    return "\(i):\(ele)"
}
```

## 値の受け取り方 その5

変数の記述なし、returnもなし。
これでもちゃんと動きます。

```swift

let array = [1, 2, 3, 4]
let pairList = array.enumerated().map { "\($0.0):\($0.1)" }
```

# おまけ

mapでの値の受け取り方を紹介しましたが、for文でも発見がありました。


## for文 その1
```swift

for (i, ele) in [1, 2, 3, 4].enumerated() {
    print(i, ele)
}
```
ふつう

## for文 その2
```swift

for tuple in [1, 2, 3, 4].enumerated() {
    print(tuple.offset, tuple.element)
}
```


この方法だと、自動で補完までしてくれました！！

![Screen Shot 2016-09-28 at 3.14.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/58141/6d7815ff-5707-1aa4-1d5e-6ec2c4d4b239.png)

![Screen Shot 2016-09-28 at 3.14.25 PM.png](https://qiita-image-store.s3.amazonaws.com/0/58141/97b30ffd-bdcb-f281-ea57-0944e6862f11.png)


# おわり
プレーンなクラスにActiveRecordのアソシエーションを生やすfake_associationsをつくった


最近、Railsで開発していて、モデルは必要だが、テーブルは必要ではなくなるということがありました。
つまり、ActtiveModelなどのオブジェクトを、例えば具体的には以下のように、Railsのモデルのように他のモデルとの関連付け（アソシエーション）を維持して、利用したいということがありました。

```ruby
class Tweet < ActiveRecord; end

class User
  
  attr_accessor :id
	
  has_many :tweets
end
```

もちろん一つ一つ必要なアソシエーションを実装することもできたのですが、同じようなメソッドを定義するのも良くないことは自明です。
そこで、`include`するだけである程度のアソシエーションを実現できるものにしました。

[tsuwatch/fake_associations](http://github.com/tsuwatch/fake_associations)

実装としては、Railsの命名規則やアソシエーション部分に書かれている情報を頼りにモデルを生成し、ActiveRecordのメソッドを呼び出していくということをしています。
ActiveRecordの内部APIを利用することも考えたのですが、あまりActiveRecordの内部実装に依存し過ぎるのは辛くなるのではないだろうかと考えてこのような方針で実装をしました。
## 使い方
現在サポートしているのは、`has_many`とある程度のオプションのみです。
以下のようなコードで動作することは確認しています。
今後さらに他のアソシエーションのサポートを充実させていきたいと考えています。

```ruby
class User
  include FakeAssociations
  
  # Need
  attr_accessor :id
	
  has_many :tweets
	
  has_many :friendships, foreign_key: 'follower_id'
  has_many :followed_user, through: :friendships, source: :followed
	
  has_many :reverse_friendships, foreign_key: 'followed_id', class_name: 'Friendship'
  has_many :followers, through: :reverse_friendships, source: :follower
	
  has_many :favorite_tweets, through: :favorites, source: :tweet
end

class Friendship < ActiveRecord::Base
  #  Table name: friendships
  #
  #  id          :integer  not null, primary key
  #  follower_id :integer
  #  followed_id :integer
end

class Tweet < ActiveRecord::Base
  #  Table name: tweets
  #
  #  id          :integer  not null, primary key
  #  user_id     :integer
end

class Favorite < ActiveRecord::Base
  #  Table name: favorites
  #
  #  id          :integer  not null, primary key
  #  user_id     :integer
  #  tweet_id    :integer
end
```

## おわり

プレーンなクラスに見せかけの関係（fake associations）を定義できるgemを作り、説明しました。Railsの規則のおかげで、探り探り関連するモデルを引っ張りながら実装を進めていくことが出来ました。主にActiveModelなクラスで利用することになると思います。
現時点で、自分の要件を満たしているのでリリースしましたが、今後他のアソシエーションもサポートしていければと考えています。
【Swift】インデックス付きでmap, reduce, filterを使ってみる

# Swift 3.0

使いどころがあるかは分かりませんが実験的に。
参考: [Swiftでのenumerateの使い方](http://qiita.com/ken0nek/items/67631f9b85bebb9026a8)

## map
```swift

let array = [1, 2, 3, 4]
let m = array.enumerated().map { "\($0.0): \($0.1)" } // インデックスと要素のペア
print(m)
// ["0: 1", "1: 2", "2: 3", "3: 4"]
```
## reduce
```swift

let array = [1, 2, 3, 4]
let r = array.enumerated().reduce(0) { $0 + $1.0 * $1.1 } // インデックスと要素の積の総和
print(r)
// 20 <- 0*1 + 1*2 + 2*3 + 3*4
```
## filter
```swift

let array = [1, 2, 3, 4]
let f = array.enumerated().filter { $0.0 * $0.1 > 3 }.map { $0.1 } // インデックスと要素の積が3より大きいもの
print(f)
// [3, 4]
```

# 最後に
enumerateでの値の受け取り方についての詳しい実験は別の記事にしたいと思います。

[【Swift】enumerateを使ったときの値の受け取り方](http://qiita.com/ken0nek/items/5c9c3f5138fbbaf5e82c)

追記: 記事にしました。
CocoaPodをプロジェクトから削除する方法


CocoaPodを削除したいときのTipsです。

以下の記事を参考にしました

>[How to remove CocoaPods from a project?](http://stackoverflow.com/questions/16427421/how-to-remove-cocoapods-from-a-project)

とりあえず、プロジェクトのディレクトリから、
該当のファイルとフォルダを全て削除します。

・``Podfile``
・``Podfile.lock``
・``/Pods``
・``xcworkspace``

そして``xcodeproj``からプロジェクトを開き、``Frameworks``内から以下を削除します。

・``Pods.xcconfig``
・``libPods.a``


![dn_10_104.jpg](https://qiita-image-store.s3.amazonaws.com/0/41889/8c301634-4bd2-08bc-c04f-6f9343f4e709.jpeg)
ex.デスノート

この段階でビルドすると、以下のようなエラーを吐きます。

![44b103ed61f0585fc8f1cefa6e12ce1b.png](https://qiita-image-store.s3.amazonaws.com/0/41889/b51c1982-d681-4137-cd25-aab2f7a83fa0.png)

``The sandbox is not in sync with the Podfile.lock``

`Podfile.lock`とは、podをインストールしたときのバージョンを記録するファイルです。つまり、先ほど``Podfile.lock``を削除したため、podのバージョンに差分ができたと怒られてしまいます。

CococaPodとの連携を切って、このエラーを解決します。
``TARGETS`` > ``Build Phases``に行き、以下のフェーズを削除します。

・``Copy Pods Resources``
・``Check Pods Manifest.lock``

ちなみに、``Manifest.lock``とは、インストールを実行するたびに作成される``Podfile.lock``のコピーです。つまり、この``Manifest.lock``と``Podfile.lock``に差分があったため(``Podfile.lock``が存在しない)、上記の``The sandbox is not in sync with the Podfile.lock``というエラーを吐いていたみたいです。

![de6ac7f803789928ac341647097ea0c2.png](https://qiita-image-store.s3.amazonaws.com/0/41889/f3065e4e-78ee-187c-1d09-4f3ce7b90ba0.png)

>参考
>[CocoaPods Under The Hood](http://www.objc.io/issues/6-build-tools/cocoapods-under-the-hood/#podfile-lock)

``clean``して``build``すると、暗雲のように立ち込めていたエラーは消え、
無事、CocoaPodとの連携を切ることができました。


おわり
Mac OS Ⅹ Yosemiteで LookupViewService がメモリをバカ食いする問題

なんか入力が遅いなぁと思ったらメモリ16Gのマシンでスワップアウトが発生していたので。

対処法としては
**`システム環境設定 > トラックパッド > ポイントとクリック`** の
* **「調べる＆データ検出」**
* **「強めのクリックと触覚フィードバック」**
の2項目のチェックをはずせばいい。

その後メモリを大量に専有している LookupViewServiceを killする。
 - ただしTERMシグナルじゃ死なない、強制終了のKILLシグナルなら死んだ。
 - なんか不安なら再起動すればそれが確実。次回からは LookupViewService というプロセスは立ち上がらない。

参考: http://apple.stackexchange.com/questions/181122/lookupviewservice-eats-a-lot-memory
Swiftでのenumerateの使い方



Swift2.0から大域関数のenumerateが消え、SequenceTypeにenumerateが実装されました。
Swift3からは`enumerate`ではなく`enumerated`になりました

```swift:AppleのAPIより

    /// Returns a sequence of pairs (*n*, *x*), where *n* represents a
    /// consecutive integer starting at zero, and *x* represents an element of
    /// the sequence.
    ///
    /// This example enumerates the characters of the string "Swift" and prints
    /// each character along with its place in the string.
    ///
    ///     for (n, c) in "Swift".characters.enumerated() {
    ///         print("\(n): '\(c)'")
    ///     }
    ///     // Prints "0: 'S'"
    ///     // Prints "1: 'w'"
    ///     // Prints "2: 'i'"
    ///     // Prints "3: 'f'"
    ///     // Prints "4: 't'"
    ///
    /// When enumerating a collection, the integer part of each pair is a counter
    /// for the enumeration, not necessarily the index of the paired value.
    /// These counters can only be used as indices in instances of zero-based,
    /// integer-indexed collections, such as `Array` and `ContiguousArray`. For
    /// other collections the counters may be out of range or of the wrong type
    /// to use as an index. To iterate over the elements of a collection with its
    /// indices, use the `zip(_:_:)` function.
    ///
    /// This example iterates over the indices and elements of a set, building a
    /// list of indices of names with five or fewer letters.
    ///
    ///     let names: Set = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
    ///     var shorterIndices: [SetIndex<String>] = []
    ///     for (i, name) in zip(names.indices, names) {
    ///         if name.characters.count <= 5 {
    ///             shorterIndices.append(i)
    ///         }
    ///     }
    ///
    /// Now that the `shorterIndices` array holds the indices of the shorter
    /// names in the `names` set, you can use those indices to access elements in
    /// the set.
    ///
    ///     for i in shorterIndices {
    ///         print(names[i])
    ///     }
    ///     // Prints "Sofia"
    ///     // Prints "Mateo"
    ///
    /// - Returns: A sequence of pairs enumerating the sequence.
    public func enumerated() -> EnumeratedSequence<Array<Element>>
}
```

APIにあるように、以下のような実行結果になります。

```swift

for (n, c) in "Swift".characters.enumerated() {
    print("\(n): '\(c)'")
}

// 0: 'S'
// 1: 'w'
// 2: 'i'
// 3: 'f'
// 4: 't'
```

[Int]型の配列の場合は、以下のようになります。

```swift

for (i, ele) in [1, 2, 3, 4].enumerated() {
    print("\(i), \(ele)")
}

// 0, 1
// 1, 2
// 2, 3
// 3, 4
```
if hoge.present?はpresence.tryでifを消せたりする

例えばviewファイルで

```view.html.erb
<%# @model.hogehoge => 1 %>
<%= @model.hogehoge + '日' if @model.hogehoge.present? %>
<%# => 1日 %>
```
とか@model.hogehogeが2回出てくるのが憎い

こう書ける

```view.html.erb
<%= @model.hogehoge.to_s.presence.try(:+, '日') %>
```

もっとも、このケースではtメソッドを使うべきですよね

```view.html.erb
<%= @model.hogehoge.to_s.presence.try(:+, t('datetime.prompts.day')) %>

<%#= lazy lookupを使ってさらに簡潔に？（yml割愛しますが、hogehoge: "%{day}日"みたいな感じです。.to_sはずせますね） %>
<%= @model.hogehoge.presence.try{|s| t '.hogehoge', day: s} %>
```
localeの定義はこちらにあわせてます
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

***
ちなみに

```rb
処理 if hogehoge.present?
```
も以下のように書ける時があります

```rb
hogehoge.presence && 処理
```
個人的にこっちの方が読みやすいです
ただし、厳密にはイコールではないので注意が必要です（思考停止の一括置換は危険）
Eclipseで始めるScala、Clojure、Groovy 準備編

# はじめに
今まで基本的にJavaをメインに使ってきた自分的には

* 環境に依存しないVM上で動作する言語がいい
* できればやはりJavaの各種遺産が使いたい

というのがあって、JVM上で動作するスクリプト言語には興味があった。
でも、いろんな言語があるのでどれを使うか迷っていた。

最近は大分リリース等も落ち着いた感じでタイトルにも上げた
Scala、Clojure、Groovyあたりがメジャーぽいのかな？
ということでこの3つの言語をEclipseで実行できる環境まで作ってみる。

## Scala vs Clojure vs Groovy トレンド検索
https://www.google.co.jp/trends/explore#cat=0-5-31&q=%2Fm%2F091hdj%2C%20Clojure%2C%20%2Fm%2F02js86&date=today%2012-m&cmpt=q&tz=Etc%2FGMT-9
![scala-clojure-groovy.PNG](https://qiita-image-store.s3.amazonaws.com/0/88168/0a929397-ff9b-9a73-91f3-6048de724a2e.png)
**<font color='blue'>Scala</font> <font color='red'>Clojure</font> <font color='orange'>Groovy</font>**
トレンド的にはScalaが一歩抜けだしてて、Clojure、Groovyは並んでるって感じか。

# Eclipseの準備
とりあえずEclipseはいつものAllInOneを利用してみる
[Pleiades](http://mergedoc.osdn.jp/)から最新のEclipse4.5を選択して、自分の環境に合ったものをダウンロード

適当にダウンロードしたpleiades-e4.5-java_yyyymmdd.zipを展開
Windows環境の場合だと解凍時のパスが長すぎてうまく解凍できない時があるので
C:\直下とかで展開するほうがベター

## Eclipseに各言語の開発環境をインストール
基本的にEclipseを立ち上げてヘルプ>Eclipseマーケットプレースから検索すれば
必要なIDEのプラグインが見つかるので便利（小並感
![マーケットプレース.PNG](https://qiita-image-store.s3.amazonaws.com/0/88168/5e22379b-ba33-149d-9bdf-41e02e621f79.png)

### Scala
Scalaで検索してScala IDEをインストール
![scalaide.PNG](https://qiita-image-store.s3.amazonaws.com/0/88168/ae5d534b-87e1-2397-5230-3c5a4e797aad.png)

### Clojure
Clojureで検索してCounterclockwiseをインストール
![clojureide.PNG](https://qiita-image-store.s3.amazonaws.com/0/88168/eaeab080-9a8f-b1a6-b09f-114d9b4c73db.png)

### Groovy
Groovyはマーケットプレースに最新のが上がってないようなので
ヘルプ＞新規ソフトウェアのインストールから自分でサイトを追加する

http://dist.springsource.org/snapshot/GRECLIPSE/e4.5/
Groovy-Eclipseを選択してインストール

![groovyide.PNG](https://qiita-image-store.s3.amazonaws.com/0/88168/15afbb14-d9c7-d9aa-45b0-b7adc6652ded.png)

## Hallo Worldしてみる
### Java
とりあえず、いつものJava

```java:JavaTest.java
package net.zantetu;

public class JavaTest {

	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}
```
```text:実行結果
Hello World!
```

### Scala
```scala:ScalaTest.scala
package net.zantetu

class ScalaTest {
  def main(args: Array[String]): Unit = {
    printf("Hello World!");
  }
}
```
```text:実行結果
Hello World!
```

### Clojure
Clojureは対話式が基本ぽいので
ちょっとやりたい感じのこととは違うので割愛
でも慣れれば色々できるんだろうな～という感じ

### Groovy
```groovy:GroovyTest.groovy
package net.zantetu

class GroovyTest {
	static void main(args) {
		print "Hello World!";
	}
}
```
```text:実行結果
Hello World!
```

## 軽く触ってみた雑感
IDEの完成度はScalaが一番良い。各種書籍も多いので勉強するときの障壁は小さい。
Hadoop関連がScalaで書かれているのでそちらを抑えたいなら一択なのかな？

Clojureははじめ意味わからなかったけど慣れれば早いサイクルで開発できそう。
でも自分のやりたいこととちょっと離れているので必要がなければやらないと思う。

GroovyはかなりJavaに近く書けるのかなというイメージ。
IDEは保管とかが若干弱いのかも、専用パースペクティブがないので
Javaパースペクティブを使うのもちょっと気になる。
でもなんか一番しっくり来たのはこいつなんだよな。
【Swift】文字列の計算式を処理する

2017/10/04 - Swift4で動作確認。

# NSExpression

[NSExpression](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSExpression_Class/)というものを使って、"5+8/4-2"のような文字列を計算したいと思います。

# コード

```swift

let numList = [5, 8, 4, 2].map { String(Double($0)) } // 割り算を正確に行うためにDouble型への変換をはさむ
print(numList)
// ["5.0", "8.0", "4.0", "2.0"]

let opeList = ["+", "/", "-"]

let zipped = zip(numList, opeList + [""])
let equation = zipped.reduce("") { $0 + $1.0 + $1.1 }
print(equation)
// "5.0+8.0/4.0-2.0"

let expression = NSExpression(format: equation)
let output = expression.expressionValue(with: nil, context: nil) as! Double
print(output)
// 5.0
```

# 参考

[【Swift】2つの配列を交互につなぎ合わせる ](http://qiita.com/ken0nek/items/55e9ac0be32d35fbaa67)
[【Swift】Int型の数字から[Int]型の配列を生成する ](http://qiita.com/ken0nek/items/825289a7f3ea1d840337)
git pushがrejectされたときの解決方法URLまとめ

複数の開発者とgitリポジトリのやりとりをしていると陥りやすいgit pushのrejectについて、解説や解決方法が書かれているページをまとめました。

- 【git】git pushがrejectされたときの対応方法
https://www.softel.co.jp/blogs/tech/archives/3569

- git pushがrejectされたときの解決の手順
http://d.hatena.ne.jp/snaka72/20100602/1275496817

- [Git] git push が non-fast-forward で reject された場合の対処
http://www.d-wood.com/blog/2014/04/08_5998.html

- git pushがrejectされたときの対処
http://qiita.com/katsuyuki/items/8e03e5eb4223912a08c5

- Non-Fast-Forward Push の解決
http://linux.keicode.com/prog/git-resolve-non-fast-forward-push-problem.php
Dockerエンジン更新時には気を付けろ

Dockerは頻繁に更新されていますが、更新時に注意が必要です。
リリース状況は、こちらで確認できます。[https://github.com/docker/docker/releases](https://github.com/docker/docker/releases)

Dockerコンテナは、Dockerデーモンが親プロセスになっています。
下のps結果を見てもらえばわかると思いますが、docker runで実行したリクエストはDockerデーモンで処理されます。詳しくは、[Docker調査20150704](http://www.slideshare.net/HommasSlide/docker20150704)を見てください。

```
# ps -ef | grep docke[r]
root      1262     1  0 00:20 ?        00:00:00 /usr/bin/docker -d --selinux-enabled
root      2669  2619  0 00:27 pts/1    00:00:00 docker run -it -name centos_homma_7 centos:7 /bin/bash
root      2826  2800  0 00:38 pts/3    00:00:00 docker run -it -name centos_homma_7_02 centos:7 /bin/bash 

# ps -ef | grep "/bin/bas[h]"
root      2669  2619  0 00:27 pts/1    00:00:00 docker run -it -name centos_homma_7 centos:7 /bin/bash
root      2710  1262  0 00:27 pts/2    00:00:00 /bin/bash
root      2826  2800  0 00:38 pts/3    00:00:00 docker run -it -name centos_homma_7_02 centos:7 /bin/bash
root      2864  1262  0 00:38 pts/4    00:00:00 /bin/bash

# ps -ef | grep "126[2]"
root      1262     1  0 00:20 ?        00:00:00 /usr/bin/docker -d --selinux-enabled
root      2710  1262  0 00:27 pts/2    00:00:00 /bin/bash
root      2864  1262  0 00:38 pts/4    00:00:00 /bin/bash
```

Dockerデーモンが落ちると、子プロセスも停止してしまうので、子プロセスであるDockerコンテナは影響を受けてしまいます。そのため、yum updateでDockerのバージョンを更新しようとすると、Dockerデーモンが一度停止する必要があるので、すべてのコンテナが停止してしまいます。

通常であれば、Dockerデーモンのバージョンをあげてもコンテナまで影響しないのがよい（そのように考えてしまいますが）と思いますが、現在のDockerはそのようになっていません。更新するときは要注意です。大事なコンテナが動いているときは更新してはいけません。

DockerもKVMのように、ライブマイグレーション的な機能がつく日が来るのでしょうか。しかしまだまだ先のような気がしています。
Openshiftはそのあたりどうなっているんだろうか。。。
Dockerの時刻

# Dockerコンテナの時刻

Dockerコンテナを通常立ち上げると、時刻はUTCになってしまう。

```
# docker run -it --name homma01 centos /bin/bash
[root@dcd3aad6428e /]# date
Wed Aug 19 15:10:31 UTC 2015
```

# JSTを使用したい
やっぱり時刻はJSTにしたい。
2つの方法があるみたいです。

参考情報は、[Will docker container auto sync time with the host machine?](http://stackoverflow.com/questions/22800624/will-docker-container-auto-sync-time-with-the-host-machine)です。

* -v /etc/localtime:/etc/localtime:ro
* -e "TZ=Asia/Tokyo"

## /etc/localtimeをマウントする方法

```:-vオプション
# docker run -it --name homma01 -v /etc/localtime:/etc/localtime:ro centos /bin/bash
[root@d1698b83d04a /]# 
[root@d1698b83d04a /]# date
Thu Aug 20 00:09:19 JST 2015
```

## 環境変数で渡す方法

```:-eオプション
# docker run -it --name homma03 -e "TZ=Asia/Tokyo" centos /bin/bash 
[root@fbd2a720e5f4 /]# 
[root@fbd2a720e5f4 /]# date
Thu Aug 20 00:15:07 JST 2015
```

ログを出力必要がある場合、どちらかを指定しておきたい。
いずれ標準で、マウントされそうな予感がする。
bmson support landed on Bemuse


About Bemuse
------------

[Bemuse] is a web based online rhythm game. Natively, it plays notecharts (譜面) in BMS format. In v1.0.0-beta.19, it adds experimental support for [#bmson] format.

Twitter: [@bemusegame]

[Bemuse]: https://bemuse.ninja/
[@bemusegame]: https://twitter.com/bemusegame


About bmson
-----------

[#bmson] is a new notechart format, which aims to help authors create notechart easily. It has many advantages:

- Sounds will be automatically sliced by the player. Authors don’t have to slice their sound files anymore. This [reduces the number of sound files in a package](https://twitter.com/wosderge/status/634015263738851328), allowing for more efficient song loading.
- It also allows different kind of slices for different difficulty.
- Unlimited number of keysounds (when needed).
- For developers, it is easy to parse, because it is a standard JSON format.
- Extensible. Custom metadata can be added to JSON.


bmson support in Bemuse
-----------------------

- Support bmson v0.21
- BGA not supported (because Bemuse doesn't support BGA)


How to try
----------

- Use __Google Chrome__ or __Opera__
- Go to https://bemuse.ninja/ and __Enter Game__
- Select __BMS Mode__
- At the bottom left, click __Play Custom BMS__
- Drag a folder with `.bmson` and KEY音 files such as `.ogg` into the box. [See example](https://www.facebook.com/bemusegame/photos/a.872468499492894.1073741828.815335081872903/876774452395632/?type=1&theater).
- Select a difficulty and play! :dancer: 


Sample bmson songs
------------------

Go here &rarr; [Sample bmson songs](http://qiita.com/dtinth/items/df3d0ee62156c8169a62)

<br>

<br>

[#bmson]: http://cerebralmuddystream.nekokan.dyndns.info/bmson/
Sample bmson songs


- [bmson_sample.zip](http://cerebralmuddystream.nekokan.dyndns.info/bmson/bmson_sample.zip) from [bmson website](http://cerebralmuddystream.nekokan.dyndns.info/bmson/)
- [flicknote — Only Love (Euphoric Trance Remix)](https://dl.dropboxusercontent.com/u/25097375/bmson/2015/flicknote_onlylove_remix.zip)
[Swift]UIColor SampleColor

色の参考
![iOS Simulator.png](https://qiita-image-store.s3.amazonaws.com/0/91606/7dce9638-21dc-e673-45a4-a580f6b0a54f.png)

```swift:tableView
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        
        let colors: [(color: UIColor, text: String)] = [
            (UIColor.blackColor(),"blackColor"),
            (UIColor.darkGrayColor(),"darkGrayColor"),
            (UIColor.lightGrayColor(),"lightGrayColor"),
            (UIColor.whiteColor(),"whiteColor"),
            (UIColor.grayColor(),"grayColor"),
            (UIColor.redColor(),"redColor"),
            (UIColor.greenColor(),"greenColor"),
            (UIColor.blueColor(),"blueColor"),
            (UIColor.cyanColor(),"cyanColor"),
            (UIColor.yellowColor(),"yellowColor"),
            (UIColor.magentaColor(),"magentaColor"),
            (UIColor.orangeColor(),"orangeColor"),
            (UIColor.purpleColor(),"purpleColor"),
            (UIColor.brownColor(),"brownColor"),
            (UIColor.clearColor(),"clearColor")]
        
        cell.textLabel?.text = colors[indexPath.row].text
        cell.backgroundColor = colors[indexPath.row].color
        
        if (cell.backgroundColor == UIColor.blackColor())
        {
            cell.textLabel?.textColor = UIColor.whiteColor()
        }
        
        return cell
    }
```

参考ソース
https://github.com/senseiswift/UIColorSample
InterfaceBuilderを使ってViewControllerを軽くする

# InterfaceBuilderを使ってViewControllerを軽くする

あまり記事を見かけないけど、実はInterfaceBuilderのIBOutletは`NSObject`であればどのクラスでも接続することができる。
メリットとしては、

* ViewControllerからロジックを分離できる
* ロジック部分を複数のViewController間で共有できる

などなど。

## 方法

例として、

* ボタンを押すと、ラベルのテキストを「Pushed」に変更する

という処理をやってみる。

* 前提
    * UILabel, UIButtonをIB上で配置しておく
    * 実際に処理を行う`LabelChanger`クラスのファイルを追加しておく

* 手順
    1. `NSObject`を`First Responder`の直下にドラッグ
    2. `Custom Class`でクラス名を指定←これが重要
    ![01-1.png](https://qiita-image-store.s3.amazonaws.com/0/92660/ed69e0e6-abbb-1105-1034-0c50bd99ded5.png)
    3. クラス名を指定したあとはいつも通り`IBOutlet`を接続して、ボタンが押されたときにラベルのテキストを変更する処理を書く
    ![02-2.png](https://qiita-image-store.s3.amazonaws.com/0/92660/3eb77cd8-46a7-9d9c-1a68-9300f20dcb06.png)
    4. 起動して`Button`をタップしてみる
    5. ラベルのテキストが`Pushed`に変わる

これでViewControllerのコードを一切編集することなく、処理をモジュール化できる。
依存関係が無いように作っておけば、別プロジェクトにだって持っていける。

## 応用

ViewControllerと接続すれば画面遷移だって書ける。
![Screen Shot 2015-09-08 at 11.25.33 PM.png](https://qiita-image-store.s3.amazonaws.com/0/92660/c69299cb-6905-9fa3-7dd2-58fbbc4170b8.png)

自分は、カスタムビューとそのカスタムビューを管理するマネージャクラスを作るときとかにこれをよく使う。

1. マネージャは`owner`としてViewControllerへ、`view`としてカスタムビューへIBOutletの接続しておく
2. ViewControllerは取得したデータをマネージャに渡すだけ。ViewController自身はデータがどう使われるか知らなくていい
3. マネージャは`self.view`にデータをセットして表示する
4. カスタムビューはタップされたらデリゲートとかでマネージャに通知
5. マネージャは`self.owner`を使って、画面遷移処理を行う

設計や仕様次第だが、viewをタップしたときの遷移処理をマネージャ内でブロックで定義して、データとともにviewに渡すのもあり。

ちなみに、このオブジェクトたちは、IBからViewControllerのインスタンスが読み込まれるときに生成されて、ViewControllerのインスタンスが破棄されるときに一緒に破棄される。ViewControllerへの強参照を持つと循環参照になってしまうのでそこは注意。
Mac から Microsoft Remote Desktop で接続するとキーボードの配置がおかしい

### 環境
- MacOSX 10.10.5
- Microsoft Remote Desktop 8.0.19
- Windows 10 Pro

Macから開発用Windowsに接続したらキーボードの配置がおかしい。
最終的に自分はWindowsは自動ログオンするようにし、日本語のキーボードのセッションを残しておくことで対応した。

[キーボードのドライバを手動で更新する方法](http://blog.masahiko.info/entry/2014/07/07/203115)も試したが、私の環境ではエラーで更新できなかった。
YAML覚書

# YAML覚書

<dl>
  <dt>YAML(ヤムル)とは</dt>
  <dd>構造化されたデータの表記仕様、xmlに比べてわかりやすい、書きやすいが実現されている</dd>
  <dt>データ構造</dt>
  <dd>インデントを使い階層構造を表現する。ただし、インデントにはタブが使えずスペースのみが使える。スペース2個単位でインデントすることが多い
  </dd>
</dl>


## 表記方法

### シーケンス(配列)

行頭に - をつけると配列を表現

```
- alpha
- bravo
- charlie

解釈→ ['alpha', 'bravo', 'charlie']
```

半角スペースでのネスト表記

```yaml
- alpha
-
  - bravo1
  - bravo2
  - 
    - bravo2_1
    - bravo2_2
  - charlie

解釈→ ['alpha', 'bravo1', 'brabo2', ['brabo2_1', 'brabo2_2'], 'charlie']
```

箇条書き表記はできない

```
- alpha
  - alpha1
  - alpha2
  - alpha3

解釈→ ['alpha  - alpha1  - alpha2  - alpha3']
```

## マッピング(ハッシュ)

ハッシュは キー: 値 で表す。:の後に半角スペースを1つ以上入れること

```
a: alpha
b: bravo
c: charlie

解釈→ {'a' => 'alpha', 'b' => 'bravo', 'c' => 'charlie'}
```

ネスト表記

```
a: alpha
b:
  b1: bravo1
  b2: bravo2
c: charlie


解釈
{
	'a' => 'alpha',
	'b' => {
		'b1' => 'bravo1',
		'b2' => 'bravo2'
	},
	'c' => 'charlie'
}
```

解釈できない

```
b: bravo
  b1: bravo1
  b2: bravo2
```

## 配列とハッシュ


```
- name: Hoge
  email: hoge@hoge.com
- name: Foo
  email: foo@foo.com


解釈
[
  {
    name: Hoge
    email: hoge@hoge.com
  },
  {
    name: Foo
    email: foo@foo.com
  }
]
```

## データ型

! を使うとデータの型を明示的に指定する

```
- !str 123
- !pairs
  - A: alpha
  - B: bravo

解釈
['123', [['A' => 'alpha'], ['B' => 'bravo']]]
```

## 複数行の文字列

各行の改行を保存

```
text: |
  alpha
  bravo
  charlie


{"text" => "alpha\nbrabo\ncharlie\n"}
```

インデント幅指定

```
- |2
  alpha
  bravo
  charlie

["  alpha\n", "  brabo\n", "  charlie\n"]
```
[Swift]タプルの配列

```swift:tuple
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let texts: [(rare: Int, name: String)] = [
            (5,"三日月宗近"),
            (3,"小狐丸"),
            (3,"石切丸"),
            (3,"岩融"),
            (1,"今剣")]
        
        // 要素へのアクセス例
        println(texts[0].name)  // 三日月宗近
        println(texts[4].rare)  // 1
    }
```


TableViewでの応用

```swift:tableView
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        
        // セルのテキストはタプルのnameをセット
        cell.textLabel?.text = texts[indexPath.row].name

        // セルの背景色はタプルのrareから判定してセット        
        switch (texts[indexPath.row].rare)
        {
        case 1:
            cell.backgroundColor = UIColor.whiteColor();
            break
        case 2:
            cell.backgroundColor = UIColor.blueColor();
            break
        case 3:
            cell.backgroundColor = UIColor.greenColor();
            break
        case 4:
            cell.backgroundColor = UIColor.orangeColor();
            break
        case 5:
            cell.backgroundColor = UIColor.magentaColor();
            break
        default:
            break
        }
        
        return cell
    }
```

実施例
![iOS Simulator-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/91606/e057b39e-ceae-b582-0527-239113f50e57.jpeg)

参考ソース
https://github.com/senseiswift/tableviewtest/commit/29f759d2220972b7c0f980d7f1181a54a56804ed
Fast and Robust Parallel SGD Matrix Factorization読んだ

# KDD2015 Fast and Robust Parallel SGD Matrix Factorizationを読んだ
## どんなもの？
高速で堅牢な行列分解手法を提案。
shared memoryの環境だけでなく、block storage環境でも効率よく動く。

## 先行研究と比べると？
- SGDの並列実行スケジューリングを効率よく行う
- block storage上でSGDのランダム実行を行う

## 技術や手法のキモはどこ？
- 行列のパーティショニングにMulti-Level Grid Fileを使う
- 非同期のIOを活用することで、IO waitを減らす(SSDなど並列IOにも非同期IOは適している)

## どうやって有効だと検証した？
shared memory環境、block storage環境の両方で今までのアルゴリズムより性能が良いことを示した。

## 議論はある？
- IO性能の違いではあまり性能差が出ない(隠ぺいできた)
- page sizeの違いもあまり性能差に影響しなかった

## 次に読むべき論文は？
- Document clustering based on non-negative matrix factorization

## ref
http://dl.acm.org/citation.cfm?id=2783322
ターミナルのキー入力を得てカーソル移動とかする (curses無し)

![スクリーンショット 2015-09-08 22.42.25.png](https://qiita-image-store.s3.amazonaws.com/0/18902/e5806161-0ef8-b596-1feb-a731ceb933b5.png)

やりたいこと： 方向キーでカーソルとか動かしたい (※画像はイメージです)

# キー入力を得る
ターミナルでユーザーの入力を得る際、`gets`や`getc`ではエンターが押されるまでキーの入力状況を得ることができません。
なので、カーソル移動等の操作には使えません。
cursesライブラリは色々とめんどいので使わない方法を調べました。

## IO#getch (io/console)
`require 'io/console'`すると`IO#getch`が使えるようになります。
これでキーが押されるたびに標準入力から文字を得ることができます。
ただし`Control + C`の終了もできなくなるので、`Control + C`が押されたらループを抜けるようにします。

```rb:read_key.rb
require 'io/console'

i = 0
while (key = STDIN.getch) != "\C-c"
  puts " #{i += 1}: #{key.inspect} キーが押されました。"
end
```

a, b, c のキーを押した結果

```shell-session
$ ruby read_key.rb 
  1: "a" キーが押されました。
  2: "b" キーが押されました。
  3: "c" キーが押されました。
```

## 矢印キーも使ってみる

矢印キーを押すと、カーソルを移動するエスケープシーケンスが入力されます。
(MacのTerminalで動作確認してます。他も一緒かは調べてません)
3文字の文字列じゃなくて、1文字が3回。

```shell-session
$ ruby read_key.rb 
  1: "\e" キーが押されました。
  2: "[" キーが押されました。
  3: "A" キーが押されました。
```

方向|エスケープシーケンス
:-:|:-:
上|"\e[A"
下|"\e[B"
右|"\e[C"
左|"\e[D"



適当に処理を変えて矢印キーを認識するようにします。

```rb:read_arrow_key.rb
require 'io/console'

arrows = {A: "↑", B: "↓", C: "→", D: "←"}

i = 0
while (key = STDIN.getch) != "\C-c"

  if key == "\e"
    second_key = STDIN.getch
    
    if second_key == "["
      key = STDIN.getch
      key = arrows[key.intern] || "esc: [#{key}"
    else
      key = "esc: #{second_key}"
    end
  end
  
  puts " #{i += 1}: #{key.inspect} キーが押されました。"
end
```

```shell-session
$ ruby read_arrow_key.rb
  1: "↑" キーが押されました。
  2: "→" キーが押されました。
  3: "↓" キーが押されました。
  4: "←" キーが押されました
```

# 使ってみる

カーソル移動してみます。
`WASD`と`hjkl`にも対応したのでPCゲーマーやvim派も安心。
(追記：宗教論争を避ける為、せっかくなので`Control+f,b,n,p`にも対応)

```rb:move_cursor.rb
require 'io/console'
require 'io/console/size'

#画面を消去して、真ん中に移動しておく
print "\e[2J"
print "\e[%d;%dH" % IO::console_size.map{|size| size / 2 }

while (key = STDIN.getch) != "\C-c"
  # 方向キー以外は不要なので、エスケープ文字を得る処理は簡略化した
  if key == "\e" && STDIN.getch == "["
    key = STDIN.getch
  end

  # 方向を判断
  direction = case key
  when "A", "k", "w", "\u0010"; "A" #↑
  when "B", "j", "s", "\u000E"; "B" #↓
  when "C", "l", "d", "\u0006"; "C" #→
  when "D", "h", "a", "\u0002"; "D" #←
  else nil
  end

  # カーソル移動
  print "\e[#{direction}" if direction
end
```

このままだと大文字のAとかを打った場合にも上下左右に移動してしまいます。
特に支障はないので対応しませんが。

`require 'io/console/size'`と`IO::console_size`、今回知ったのですがほとんど使われてませんね。
今まで`stty size`でやってました。GitHubで`console_size`で検索しても全く使われてないっぽい？

# 参考

- [Rubyでバッファリングなしのキー入力を試す - Programmer's Dialy](http://hifistar.hatenablog.com/entry/2015/01/30/230403)
- [instance method IO#getch](http://docs.ruby-lang.org/ja/2.2.0/method/IO/i/getch.html)
- [singleton method IO.console_size](http://docs.ruby-lang.org/ja/2.2.0/method/IO/s/console_size.html)
- [ANSI escape code - Wikipedia](https://en.wikipedia.org/wiki/ANSI_escape_code)
AWS SDK for Node.jsをProxy環境で使う

# 環境

```bash
$node ---version
v0.10.33

$npm --version
1.4.28
```

以下で`package.json`を作成

```bash
$npm init
```

AWS-SDKとProxy用のモジュールをインストール。`-save`オプションによってpackage.jsonに依存関係として追記する。

```bash
$npm install aws-sdk --save
$npm install proxy-agent --save
```

コードは以下のようにすればOK

[Configuring the SDK in Node.js](http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html#Configuring_a_Proxy)

```js
var AWS = require('aws-sdk');
var proxy = require('proxy-agent');

AWS.config.update({
    httpOptions: { agent: proxy('http://host:port') }
});

var s3 = new AWS.S3();
s3.listBuckets(function(err, data) {
  if (err) console.log(err, err.stack);
  else console.log(data);
});

```
現状、（自分の中で）最も良いと思われるRailsでのStylesheetsディレクトリの構成


## 基本的な構成
### 前提
* Bootstrapを使う
* importの機能を理解して（requireも）、フレームワークとアプリケーションのスタイルを疎な関係にする
* application.scssは、requireをするだけ。そこにスタイルを記述してはならない。

### 構成

```
app/assets/stylesheets/
|-- applications.scss
|-- bootstrap_style.scss
|-- style.scss
|-- globals
	|-- _all.scss
	|-- _functions.scss
	|-- _mixins.scss
	|-- _variables.scss
|-- bootstrap_customs
    |-- _buttons.scss
    |-- _navbar.scss
    |-- ...
|-- modules
	|-- _welcome.scss
	|-- ...
```

```scss:applications.scss
/*
 *= require_self

 *= require font-awesome
 *= ...

 * vendor/assets
 *= require animate/animate.css
 *= ...

 * rails-assets
 *= require jquery-bar-rating/dist/themes/fontawesome-stars.scss
 *= ...


 *= require bootstrap_style
 *= require style
*/
```

```scss:bootstrap_style.scss
/* Bootstrap */
@import "bootstrap-sprockets";
@import "bootstrap";
```

```scss:style.scss
/* Global */
@import "globals/all";

/* Bootstrap Custom */
@import "bootstrap_custom/buttons";
@import "bootstrap_custom/navbar";

/* Application Style */
@import "modules/*";
```

```scss:globals/_all.scss
@import "./variables";
@import "./functions";
@import "./mixins";
```

```scss:globals/_variables.scss
$serif: Georgia, serif;
$sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;

$title-font-size: 42px;
$headline-font-size: 26px;
$sub-headline-font-size: 20px;
$base-font-size: 16px;
$small-font-size: 13px;

$baseline: 25px;
$base-line-height: ($baseline/$base-font-size);
```

> 参考
> https://mattbrictson.com/smacss-and-rails
> https://mattbrictson.com/lightning-fast-sass-reloading-in-rails
Ruby-Processing 視界内の円に色づけする(2D)


視界内の円に色づけするサンプルです。
視界内にある円のうち、右側の円には赤く、左側の円には緑に色づけしています。

![angle-of-view.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/7951c192-4c51-2650-b9a6-033ef7899eed.gif "angle-of-view.gif")


```ruby:angle-of-view.rb
load_library :vecmath

# Y 軸上方向が正として計算しています。
# (描画時には y 座標の符号を判定しています)

def setup
  size 400, 400

  n = 100 # 点の個数
  @vecs = (1..n).map { Vec2D.new(rand(width)-width/2, rand(height)-height/2) }
end

# 二つのベクトルのなす角を求める
def calc_angle(a, b)
  cos_theta = a.dot(b) / (a.mag * b.mag)
  Math::acos(max(0, min(1, cos_theta)))
end

def draw
  background 255
  translate width/2, height/2 # 原点を画面中央にする

  m = Vec2D.new(mouse_x - width/2, -(mouse_y - height/2))# マウス位置

  angle_of_view = 30 # 視野角
  left  = m.rotate(-angle_of_view.radians)
  right = m.rotate( angle_of_view.radians)

  # ウィンドウ外までベクトルを伸ばす
  m *= 100; left *= 100; right *= 100

  line(0, 0, m.x, -m.y)
  line(0, 0, left.x, -left.y)
  line(0, 0, right.x, -right.y)

  @vecs.each {|v|
    # ベクトルの内積を計算して、angle_of_view 以下か調べる
    if calc_angle(m, v) <= angle_of_view.radians
      # マウス位置のベクトルに対して v ベクトルが左右どちらの方向か調べる
      sign = m.cross(v)
      if sign < 0 # m の右側
        fill 255, 0, 0
      else # m の左側
        fill 0, 255, 0
      end
    else
      no_fill
    end
    ellipse(v.x, -v.y, 8, 8)
  }
end
```

コマンドラインから次のように実行します。

```
$ rp5 run angle-of-view.rb
```
【Choregraphe】kintoneに登録されたデータをPepperで取得する

##はじめに

Peppperのビジネスでの活用を考える上で、データベースと連携させたいという欲望は必ず出てくると思います。そんな時はkintoneとの連携をお勧めします。

[Pepper - kintone GET ボックス（M-SOLUTIONS株式会社)](https://cybozudev.zendesk.com/hc/ja/articles/205294930-Pepper-kintone-GET-%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-M-SOLUTIONS%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-)

こちらのサイトにあるように、一からプログラムを書かなくても、気軽にkintoneと連携できるボックスを既に用意してくださっているので、kintone上でデータを登録して、あとはそのボックスを使ってAPI連携でデータを取得するだけです。
サンプルは上記サイトの最下部からダウンロードできます。

##使い方

サンプルのプロジェクトではこのような構成になってます。

![スクリーンショット 2015-09-08 20.44.44.png](https://qiita-image-store.s3.amazonaws.com/0/67591/3129e128-80c2-a607-298e-a6019a125dd6.png)


ほぼサイトの方で説明頂いてますし、サンプルを見ればすぐ使えると思いますが、
ただサンプルのボックスだとクエリを設定する際に、下記の画像のように変数のダイアログボックスでクエリーを入力する必要があります。

![スクリーンショット 2015-09-08 20.58.02.png](https://qiita-image-store.s3.amazonaws.com/0/67591/242fb89e-3b1d-02aa-f6d2-fffb5bee82bb.png)


これだと他のボックスから値を渡すケースがあった場合、今のままでは使えません。
そこで、ボックスのpythonを少し修正しました。

シンプルにボックスの構成は文字列で渡せれるようこのような感じです。

![スクリーンショット 2015-09-08 21.55.22.png](https://qiita-image-store.s3.amazonaws.com/0/67591/b385d925-f289-51ff-8921-4bc6f6732b6d.png)


具体的な修正コードは載せませんが、修正した状態のボックスを以下に置いてます。

[https://github.com/king-panda/kintone-get-fix](https://github.com/king-panda/kintone-get-fix)

GETで値がJSON形式で返ってきます。
返ってきた際に、`IndexError`で処理が停止してしまうので、114行目付近に

```py

except IndexError:
            self.onFailed("x")

```

を追加して、エラーの場合は`onFailed`に流すようにしています。（一致する値が無かったときの処理）
Zsh環境をPreztoで構築したらエディタがnanoになってたからvimにした


oh-my-zsh使っていたらどうもzshが重い気がしてきた。
何かとちょこちょこカイゼンで自分でいじってたのはよいけど、気付いたらoh-my-zsh入れたあとにやること多くなりすぎたから、もっと簡単に再現できて、でも便利な環境をラクして手に入れたい。

ということでzshのフレームワークで割と人気っぽいPreztoを使うことにした。
[Prezto — Instantly Awesome Zsh](https://github.com/sorin-ionescu/prezto)

## Preztoのインストール
ここがよくまとまっているのでご参照あれ。というか多分自分のインストール時には本家のGitHub見てたから、さっきぐぐって日本語の人気そうな記事を持ってきただけなんですけどね。

[oh-my-zshを使っていて重いと感じている方、preztoはいかが？](http://qiita.com/kei_q/items/814ec412b3c28f580927)


## デフォルトで呼び出すエディタを確認した
運用していく中で気になったのが、hubコマンドでpull-request送るときに **エディタがnanoになってる** ってやつ。
まずは現状の確認をしてみた。

`echo $EDITOR`や`echo $VISUAL`というのを打てば、現在設定されているエディタの名前を返すはず。

![Kobito.5u52R8.png](https://qiita-image-store.s3.amazonaws.com/0/58800/a8ab40f1-882f-21b8-58af-e74e561be057.png "Kobito.5u52R8.png")


どうやらどこかしらでnanoをデフォルトで呼び出すようにしているらしく、だいたい他のこともnanoになりそうな雰囲気を醸し出してる。

## vimに変更しました
.zprofileにてエディタにnanoが指定されていたためvimに変更。
16行目~22行目くらいにありますね。

```
#
# Editors
#

export EDITOR='vim' # nanoからvimに変更
export VISUAL='vim' # nanoからvimに変更
export PAGER='less'
```

書き換えが嫌だっていう人は別の場所に上書きでよいと思われますね。
どうでもよいけどもここはatomでもいけます。

## 変更を確認した

設定ファイルを読み込み直すなりターミナル再起動させるなりして変更が反映されたか確認してみます。

![Kobito.VWueV2.png](https://qiita-image-store.s3.amazonaws.com/0/58800/960a6f01-3e3d-ca09-b8a9-b65ab89d86a1.png "Kobito.VWueV2.png")

vimにまた出会えてうれしいです。

## 参考

`bundle open`でもeditorがnanoになっちゃうよってGitHub Issue
[`bundle open` opens in nano even with EDITOR env variable set to different editor #315](https://github.com/sorin-ionescu/prezto/issues/315)

存在価値のあるかわからない前記事 - [Nodebrewでio.jsとnode.jsのバージョン管理 - Homebrewでのインストールと基本操作](http://qiita.com/naru0504/items/b35b73258059449ec72a/?next)
1時間以内に解けなければプログラマ失格となってしまう5つの問題をjsで解く


- [1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に](http://www.softantenna.com/wp/software/5-programming-problems/)

１時間以上かかったのでもれなく失格しました[完]

## 1〜4
1問目から3問目は特に問題なく普通に解ける。  
4問目は文字にしてソート

```javascript
// q1
function q1f(list) {
  let sum = 0
  for(let i =0,len = list.length; i < len; i++) sum += list[i]
  return sum
}

function q1w(list) {
  let sum = 0, i=0
  while(i < list.length) sum += list[i++]
  return sum 
}

function q1r(list, sum = 0, i = list.length - 1) {
  if(i < 0) return sum
  return q1r(list, sum + list[i], i - 1)
}

console.log(q1f([1,2,3]))
console.log(q1w([1,2,3]))
console.log(q1r([1,2,3]))

// q2
let q2 = (a, b) => a.map((x,i) => [x, b[i]]).reduce((list, x) => list.concat(x))
console.log(q2([1,2,3], ['a', 'b', 'c']))

// q3
function q3() {
  let list = [0, 1]
  while(list.length < 100)  list.push(list.slice(-2).reduce((sum, x) => sum + x))
  return list
}
console.log(q3())

// q4
let q4 = list => list.map(x => x.toString()).sort().reverse().join("") - 0
console.log(q4([50, 2, 1, 9, 56]))
```

コメントにて4問目の誤りを教えて頂いたので修正しました。
上記のものだと`[9, 91]`のような配列の時に991にならず919になってしまいます。
なので単純にソートせず前後の文字を足したもので比較します。

```javascript
let q4 = list => list.map(x => x.toString()).sort((a,b) => a + b < b + a).join("") - 0

console.log(q4([9, 91])) // 991
console.log(q4([ 5, 2, 1, 9, 50, 56])) // 95655021
```


javaによる回答例

- [Solution to Problem 4 - svpino.com](https://blog.svpino.com/2015/05/08/solution-to-problem-4)


# 問5
思いの外めっちゃ時間かかった。
全ての組み合わせを問２で作った関数使って合成し文字列にして、evalした。

```javascript
// q5
function f(result, prev, n) {
  if(n === 0) {
    result.push(prev)
    return
  }
  for(let i=0; i < 3; ++i) {
    f(result, prev.concat([i]), n-1)
  }
}

let n = [1,2,3,4,5,6,7,8,9].map(x => x.toString())
let o = ['+','-','']
let idx = []
f(idx, [], 8)

let ans = idx.map(x => x.map(i => o[i]))
             .map(x => q2(n,x).join(''))
             .filter(x => eval(x) === 100)

console.log(ans)
```