OmniAICreator/Qiita-1.07M huggingface dataset:
==と===

ややこしいために、CoffeeScriptからは`==`が追放されてしまっていますが、`==`や`===`はどのような条件で等価になるのでしょうか。なお、これ以降で「仕様書」と書いた部分は、[ECMA-262 5.1版](http://www.ecma-international.org/ecma-262/5.1/)のことを指します。

# ===
`===`の厳密な定義は仕様書11.9.6にありますが、噛み砕けば以下のようになります。

* Objectの場合は、同じオブジェクトならtrue、そうでなければfalse
* それ以外の文字列、数値、ブール値、null、undefinedは、原則同じ値ならtrue、そうでなければfalse
* 文字列はコードポイントの逐次比較、正規化はされない
* 例外1（数値）: **+0 === -0**
* 例外2（数値）: **NaN !== NaN**

# ==
`==`の場合は、以下のような流れです（仕様書11.9.3）。

* 両辺が同じ型（Object、文字列、数値、ブール値、null、undefinedの分類で）なら、===の結果と同じ。
* null == undefined
* 一方が文字列、もう片方が数値なら、**文字列を数値に変換して**[^1]比較する。
* 片方がブール値なら、`true`を整数の1に、`false`を整数の0に変換してから==で比較
* Objectと（文字列または数値）の場合、Objectをプリミティブ値に変換して==で比較
* それ以外の組み合わせではfalseを返す

途中にある「プリミティブ値への変換」ですが、概ね以下のような感じです（仕様書9.1ほか）。

* ラッパーオブジェクト（Boolean、String、Number）…元のプリミティブ値を返す
* JavaScript標準であるオブジェクト…`toString()`をした結果
* `valueOf()`がプリミティブ値を返すオブジェクト[^2]…そのプリミティブ値

わかりやすく、表にまとめてみました。

|＼ |Object|文字列|数値|ブール値|null|undefined|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|Object|===|Objectをプリミティブに変換|プリミティブ変換|ブール値は数値に、Objectはプリミティブに変換|false|false|
|文字列|Objectをプリミティブに変換|===|文字列を数値へ変換|両方数値に変換|false|false|
|数値|Objectをプリミティブに変換|文字列を数値へ変換|===|ブール値を数値に変換|false|false|
|ブール値|ブール値は数値に、Objectはプリミティブに変換|両方数値に変換|ブール値を数値に変換|===|false|false|
|null|false|false|false|false|true|true|
|undefined|false|false|false|false|true|true|

なお、Objectから変換されたプリミティブと比較する相手の型が一致しない場合、さらに変換が行われます。たとえば、以下のような流れです。

```js
new Boolean(true) == true
new Boolean(true) == 1 //1. ブール値が数値に変換される
true == 1 //2. Booleanオブジェクトが.valueOf()経由でプリミティブ値に
1 == 1 //3. ブール値と別の型の比較なので数値に変換
true
```

[^1]: [この前に書いた](http://qiita.com/jkr_2255/items/7bd60f711b1ae6047592)ToNumberで変換します（`+foo`や`foo-0`と同じ結果です）。
[^2]: Dateだけは`valueOf()`がプリミティブを返しますが、`toString()`の結果になります。
初めて作ったApple Watchアプリが無事リリースされたので、宣伝とソースコードとメモ

# 宣伝

前評判が良くなかったので期待してなかったApple Watchですが、いざ触ってみるといい感じ。（僕が今回スマートウォッチ自体を持つのが初めてのため、ハードルが下がっているというのもありそうです。）
しばらくはWatchアプリを出して遊んでみようと思っています。

手始めにミニゲームなアプリを公開してみました。（Lights Outのクローン）

![42.png](https://qiita-image-store.s3.amazonaws.com/0/2191/7442090b-2697-73d5-c7d2-2903eab6af93.png)
[Apple Watch対応のミニゲームアプリ「反転一色（Flip One Color）」をリリースしました - UPDATE - SpriteKit.jp](http://spritekit.jp/update/2015/05/23/flip-one-color/)

ソースコード（Swift）はGitHubで公開しています。
https://github.com/tnantoka/FlipOneColor

# メモ

## 基本的なこと

### アプリをApple Watchに対応させる

プロジェクトを選択して、Targetの最下部の+からWatch Appを追加。
Notificationのチェックはいらなければ外す。Activateする？って聞かれるのでYes。

参考：https://developer.apple.com/library/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/ConfiguringYourXcodeProject.html#//apple_ref/doc/uid/TP40014969-CH2-SW1

### 画面遷移

http://qiita.com/gladenjoy/items/aaec7306d7135f64cdab
http://www.toyship.org/archives/2043
などのとおりにやればできる。

iOSと違って、戻るボタンの右に表示されるのが**現在の画面**のタイトル。微妙…。

### 複数のボタンを1行に並べる

Groupに入れて、Widthを`Relative to Container`にして1以下の値にすれば分割できる。

参考：http://qiita.com/shu223/items/e704f70abc50da32ba38

### DEBUGフラグ

`Other Swift Flags`に`-D DEBUG`などする時は、WatchKit Extensionにも設定する。

### アイコン

Watch Appの`Images.xcassets`に設定する。

### スクリーンショット

External Displaysを表示したままでCommand + SすればiPhoneの画面と一緒に撮れる。（iPhoneだけを取りたい時に邪魔だったりもするけど。）
ストアに必要なのは42mmの方だけ。


### バージョン番号

プロジェクト初期状態のままだと、バージョン（Build）の値が`1`と`1.0`でずれてるので合わせる。（そのままだとValidateでWargingが出た）

### willActivateはviewWillAppear:とは用途が違う

名前の通り、スリープからの復帰とか、他アプリから戻ってきた時とか、色々呼ばれる。

## 困ったこと

### 複数のボタンに同じような処理をさせたい時

- IBActionに引数senderは渡ってこない。
- tagが設定できない。
- IBOutletCollectionは未サポート。

ということで、今回は25個のボタンにせっせとOutletとAction設定しました。

### WatchKit AppをBuildしてもSimulatorがアクティブにならない

iPhoneの画面をタップしてもダメ。
Command+TabかDockアイコンクリックなら行ける。
地味に困るけど、仕方ない。

### no paired Apple Watch？

最初、Device名の後ろに` (no paired Apple Watch)`が表示されて実機インストールできなかった。
USBケーブルを繋ぎ直したらDevise登録とかXcodeが勝手にやってくれて解消した。

### application:handleWatchKitExtensionRequest:reply:で落ちてた

この中でiPhoneアプリがクラッシュしても、以下のエラーが発生するだけ。
凡ミスに気づくのが遅れた。

```
The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]
```

### iPhone上のApple Watchアプリで表示される名前が変わらない

iPhoneアプリ側の`CFBundleName`が使われる。
Apple Watchの実機上に表示されるのはWatch Appの`CFBundleDisplayName`。
ややこしい…。

参考：https://developer.apple.com/library/ios/qa/qa1892/_index.html

### 二重開発感

Viewの使い回しはできないので、ゲーム画面をiPhoneとWatch用にそれぞれ作業。
ゲームのロジック部分は共通化したけど、それでも残るこれさっきもやったぞ？感…。

ただいま次のアプリを開発中なので、また何かあれば追記 or 別投稿したいと思います。
カリー化された関数とその用途

## はじめに

Scala 勉強会で表題について聞いてみました。そのことを共有したいと思います。

この記事の内容は、カリー化された関数とその用途になります。

## カリー化された関数

カリー化とは、複数の引数を受け取る関数を、１つの引数を受け取って、１つの値（値は&lt;function1&gt;を含む）を返す関数にすることです。

カリー化された関数は、いつでも、「１つの引数を受け取って、１つの値を返す」ということです。

「１つの引数を受け取って、１つの値を返す」という仕組みが大切なんだそうです。そして、その型は`<function1>`ですね。

まずは、複数のパラメータリストを持つ関数で、その関数の結果値の型が`<function1>`であることを確認してみます。

``` scala
object Main extends App {

  def product(a: Int)(b: Int)(c: Int) = a * b * c
  println( product(1)(2)(3) )

  val p1 = Seq(1,2,3).map(product)
  println( p1 )

  val p2 = Seq(1,2,3).map(p1(0))
  println( p2 )

  val p3 = Seq(1,2,3).map(p2(0))
  println( p3 )
}
```

期待した結果になりましたね。

次に、１つの引数を持つ関数をネストさせた関数で、その関数の結果値の型が`<function1>`であることを確認してみます。

``` scala
object Main extends App {

  def product(a: Int) = (b: Int) => (c: Int) => a * b * c
  println( product(1)(2)(3) )

  val p1 = Seq(1,2,3).map(product)
  println( p1 )

  val p2 = Seq(1,2,3).map(p1(0))
  println( p2 )

  val p3 = Seq(1,2,3).map(p2(0))
  println( p3 )
}
```

期待した結果になりましたね。

そして、部分適用された関数と`curried`メソッドで作られるカリー化された関数でも確認してみます。

``` scala
object Main extends App {

  def product(a: Int, b: Int, c: Int) = a * b * c
  println( product(1, 2, 3) )

  val pp = product _
  val p1 = Seq(1,2,3).map(pp.curried)
  println( p1 )

  val p2 = Seq(1,2,3).map(p1(0))
  println( p2 )

  val p3 = Seq(1,2,3).map(p2(0))
  println( p3 )
}
```

期待した結果になりましたね。

つまり、この３種類の関数はカリー化された関数ですね。

## カリー化された関数の用途

`map`などの高階関数でカリー化された関数を使うとのことです。

確かに、カリー化された関数のおかげで、`<function1>`を受け取る高階関数がより身近に感じられるようになりました。

カリー化された関数には数学的な背景があるようなのですが、数学的な背景については理解できていません。

## まとめ

部分適用された関数とカリー化された関数がちょっと分かってきました。

- プレースホルダー構文とは？
- 部分適用とは？
- 部分適当された関数とは？
- カリー化とは？
- カリー化された関数とは？

これらに答えられるようになったと思います。

## 参照 URL

- [部分適用された関数とカリー化された関数は何が違うのか？](http://qiita.com/t-mochizuki/items/4a5b1bd5c8dd7ccd6a92)
PostgreSQLのバージョンアップでPostGISが動かなくなった時のメモ


brew でインストールしたPostGISがうまくうごかなくなった。
以下のようなエラーがでたりしていた。

```
ERROR: could not open extension control file "/usr/local/Cellar/postgresql/9.4.1_1/share/postgresql/extension/postgis.control": No such file or directory
```

Extensionがないようである。
9.4.1のディレクトリにはあるからだろう。

PostGISを再インストールしたらなおる。

```
$ brew reinstall postgis
```
【iOS】AppDelegate.swiftってなにしてんの？


はい、ふと`AppDelegate.swift`がなんの用途のために使うのか気になったため実際に検証しました。


## AppDelegate.swiftとは？
　アプリをつくった段階でデフォルトでつくられるファイルのひとつ。アプリ全体のライフタイムイベントを管理するためのクラス。
　
## 実際に検証！

##### ソースコード
```AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    func applicationWillResignActive(application: UIApplication) {
        println("アプリ閉じそうな時に呼ばれる")
    }

    func applicationDidEnterBackground(application: UIApplication) {
        println("アプリを閉じた時に呼ばれる")
    }

    func applicationWillEnterForeground(application: UIApplication) {
        println("アプリを開きそうな時に呼ばれる")
    }

    func applicationDidBecomeActive(application: UIApplication) {
        println("アプリを開いた時に呼ばれる")
    }

    func applicationWillTerminate(application: UIApplication) {
        println("フリックしてアプリを終了させた時に呼ばれる")
    }

}

```

それぞれのメソッド内でメソッド名をもとにどんな時に呼ばれるのかを予想して`println("どういう時")`を記述。



### ①Runでアプリを起動(cmd + R)

![アプリ起動](http://i.imgur.com/1KTkxoA.png)

`アプリが開いた`ので`applicationDidBecomeActive(application: UIApplication)メソッド`が呼ばれたっぽい！


### ②アプリを閉じる(cmd + shift + H)

![アプリを閉じる](http://i.imgur.com/OSiGABG.png)

`アプリを閉じた`ので`applicationWillResignActive(application: UIApplication)メソッド`と`applicationDidEnterBackground(application: UIApplication)メソッド`が呼ばれたっぽい！

### ③アプリを開く(クリック)

![アプリを開く](http://i.imgur.com/9t52yXa.png)

`アプリを開いた`ので`applicationWillEnterForeground(application: UIApplication)メソッド`と`applicationDidBecomeActive(application: UIApplication)メソッド`が呼ばれたっぽい！

### ④ホームボタン2度押し(cmd + shift + Hを2度押し)

![ホームボタン2度押し](http://i.imgur.com/CQPA3Tq.png)

`アプリを閉じよう`としているので`applicationWillResignActive(application: UIApplication)メソッド`が呼ばれたっぽい！

### ⑤フリックでアプリを終了する

![アプリを落とす](http://i.imgur.com/HWcSSfU.png)

`アプリを終了させた`ので`applicationDidEnterBackground(application: UIApplication)メソッド`と`applicationWillTerminate(application: UIApplication)メソッド`が呼ばれたっぽい！

### 検証終了
やはり、println()内で予想した仮説どおりの動きをしてくれた。


## 実際どのような処理をしたい時に使うの？
　logを取ったり(どの画面で閉じたか)、ローカルのデータベースに今の状態を保存したい時とかにつかう。
この辺になってくると高度な処理になってくるらしいので、使うのはまだ先の模様。
LinuxからSambaをマウントする

#### 準備

必要なパッケージは下記、ざっくりとした用途も添えて

```sh
yum install samba-client samba-winbind cifs-utils
```

- `samba-client`  … Sambaプロトコルにアクセスする
- `samba-winbind` … Windowsドメインを名前解決する
- `cifs-utils`    … Sambaをマウントする


#### Windowsドメインの名前解決に参加させる
/etc/nsswitch.conf をのhostsの指定に `wins` を追加する

```sh
#hosts:      files dns
hosts:      files wins dns
```


#### 共有フォルダを探す
```sh
smbclient -L <Windowsのホスト名>
```


#### Sambaをマウント/アンマウントする

```sh
mkdir /home/hoge/test

# マウント
mount -t cifs //<Windowsのホスト名>/test /home/hoge/test -o user=<Windows共有フォルダのユーザー名>
# or
mount.cifs //<Windowsのホスト名>/test /home/hoge/test -o user=<Windows共有フォルダのユーザー名>

# アンマウント
umount /home/hoge/test
```

通常マウントすると root 権限になるので必要があれば、マウント時のオプションに
`uid=vagrant,gid=vagrant` などとすることで所有者を変更することができる。


#### マニュアルコマンド
```sh
mount.cifs
# or
man mount.cifs
```
Form上でマウスカーソルを表示・非表示。Cursor.Hide()・Show()の罠

## こんな経験をした
Cursor.Show()で表示でCursor.Hide()で非表示か。
ｶﾀｶﾀｶﾀ
あれ、カーソル表示・非表示繰り返してたら何故か上手く表示・非表示の制御できなくなった。。。
このイベント（Loadイベント等）で非表示しても効果なし？
ひとまず、いろんなところでHideを実行。
あれ、Showしてもカーソル全然出てこない。。。

## 原因
実は、 Cursor.Show()・Cursor.Hide()の効果は重ねられるようです。
> Cursor.Hide メソッド (System.Windows.Forms)　https://goo.gl/8m121H
Show メソッドおよび Hide メソッドの呼び出しは、均等化する必要があります。

つまり、Hideメソッドを二回実行したらShowメソッドを２回実行しないと表示されない。
HideとShowのそれぞれの実行回数が分からなくなると終わり。
しかも、HideとShowはCursorクラスの静的メソッドだから、アプリケーション全体で実行回数を監視しないと。。。それは面倒。

### 代用
Cursor.Show・Hideは使わない！！！
マウスカーソルを消したいForm（Control継承してればok）で下記を定義して
非表示したければHideCursor、表示したければShowCursorを実行。
これで均等化とはおさらば！

```lang:

       private void HideCursor()
        {
            // マウスカーソル用画像を作成
            Bitmap bitmap = new Bitmap(1, 1);
            Graphics g = Graphics.FromImage(bitmap);
            g.FillRectangle(Brushes.Black, g.VisibleClipBounds);
            g.Dispose();
            bitmap.MakeTransparent();

            // 作成した画像でCursorのインスタントを作成
            IntPtr handle = bitmap.GetHicon();
            var icon = Icon.FromHandle(handle);
            var cursor = new Cursor(icon.Handle);

            // セット
            this.Cursor = cursor;
        }

        private void ShowCursor()
        {
            // デフォ値にセット
            this.Cursor = Cursors.Default;
        }
```

### 最後に
・本当は、this.CursorではなくてCursor.Currentにセットしたかったけど何故か変わらない。。。
・ライブラリ化、拡張メソッド化はご自由に。
Alfred→Qiita連携で自分の知識をすばやく探せるようにする

自分のQiita投稿が増えてきて、自分のナレッジベースがQiitaになってくると、Qiitaをさくっと検索できるようにしておきたいです。

下の図のように、Alfredで検索ワードを入れたら、Qiitaを検索できるようにしてみたいと思います。

![Blank_Skitch_Document.png](https://qiita-image-store.s3.amazonaws.com/0/889/82cfe362-9792-8ac2-eaf0-cfeab2b849cb.png)

## AlfredでQiitaを検索できるようにする

まず、Alfredの設定画面を開きます。

![Blank_Skitch_Document.png](https://qiita-image-store.s3.amazonaws.com/0/889/9e9e2cd3-1509-3965-18b5-bac1c7f2d66d.png)


設定画面が開いいたら、**Features**→**Web Search**→**Add Custom Search**を開きます。

![Alfred_Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/889/e3c88e06-d6e0-5592-82ad-7ddd16058f2b.png)


カスタム検索の設定画面が出たら、次のように入力します。

* **Search URL**: 次のURLを入力します。`<username>`の部分はご自分のユーザ名にします。

```
http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=user%3A<username>+{query}
```

* **Title**: 「Qiita」と入力します。
* **Keyword**: 「q」や「qiita」などお好きなキーワードにします。ここで設定したキーワード + スペースをAlfredに入力することでQiitaで検索するモードになります。
* **アイコン**: この画像をドラッグアンドドロップします。<br>![](https://qiita.com/icons/favicons/public/apple-touch-icon.png)

すべて入力したら、**Validation**の**Test**をクリックして自分の投稿が検索されるか試します。

問題なければ**Save**を押して完了です。

![Screenshot_2015_05_23_22_16.png](https://qiita-image-store.s3.amazonaws.com/0/889/424f8eea-52c1-4e16-4977-9e0d5b2892a8.png)
passport-twitterを使ってみた

# はじめに
再来週に参加する勉強会でpassportについて話すつもりなので、記事をまとめてみました。passportを使えば簡単にgoogleやtwitterのアカウントからログインするということが実現できるのですが、論より証拠ということで実際に作ってみました。

# そもそもpassportとは
passportとは他サービスからの認証を簡単に実現できるミドルウェアになります。ただし、前提として[Express](http://expressjs.com/)を使う必要があります。

http://passportjs.org/

passportは他サービスからの認証の基本的な枠組みを提供するだけなので、単体ではOAuth認証などはできません。[passport-google-oauth2](https://www.npmjs.com/package/passport-google-oauth2)、[passport-twitter](https://github.com/jaredhanson/passport-twitter)などのように、自分が使いたい認証のライブラリを別に用意する必要があります。今回はtwitter認証がやりたいので、passport-twitterを使います。

# 早速使ってみる
https://github.com/jaredhanson/passport-twitter
https://github.com/jaredhanson/passport-twitter/blob/master/examples/signin/app.js

公式サイトを見れば、どう書けばいいのか大体分かるとおもいます。ここでは忘備録を兼ねて、自分が勉強したところを共有させて頂きます。

```js:app.js
//npmモジュールのロード
var express = require('express');
var passport = require('passport');
var TwitterStrategy = require('passport-twitter');

//Expressの初期化
var app = express();
//Expressでpassportが使えるようにする
app.use(passport.session());

// passport-twitterの初期化
passport.use(new TwitterStrategy({
        consumerKey: TWITTER_CONSUMER_KEY,//TwitterのconsumerKey
        consumerSecret: TWITTER_CONSUMER_SECRET,//TwitterのconsumerSecret
        callbackURL: BASE_URL+'/auth/twitter/callback'//認証成功時の戻り先URL
    },
    function(token, tokenSecret, profile, done) {
        // 認証が完了したtwitterIdを検証する
        // 例えばtwitteridがDBの中に存在するかということを確認する
        // 検証結果によってdoneの書き方を以下のように指定する
        //     検証成功 : return done(null,profile);
        //     検証失敗 : return done(null,false);
        //     例外発生 : return done(null);
        return done(null,profile);
    }
));

//自作サービス中でtwitter認証を行うURLを設定する
app.get('/auth/twitter',
    passport.authenticate('twitter'));

//認証正常時の戻り先URLの設定をする
app.get('/auth/twitter/callback',
    passport.authenticate('twitter', {
        failureRedirect: '/' }),//認証失敗時のリダイレクト先を書く
    function(req, res) {
        // ここでは認証成功時のルーティング設定を書く
        // ちなみにreq.userでログインユーザの情報が取れる
        //     例) req.user.useridでユーザIDがとれます
        res.redirect('/');
    });
```

このように、とても簡単にtwitter認証が実現できます。実際に自作ゲームでpassport-twitterを使っているのはここになります。

https://github.com/kaidouji85/gbraver/blob/7ad0763d8da7f03d28d196a1026e05beab1242d5/app.js

また、手前味噌ではありますが、実際にpassport-twitterを使っているサービスはこれになります。

http://gbraver.herokuapp.com

# おわりに
2時間程度でtwitter認証を実現することが出来るようになりました。passportは少しとっつきにくいところがありますが、慣れるととても便利なツールなのでオススメです。
Ninety Nine Scala Problems奮闘記5

# P07 Flatten a nested list structure.

自信がついてきたので自分で考えてみたが難しい…。

でも、以下のアルゴリズムでできると思ったので組んでみる。

0. 結果格納用のリストを変数で用意し、以下のメソッドをメソッド内で定義する。
1. 先頭から1要素取り出す。
2. その要素がListならそのListに対して再帰呼び出しする。その後1.の残りのListに対しても再帰呼び出しする。
3. その要素がList以外の何かなら、結果格納用リストの末尾にくっつける。その後、1.のListの残りの要素に対して再帰呼び出し。
4. その要素がNilならListの終わりなので何もしない。(終了条件)

```scala:myAnswer1.scala
  def myAnswer[A] (ls: List[A]): List[A] = {
    var result: List[A] = Nil
    def flatten[A] (ls: List[A]): Unit = ls match {
      case ls::tail if ls== classOf[List] => {
        myAnswer(ls[A])
        myAnswer(tail)
      }
      case h::tail => {
        result:+h
        myAnswer(tail)
      }
      case Nil =>
      case _ => throw new NoSuchElementException
    }
    flatten(ls)
    result
  }
```

これに対して
```scala:scala
myAnswer(List(List(1,1),2,List(3,List(5,8))))
```
を実行するがエラーになる。
```
Error:(11, 37) type List takes type parameters
      case ls::tail if ls== classOf[List] => {
                                    ^
Error:(12, 20) value ls of type A does not take type parameters.
        myAnswer(ls[A])
                   ^
```

「Listは型パラメータを取るよ」…？あっ。

```scala:scala
      case ls::tail if ls == classOf[List[A]] => {
        myAnswer(ls[A])
        myAnswer(tail)
      }
```
これで一つ目のエラーは消えた。でも次のやつが全然分からない。
多分そもそも型パラメータが分かってない。

それでもう悩んでもダメだと判断して回答例を見ると

```scala:suggestedAnswer
  def flatten(ls: List[Any]): List[Any] = ls flatMap {
    case ms: List[_] => flatten(ms)
    case e => List(e)
  }
```

この問題はそもそも再帰ではなく、flatMapの使い方を練習する問題でした。

flatMapを知らなかったので [flatMapをマスターする](http://qiita.com/mtoyoshi/items/c95cc88de2910945c39d) を参考にしながらお勉強。

ちょっとよく分からないので、エントリを分けます…。

でも今回は、自分が再帰をわかっていないこととflatMapとの出会いがあったので収穫はあったと思い込むことにします。デバッグもできず模範回答も分からずのエントリ。ぐぬぬ…。

次回エントリは「Scalaの再帰が分かった話」とかにしたいですわ…。


## 参考
- [Functional Scala: Polymorphic Functions ?!?](https://gleichmann.wordpress.com/2011/01/23/functional-java-polymorphic-functions/)
- [flatMapをマスターする](http://qiita.com/mtoyoshi/items/c95cc88de2910945c39d)
CakePHP3.0をインストールしてみる(自分用めもめも

####■CakePHP3.0をインストール
・公式サイト->http://cakephp.org/
####■プロジェクトの作成
`$ php composer.phar create-project -s dev cakephp/app`
####■エラー
Your requirements could not be resolved to an installable set of packages.
　Problem1
　　- Installation request for cakephp/cakephp 3.0.*-dev -> satisfiable by cakephp/cakephp[3.0.x-dev].
　　- cakephp/cakephp 3.0.x-dev requires ext-intl * -> the requested PHP extension intl is missing from your system.
->php.intlがはいってない

####■php.intlを探してみる
`$ php -i | grep intl`
->何も表示されなかった。入ってない証拠。

####■php.intlをインストールする
`# sudo pecl install intl`
->peclコマンドが使えませんとエラーでる。

####■peclをインストールする
`# yum install php-pear`
`# pecl install intl`
->ここでdefaultでおっけーか聞かれるからyでおっけいしておく。

####■エラーがでる
ERROR: `/tmp/pear/temp/intl/configure --with-icu-dir=DEFAULT' failed

####■もういちど
`# yum install icu libicu-devel`
`# pecl install intl`
->You should add "extension=intl.so" to php.iniって言われるので、その通りにする。

####■php.iniにextension=intl.soを書き込む
`# vi  /etc/php.ini`
  ;;;;;;;;;;;;;;;;;;;;;;
　; Dynamic Extensions ;  
　;;;;;;;;;;;;;;;;;;;;;;
　**extension=intl.so**
　; If you wish to have an extension loaded automatically, use the following
　; syntax:

####■サーバーの再起動
`# service httpd restart`

####■データベースの設定
######mysqlにrootでログインしてテーブルを作成する
`mysql> create database xxx;`
`mysql> grant all on xxx.* to dbuser@localhost identified by 'xxx';`

######データベースに接続して、xxxxを書き換える
`$ vi app/config/app.php`

```lang:app.php

'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            /**
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'nonstandard_port_number',
            'username' => 'xxxx',
            'password' => 'xxxx',
            'database' => 'xxxx',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
```


*参考サイト*
http://qiita.com/kozo/items/263de91d659cef7d5ab5
http://catcher-in-the-tech.net/278/
http://nagoring.com/blog/tag/cakephp3/
http://shouhei.github.io/blog/2014/12/05/cakephp3falsetiyutoriarunitiyarenzi!/
http://tekitoh-memdhoi.info/views/631
https://secure.nanako-net.info/redmine/projects/know-how/wiki/Php-pear
http://note.onichannn.net/archives/3107
http://anz-note.tumblr.com/post/96801260816/cakephp3-v3-1
http://tbrhdys.hatenablog.com/entry/2015/05/02/174214
How to I18n with CarrierWave

CarrierWave の日本語設定ファイルを置くにはどうすべきか、といったハナシで、[RailsでcarrierwaveのI18n設定をする](http://qiita.com/jemiam/items/99dc19d40c729439ec1b) にあるように github からとってきて config/locales/carrierwave_ja.yml を配置すればイイです。

しかし、そもそも github リポジトリにあるのなら gem の中にあるんじゃね？と思い、調べてみました。

```bash
% find `bundle show carrierwave` -name 'ja.yml'
/Users/maangie/.rvm/gems/ruby-2.2.1/gems/carrierwave-0.10.0/lib/carrierwave/locale/ja.yml
```

やはりありました。

ならコピーしなくてもすむはずだ。と考えて `config/application.rb` にこう書いてみました。

```ruby
config.i18n.load_path += Dir[
  Pathname(CarrierWave.method(:root).source_location[0]).dirname
  .join('carrierwave', 'locale', '*.{rb,yml}')
]

config.i18n.default_locale = :ja
```

ちゃんと日本語化されました。

あんまししない感じかもですが…。特に `source_location` メソッドを使うのはアレな感じがします。まあ、別解として。
【Raspberry Piをさわってみた(1)】Minecraft Pi Editionの基本操作をまとめた(2015.5.23 先行公開)

<h2>はじめに</h2>
<p>世界中でおなじみのゲームMinecraft。今日はそのRaspberry Pi版と言うべき「Minecraft Pi Edition」の基本操作について説明したい。</p>

<h2>1.移動について</h2>
<p>MineCraft Pi Editionを開くと、左上にPosという数値が表示され、これが現在位置にあたる。尚x,y,z座標の配置は以下の図のようになる。横幅の方向がx、高さがy、奥行きがzと言う具合に覚えておくとよい。</p>

![g1.png](https://qiita-image-store.s3.amazonaws.com/0/39145/6871fd07-9dfa-ce7c-1b3e-e02c40ffa4ef.png)

<h4>各キーの働き</h4>
<table>
     <tr>
          <td>キー</td>
          <td>移動方向</td>
          <td>座標</td>
     </tr>
     <tr>
          <td>Aキー</td>
          <td>左に移動</td>
          <td>x軸負の方向</td>
     </tr>
     <tr>
          <td>Dキー</td>
          <td>右に移動</td>
          <td>x軸正の方向</td>
     </tr>
     <tr>
          <td>Wキー</td>
          <td>上に移動</td>
          <td>z軸正の方向</td>
     </tr>
     <tr>
          <td>Sキー</td>
          <td>下に移動</td>
          <td>z軸負の方向</td>
     </tr>
     <tr>
          <td>space</td>
          <td>縦上方向に移動する</td>
          <td>y軸正の方向</td>
     </tr>
     <tr>
          <td>shift</td>
          <td>縦下方向に移動する</td>
          <td>y軸負の方向</td>
     </tr>
</table>

<p>操作していて良く海に落ちてしまい、脱出不能となることがある。こんなときにspaceやshiftで一旦空中に移動したりすると便利だ。</p>

<h2>2.メニュー画面について</h2>
<p>Minecraft Pi Editionでは<b> 「ESC」キー</b>を押すと、以下のようなメニュー画面に移行できる。</p>

![ex2.jpg](https://qiita-image-store.s3.amazonaws.com/0/39145/0c30b676-491b-97f0-17af-20d02ecb2ecc.jpeg)

以下このメニュー画面について説明する。</p>
<table>
     <tr>
          <td>ボタン</td>
          <td>働き</td>
     </tr>
     <tr>
          <td>画面上左のボタン[1]</td>
          <td>サウンドのON/OFF</td>
     </tr>
     <tr>
          <td>画面上右のボタン[2]</td>
          <td>俯瞰視点/自己視点の切り替え</td>
     </tr>
     <tr>
          <td>Back to game[3]</td>
          <td>ゲームに戻る</td>
     </tr>
     <tr>
          <td>Quit to game[4]</td>
          <td>ゲームをやめる</td>
     </tr>
</table>

<h2>3.ブロックを地面に配置する</h2>
<p>次はいよいよMinecraft Pi Editionの肝というべき、ブロックを空中や地面に配置し、自由な形を作っていく上で必要なキー操作やマウスの操作について説明する。</p>
<table>
     <tr>
          <td>ボタン</td>
          <td>働き</td>
     </tr>
     <tr>
          <td>マウスを左クリック</td>
          <td>既にあるブロックを1つ撤去(剣装備時)</td>
     </tr>
     <tr>
          <td>マウスを右クリック</td>
          <td>ブロックをマップに配置</td>
     </tr>
     <tr>
          <td>マウスホイール</td>
          <td>下のパレットから、マップに配置するブロックを選択</td>
     </tr>
     <tr>
          <td>Eキー</td>
          <td>マップに配置するブロックの選択画面に移行</td>
     </tr>
</table>

<p>Eキーを押すと以下のような画面が表示され、色々なブロックから好きなブロックを選ぶことができる。</p>

![ex3.jpg](https://qiita-image-store.s3.amazonaws.com/0/39145/9515013e-2274-03de-a657-f9a77f88c2b9.jpeg)

<h2>4.Pythonでminecraftと表示してみよう</h2>
<p>最後はPython側からの操作で、minecraftと表示するまでを紹介したい。まずはviやテキストエディターなどで以下のようにプログラムを書いてみると、</p>

```message.py
# minecraft用APIの呼び出し
from mcpi import minecraft
# 新規にminecraft用のオブジェクトを生成
mc = minecraft.Minecraft.create()
# postToChatの引数に好きなメッセージを入れて完成
mc.postToChat("minecraft")
```
<p>ファイルのあるフォルダーまでcdで移動し、「python 指定したファイル名.py」と入力すると、画面にメッセージが表示される。</p>

![ ex1.jpg](https://qiita-image-store.s3.amazonaws.com/0/39145/cb99a92e-4110-ba97-7ac2-b8328e7ab75a.jpeg)

<h2>5.最後に</h2>
<p>今日は、ゲームの基本操作とPythonで操作するまでを簡単にまとめた。次回はPythonを使ってブロックを配置する事について説明したい。</p>
Windows10 IoT CoreのブートメディアをWindows7/8で作成する

#前提
* 先日、Raspberry Pi 2にインストールするIoT用OSとして「Windows 10 IoT Core」がリリース。(まだプレビュー版、RasPi2以外にもいくつかのボードに対応)
* Microsoftはご丁寧に[Get Started](https://ms-iot.github.io/content/GetStarted.htm)ページを公開しており、このサイトの手順通りに進めれば、簡単にWindows 10 IoT Coreをインストールできるし、簡単なアプリケーションのデプロイまで出来る

#問題点
* Raspberry Pi 2で使用するために、まずMicroSDカードにOSのイメージを焼く必要があるが、**この作業には「Windows 10」が必要となる**
* 「Windows 10」に搭載されている**「dism」コマンドを使用しなければ、Windows 10 IoT CoreのOSイメージを焼けない**
* 「Windows 10」さえあれば良いので、VMWare PlayerやMacのBootCampなどの仮想環境で構築しても良い
* とは言え、このためにWindows 10環境作るのめんどい・・・というあなたのために

# Windows7/8環境で焼くには？
**早い話が、Windows 10用の「dism」コマンドが使えればそれでOK!**
超簡単に言うと、Windows 10のisoをバラして、中のdismコマンドを引っこ抜き、それを使用してイメージを焼く
上記の説明で、あーなるほどねってなった方は、以下は読まなくてOKですｗ


**手順**
1. [ココ](http://windows.microsoft.com/ja-jp/windows/preview-iso)からWindows 10 Insider Previewをダウンロードする  
2. ダウンロードしたisoをマウントする。
(Win8なら右クリック -> マウント、Win7ならDaemonToolsを使用、あるいは、7zipなどのアーカイバを使用して、isoファイルを展開しても良い)  
3. 無事マウントあるいは展開できたら、**「sources」ディレクトリ配下に移動**  
4. **「sources」**ディレクトリ配下の、**サブディレクトリ**と**拡張子がwimのファイル**を除く全てのファイルをコピーし、自端末の適当な場所にペースト (例: c:\win10配下にコピー)
※中身をよーく見てみると、**「dism」**が存在するはず。そして、関連するdllも。
※つまるところ、「dism」とその仲間たちされあれば良いので、全てをコピーする必要なんかないのだけれど、選ぶのがめんどうくさいので、さくっと全部コピーしちゃいましょう。 
※なぜサブディレクトリと\*.wimを除くのかと言うと、こいつらはファイルサイズがバカでかいため。  
5. コピーした場所へパスを通す。そのために、まずは「システムのプロパティ」を起動する。やり方がわからない場合は、[こちら](http://8cmp.blog.fc2.com/blog-entry-50.html)を参考に。
個人的には、スタート -> sysdm.cpl で起動するのが好き  
6. 「システムのプロパティ」が起動したら、詳細設定 -> 環境変数 -> システム環境変数 -> Pathを選択して編集 -> **変数値の末尾にセミコロン + コピー先のフルパスを追記**
(例 xxx;c:\win10)
![path.gif](https://qiita-image-store.s3.amazonaws.com/0/80163/4f3623d2-cc56-f22c-85a3-a394420c1716.gif)
これでパスが通ったはず  
7. あとは、[Get Started](https://ms-iot.github.io/content/win10/SetupRPI.htm)通りに手順を進めると、Windows 10 IoT Coreのブートメディアを作成できる。
この辺は日本語での解説も多いので、詳細は各自調べて下さい。
※一応簡単に書いておくと、ブートメディアにしたいMicroSDをPCに挿し、コマンドプロンプト開いて、
``diskpart
list disk``
と実行、対象のMicroSDの番号を確認する。環境によるが、1とか2の人が多いと思う。
次に
`dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDrive[MicroSDの番号] /SkipPlatformCheck`
を実行するだけ。
(例: 対象のMicroSDの番号が1なら、`/ApplyDrive:\\.\PhysicalDrive1`とする)
flash.ffuは、Win10 IoT CoreのOSイメージ、事前にダウンロードしておくこと。
エラーなく完了したら、完成！あとは楽しいIoTライフを！


#余談
Win10環境を、KVM上で構築していてずっと遊んでいた。
MicroSDをUSBパススルーさせてゲストOSに認識させるかーちょっとめんどくせーなーとか思ってたんだけど、この方法を思いついてやってみたら出来た。だけど、やったーできたーってなって、ふとググってみたら、Raspberry Piの公式フォーラムで同じこと既にやっている人がいたっていうね・・・さっさとググっておけば良かったorz
PHP7調査(35)関数の返り値のタイプヒントが書けるようになった

PHP7から、関数の返り値のタイプヒントが書けるようになりました。返り値のタイプヒントは関数の引数リストの後ろに`: [型名]`で指定します。

```php
<?php
function foo(): array {
    return [1,2,3];
}
foo();
```

上の例では、foo関数の返り値の型をarrayとして宣言しています。


型が合っていない場合、引数のタイプヒント同様に怒られます。

```
PHP Fatal error:  Uncaught TypeException: Return value of foo() must be of the type array, integer returned in /tmp/foo.php on line 3 in /tmp/foo.php:3
Stack trace:
#0 /tmp/foo.php(5): foo()
#1 {main}
  thrown in /tmp/foo.php on line 3
```

また、PHP7からはスカラ型（int, float, bool, string）のタイプヒントがサポートされましたので、返り値についてもスカラ型を指定できます。

# クラスメソッドの場合

上では関数を例に出しましたが、クラスのメソッドでも同じように返り値のタイプヒントが使えます。また、インターフェースを実装したりクラス継承したりする場合、子の返り値のタイプヒントは親メソッド（またはインターフェース宣言）と合わせる必要があります。

```php
<?php
interface Foo {
    static function now(): DateTime;
}
class Bar implements Foo {
    static function now(): DateTime {
        return new DateTime();
    }
}
Bar::now();
```


これはフレームワークなどで活用されてはじめて真価を発揮するような機能だと思いますが、PHP5系のサポートを切らないとフレームワークでは採用できないので、まだまだ道のりは長そうですね。

# 型宣言の位置、変だよね？

PHPはCに似た文法の言語だと思っていたのに、返り値のタイプヒントを関数の前に書けないのは意外といえば意外ですよね。

RFCには、Hack, Haskell, Go, Erlang, ActionScript, TypeScript が引数より後ろで返り値の型宣言するよね、と書いてあります。Hackに合わせること自体は合理的な判断だと思うので、慣れていくしかないでしょう。

引き合いに出す言語としてHaskellはどう考えても不適切（文法自体を型つきラムダ計算から輸入しているので、順番をいじると意味が無くなる）ですが、広い心でスルーしましょう。

# ちょっぴり気になること

文法的に、ジェネレータ関数がyieldする型やreturnする型は書けないようです。この辺、Pythonだとどうなってるんですかね…？

```php
<?php
/* foo()はジェネレータを返すので、これ自体は正しい */
function foo(): Traversable {
    yield 1; /* yieldする型を記述する方法が無い気がする */
}
foreach (foo() as $v) {
    var_dump($v);
}
```

# 参照

* [PHP RFC: Return Type Declarations](https://wiki.php.net/rfc/return_types)
ubuntuでwineのインストールが一手間必要だった

## 注意点

```bash:
dpkg --add-architecture i386
```

が必要だった。

## dockerイメージ作った

* [tukiyo3/wine1.7](https://registry.hub.docker.com/u/tukiyo3/wine1.7/)UPしといた。

## ubuntuのリポジトリ

```bash:
sudo add-apt-repository ppa:ubuntu-wine/ppa
```

## winetrickで入れておいたほうが良いもの

* [WineHQ - The Elder Scrolls IV: Oblivion 1.2.x](https://appdb.winehq.org/objectManager.php?sClass=version&iId=7506)

## 一括インストール

```
for i in \
 dotnet20 d3dx11_42 d3dx11_43  d3dx10 \
 d3dx9_26 d3dx9_28 d3dx9_31 d3dx9_35 d3dx9_36 \
 d3dx9_39 d3dx9_42 d3dx9_43 d3dx9 directx9 \
 dinput dinput8 directmusic directplay dmsynth \
 gfw mfc40 mfc42 physx quartz vb6run vcrun2003 vcrun2005 vcrun2008 \
 vcrun2010 vcrun6 vcrun6sp6 wmp9 wsh56vb wsh57 xact xact_jun2010 \
 xinput xna40
do
  winetricks $i
done
```
vagrantで立ち上げた環境にPrivateIpでssh接続ができなかった

#vagrantで立ち上げた仮想環境にプライベートIPでssh接続ができなかった

##はじめに
vagrantで仮想環境を立ち上げたとき、プライベートIP(デフォルト:192.168.33.10)でsshが出来ず、個人的に結構詰まったのでメモ。
ちゃんとした原因が分かった訳じゃないのでまた追記します。

##目的

vagrantで立ち上げた仮想環境のeth1に192.168.33.10を割り振る。
`ssh 192.168.33.10`でssh接続が出来るようにする。


##環境
OS X ： 10.9.5
VirtualBox ： 4.3.28
Vagrant ： 1.7.2

##エラー内容
vagrantのインストールなどは割愛。
仮想環境を立ち上げる所からで...

``` input.
$ vagrant up
```

仮想環境を立ち上げたとき、ログにエラーが出た。

``` output.
The following SSH command responded with a non-zero exitstatus.
Vagrant assumes that this means the command failed!
ARPCHECK=no /sbin/ifup eth1 2> /dev/null

Stdout from the command:

Gerät eth1 scheint zu fehlen, Initialisierung verzögert.


Stderr from the command:
```

eth1にssh接続できないようだ。
loでも接続出来ないか確認してみる。

``` input.
$ vagrant ssh
```

もしくは

``` input.
$ ssh vagrant@127.0.0.1 -p 2222
$ vagrant@127.0.0.1's password: vagrant
```
 
loだと接続することが出来る。
仮想環境のネットワークを確認してみると

``` input.
$ ifconfig
```

``` output.
eth0      Link encap:Ethernet  HWaddr 08:00:27:0D:65:9F  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe0d:659f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:534 errors:0 dropped:0 overruns:0 frame:0
          TX packets:342 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:58601 (57.2 KiB)  TX bytes:47212 (46.1 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
```

eth1が設定されていないようだ。

##解決法

###エラー内容の確認
上記でeth1が設定されていないことがわかったので、まずeth1の状態を調べてみる

``` input.
dmesg | grep eth1
```

``` output.
udev: renamed network interface eth1 to eth2
```

どうやらeth1がeth2にrenameされているようだ。
という訳でネットワークスクリプトの設定を見に行ってみる。

``` input.
sudo vim /etc/udev/rules.d/70-persistent-net.rules
```

``` /etc/udev/rules.d/70-persistent-net.rules.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:e4:9f:43", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:0d:65:9f", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```

eth1がなくeth2が設定されている。
ここでeth2をeth1に変更する

``` /etc/udev/rules.d/70-persistent-net.rules.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:e4:9f:43", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" 

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:0d:65:9f", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```
###eth1の設定ファイルも編集する

``` input. 
sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1
```

``` /etc/sysconfig/network-scripts/ifcfg-eth1.
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.33.10
NETMASK=255.255.255.0
DEVICE=eth1
PEERDNS=no
```

``` input.
sudo service network restart
```

ifconfigで確認するとeth1に192.168.33.10が割り振られている。

これでホストのターミナルからsshできるようになった。
Scala インタプリタモードを使ってみよう

## はじめに

Scala インタプリタモード（REPL モード）を使うことがあります。ライブラリを試すために使ったり、デバッグのために使ったり、用途は様々です。

この記事では、Scala インタプリタモードのキーバインドについて紹介したいと思います。

今、Emacs で単語を削除するように、Scala インタプリタモードで単語を削除したみたいだけれど、どうやったの？この記事では、そのような疑問に答えたいと思います。

## 前方の単語削除

まずは、前方の単語を削除してみましょう。

```
scala> hoge hoge hoge hoge
            #
```

`#`があるところに、カーソルを移動して、`ESC + d`を試してみましょう。すると、次のようになるかと思います。

```
scala> hoge  hoge hoge
            #
```

次は、すこしカーソルの位置を変えてみます。

```
scala> hoge hoge hoge hoge
           #
```

同じように試してみましょう。

```
scala> hoge hoge hoge
           #
```

## 単語単位で移動

#### 単語単位で前進

単語単位で前進してみましょう。

```
scala> hoge hoge hoge hoge
            #
```

`#`があるところに、カーソルを移動して、`ESC + f`を試してみましょう。すると、次のようになるかと思います。

```
scala> hoge hoge hoge hoge
                #
```

次は、すこしカーソルの位置を変えてみます。

```
scala> hoge hoge hoge hoge
           #
```

同じように試してみましょう。

```
scala> hoge hoge hoge hoge
                #
```

さきほどの単語削除と同じような動きですね。

#### 単語単位で後進

単語単位で後進してみましょう。

```
scala> hoge hoge hoge hoge
                 #
```

`#`があるところに、カーソルを移動して、`ESC + b`を試してみましょう。すると、次のようになるかと思います。

```
scala> hoge hoge hoge hoge
            #
```

次は、すこしカーソルの位置を変えてみます。

```
scala> hoge hoge hoge hoge
                #
```

同じように試してみましょう。

```
scala> hoge hoge hoge hoge
            #
```

なんとなく単語で移動することができれば、それだけで充分ですね。

## 後方の単語削除

単語の移動には前進と後進がありました。単語の移動と同じように、`Ctrl + w`で後方の単語を削除することができます。

## まとめ

ほかにも便利なキーバインドがあります。便利なキーバインドがまとめられているサイトの URL を用意しました。

OSXであれば、`ESC`の代わりに`Option`を使うこともできます。その場合は、設定が必要になります。例えば、ターミナル.appであれば、次のように設定します。

これは設定前の画像です。

![scala 1.png](https://qiita-image-store.s3.amazonaws.com/0/29884/b01ada98-c8a3-6b60-8096-2fef3a80ccac.png)

これが設定後の画像です。

![scala 2.png](https://qiita-image-store.s3.amazonaws.com/0/29884/8d769109-f864-b884-be30-e922b938a80f.png)

設定は、「メタキーとしてOptionキーを使用」にチェックを付けるだけです。

## 参照 URL

- [なごやかScala #11 sbtの使い方とScalaによるアプリケーション実装](http://maedaunderscore.github.io/nascala-FrequentWords/)
Swiftでreduceを使ってArrayからDictionaryを作る方法

# varでfor文を回してやる方法

例えばURLのGETパラメータをDictionaryにしたいってときに、`var`で`Dictionary`を宣言してfor文の中で追加してくってのが最初思いつきます。

```swift
let queries = ["id=3", "token=abc", "tag=5"]

var params = [String: String]()
for q in queries {
    let v = q.componentsSeparatedByString("=")
    let (key, value) = (v[0], v[1])
    params[key] = value
}

println(params)
// => ["id": "3", "token": "abc", "tag": "5"]
```

これだと`params`に新たに値を追加できちゃうのと、せっかくSwiftなので`map`とか`filter`の高階関数使ってうまいことできないかなと思ったので考えてみました。

# `reduce`を使う

自分で`map`で色々やってみましたができなくてScalaが得意な同僚に聞いたところ、そういう場合は`reduce`でできるということなのでやってみました。

以下のような感じです。

```swift
let queries = ["id=3", "token=abc", "tag=5"]

let params = queries.reduce([String: String]()) { (var dict, q) in
    let v = q.componentsSeparatedByString("=")
    let (key, value) = (v[0], v[1])
    dict[key] = value
    return dict
}
println(params)
// => ["id": "3", "token": "abc", "tag": "5"]
```

`dict`のところを`var`で宣言してるもポイントです。最初は何もつけてなかったんですが、`value`を突っ込めないなと思って試しに`var`をつけたらいけました。`var`使っちゃってんじゃんというツッコミ入りそうですが閉じてるのでいいかなと・・

# `reduce`ではどんなことが起きてるのか

reduceの宣言を見てみます。

```swift
func reduce<U>(initial: U, combine: @noescape (U, T) -> U) -> U
```
今回の場合で言えば、`U`は`[String: String]`のDictionary型、`T`は`String`型となります。なので、当てはめてみて各ループでどのようなものが返ってきているかをまとめると、以下のようになります。各ループで返却された値が次のcombineのUになるっていうことですね。

|#|combine: ([String: String], | String)| ->: [String: String]|
|:--|:-------:|:---------:|:------:|
|1| `initial`で渡した`[]` | "id=3" | ["id": "3"] |
|2| ["id": "3"] | "token=abc" | ["id": "3", "token": "abc"]|
|3| ["id": "3", "token": "abc"] |  "tag=5" | ["id": "3", "token": "abc", "tag": "5"] |

# まとめ

可読性を考えたらどっちがいいかは微妙なところです。ただ、`reduce`の動きがイマイチよくわかってなかったので理解が進んでよかったです。表にしてみたら分かった気がしました。`reduce`のサンプルってたいてい配列の要素を全部足し算するとかしか出てこなくてあんまり使いどころのイメージ湧かないなと思ってましたが、再帰的な処理が出てきたときは`reduce`を思い浮かべるといいようです。
Coq の Variable と Parameter の違い

Coq の Variable(s), Parameter(s), Hypothesis(es), Axiom, Conjecture の違いがいつもわからなくなるのでメモ。

まず Parameter = Parameters = Axiom = Conjecture で、Variable = Variables = Hypothesis = Hypotheses です。

この2つは Section を使わない場合や Section の中にいる場合は同じなのですが、Section の中で使ってその Section を閉じた場合に違いがでます。

```coq
(* Coq8.4pl5 *)

Section Sect.
  Parameter (A : Type).
  Variable (B : Type).

  Definition A' := A.
  Definition B' := B.

  Print A.  (* => *** [ A : Type ] *)
  Print B.  (* => *** [B : Type] *)

  Print A'. (* => A' = A : Type *)
  Print B'. (* => B' = B : Type *)
End Sect.

Print A.    (* => *** [ A : Type ] *)
Print A'.   (* => A' = A : Type *)
Print B'.   (* => B' = fun B : Type => B : Type -> Type
                  Argument scope is [type_scope] *)
Print B.    (* => Error: B not a defined object. *)
```

Section の中ではどちらも同じですが、Section を閉じたあとは、Variable で定義した B は消え、B' は `Type -> Type` の関数になっています。

また慣習として、ソートが Prop のときは Axiom, Hypothesis を、それ以外のときは Parameter, Variable を使うようです。

参照: https://coq.inria.fr/refman/Reference-Manual003.html#sec41
saveとupdate_attributesの違い

既存プロダクトにあらたな機能を付け加えようとcontroller内をいじっているとき「ん？updateアクションのときはupdate_attributesだけどそのほかだとsaveになってるぞ、何か違いあんのか？」とふと思って、ちょこっと調べたのでメモ程度に残しておくことにしました。
#save
レファレンスによると”生成したモデルオブジェクトをデータベースに保存する”と記されている。参考URL  -> [Railsドキュメント](http://railsdoc.com/references/save)

ピンとこないがまあオブジェクトを呼び出してそこに何かを代入して保存のようなときにsaveを使えってことかな。

つまり```モデル名.オブジェクト名 = ```とやってから保存するときにsaveを使うってことと勝手に理解しました笑

#update_attributes
レファレンスによると”データベースから取得したオブジェクトを更新”と記されている。参考URL  -> [Railsドキュメント](http://railsdoc.com/references/update_attributes)

こっちはなんとなくイメージ湧きます。つまり```モデル名.update_attribute(オブジェクト名, オブジェクト名)```で保存できるってこと。


###結果
まあ保存することのみを考えるなら特に意識する必要はないのかと思いました。
もちろんvalidation、callbackなどを考慮するときは考えなきゃですが。。。
そこは以下を参考にしださい笑
http://qiita.com/tyamagu2/items/8abd93bb7ab0424cf084
http://qiita.com/rtoya/items/29cef3e328299781a328

こんなんでいいのか・・・アドバイスあったらコメント下さい！

コールバックで思い出しましたがchangedメソッドは使うとき時間かかりました。次はそれについて書こうかな。
ブラウザに出力される日本語が文字化けするとき


HttpServletResponse#setContentTypeをを設定すればよい。
Windows-31J、UTF-8はお好みで。

```java:HelloServlet.java
public class HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=Windows-31J");
		PrintWriter pw = response.getWriter();
		pw.print("こんにちは世界");
	}
}
```
Vagrant + Chefでnode.js開発環境構築



VagrantとChefでnode.jsの開発環境を構築してみます。
Berksfileにrecipe[npm]を追加するとエラーになってしまうようです。


環境：MacOSX 10.9.5

## Chefをインストール

Development Kitでインストールする。
まず、https://downloads.getchef.com/chef-dk からpkgをダウンロードして、インストールする。

chef-dkに入っているのrubyへのパスを通す

```
echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
source ~/.bash_profile
```

## knife-soloをインストール

```
$ sudo chef gem install knife-solo
```

## knifeの初期設定をする
```
$ knife configure
```
設定は全てデフォルトでOK

## BerkshelfでVagrantとCookBookを用意する。

```
$ berks cookbook {{ディレクトリ名}}
$ cd {{ディレクトリ名}}
$ bundle install
```
##Berksfileを編集する
```Berksfile
source "https://supermarket.chef.io"

metadata
cookbook 'nginx'
cookbook 'mongodb'
cookbook 'nodejs'
cookbook 'forever'
cookbook 'git'
```
##Vagrantプラグインをインストール
```
$ vagrant plugin install vagrant-berkshelf
$ vagrant plugin install vagrant-omnibus
```
##Vagrantfileでboxを指定する
```Vagrantfile
config.vm.box = '{{box名}}'
```


##Vagrantfileにrecipeを追加する
```Vagrantfile
    chef.run_list = [
      'recipe[ubuntu::default]',
      'recipe[nginx]',
      'recipe[nodejs]',
      'recipe[mongodb]',
      'recipe[forever]',
      'recipe[git]'
    ]
```

##Vagrantを起動

```
$ vagrant up --provision
```

##参考記事
* http://qiita.com/bitai/items/26e63ddab3c44b5920e1
MacのターミナルからSCPコマンドでサーバーにフォルダごとアップロード。

macでwinscpみたいなものを探したあげくに意を決してSCPコマンドを叩く気になったみなさん、こんにちは。

## 前提
サーバーは公開鍵認証ではなくパスワード方式。
サーバーのユーザーのパスワードを知っている。
Macのターミナル.appから実行。

## サーバーへアップロード
~~~
scp -P 20512 -r /Users/Tetsuya/Project/aaa/public tetsuya@test.org:/home/a-site
~~~

サーバーのパスワードが求められる。
サーバーの/home/a-siteの下にpublicディレクトリが新規に作成される。public配下のディレクトリ・ファイルも再帰的にアップロードされる。

## サーバーからダウンロード
~~~
scp -P 20512 -r /var/www/html/b-site  tetsuya@test.org:/Users/Tetsuya/Desktop/
~~~

サーバーのパスワードが求められる。
ローカルのDesktopにb-siteフォルダができる。b-site配下のディレクトリ・ファイルも再帰的にダウンロードされる。
Postfixを使ってテストメールを送る

今週はPostfixを使ってメールが送れるかどうかのテストをいっぱいしたので、それについてのまとめをしようと思います。

## Postfixって何？
Postfixでテストメール送れることを教えてもらい散々使ってたけど、Postfixが何者か全然知らなかった・・・

```
Postfix（ポストフィックス）はフリーソフトウェア・オープンソースソフトウェアのメール転送エージェント(MTA)である。 Sendmailとの操作上の互換性を確保しつつ、管理・設定が容易で、高速・安全であることを指向して開発されている。 完全にUNIX用のMTAシステムとして設計されているため、UNIX上の他の多くのソフトウェアと連携が必要となる場合がある。 NetBSD、Mac OS X Serverなど、いくつかのUnix系OSで標準のMTAとして採用されている。
```
というものらしい。オープンソフトウェアだったんですね。参考:[Wikipedia](http://ja.wikipedia.org/wiki/Postfix)

## 使い方
１ヶ月前くらいに使い方教えてもらったのに忘れていたので、復習を。
Mac Book Proでやってます。

#### Postfixを起動する
``` sudo postfix start ```

#### メールのコントローラー（メーラーっていうのかな）の宛先を自分宛に変える(EMAIL_ADDRESSの部分)
``` mail({:to => EMAIL_ADDRESS ... }) ```

#### Railsコンソールを立ち上げる
``` rails c ```

#### テストメールを送る
``` MailerController.method_name(AUGUMENT).deliver ```
※ポイントは``` .deliver ```をつけること。これをつけないと送られません。
Ruby on Rails だと同じクラス名のディレクトリの下にある同じメソッド名のhtml/testファイルをメールとして送ってくれます。
（例）

```lang:/app/mailer/user_mailer.rb
class UserMailer < ActionMailer::Base
  def recommend_mail(user)
    @user = user
    mail({:to => sample@hogehoge.co.jp, :subject => "あなたにオススメ商品！"})
  end
end
```
みたいなコードがあったとしたら
/app/views/user_mailer/recommend_mail.html.erb
というファイルを作り、そこにメールの本文を書く。

## テストメールが終わったら
Postfixを止めておきましょう。
``` sudo postfix stop ```
Cocos2dx 2.2.6から3.6への移行 （Windows Android環境）

今回は難産な割にやることはシンプルでした。
およそ１２時間は調べていたと思います。
今回の問題は、おそらくv3.6固有のものです。

Box2dをいじっていて、どうにもDebugDrawのエラーから逃れられないので（box2d自体は動く）、
資料も多いv3系に移行してしまおうと思い、バージョン移行にとりかかりました。

で、今回は主にv3.6の環境構築の方法です。

v3系はv2系とごっそり内容が変わっているので、プロジェクトをそのまま
持ってくることはできません。
ソースコードもCCのprefixが取れていますし、ビルド環境も、フォルダ構成から
プロジェクトの構築方法まで変わっています。

ですので、１からやることになります。

まずインストール自体は、以下のページを参考にしました（ありがとうございます）。

Cocos2d-x 3.4 Windows開発環境のセットアップ | cretia studio 
http://studio.cretia.net/blog/185

Cocos2d-x v3.2の開発環境を作ってみた 
http://www.mnemonic.jp/shimodai/post-453/

注意点と言えば、
ANT_ROOTがantのインストールフォルダ直下ではなく/binだということくらいです。

私がインストール後に遭遇した不具合はeclipseにおいて、

* ビルドができない（ビルドコマンドでなにも反応がない）
* runするとビルドせずにすぐにエミュレータ起動にいく（もちろんエラーになる）

でした。

で、この不具合をどうやって回避するかを結論から言うと、

* v.3.5_tizenをダウンロードしてきて、
\cocos2d-x-3.5_tizen\templates\cpp-template-default\proj.android
の中にある、

.project
.cproject

を、

\プロジェクト名\proj.android

に上書きコピーします。
そうすると無事ビルドできるようになります。

参考まで。
Good luck!
－－－－－－－－
追記：
3.6環境ですが、２つのファイルをコピーしただけでは不完全のようです。
新しい記事を参考にしてください（結果的に3.6環境は使っていません）。

Xcode6 - cocos2dx:unable to open executable - Qiita 
http://qiita.com/n2labo/items/caea30e45d56ead30bfb
OS起動後、音がミュートになっているのを解除する方法

## 参考

* [alsa - Howto save AlsaMixer settings? - Ask Ubuntu](http://askubuntu.com/questions/50067/howto-save-alsamixer-settings)
* [alsamixerとamixer、GUIのミキサー - 試験運用中なLinux備忘録](http://d.hatena.ne.jp/kakurasan/20070907/p1)


## alsactl を使う

ミュートを解除した状態で保存

```bash:設定保存
/usr/sbin/alsactl --file ~/.config/asound.state store
```

```bash:設定復元
/usr/sbin/alsactl --file ~/.config/asound.state restore
```

## amixer を使う

ミュート状態と、ミュート解除状態を`amixer`コマンドの出力結果でdiffをとりあたりをつける。
自分の場合だと以下でミュート解除できた。

```bash:
amixer -q set IEC958 on
```

```bash:~/.bashrc
if [ "$DISPLAY" = ":0.0" ];then
  amixer -q set IEC958 on
fi
```
Git for Windowsでコンフリクト解決するときの手順

# はじめに

Githubは[Github for Windows](https://windows.github.com/)というグラフィカルなプログラムからも操作できるそうなので、どうなっているのか調査してみました。結果、GUIだけからレポジトリ追記やコンフリクトの解決など、Gitの基本操作をすることができましたので、記事にしてみます。

なお、オンライン書籍[ニューラルネットワークと機械学習](nnadl-ja.github.io/nnadl_site_ja/)の翻訳プロジェクトを操作の題材にしています。

(参考にした記事： https://gist.github.com/wizard-paso/4246134)

# Gitレポジトリをローカルに取得し、内容を編集する

まず、左側のパネルからGithubでアクセス権のあるレポジトリを、ローカルにクローンとかできます。この後保存先のフォルダを聞かれます。

![rapture_20150523160555.png](https://qiita-image-store.s3.amazonaws.com/0/1871/42c46a22-c275-74b2-219e-e81ab0e0f2c9.png)

保存先のファイルには「Open in Explorer」でアクセスできます。

![open in explorer.png](https://qiita-image-store.s3.amazonaws.com/0/1871/6165c300-c73d-ae4a-6db2-1f07d45bea34.png)


さてローカルで何か変更を加えたら、変更を「Show」して

![rapture_20150523161142.png](https://qiita-image-store.s3.amazonaws.com/0/1871/1f0ec8f8-9232-6c24-75ac-0f412b0564e5.png)

右側にCommit(追加)しようとしている変更がでるので、チェックしてコメントしてCommitを押します。

![write-commit-message.png](https://qiita-image-store.s3.amazonaws.com/0/1871/3c9f0e2d-c214-0fba-f891-bfdf0a123d76.png)

Commitした結果は、左側のSyncボタンを押すとGithubにpushできます。このSyncボタンの側には、ローカル(手元のパソコン)とリモート(Github)、それぞれのリポジトリの状態が表示されています。下の画像ですと「ローカルはリモートより2コミットぶん進んでいるが、他の2コミットぶん遅れている」と表示されており、このままSyncしてしまうと衝突しそうですが、先に進むには仕方ないのでSyncを押します。

![04-sync.png](https://qiita-image-store.s3.amazonaws.com/0/1871/eb1cf0ea-1d1f-509e-da88-c6f06b66bbcd.png)

ローカルとリモートの変更が独立ならば自動的にmerge(統合)されるのですが、今回は運悪く衝突してしまいました。

![rapture_20150523165954.png](https://qiita-image-store.s3.amazonaws.com/0/1871/cc47caab-e1da-f995-1981-5aee6ec6e138.png)


# Conflict(衝突)の解決

衝突箇所は、ソースファイルに以下のような記号で挟まれて記入されます。衝突箇所が複数の場合は、衝突したと解釈されたすべての箇所に以下のメッセージが記入されます。

```` 
<<<<<<<<<<<< HEAD
ローカルの変更内容
============ 
リモートの変更内容
>>>>>>>>>>>> リモートブランチの名前
````

そこで、衝突しているファイルを好みのエディタで開き、衝突している個所を修復していきます。

![rapture_20150523170135.png](https://qiita-image-store.s3.amazonaws.com/0/1871/7cdc5693-24bc-0215-22c4-d9185878c586.png)

両方の変更を勘案しながらいいとこどりして、`<<<<<<`記号なども消し、HTMLファイルとして読める状態にしておきます。ローカルのブラウザで開くなどして、うまく統合できたか動作確認をしましょう。

![rapture_20150523170430.png](https://qiita-image-store.s3.amazonaws.com/0/1871/6a9bf9e9-03c3-8988-eb39-13eccbcd2aad.png)

統合できたらふたたびCommit操作をします。これまでの作業で、ローカルの状態から統合された状態へ遷移するパッチが作れたので、コミットします。

![merge-comment.png](https://qiita-image-store.s3.amazonaws.com/0/1871/d602f406-ba7d-402c-b301-3e1b395cc1f0.png)

すると、ローカルレポジトリがリモートレポジトリにくらべて純粋に「進んでいる」状態まで来ました。こうなったら「Sync」を押せば・・・

![sync-ahead.png](https://qiita-image-store.s3.amazonaws.com/0/1871/f38a58c0-31ae-626d-166c-53d5f655ab69.png)

変更がGithubに送信され、統合完了です！

![syncing.png](https://qiita-image-store.s3.amazonaws.com/0/1871/edd54ade-88ab-2be0-9600-1be20906b108.png)

Githubにもちゃんと投稿されていることを確認できます。

![finished.png](https://qiita-image-store.s3.amazonaws.com/0/1871/fba310a5-5131-bbe2-0d06-6096b5770ec3.png)
AmazonLinuxのbashプロンプトにgitのブランチ名を表示させてみた

[今いるディレクトリの git のブランチ名をプロンプトに表示する - Qiita](http://qiita.com/da0shi/items/13c65d1b10348e79461b)

これにしたがって、AmazonLinuxのbashプロンプトにgitのブランチ名を表示させてみた。

あと、AmazonLinuxのプロンプトって標準では、`[ec2-user@ip-12-34-56-78]`とかでるので、番号じゃどのインスタンスか間違えやすいので、次の設定もした。

[Linux インスタンスのホスト名の変更 - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html)

任意のサーバー名を考えて突っ込む。

```bash
sudo sh -c 'echo "export NICKNAME=webserver" > /etc/profile.d/prompt.sh'
```

あとは、自分のGitに入っている、`git-prompt.sh`の場所を調べる。僕の場合は`/usr/share/doc/git-2.1.0/contrib/completion/git-prompt.sh`だったので、`GIT_CONTRIB_DIR`に突っ込む。

```bash:~/bashrc
# Prompt
gitps1="true"
GIT_CONTRIB_DIR=/usr/share/doc/git-2.1.0/contrib
if [ -r ${GIT_CONTRIB_DIR}/completion/git-prompt.sh ]; then
  . ${GIT_CONTRIB_DIR}/completion/git-prompt.sh
  gitps1="__git_ps1"
fi

export PS1='\[\e[1;31m\][\u@${NICKNAME} \W$(${gitps1})]\$\[\e[m\] '
```

これで、どこのインスタンスのどのブランチにいるのかを間違えないで済むので素敵です。
Chef(knife)でcookbookの文法チェックをする

Chefは、コマンドを叩く→実行 の1サイクルが非常に長く、場合によっては1サイクルに数分とか1時間以上かかることもあります。
1時間後に文法エラーが発覚するととても悲しい気持ちになるわけです。

なので、いかにコードを実行せずに文法チェックするのが重要です。
`knife cookbook test`というコマンドでそれができます。

# `apache`という名前のcookbookをテストする

```
$ knife cookbook test -o site-cookbooks apache
```

# 全部のcookbookを一気にテストする

```
$ cd site-cookbooks
$ knife cookbook test  -o . *
```
JavaScript で同じ要素が繰り返す配列を作る

## 例えば 'AB' が10回繰り返すような配列を作る
```js
Array.apply(null, Array(10)).map(function(){ return 'AB' });
```

### 結果
```js
["AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB"]
```

イマイチだなーとは思う。

## 参考
- [Create an array with same element repeated multiple times in javascript - Stack Overflow](http://stackoverflow.com/questions/12503146/create-an-array-with-same-element-repeated-multiple-times-in-javascript)
Ubuntu12.04 にHaskell GHCiをインストール

Haskellをやってみようと思った。
環境：Ubuntu12.04 64bit

https://www.haskell.org/platform/linux.html">https://www.haskell.org/platform/linux.html
からGeneric Linux Binariesを落としてきて

```bash
$ cd /
$ sudo tar xvf ...downloaded-tarfile...
$ sudo /usr/local/haskell/ghc-7.8.3-x86-64/bin/activate-hs
```

とする。

すると以下のようにして対話式プログラミングできるプロンプトが出る。

```bash
$ ghci
...
Prelude>
```

はずだがエラーが出た。

```bash
GHCi, version 7.3.20111021: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... <command></command>: can't load .so/.DLL for: libgmp.so (libgmp.so: cannot open shared object file: No such file or directory
```

そこで以下のコマンドでlibgmp.soに静的リンクを張ったらうまく行くようになった。

```bash
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libgmp.so.10 /usr/lib/x86_64-linux-gnu/libgmp.so
```

ソースファイルを読み込ませるには

```bash
$ ghci Sample.hs
```

とするか、

GHCiを起動してから

```bash
Prelude> :l Sample.hs
```

とすればよい。
ファイルに変更を加えた時には

```bash
Prelude> :r
```

でリロードする。