OmniAICreator/Qiita-1.07M huggingface dataset:
MacのDockerでバグ VirtualBox 5.0.x問題



## 現象

以下のエラーが出る

```
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```

## 問題

Virtual Boxの不具合

* [#14412 (Failed to load VMMR0.r0 (VERR_VMM_SMAP_BUT_AC_CLEAR) [FIXED IN SVN]) – Oracle VM VirtualBox](https://www.virtualbox.org/ticket/14412)

テストビルドでは修正済み

VirtualBox 5.0.0-5.0.2辺りで発生している様子

## 対処

1. テストビルドにする → [Testbuilds – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Testbuilds)
2. 4.3.30にして、再起動


僕の環境では、VirtualBox 5.0.3で問題が起こらなくなったようです。

## 参考

* [Docker-Machine : "Error creating machine: exit status 1" · Issue #1716 · docker/machine](https://github.com/docker/machine/issues/1716)
Ring ZERO の iOS SDK を Swift から使う


![photo](https://qiita-image-store.s3.amazonaws.com/0/7113/9fe47ead-d66a-d449-52fe-c63af52a2778.jpeg)
8/26 に，Ring ZERO の iOS SDK の β 版がリリースされました．[ここ](https://developer.logbar.jp/ring/ja/) からダウンロードできます．早速 Swift から使ってみたのでまとめてみようと思います．

## 何ができるのか

これまでは，Open URI を用いて Ring のアプリ内で登録したジェスチャーを取得していました．すなわち，あるジェスチャーが認識されたら HTTP リクエストが送られるので，サーバ上で処理をおこなう必要がありました．なので，アプリ内でジェスチャーを受け取りたいような場合は，1度 HTTP リクエストを送ってそれを WebSocket で流すみたいなことをせざるを得なかったのですが，今回 SDK が出たことにより，アプリ内で直接ジェスチャーを取得できるようになりました．さらに，SDK ではジェスチャーはアプリ内に登録されたものを利用する形式になるので，Ring のアプリ内にジェスチャーを登録する必要がなく，サードパーティのアプリが非常に作りやすくなりました．(これまでは個人でジェスチャーを登録して遊ぶ程度が関の山でした) ただ 8/26 現在，まだ β 提供のため SDK を使ったアプリを一般公開することはできないようです．

現在は以下の 8 個のジェスチャーを使うことができます．現時点では自分で新しいジェスチャーを登録することはできません．

![gesture](https://qiita-image-store.s3.amazonaws.com/0/7113/896ebb4d-f9b5-b789-e7e5-93d76702c92b.png)

ちなみにこの画像は SDK で取得することができます．以下はハート ```CR_POINTS_HEART``` の画像です．

```swift
CRCommon.imageWithPoints(CR_POINTS_HEART,
                         width: imageView.frame.width,
                         lineColor: UIColor.lightGrayColor(),
                         pointColor: UIColor.lightGrayColor())

```

## コードサンプル

ちょっとしたサンプルを書いておこうと思います．以下は起動時の処理です．```viewDidAppear``` あたりに書きましょう．

```swift
let gestureDict = ["circle": CR_POINTS_LEFT, "pigtate": CR_POINTS_RIGHT,
                   "heart": CR_POINTS_DOWN, "triangle": CR_POINTS_UP]

if let ringApp = ringApp {} else {
    ringApp = CRApplication(delegate:self, background: false)
    if ringApp!.installedGestureIdentifiers().count == 0 {
        var error: NSError?
        // 1度ジェスチャーをインストールすると，アプリを削除しない限り更新できない
        if !ringApp!.installGestures(gestureDict, error: &error) {
            println(error!.localizedDescription)
            return
        }
    }
    ringApp!.setActiveGestureIdentifiers(gestureDict.keys.array)
    ringApp!.start()
}
```

以下はジェスチャー認識時に呼ばれる delegate です．ジェスチャーに対応する key が返ってきます．

```swift
func didReceiveGesture(gesture: String!) {
    if let gesture = gesture {
        println(gesture)  // circle など
    }
}
```
[Swift][iOS]NSDictionaryで構成されるNSArrayのソートについて

PlistをNSArrayとして読み込む、というのはよくある事だと思います。
その場合、NSArrayの要素がNSDictionaryになる事があります。
この時に、NSArrayをNSDictionaryのKeyの値ごとにソートする方法について投稿します。

NSArray型の配列aryを、aryの各要素であるNSDictionaryのkeyである"foo"で取得出来る値によってソートする場合について記述します。


```
let sortDescription = NSSortDescriptor(key: "foo", ascending: false)
let sortDescAry = [sortDescription]
ary = ary.sortedArrayUsingDescriptors(sortDescAry) as NSArray
```

このように書きます。
配列の順番が変更されますが、NSArrayでOKです。
NSSortDescriptorはさらに引数としてselector:やcomparator:を渡す事も出来、ソート条件を指定出来るようですが、ここは私には何がなんだかわかりません。ご存知の方がいらっしゃれば、指定の仕方など教えて下さい。

で、この様に書けば日本語でもソート出来ます。ただ、注意点としては、NSDictionaryに数字が文字列として格納されている場合は、思った通りにソートされません。
具体的には、100よりも99の方が後に来ます。要は文字列なので辞書式になってしまうんですね。
ちゃんとNSDictionaryに数値として格納すれば、これもちゃんとソートしてくれます。
こんな都合のよい関数があるなんて…
Reduxにおけるreducer分割とcombineReducersについて

*2015-08-28 11:06 合成された初期状態ツリーの出力結果を追加*

## 分割されたreducerの初期状態ツリー

Reduxの原則の1つであるグローバルな状態ツリーがすべてのソースとなるという点。
理屈ではわかるんだけど、いくつかコンポーネントを作っていくと常に大きなツリーが渡されるってのがとても扱いづらく感じる。つまり、何かアクションを受け取ってそれを状態ツリーに反映させるとき、ほとんどのケースにおいてツリーの一部だけを更新して、それ以外はいじらないことが多いからだ。

Reduxリポジトリのasyncのサンプルコードを追っていくと、reducers/index.jsの部分がよくわからなかった。
他のサンプルだと初期状態ツリーは定数として定義してreducerのデフォルト引数に指定していることが多かったが、asyncではまずそれがない。
そしてなにより状態ツリーはグローバルなものが１つで、それがすべてであるという説明を読んでいたので、`postsByReddit`は文字列、`selectedReddit`はオブジェクトというように初期状態の構造が異なっていることには混乱した。

そうなると怪しいのは`combineReducers`になる。最初に名前を見た時、単に１つずつ実行しているだけだろうと思ったけど実際にはそれ以外にもやっていた。そしてそれが各reducerにおいて初期状態の構造が異なっている理由だった。

## combineReducersがやっていること

`combineReducers`の処理の本筋部分だけを取り出すと

+ 各reducerを呼び出して初期状態を取り出す
+ 初期状態をまとめて初期状態ツリーを作る
+ reducerの処理をまとめたcombination関数を返す

となっていて、`combineReducers`が初期状態ツリーの生成も担っていた。

## さらにcombination関数の処理について

`combineReducers`が返す`combination`関数はreducer名をキーにした状態ツリーから、そのreducerの部分状態を取り出して渡す。戻ってきた新しい部分状態はやはりreducer名をキーにしてまた１つの状態ツリーにまとめられて、最終的なreducerの戻り値となる。

```
function reducerA(state = 'hoge', action) {
  switch (action.type) {
    case 'ACTION_X':
      return 'foobar';
  }
  return state;
}

function reducerB(state = { flag: false, items: [] }, action) {
  switch (action.type) {
    case 'ACTION_Y':
      return Object.assign({}, state, { flag: true });
  }
  return state;
}

let rootReducer = combineReducers({ reducerA, reducerB });

// stateとしてundefinedを渡して初期状態ツリーを取り出す
console.log(rootReducer(undefined, { type: null }));
```

実行すると以下の初期状態ツリーが出てくる。

```
{
  "reducerA": "hoge",
  "reducerB": {
    "flag": false,
    "items": []
  }
}
```

## reducerをどう分割していくか

`combineReducers`を使うことでreducerごとに別々の名前空間で処理が実行されているようなものなので(chrootみたいな感じ)、reducerの分割単位は状態ツリーのどの部分ツリーをスコープとするかがポイントになるようだ。

基本的には個々のreducerは最小限の部分ツリーで動くように作って、どうしてもツリーを横断的に処理する必要があるものについてはそれらを含むちょっと大きめのツリーを渡すreducerに任せる、って感じで作っていくといいのかな。
WebWorkerを試してみよう

## はじめに

WebWorkerを試してみました。

サーバを使わずに確認できるかと思ったのですが、Chromeでは`Uncaught SecurityError: Failed to construct 'Worker': Script at app.js:2`となり、確認することはできませんでした。

`python -m SimpleHTTPServer`を使えば、このエラーを回避することができます。

この記事では、使用したファイルを紹介します。内容は、ボタンをクリックしたときに、アラートで1が表示されるというものです。

## ファイル

まず、index.htmlを見てみます。ボタンをクリックしたときに`homework()`を呼び出すようになっています。

``` index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="app.js"></script>
  <script src="worker.js"></script>
</head>
<body>
  <form action="#">
    <input type="button" value="work!" onclick="homework();">
  </form>
</body>
</html>
```

つぎに、app.jsを見てみます。`homework()`が呼び出されたときに、WebWorkerを生成して、そのWorkerにイベントリスナー(アラートを表示するコールバック関数)を設定して、データを送信するようになっています。

``` app.js
function homework() {
  var worker = new Worker('worker.js');
  worker.addEventListener("message", function (e) {
    alert(e.data);
  });
  worker.postMessage(100);
}
```

worker.jsを見てみます。イベントリスナー(データを送信するコールバック関数)を指定しています。

``` worker.js
addEventListener("message", function (e) {
  postMessage(1);
});
```

postMessageで送信されたデータを受信するとmessageイベントが発火するようです。そして、そのmessageイベントを捕捉して、コールバック関数をを実行する感じです。

Workerの生成元とWorkerという見方をすると分かりやすいかもしれません。

あと、Workerでできないことは主に、親ページに直接影響を与えるものらしいです。

```
Worker で実行できないことは主に、親ページに直接影響を与えるものです。これは、DOM の操作やページのオブジェクトを使用することを含みます。DedicatedWorkerGlobalScope.postMessage を使用してメインスクリプトにメッセージを戻してから変更操作を行う形で、間接的に実行しなければなりません。
```

[Web Worker を使用する - Web developer guide | MDN](https://developer.mozilla.org/ja/docs/Web/Guide/Performance/Using_web_workers)

## まとめ

どんなことに使えるのかイメージが湧いていない状態ですが、なんだか面白そうな雰囲気があります。

## 参照URL

- [javascript - Chrome can't load web worker - Stack Overflow](http://stackoverflow.com/questions/21408510/chrome-cant-load-web-worker)
- [window.postMessage - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage)
Laravel5のデータベース操作

##DBファサードを利用
####SELECTクエリーを実行する
```
$results = DB::select('select * from users where id = ?', [1]);
```
####INSERT文を実行する
```
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
```
####UPDATE文を実行する
```
DB::update('update users set votes = 100 where name = ?', ['John']);
```
####DELETE文を実行する
```
DB::delete('delete from users');
```
####通常のSQL文を実行する
```
DB::statement('drop table users');
```
詳しくは公式ドキュメント
http://readouble.com/laravel/5/0/dev/ja/database.html

##Database: Query Builderを利用(fluentインターフェイス)

####テーブルから全レコードを取得する
```
$users = DB::table('users')->get();

foreach ($users as $user)
{
    var_dump($user->name);
}
```
####テーブルから１レコードを取得する
```
$user = DB::table('users')->where('name', 'John')->first();

var_dump($user->name);
```

####レコードの１カラムを取得する
```
$name = DB::table('users')->where('name', 'John')->pluck('name');
```

詳しくは公式ドキュメント
http://laravel.com/docs/5.1/queries
http://readouble.com/laravel/5/0/dev/ja/database.html

##Eloquentを利用
公式ドキュメント
http://laravel.com/docs/5.1/eloquent
http://readouble.com/laravel/5/0/dev/ja/eloquent.html
ActiveRecordのCallbackを利用して、Sidekiqにenqueueしてハマった

# やりたかったこと
* 特定attributeの更新があった場合に、外部サービスと連携したい
* 外部サービスの操作はワーカープロセスに任せて、非同期でデータ更新

## 概要&サンプルコード
1. 特定attributeが更新された場合、Sidekiq::Workerにenqueue  
    i. after_saveにて、attribute_changed?で更新確認  
    ii. 更新されていればenqueue  
1. Worker側で更新対象取得
1. 外部サービス情報取得、更新

```
# == Schema Information                                                                                                                                                                             
#
# Table name: users
#
#  id                  :integer        not null, primary key
#  external_user_id    :integer
#  external_user_name  :string(255)
#  created_at          :datetime
#  updated_at          :datetime
#

class User < ActiveRecord::Base
  after_save : refresh_external_user_name

  def update_external_user_name
    client = ExternalService::Client.new
    name = client.get_name(external_user_id)
    update(external_user_name: name)
  end 

  private

    def refresh_external_user_name
      if external_user_id_changed?
        ExternalServiceWorker.perform_async self.id
      end
   end 
end

class ExternalServiceWorker
  include Sidekiq::Worker
                                                                                                                                                                                                                        
  def perform(id)
    user = User.find(id)
    user.update_external_user_name
  end 
end
```

# 発生した問題
* Worker内で行っている、User.find(id)がRecordNotFoundとなる
* 成功するケースもある
* RecordNotFoundがでた後に、idでDBを確認するとデータは存在してる

## 原因
after_saveの時点でidは発行されているため、データが存在しているようにみえた
しかし実際にはTransactionはCOMMIT前なので、DBにデータはまだ存在していない
そのためWorker内のUser.find(id)が、COMMITより先に走ってしまった場合RecordNotFoundとなる
COMMITが完了していれば、DBにもデータが存在するので成功する

# 解決方法
1. 確実にTransactionがCOMMITされてるタイミング(after_commit)で、enqueueするようにした
2. after_commit内ではattribute_changed?メソッドを使えないため、previous_changes.has_key?(:external_user_id)による更新確認に変更

コード変更点

```
-  after_save :refresh_external_user_name
+  after_commit :refresh_external_user_name

  def refresh_external_user_name
-    if external_user_id_changed?
+    if previous_changes.has_key?(:external_user_id)
       ExternalServiceWorker.perform_async self.id
     end
  end
```

# 教訓
Callback利用して特定の値が更新された時にjob登録、別プロセスでデータ追加更新みたいなことをしたいケースではTransactionの確定タイミングに注意してプログラムを組むのが大事。
sshのX11Forwardingでエラーが起きる

なんだか、初心者向け基礎知識を小出しに記事にするのが流行っているらしい。
俺もS/N比悪化に一役買ってやるべく記事を書こう。


Linuxを、サーバ向けのXが入らないパッケージ構成でセットアップして、後からXを使うアプリケーションを入れた場合に、sshでXアプリケーションを転送しようとしてもエラーが発生してうまくいかない事がある。例えば Oracle のインストーラを Xming で動かそうとした時とか。

```lang:shell-output
$ ssh -X xxx.xxx.xxx.xxx
X11 forwarding request failed on channel 0
```
ssh 自体はつながっているし他のポートは転送できるのに、X11Forwarding だけできない謎状態。

xauth コマンドが入っていないとそうなる。
サーバー向けのパッケージ構成で入れると陥りがち。

入れておこう。

```lang:shell-command
$ sudo yum install xauth
$ sudo apt-get install xauth
$ sudo portmaster x11/xauth
```
laravel-5-boilerplateのインストール

#laravel-5-boilerplateとは
機能のGitHabのreadmeに詳細が書いてあります
https://github.com/rappasoft/laravel-5-boilerplate
今回はロール・パーミッション認証とOAuth認証を実装するために利用しました

ロール・パーミッション認証については以下のサイトを参考にしました
http://kore1server.com/161

また、OAuthのみを実装したい場合はこちらのサービスプロバイダーを利用するのもよい
https://github.com/oriceon/oauth-5-laravel

#インストール
アプリケーションディレクトリに移動

```
git clone https://github.com/rappasoft/laravel-5-boilerplate.git
composer install
npm install
cp .env.example .env
php artisan key:generate
```
データベースの設定を.envに書き込む

```
DB_HOST=localhost
DB_DATABASE=laravel
DB_USERNAME=homestead
DB_PASSWORD=secret
```
migrationとseedingを実行
```
php artisan migrate
php artisan db:seed
```
###storage/のパーミッションがおかしい時は
```
chmod -R 777 storage
```

###php-mcryptでエラーが出るのでconfig/app.phpを編集

~~'cipher' => MCRYPT_RIJNDAEL_128,~~
'cipher' => 'AES-256-CBC',

これでトップ画面にアクセスできるようになると思います

![スクリーンショット 2015-08-28 00.13.40.png](https://qiita-image-store.s3.amazonaws.com/0/90235/c8eab80a-6da0-d1e2-9eb2-e0dfdde52175.png)

初期ユーザーはdatabase/seeds/Access/UserTableSeeder.phpで確認できます。

```
<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon as Carbon;

class UserTableSeeder extends Seeder {

	public function run() {

		if(env('DB_DRIVER') == 'mysql')
　　　　　　　//①データベースの外部キー制約を解除
			DB::statement('SET FOREIGN_KEY_CHECKS=0;');

		if(env('DB_DRIVER') == 'mysql')
　　　　　　　//②テーブルの中身を全削除
			DB::table(config('auth.table'))->truncate();
		else //For PostgreSQL or anything else
			DB::statement("TRUNCATE TABLE ".config('auth.table')." CASCADE");

		//Add the master administrator, user id of 1
		$users = [
			[
				'name' => 'Admin Istrator',
				'email' => 'admin@admin.com',
				'password' => bcrypt('1234'),
				'confirmation_code' => md5(uniqid(mt_rand(), true)),
				'confirmed' => true,
				'created_at' => Carbon::now(),
				'updated_at' => Carbon::now()
			],
			[
				'name' => 'Default User',
				'email' => 'user@user.com',
				'password' => bcrypt('1234'),
				'confirmation_code' => md5(uniqid(mt_rand(), true)),
				'confirmed' => true,
				'created_at' => Carbon::now(),
				'updated_at' => Carbon::now()
			],
		];

		DB::table(config('auth.table'))->insert($users);

		if(env('DB_DRIVER') == 'mysql')
　　　　　　　//①データベースの外部キー制約を設定
			DB::statement('SET FOREIGN_KEY_CHECKS=1;');
	}
}
```

①外部キー制約に引っかかってテーブルが削除できないときの対策

```
DB::statement('');   　　　　                    //直接Queryを実行

DB::statement('SET FOREIGN_KEY_CHECKS=0;');     //外部キー制約無効
DB::statement('SET FOREIGN_KEY_CHECKS=1;');     //外部キー制約有効
```

②TRUNCATE TABLE命令は全行削除の機能しか持っていないため、テーブルのレコードを記録する領域（データページ）の割り当てを解除して一気にレコードを消滅させます。従って、TRUNCATE TABLEの方がDELETEより高速に削除できます。

seedingを確認すると初期ユーザーは
use@user.comとadimin@admin.com
パスワードは共に1234だとわかります

実際にログイン出来ることが確認できます

![スクリーンショット 2015-08-28 02.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/90235/2bd7f8da-a7c1-4e52-7c69-bcecd5696146.png)
シェルスクリプトでghq風コマンドを作る

[ghq](https://github.com/motemen/ghq) を ghq get と ghq list を peco に渡して cd することにしか使ってないので、このくらいならシェルスクリプトでできる気がしてやってみた。

`~/.zshrc` に次の内容を書く。

```bash
ghq-get() {
  git clone "git@github.com:$1.git" "$HOME/github_repos/$1"
}

function peco-ghq-fu () {
  local selected_dir=$(find $HOME/github_repos/ -maxdepth 2 -mindepth 2 | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-ghq-fu
bindkey '^g' peco-ghq-fu
```

次のコマンドで github からリポジトリを clone する。

```
$ ghq-get motemen/ghq
```

`Ctrl-g` で peco にリポジトリのディレクトリを表示して cd できる。
[Swift] Facebook SDK iOS を使って友達のリストを取得する

SwiftでFacebook SDKを使って友達のリストを取得する方法です。

SDKの導入からの方はこちら。
[SwiftでFacebookのユーザー認証からデータ取得まで(Facebook SDK)](http://rayc5.hatenablog.com/entry/2015/08/27/043556)

## 実装

facebookには単純に友達を取得するAPIがないので、taggable_friendsを利用して友達のリストを取得します。

パラメータを設定せずにリクエストを送ると25人分しか返ってこないので、パラメータとしてlimitに友達の数を設定することで一回で取得するようにします。
友達の数を取得するためにはfriendsを利用します。

※補足
taggable_friendsは名前の通りtaggableな友達しか取得できないので全ての友達が取得できるわけではありません。
しかし、untaggableな友達は少ないと思うので、ほとんどの友達が取得できると思います。
僕の場合は877人中859人の友達が取得できました。

それにしてもuntaggableな友達って誰なんでしょう。
わかる方いらっしゃいましたらご教授ください。

```swift
func friendsList() {

        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/friends", parameters: nil)
        graphRequest.startWithCompletionHandler( { (connection, result, error) -> Void in
            
            if ((error) != nil)
            {
                // Process error
                println("Error: \(error)")
                return
            }
            
            
            let summary = result.valueForKey("summary") as! NSDictionary
            let counts = summary.valueForKey("total_count") as! NSNumber
            
            let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/taggable_friends", parameters: ["fields": "id,name,picture", "limit": "\(counts)"])
            graphRequest.startWithCompletionHandler( { (connection, result, error) -> Void in
                
                if ((error) != nil)
                {
                    // Process error
                    println("Error: \(error)")
                    return
                }
                else
                {
                    let friends = result.valueForKey("data") as! NSArray
                    var count = 1
                    if let array = friends as? [NSDictionary] {
                        for friend : NSDictionary in array {
                            let name = friend.valueForKey("name") as! NSString
                            println("\(count) \(name)")
                            count++
                        }
                    }
                }       
            })
        })   
    }
```
geojson の simplestyle （Google Maps 実装）

こんにちは。
geojson の [simplestyle](https://github.com/mapbox/simplestyle-spec)（[geojson のスタイル指定](http://qiita.com/kkdd/items/46906cb1110488828d9e)）の Google Maps 実装（JavaScript ）を作ってみました[^1]。

下記はこれを使った表示例です。この [geojsonデータ](https://github.com/nationalparkservice/npmap.js/blob/master/examples/data/simplestyle.geojson)[^2] を使用しました。
![geojson.jpeg](https://qiita-image-store.s3.amazonaws.com/0/54617/12898511-8211-38b0-cf77-10c237e06c7e.jpeg)

```js
var styleDefaultMarker = {
	symbol: '',
	color: '#7e7e7e',
	size: 'medium'
};
var anchors = {'medium': -30, 'small': -20, 'large': -40};
var styleDefault = {
	title: "",
	description: "",
	icon: markerImage(styleDefaultMarker),
	strokeColor:  "#555555",
	strokeOpacity:  1.0,
	strokeWeight:  2,
	fillColor:  "#555555",
	fillOpacity:    0.6,
//	draggable: true,
//	editable: true,
};
var keyStyle = {
	'title': 'title',
	'description': 'description',
	'stroke': 'strokeColor',
	'stroke-opacity': 'strokeOpacity',
	'stroke-width': 'strokeWeight',
	'fill': 'fillColor',
	'fill-opacity': 'fillOpacity'
};

function markerImage(properties) {
    for (var k in styleDefaultMarker) {
        if (properties[k] === undefined) {properties[k] = styleDefaultMarker[k];}
    }
    var siz = properties["size"][0];
    if (properties["symbol"] != "") {siz += "-";}
    var pinUrl = 'https://api.tiles.mapbox.com/v3/marker/pin-' + siz + properties["symbol"] + '+' + properties["color"].replace(/^#/,"") + '.png';
	var img = new google.maps.MarkerImage(pinUrl, null, new google.maps.Point(0, anchors[properties["size"]]), null);
	return img;
}

function copyObject(obj){
	var newObj = {};
	for(var i in obj){newObj[i] = obj[i]}
	return newObj;
};

var styleFeature = function(feature) {
	var style = copyObject(styleDefault);
	for (var i in keyStyle){
	   var x = feature.getProperty(i);
	   if (x != undefined) {style[keyStyle[i]] = x;}
	}
	var markerProperties = copyObject(styleDefaultMarker);
	for (var k in markerProperties) {
	    markerProperties[k] = feature.getProperty("marker-" + k);
	}
	if (markerProperties["symbol"]) {style['icon'] = markerImage(markerProperties);}
	return style;
}

var map;
function init() {
	map = new google.maps.Map(...);
	map.data.setStyle(styleFeature);
//	map.data.setControls(['Point', 'LineString', 'Polygon']);
}

function loadGeoJson(geojsonData) {
    map.data.addGeoJson(geojsonData);
}
```
-------
[^1]: なお本当はマーカーの ```style``` 指定に関して、simplestyle として正しいことのチェックを加えるべきだと思っています（参考：[Leaflet.MakiMarkers](https://github.com/jseppi/Leaflet.MakiMarkers) ）。

[^2]: このデータは "[Diffable, more customizable maps](https://github.com/blog/1772-diffable-more-customizable-maps)"（Github の blog）でも表示例に使われています。しかしこの [Github での表示](https://github.com/nationalparkservice/npmap.js/blob/master/examples/data/simplestyle.geojson)の実装は [specification](https://github.com/mapbox/simplestyle-spec) に忠実ではないです（色など）。
CSV/TSVにクエリを適用する `q` を使う

# q とは何か

https://github.com/harelba/q

ググラビリティが非常に低そうですが、有用度は非常に高いツールです。
CSV/TSVに対してSQL(like)なクエリを発行できます。

# 導入する
## OSXでの導入方法

(私の使っている)OSXではhomebrewで導入できます。

```
brew install q
```

## その他のOSの場合の導入方法

[公式ページのインストール手順](http://harelba.github.io/q/install.html)を確認して下さい。

# 使う
## データを準備する

UTF-8であれば対応しているようですので、郵便番号CSVをダウンロードしてUTF-8へ変換します。

```
curl -vs http://www.post.japanpost.jp/zipcode/dl/oogaki/zip/ken_all.zip 2>/dev/null\
 | tar -xvf- -O - 2>/dev/null\
 | nkf -w > ken_all.csv
```

## クエリを発行する
### 郵便番号が最も多い都道府県はどこか

```
q -d',' "select count(c7) as c,c7 from ken_all.csv group by c7 order by c desc"|head -n 10
```
```
8245,北海道
7525,愛知県
6672,京都府
5435,新潟県
5217,兵庫県
3934,福島県
3843,大阪府
3808,東京都
3588,千葉県
3368,岐阜県
```

### 郵便番号が最も多い市区町村はどこか

```
q -d',' "select count(c7||c8) as c,c7||c8 as ct from utf-8.csv group by ct order by c desc"|head -n 10
```
```
1147,富山県富山市
836,岐阜県岐阜市
775,東京都港区
753,新潟県上越市
696,東京都新宿区
660,京都府京都市上京区
630,京都府京都市伏見区
601,京都府京都市下京区
582,新潟県長岡市
557,京都府京都市中京区
```

# ToDo

JOINが使えるのですが、使えるネタを見つけていません…。
powが使えなくて詰まる(解決編）・・・、が解決してなかった問題

## powが使えなくて詰まる(解決編）・・・、が解決してなかった問題

ポートに20559を指定しないとまた動かなくなりました・・・。
再インストールして色々と確認です。

```
$ launchctl list | grep -i pow
PID    status   Label
407    	0    	cx.pow.powd
-     	0    	com.apple.powerchime
```

cx.pow.firewallのデーモンが動いてないみたい、
っと思いきやどうやらデーモンにも種類があるようです。
[参考サイト](http://d.hatena.ne.jp/kanonji/20100621/1277075926)

`launchctl list`コマンドででてくるものはroot権限を必要としないもので、
root権限で動いているデーモン達をみたければ`sudo launchctl list`コマンドで見られるようです。

```
$ sudo launchctl list　| grep -i pow
PID    status   Label
48	0	com.apple.powerd
-	0	cx.pow.firewall
-	0	com.apple.powerd.swd
```

PIDに番号があるものは起動していて、statusが0なら正常のようです。
`cx.pow.firewall`のPIDがないので動いていないことが確認できました。
[参考サイト](https://monkeying11.wordpress.com/2011/08/10/macports%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

いつもの`powder config`コマンドで確認。

```
dstPort      80
httpPort     20559
dnsPort      20560
timeout      900
workers      2
domains      dev
extDomains
```

ここのdstPortのポート番号は、

```lang:~/.powconfig
export POW_DOMAINS=dev
export POW_DST_PORT=80
```

のファイルで変更できるようです。
なくてもデフォルト値が入るので問題ないです。

最後にcx.pow.firewall.plistデーモンの確認。

/Library/LaunchDaemons/cx.pow.firewall.plist

```lang:cx.pow.firewall.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>cx.pow.firewall</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/sh</string>
                <string>-c</string>
                <string>
                  sysctl -w net.inet.ip.forwarding=1;
                  echo "rdr pass proto tcp from any to any port {80,20559} -> 127.0.0.1 port 20559" | pfctl -a "com.apple/250.PowFirewall" -Ef -
                </string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>UserName</key>
        <string>root</string>
</dict>
</plist>
```

`"rdr pass proto tcp from any to any port {80,20559} -> 127.0.0.1 port 20559"`
ここはdstPortと同じポートを指していれば大丈夫っぽいです。

## `cx.pow.firewall`デーモンを起こす

[参考サイト](http://www.maruko2.com/mw/LaunchDaemons_(launchctl,_launchd.plist)_%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)


> launchctl の使用例
OS ブート時に launchd が load しているジョブは、root 権限で操作する必要がある。
LaunchDaemon の起動方法
launchctl コマンドで launchd.plist ファイルをロードする。
load, unload するときは launchd.plist の指定をファイルパス（フルパス）で行う必要がある。

ここに当てはまると思うので、
`$ sudo launchctl load /Library/LaunchDaemons/cx.pow.firewall.plist`
を実行。

`/Library/LaunchDaemons/cx.pow.firewall.plist: Operation already in progress`
ん〜、もう動いてるよ的な意味？ですかね。
再度確認。

```
$ sudo launchctl list　| grep -i pow
PID    status   Label
48	0	com.apple.powerd
-	0	cx.pow.firewall
-	0	com.apple.powerd.swd
```

PIDが付いてないので準備はできていても、動いてないっぽいですね。
`powder open`してもポート20559をつけないと動かず・・・。

ちょっと時間切れになってしまったので、
launchctlコマンドについて次は調べたいと思います。
テキスト中のタグで画面遷移する実装に使える「ClickableSpan」のデザインを調整する

Instagram、Twitterなどでは、「#」から始まるテキストがハッシュタグとして扱われます。
タグの部分は色が変わり、画面遷移することができるようになっています。

今回これを実装するのですが、デフォルトのスタイルではHTMLの`<a>`のデフォルトスタイルのように青色、下線が入ってしまいます。

以下では、このClickableSpanのデザインを、自分の意図したものへ変える方法を紹介します。

# やりがちな実装

ハッシュタグや、メンションの実装の何がすごいかといえば、
クリックできるテキストが、ひとつのTextViewに、複数入っているところにあります。
一般的には、

```java
TextView textView;

textView = (TextView) findViewById(R.id.text);
textView.setOnClickListener(this);
```

とかやるもんだから、TextView全体にリスナーがついちゃいます。
一つ一つの文字列に対してonClickListenerをつけるなんて考えません。
……でも、Instaはできている。

# ClickableSpanの実装例

簡単です。**SpannableStringBuilder** ([Reference](http://developer.android.com/reference/android/text/SpannableStringBuilder.html)) を使いますよ！
以下、実装例です。ちょっと長いけど、簡単なはず。

```java
// まずはSpannableStringBuilderを用意します
// これに、テキストをappendしながら、ClickableSpanをくっつけていきます
SpannableStringBuilder builder = new SpannableStringBuilder();

// 流れとしては、文字をappendして、その範囲にSpanをsetするを繰り返す感じです
// 大事なのは、setSpan(Object what, int start, int end, int flags)です。
builder.append("#ハッシュタグ");
builder.setSpan(new ClickableSpan() {
    // テキストをタップした時に実行するonClick
    @Override
    public void onClick(View widget) {
        // 画面遷移などの処理
        context.getApplicationContext();
        Intent intent = new Intent(context, NextActivty.class);
        context.startActivity(intentOtherUserProfile);
    }

    // 見た目のデザインを調整するupdateDrawState
    @Override
    public void updateDrawState(TextPaint ds) {
        // 色と下線を変更
        ds.setColor(getContext().getResources().getColor(R.color.gray));
        ds.setUnderlineText(false);
    },
    0, "#ハッシュタグ".length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 最後に変更するindexを指定します
// 一番最後の引数では、指定したindexを選択範囲に含めるか含めないかなどを設定しています

builder.append("後ろに続くコメント");

// 通常通り、textViewにセット
textView.setText(builder);

// これを忘れない。リンクなどで画面遷移するよ宣言
textView.setMovementMethod(LinkMovementMethod.getInstance());
```

# 勝手についてしまう「下線」「色」を変えるには

上の実装例にもあったように、**updateDrawState**をオーバーライドします。
TextPaintに対して、Textの様々な見た目を設定してあげることでデザインを変更します。
下線がつかないだけで、ずいぶんとスマートになりますよ！

参考：
[ひきだしのナカミ Android - ClickableSpanのアンダーラインを消す](http://kabagaeru.blogspot.jp/2014/03/android-clickablespan.html)
[Y.A.Mの雑記帳 Android Spannable を使って文字列の一部を装飾する](http://y-anz-m.blogspot.jp/2011/08/androidspannable.html)
Electron アプリのウィンドウサイズ＆ポジションを復元する

Chrome はウィンドウを閉じた時のサイズとポジションを覚えてくれているので Electron でもそういう API があると期待したけれど，[無かった](https://github.com/atom/electron/issues/526) ので自前実装したメモ．

アプリが終了する時にファイルに書き出す．ファイルはユーザデータのディレクトリあたりに適当な名前で保存する．

```javascript
var info_path = path.join(app.getPath("userData"), "bounds-info.json");
```

ウィンドウを作成する際に保存された情報を読みに行き，あればそれを使うようにする．

```javascript
var bounds_info;
try {
    bounds_info = JSON.parse(fs.readFileSync(info_path, 'utf8'));
}
catch(e) {
    bounds_info = {width: 800, height: 1000};  // デフォルトバリュー
}

mainWindow = new BrowserWindow(bounds_info);
```

最後に，ウィンドウを閉じる直前にファイルにウィンドウのサイズと位置を保存する．

```javascript
mainWindow.on('close', function() {
    fs.writeFileSync(info_path, JSON.stringify(mainWindow.getBounds()));
});
```

書き込むのはウィンドウを閉じる直前のイベントである `close` であり，`closed` ではないことに注意．
Electronと...仲良くなりたい... 本当に簡単な最初のことはじめ!!!

##Electronまとめ
最近のキラーGUIアプリはこれで作られてる事が多いですよね！
GitHub社謹製エディタAtomや、チャットツールのSlack(弊社も本当にお世話になっております)
あとKobitoもそうだったかな？？？

## **特徴**

 * OSSであり、誰でも利用可能
 * HTML/CSS/jsなどのフロント言語のみでGUIの制作が可能
 * クロスプラットフォーム(ChromeがどのPCでも動くのと同様にChromiumがベースに作られている)

##ファイル構成
- main.js
- package.json
- index.html

※Electron node.js npmはinstall済みという想定で進めさせて頂きます...!

最低限起動に必要なのはこの３つのみです


## 基本的なコード

自分はまだnode.jsすらいまいちわかりません！(ごめんなさい
まちがった情報が含まれている可能性がありますので、適時まさかりを投げてくださると助かります。

**<i class="fa fa-code"></i>設定ファイルです**

```json:package.json
{
  "name": "FirstApp",
  "version": "0.1.0",
  "main": "main.js"
}
```

**<i class="fa fa-code"></i>Electronの本体スクリプトですね**

```js:main.js
var app = require('app');
var BrowserWindow = require('browser-window');
var mainWindow = null;

//***クラッシュレポート***///
require('crash-reporter').start();

//***全てのウィンドウ閉じた時の処理を定義 要するに×ボタン押したとき***///
app.on('window-all-closed', function() {
	app.quit();
});

//アプリケーションの初期化が完了したら呼び出される
app.on('ready', function() {
	// メインウィンドーを作成します
	// ここでは幅800,縦400のウィンドーが作るインスタンス生成になります
	// ウィンドウオブジェクトを操るには今後、mainWindow変数にアクセスすることになります
	mainWindow = new BrowserWindow({width: 800, height: 400});
	// メインウインドーに表示するURLを指定
	// ここにあなたのブログのURLを入れてみて下さい。表示されますよ！！！
	// __dirnameには現在実行中のファイルディレクトリパスが格納される
	mainWindow.loadUrl('file://' + __dirname + '/index.html');
	//メインウインドウが閉じられたときの処理
	mainWindow.on('closed', function() {
		//　終了するときはmainWindow変数を初期化する
		mainWindow = null;
	});
});
```
**<i class="fa fa-code"></i>起動時にトップに表示したいHTMLです**

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <script>
      alert('momozono coming!');
    </script>
  </head>
  <body>
    <h2>So Sleepy!!!!</h2>
  </body>
</html>
```

## 起動
![image](https://qiita-image-store.s3.amazonaws.com/0/80075/5143ed29-e596-3c10-2f56-c4dce8977946.png)
electronをカレントディレクトリで起動します。(npm, node.jsのinstallは割愛させて頂きます)

![image](https://qiita-image-store.s3.amazonaws.com/0/80075/ddc16de0-3233-d080-4a8a-194c31baf110.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/80075/a9eb331d-eb0f-0bce-08fd-57396a568f1d.png)

ちゃんとトップに意図したHTMLが表示されましたね。
現在広く用いられているGUIに使用されている技術ですので、もう少し独自のメソッドとかも把握して簡単なアプリケーションが作れるといいですね！

チュートリアルは公式Docに落ちてるので、そこを参照するのが一番いいかもしれません！
https://github.com/atom/electron

ではでは！

## 参照
http://blog.asial.co.jp/934
http://ics-web.jp/lab/archives/8401
関数プログラミングを速習するための作業メモ

『関数プログラミング実践入門』を利用する。
第0章とか1章など不要、2章から忘れそうなところ、特に文法だけ羅列する。

###注意ポイント
- 変数はletで束縛しないと利用できない

```hs
let one = 1
```

- 無名関数（ラムダ式）の宣言の例

```hs
\x -> x * 2
```

-第二引数なんてない（厳密には）

なぜなら、「関数が第一級の対象」だから。




- 

#### ラムダ式
```hs
->
```
もうICS以上でいいよね？

Android開発を進める上では、どのバージョンで動作するかを決める必要があります。もちろん、古いバージョンを指定することもできるのですが、個人の感覚としては新規開発に当たってAndroid 4.0（Ice Cream Sandwich、API 14）以上を指定するのがいいのではないかと思います。

# 実機検証は必須…でも、できますか？
Androidアプリを作る上で欠かせないのは実機での検証です。とりわけ、Android 2系列の機種ではAPIの問題に加え、性能面でも現代の端末に比べて劣っているので、（よほど軽くて画面もシンプルなアプリを作るのでなければ）実機での動作感を確認することも必要です。

ただ、今更Android 2系列の端末を普段使いしている人もほぼいないでしょうし、改めて手に入れるというのも面倒な話です。過去に使って眠っている端末があるならともかく、実機テストを始める前の時点でハードルとなります。

# 右肩下がりのシェア
[Google Playの入れてある端末での集計](http://developer.android.com/about/dashboards/index.html)では、2015年8月時点でAndroid 4.0以上が95%を占めています。当然ながら、Android 6 (Marshmallow)まで出ている現在、古いバージョンのシェアは下がる一方です。2系列までサポートすることで増加する工程と、それで得られるユーザー数を天秤にかけて、果たしてサポートによるメリットはどの程度なのか、微妙なラインです。

# 新機能はどうする？
もちろん、最低バージョンを下げたままでも、最近のAndroid用APIを呼べないわけではありません。とはいえ、存在しないものを呼んでしまえば当然クラッシュしますので、以下の2つのどちらかで対応する必要があります。

* バージョンごとに切り分けて、対応するバージョンでだけコードを実行する
* サポート用ライブラリを入れる

このように、考えるべきことは増えてしまいます。
phpのpreg_matchで特定の文字列のあとの何かを抜き出す


こんばんわ。
いっつも同じことをやろうとして、結局わからずググって、結果・・preg_matchが出てきて、とりあえずコピペでやり過ごしてきました。

でも！もうこんな繰り返しは嫌！時間の無駄！
ということで、実際の例題を使って、私がやってきた思考と共に理解を深めていこうと思います。



## さっそく例題

まずは↓のようなURLを使ってみましょう。

```
http://example.com?name=riki&page=30&count=100
```

(問題)この中から、nameパラメータの値と、countパラメータの値を抜き出してください(preg_match)を使って。

## まずはnameから抜き出してみる

私: nameパラメータは`name=****`ってなってるから、`name=`のあとの文字列を抜き出せればなんとかなりそうだよな・・
私： 確か文字列は`\w`だった気が・・じゃあこんなかんじかな？

```php
<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=\w/', $str, $match);

var_dump($match);
```

```php:結果
array(1) {
  [0]=>
  string(6) "name=r"
}
```

私： おぅ・・・そうじゃないんだよな、、`name=`は欲しくないし、パラメータの値は1文字じゃなくて、次の&までほしいんだ
私： (ググる・・)なるほど。`()`で囲うとグルーピング出来て、そのグルーピングの中で一致したものを返してくれるのね！
私： あと、値が最初の1文字しか出ないのは、`\w`で1文字しか指定してないからかーじゃあ、`1文字以上の繰り返し(+)`を使ってみよう

いざ！！！

```php
<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(\w+)/', $str, $match);

var_dump($match);
```

```php:結果
array(2) {
  [0]=>
  string(9) "name=riki"
  [1]=>
  string(4) "riki"
}
```

おー期待どおり`$match[1]`にnameの値が取得出来たぞ！

## 第二回戦、countパラメータも抜き出してみる

私： 次は、countパラメータかーこれは、`&count=`に続く数字を抜き出せば行けそうや。nameの時のを応用して・・・っと

```php
<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(\w+)&count=(\d+)/', $str, $match);

var_dump($match);
```

```php:結果
array(0) {
}
```

私： え・・・nameすら一致しなくなった・・・
私： あーこれだと、`name=xxxxcount=100`とかじゃないと一致しないか。
私： 実際には、name=xxxとcount=100の間には何かしらの文字列が続いてるので・・これを実現するために、`.*`何かの文字列の0回以上の繰り返しを使ってみるか

いざ！

```php
<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(\w+).*&count=(\d+)/', $str, $match);

var_dump($match);
```

```php:結果
array(3) {
  [0]=>
  string(27) "name=riki&page=30&count=100"
  [1]=>
  string(4) "riki"
  [2]=>
  string(3) "100"
}
```

私： っしゃあ！！

私： でもあれだな・・$matchのキーが数字なのね。
私： なんかnameパラメータの値は`$match['name']`とか、countは`$match['count']`で取れると嬉しいよな・・
google: `preg_match グループ 一致 名前`で検索やで！
google: [phpのマニュアル](http://php.net/manual/ja/function.preg-match.php)に、名前つきサブパターンってのがあったで！
私： OK！ぐーぐる！
私： なるほど・・`(?P<name>\w)`とかって書けば、一致した部分が`$match['name']`で抜け出せるようになるのね。
私： (はてな・・P・・小なり・・付けたい名前・・大なり！！で覚えるのだ）

## 名前付きで抜くようにしてみる

```php
<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(?P<name>\w+).*&count=(?P<count>\d+)/', $str, $match);

var_dump($match);

```

```php:結果
array(5) {
  [0]=>
  string(27) "name=riki&page=30&count=100"
  ["name"]=>
  string(4) "riki"
  [1]=>
  string(4) "riki"
  ["count"]=>
  string(3) "100"
  [2]=>
  string(3) "100"
}
```

っしゃー！！出来た！
これで楽勝や！

## まとめ

* 一致する部分を抜き出すには・・
	* `()`で`グルーピング`を使う！
* 一致した配列に名前をつけるには・・
	* 一致させるパターンの前に、`?P<hoge>`で名前をつけるのだ！

## 終わりのことば

いかがでしたでしょうか。
正規表現で一番使われて、かつ単純なパターンだと思うものを紹介してみました。

私はこれを今までよく理解せずに使っていたため、毎回ぐぐるという不毛な作業をして時間を食ってました。。
これを機に正規表現の苦手意識をなくして、バリバリ書けるようになっていきたいと思います！
VirtualBox for Macに入れたWindows 7のVM ImageをWindows 10にアップグレードする方法

##はじめに

MacのVM上で使っているWindows7をWindows10にアップグレードしてみました。今のところWindows7, 8は無料でアップグレードできるみたいです。

私の場合は、ハードがMacBook Airということもあり、Windows10のアップグレード通知には、「CPUがサポートされていません」、「VirtualBox Graphics Adapter for Windows Vista and 7」などがWindows10との互換性が認められないとの表示がでていて通知からのアップグレードはできませんでした。

しかし、Windows10の[ISOイメージ](https://www.microsoft.com/en-us/software-download/windows10ISO)から`setup.exe`を叩くと、Windows10へのアップグレードが可能になりました。

###個人環境

- MacBook Air 11-inch Mid 2013

- Yosemite 10.10.5

- VirtualBox 5.02

- VM : Windows 7 Home Premium SP1 64bit

##VMでのWindows10へのアップグレードの手順


> VirtualBox :
> Menu -> Devices -> Option Drives -> Windows10ISO

> Guest : Windows :
> スタートメニュー -> コンピュータ -> DVD/CDドライブ -> WINDOWS10 -> setup.exe

ただし、`VirtualBox Guest Additions`をインストールしている場合はこれをコントロールパネル、プログラム追加にてアンインストールしておく必要があるかもしれません。

![](https://raw.githubusercontent.com/mba-hack/images/master/windows10-virtualbox-macbookair.png)

##Windows10の感想

Windows7からの移行の身としては、非常に良いです。

微妙に使いづらかった部分が使いやすくなっていたり、動作が早くなったような気がしたりと、良い感じです。

また、Window Managerは、基本的に前から文句はなかったのですが、アイコンがかっこ良くなりました。なんか自分が使ってるLinuxのNumix Themeにそっくりな気がしなくもないのですが、最近のMicrosoftのOSSへの貢献を考えれば、似てようが似てまいが正直どうでもいい。


そして、Windows7のアプリとの互換性はある程度備わっており、ほとんどのアプリがそのまま動作しました。

![](https://raw.githubusercontent.com/mba-hack/images/master/windows10-virtualbox-macbookair-2.png)
ScalaTestを使ってみる1

今日はScalaTestをREPLで使ってみます。

# jarの読み込み

ScalaTestのjarファイルをREPLに読み込みます。:require命令を使います。Scalaのバージョンによっては命令がなかったり、異なる命令だったりするので注意してください。

```
c:\work>scala
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_7
5).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :require scalatest_2.11-2.2.4.jar
Added 'c:\work\scalatest_2.11-2.2.4.jar' to classpath.
```

# 試験クラスの作成

試験クラスを作成します。色々な作り方があるようですが、取り敢えずはFlatSpecを拡張し、Matchersを加えたクラスを作れば良いです。

その前に、必要なものを輸入しておきましょう。

```
scala> import org.scalatest.FlatSpec
import org.scalatest.FlatSpec

scala> import org.scalatest.Matchers
import org.scalatest.Matchers
```

取り敢えずExampleSpecという名称のクラスを作成し、「3は2であるべきである」という試験項目と「3は3であるべきである」という試験項目を追加しました。

```
scala> class ExampleSpec() extends FlatSpec with Matchers {
     | "integer 3" should "equal to 2" in {
     | 3 should equal (2)
     | }
     | it should "equal to 3" in {
     | 3 should equal (3)
     | }
     | }
defined class ExampleSpec
```

# 試験の実行

試験を実行するにはrunを使えば良いです。

その前に、必要なものを輸入しておきましょう。

```
scala> import org.scalatest.run
import org.scalatest.run
```

runの第1引数として前項で作成したExampleSpecクラスの実体を渡します。

```
scala> run(new ExampleSpec())
[32mExampleSpec:[0m
[32minteger 3[0m
[31m- should equal to 2 *** FAILED ***[0m
[31m  3 did not equal 2 (<console>:15)[0m
[32m- should equal to 3[0m
```

文字化けしていますが、試験の実行自体は行われています。
Go言語の自作パッケージに説明をつけてみる　その１

今回もドキュメントを見ながら勉強してみる。

[Effective Go - Commentary](http://golang.org/doc/effective_go.html#commentary)

Go言語では、godocコマンドを使うことで各パッケージの説明を見ることができる。

```
$ godoc fmt
PACKAGE DOCUMENTATION

package fmt
    import "fmt"

    Package fmt implements formatted I/O with functions analogous to C's
    printf and scanf. The format 'verbs' are derived from C's but are
    simpler.


    Printing

    The verbs:

    General:

	%v	the value in a default format
		when printing structs, the plus flag (%+v) adds field names
	%#v	a Go-syntax representation of the value
	%T	a Go-syntax representation of the type of the value
...
```

で、自作パッケージの場合、何もしないと関数の定義など、ソースコードから自動で判別できる情報しか表示されないのだが（それが表示できるだけでも感動だけど）、そこに自分で書いた説明文を追加することができる。

上のfmtパッケージの例で言う以下の部分

> Package fmt implements formatted I/O with functions analogous to C's
printf and scanf. The format 'verbs' are derived from C's but are
simpler.

やり方はとっても簡単。
パッケージ内のファイルのpackage宣言の直前にコメントを入れるだけ。

例えば前回作成したgithub.com/chooyan/mathパッケージに説明を加える場合、

```
$ cd $GOPATH/src/github.com/chooyan/math
$ vi sum.go
```

```
// Package math provides some simple calcuration functions.
// These are sample functions to practice golang.
package math

func Sum(a int, b int) int {
        return a + b
}
```

という感じで記述する。
※ 先頭のコメントとpackage宣言の間にスペースを入れないように注意！

で、確認する。

```
$ godoc github.com/chooyan/math
PACKAGE DOCUMENTATION

package math
    import "github.com/chooyan/math"

    Package math provides some simple calcuration functions. These are
    sample functions to practice golang.

FUNCTIONS

func Abs(i int) int

func Sum(a int, b int) int
```

出た出た。


ちなみにパッケージ内に複数の.goファイルがある場合は、どれか一つに説明が書いてあれば問題ない。

>For multi-file packages, the package comment only needs to be present in one file, and any one will do.

他にも複数行にまたがって出す時は/* */で囲えば良いとか、特定の書き方しておけばgrepが便利だとかいろいろ書いてあるみたいだけど、それはまた別でまとめます。
プログラマの健康を考えるイベント「ヘルシープログラマ!」に行ってきた


ヘルシープログラマの出版を記念した勉強会
http://connpass.com/event/18312/
へ参加してきました。
会場はクックパッドさん。
初めて行ったけど、いいオフィスですね。

# ヘルシープログラマ・翻訳、そして実践 (玉川竜司さん)
スライド: http://www.slideshare.net/dragan10/ss-52077522
O'RELLIYの本を翻訳している方。BigData系の本を数多く翻訳している。
## この本を翻訳しようとした理由
なにか毛色が違う本を翻訳したくてCooking for Geeksとか翻訳したかったけど、他の人が翻訳することに。
念願かなってこの本を翻訳できるように

## 翻訳しようとして、大変だったこと
単語がわからない。お医者さんにも力をかりた

## 実践してみた
・義務感持つと辛いからしんどいときは無理をしない。
・歩く量が増えて起きたこと
--やせた
--風邪引くことがなくなった
--アルコール耐性があがった

### 使ってるデバイス
オムロンのWelness Linkをつかってる。
NFCで転送できる。
計測を継続することが重要

## アジャイルなダイエット
・米の量を減らした
・それほどガチガチにやってはいない

## まとめ
1つの方法にこだわらなくてもいい
プログラマ=不健康というのは思い込み
ジムとかが難行苦行に思う？　ちょっとずつ自分の体が健康になっていくことが嬉しい

# 走って良かった10のこと (井原正博さん)
スライド: https://speakerdeck.com/ihara/zou-tuteliang-katuta10falsekoto

## 走るモチベーション
満員電車に乗りたくない
UTMBに出たい
160km/33hが最長記録

## 長距離ランナーの作り方
スライド参照

## 走って良かった話
1.やせる 
60kgの人が10km走れば600kcal消費できる。
時間は関係なく距離が関係ある
2.体の値が改善する
コレストロースや血圧等々が改善する
ただし、酒を飲む量が増えた。
3.走るとすっきりできる
4.食事が美味しい
5.食べたいものが食べられる
とった分消費すればいいじゃん
6.自由になる
7.世界が広がる
栄養学とか勉強し始めて自炊になる。
酵素ジュースを作ってみるとか野菜育ててみるとか
8.話のネタが増える
160km/33h走ったとかすごいネタ
9.我慢強くなる
走ってる方がつらい
10.まだまだ成長できる
この年でも成長できることがわかる

## まとめ
結局はPDCA回すことが大事

# LT
## 昇降式デスクの全面導入事例(小野和俊さん)
### まとめ
昇降式デスクのメリットは立つ/座るが選べること。スタンディングデスクだけならば強制感があってつらい。
バランスボールは人に合う合わないもあって、だめ。
今回はパーティションありのデスクを導入したけどないのもある。
昇降式でペアプロすると対等な感じがする
コードレビューとかやりやすい。
腰痛対策にはかなり有効

## 体の瞑想を求めて：アレキサンダーテクニークからSSSまで(森正弥さん)
### まとめ
緊張は体の動きを阻害するので脱力が大事

## 糖質とプログラミングと私 (末並晃さん)
### まとめ
スライド: http://www.slideshare.net/asuenami/ss-52074027
やせたければ脂肪をたくさんとりなさい　という本がオススメ
プログラマが糖質制限に向いているのは、
1.しっかりした理論
2.忙しくてもできる
3.アジャイル
足し算ではなく引き算なので何かを始めなくていい。
## 東京から仙台まで歩く方法(川原翔吾さん)
### まとめ
スライド:http://www.slideshare.net/ooharabucyou/ss-52044395
1日で歩き切るのではなく、行ったところまでは交通機関使って戻ってこれる。で実践
杖があると歩ける。あと流せるテイッシュは以外と大事。
食料品とかは自動茶屋（自動販売機）や茶屋(コンビニ）がだいたいどこにでもあるから持ち歩かない
1日デジタル機器離れできるから脳と目がすっきりできる。

## You're what you eat ~ 食事を自分に最適化する ~ (関口隆介さん)
### まとめ
スライド:http://www.slideshare.net/ryusukesekiguchi/you-are-what-you-eat-for-healthy-programmer-52051869
絶対的に体にいいものはないし悪いものもない。
食物繊維を意識してとるといい。エナジードリンクとかで血糖値を無理やりあげるとそのときはパフォーマンスがあがるけどそのあとはつらい。
野菜やきのこを意識してとるといい。
1食に一品、1日で2品程度増やせば良さそう
腹8分目に食べる
サラダ→スーツ→メイン→主食でたべると満腹感がでる。
ただ、いろいと考えるとめんどくさくて毎日やらなくなるのでできることから習慣化してくといい。
レースコンディションによりRecordInvalidを抜けてRecordNotUniqueを引いてしまうときの対処

凄くシンプルに以下のようなコントローラとモデルがあるとする。

```users_controller.rb
class UsersController < ApplicationController
  def create
    render json: User.create!(user_params).to_json, status: 201
  end

  def user_params
    params.permit(:name)
  end
end
```

```user.rb
class User < ActiveRecord::Base
  validates name,
    presence: true,
    uniqueness: { :case_sensitive => false }
end
```

`/users`へ同じ`name`パラメータでかつ同時POSTされたりすると、タイミングによっては`uniqueness`バリデーションを抜けられることがある。
DBのテーブル定義で`name`カラムに`unique`インデックスを張っていれば、`ActiveRecord::RecordNotUnique`がraiseされる。

エラーハンドラーが`ActiveRecord::RecordInvalid`を補足していて、モデルの`#errors.messages`などをパラメータエラーのヒントとして返すようにしていても台無しになってしまう。
このケースでは再度バリデーションを通して`ActiveRecord::RecordInvalid`をraiseさせたい。

## コントローラの処理をリトライする

```application_controller.rb
class ApplicationController < ActionController::Base
  # counter: リトライする回数
  # exception: リトライする例外
  def retry_action(counter = 1, exception = StandardError)
    yield
  rescue exception => e
    retry if (counter -= 1) >= 0
    raise e
  end

  def retry_from_record_not_unique
    retry_action(1, ActiveRecord::RecordNotUnique) do
      yield
    end
  end
end
```

```users_controller.rb
class UsersController < ApplicationController
  around_action :retry_from_record_not_unique, only: :create

  def create
    render json: User.create!(user_params).to_json, status: 201
  end

  def user_params
    params.permit(:name)
  end
end
```

リトライ回数と補足する例外を抽象化した`retry_action`を定義し、リトライさせたい例外のコールバック用メソッド`retry_from_record_not_unique`を作り、`around_action`により対象のアクションをブロックで渡す。

こうするとレースコンディションにより、バリデーションを抜けて`ActiveRecord::RecordNotUnique`がraiseされても、再処理によって`uniqueness`でバリデーションエラーが起こり`ActiveRecord::RecordInvalid`がraiseされる。

参考: http://stackoverflow.com/questions/9020648/handle-timeouterror-with-retry

アクションに`rescue`はやすほうが、シンプルでわかりやすい気もする。。

```users_controller.rb
class UsersController < ApplicationController
  def create
    render json: User.create!(user_params).to_json, status: 201
  rescue ActiveRecord::RecordNotUnique => e
    counter ||= 1
    retry if (counter -= 1) >= 0
    raise e
  end

  def user_params
    params.permit(:name)
  end
end
```

こういうのデバッグするのが難しくて、いい方法があったら知りたい。
ちなみに今回はUserモデルのバリデーション後にディレイを入れてデバッグしてた。。

```user.rb
class User < ActiveRecord::Base
  validates name,
    presence: true,
    uniqueness: { :case_sensitive => false }

  after_validation { sleep 3 }
end
```
Rubyで返り値無しのメソッドはどう書くのが良いのか調べた(が結論は出なかった)

自分を含めRubyに不慣れなひと数人でRubyで書かれたコードのレビューをしていたときに、「rubyって最終行の評価結果が返り値になるから、返り値不要のメソッドの場合、どう書くのが良いのか知りたさある」という発言が出たのが発端となり、ググって分かる程度のことをまとめた。

#空のreturnを書く派閥
##【return絶対書くよ派】
- 返り値不要なら、空のreturnを明示する
- ”最後に評価された値を返す”という言語仕様が気持ち悪いので、そもそも全てのメソッドでreturnを書く

##【空のreturnだけ書くよ派】
- 返り値不要なら、空のreturnを明示する
- ”最後に評価された値を返す”という言語仕様なので、返り値がある場合はそれに従って値を返す

#return書かない派閥
##【return書くとちょっと遅いよ派(旧世代のパフォーマンス重視派)】
- ver1.8まではそうだったが、ver1.9からはそんなことない(らしい)
 - ここを読んだ：http://d.hatena.ne.jp/nagachika/20110423/ruby_return_performance

##【返り値があってもメソッドを呼ぶ側で扱わないから問題ない派】
- 「最後に評価された値が返ってしまうことで困ったことはない」
- 「なんか普通に何が返るべきかーって考えてコードかけば困らなそう、呼び出すところでもこういう値が返ってくるだろうなって期待するところでは返り値を変数にいれるなりするだろうしそうでなければ呼ぶだけだよね」
 - 上記どちらも友人S氏の発言。

##【return絶対要らない派】
- 「Ruby ではメソッドの最後の return は使っても使わなくても全く同じ 意味に書ける。よってこれは全部省略する。理由は、まず簡潔さ。それから「Ruby ではすべての式が値を持つ」と いう基本思想を適切に表現するからである。if も while もイテレータ もメソッドも同様に値を持つ。ならば書式も全部同じにするのが適切で ある。あらゆる式の記述の中にオブジェクトの流れを見るのだ」
 - 引用元：http://i.loveruby.net/ja/ruby/codingstyle.html

#その他の派閥
##【コーディングルール決めてね派】
- どう書くか迷うものがあれば、コーディングルールを決めて統一するべき
- RubyのコーディングルールといえばCookpad社のそれだが、返り値無しのメソッドについての言及は見つからなかった
 - https://github.com/cookpad/styleguide/blob/master/ruby.ja.md
- (ほかのRubyコーディングルールは調べていない)

#所感
メソッドの返り値の型を指定するJavaやScalaからRubyに移った人や、return必須なPythonなどからRubyに移った人だと、メソッドがなにを返すのか自分の手で明示するのが当然という考えのため、「返り値不要のメソッドの場合、どう書くのが良いのか知りたさある」という気持ちになると思われる。

しかしながらRuby(や同様の言語仕様なPerl)に熟達した人だと、実際にそのメソッドがなんらかの返り値を返していたとしても、返り値不要のメソッドなら呼ぶだけなのだから問題ないという考えに至ると思われる。

余談ですが、
「(Pythonに慣れているせいで)retrun必須なほうが気持ちいいです...」
と言ったところ、Rubyistの友人から
「まだRuby脳になりきれていないようだな」
と返されました。その通りだと思うのでRubyはRubyらしく書けるように精進したいです。
unity > macApp > InputFieldで日本語入力ができない > InputField > Inspector View > Line Type > Multi Line NewLineにする

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

androidでは問題なかったが、MacOS X上で動作させた時にInput Fieldの日本語入力がうまく動かない（漢字変換時のEnter入力で入力が終わってしまう）症状があった。

以下を参考に訂正した。
http://chnr.hatenablog.com/entry/2015/03/06/011559

> InputField の Inspector View に Line Type がある。
これを Multi Line Newline にする。
これだけ。
Railsのデバッグを助けるgems

## 引用元

[#402 Better Errors & RailsPanel - RailsCasts](http://railscasts.com/episodes/402-better-errors-railspanel?view=asciicast)

- Better Errors
- RailsPanel

超有名gemなので今更感ですが、エディタの設定でコードに飛べるところと、Ajax 時の Better Errors の見方を知らなくて「おお！」と思ったので、メモ。

参考：[Gems - すべてのRailsプロジェクトでいれておくべき7つの開発用Gem - Qiita](http://qiita.com/icb54615/items/374f76b38f673fab7744)

## BetterErrors

### BetterErrors エディタの設定

エディタ設定してあれば、エラー画面の赤四角で囲ったファイルパスのリンクをクリックで、該当のコードを開いてくれる。

![better-errors-editor.png](https://qiita-image-store.s3.amazonaws.com/0/5691/1049e920-3a7c-e96d-a02b-82e9811d9bf0.png)



#### 設定方法

MacVim の場合の例

```/config/initializers/better_errors.rb
BetterErrors.editor = :macvim if defined? BetterErrors
```

RailsCastsの文字起こしページからもリンクがあったけど、さすがに古いからかリンク切れだったので、張ってみた。

[Method: BetterErrors.editor= — Documentation for charliesome/better_errors (master)](http://www.rubydoc.info/github/charliesome/better_errors/master/BetterErrors.editor=)

##### 使えるエディタ名を表すシンボル

- :textmate, :txmt, :tm
- :sublime, :subl, :st
- :macvim

### AJAX request でも better_errors できる

ブラウザのパスで

```
http://localhost:3000/__better_errors
```

とすると、最後のエラー画面を表示してくれる。
最後のエラーがAjax Request時に発生したエラーでも表示してくれる。
コレ便利！


## RailsPanel

Chrome拡張

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/8c815618-91f1-5c45-dc49-221936f9b040.png)

インストールするとChromeのDeveloper Console部分に [Rails] ボタンが出てくる。

呼ばれたController#Actionとかが表示されて、とても便利。

### gemの追加

このChrome拡張する場合は以下のgemを追加する必要がある。

```rb
group :development do
 gem 'meta_request'
end
```

### エディタ設定

こちらも、エディタ設定を加えると、なんとファイル名クリックで該当のソースコードを開いてくれる。
BetterErrorsは前後のソースコードある程度見えてるから、こっちのエディタショートカットの方が嬉しい感倍増な気がする。

![RailsPanel_editor.png](https://qiita-image-store.s3.amazonaws.com/0/5691/e7d0068f-bd44-1978-fc8a-db465eac1e4e.png)

Chrome拡張の設定なので、おなじみの「設定｣→「拡張機能」からRailsPanelを選ぶ。
「オプション」リンクからエディタの設定ができる。

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/8cdc843b-b9c1-931a-80d5-d2762a930ee3.png)

RubyMineもある・・！
npmのモジュールを自分でforkした版のやつに差し替える

例として、npmの公式tupai.jsの代わりに自分専用のバージョンを使いたいとします。

# Github上のモジュールを指定する

forkして作ったオレオレ版をGithubなどに置いておきます。
https://github.com/DQNEO/tupai.js/tree/dev

プロジェクトルートのpackage.jsonで、上記レポジトリとブランチを参照するように修正します。

```package.json
{
    "name": "myproject",
    "dependencies": {
        "tupaijs" : "git+https://github.com/deyunanhai/tupai.js.git#master"
    }
}
```

これで`npm install`すれば `./node_modules/`の下にオレオレ版がインストールされます。

`#master`のところは任意のブランチ名やタグ名、コミットハッシュ値を指定することができます。

# ハマりポイント

`https://github.com/...` のような https URLは使えないようです。代わりに `git+https://` と書きましょう。


# ローカルのモジュールを指定する


公式マニュアルに詳しく書いてあるのでご参照ください。

http://liberty-technology.biz/PublicItems/npm/package.json.html
windowsでできていたショートカットをmacでもやりたくて調べ回る

##画面をロックする方法
|windows|mac|
|:---|:---|
|windows + L|shift + ctrl + 電源キー|

##文頭に移動
|windows|mac|
|:---|:---|
|home|ctrl + A|

##文末に移動
|windows|mac|
|:---|:---|
|end|ctrl + E|

##Google Chrome で普通のリロード
|windows|mac|
|:---|:---|
|F5|command + R|

##Google Chrome でスーパーリロード
|windows|mac|
|:---|:---|
|ctrl + F5|command + shift + R|

##Google Chrome で要素の認証
|windows|mac|
|:---|:---|
|F12|opt + command + I|

##バックスラッシュを出す
|windows|mac|
|:---|:---|
|¥|alt + ¥|

## windowsキーのコマンドでアクティブの画面をセカンドディスプレイに移動できたじゃん　あれをmacでもやりたい
Spectacleとshiftitの併せて技で無理矢理解決
http://qiita.com/nnmr/private/39907bd4f940dab95b97

## Windowsみたいにひらがな入れてから「F7」キーでカタカナとかにしたい つまりファンクションキーを使えるようにしたい
環境設定 → キーボード
「F1,F2などのすべてのキーを標準のファンクションキーとして使用」にチェックを入れる