OmniAICreator/Qiita-1.07M huggingface dataset:
paper_trail gemをアップデートしたらテストが通らなくなったときはこうしよう


古めの[paper_trail](https://github.com/airblade/paper_trail)を使っている人がGemをアップデートしたときにありがちです。

## 問題

paper_trailを3.0.5以上にアップデートしたら、paper_trailを利用した履歴管理関連のテストが落ちるようにになった。

## 解決方法

テスト実行時に自動的にpaper_trailのバージョニングがオフになるようになったので、spec_helper.rbに以下の行を加え、

```ruby
require 'paper_trail/frameworks/rspec'
```

履歴関連のテストをしている部分を`with_versioning`ブロックで囲むか、

```ruby
describe '#hoge' do 
  with_versioning do 
    describe 'versioning test'
  end
end
```

テストに`versioning: true`をつけると履歴管理が有効になります。

```ruby
describe '#hoge', versioning: true do 
  describe 'versioning test'
end
```
SwiftのExtensionを使って、ArrayとNSMutableArrayのランダムソートメソッドを作ってみた


Extension専用のファイルを適当に作ります。
そして、その中にメソッドを作ります。

```Extension.swift
//
//  Extension.swift
//  TinderStyleApp
//
//  Created by kiiita on 2014/09/06.
//  Copyright (c) 2014年 kiiita. All rights reserved.
//

import Foundation

extension Array {
    mutating func shuffle(count: Int) {
        for _ in 0..<count {
            sort { (_,_) in arc4random() < arc4random() }
        }
    }
}

extension NSMutableArray {
    func shuffle(count: Int) {
        for i in 0..<count {
            var nElements: Int = count - i
            var n: Int = Int(arc4random_uniform(UInt32(nElements))) + i
            self.exchangeObjectAtIndex(i, withObjectAtIndex: n)
        }
    }

}
```

あとは使いたい部分で呼び出すだけです。
正しく動いていれば、補完で出てきます。

```VC.swift
var exampleArray: NSMutableArray = NSMutableArray()

override func viewDidLoad() {
	super.viewDidLoad()

	exampleArray = ["hoge", "huga", "piyo"]
	exampleArray.shuffle(exampleArray.count)
	
}
Goで一定周期で何かを行う方法

Goでは言語組み込みの並行処理のサポートがあるから、一定の周期で何らかの処理を行うのは簡単だ。その処理のためのgoroutineを作って、それを一定の間隔で目覚させて実際の処理を行わせるようにすれば良い。

## Sleep

一番簡単な方法は無限ループを回して、ループの最後にtime.Sleepで一定時間休むという方法だろう。

```go
go func() {
    for {
        // ここでなにかを行う
        time.Sleep(3 * time.Second) // 3秒休む
    }
}()
```

この方法は手っ取り早いけど、Sleepを途中で中断することはできない。たとえばこのgoroutineがいらなくなったときにそれをチャネルで通知してgoroutineを終了させるとか、あるいは早めに目覚めさせてループの先頭に復帰させるとか、そういったことはSleepが返ってくるまで行うことができない。

## Ticker

「多重化できない」問題はだいたいチャネルで抽象化すればうまく扱うことができる。

この場合、time.Tickerを使うともっと柔軟にループを回すことができる。time.Tickerはランタイムのグローバルなタイマーに関連付けられる値で、ランタイムからTickerの中のチャネルに一定周期で値が送られるようになっている。チャネル経由でクロックが送られてくるので、select文を使って他のチャネルとクロックとを同時に待つことが可能になっている。

```go
go func() {
    t := time.NewTicker(3 * time.Second) // 3秒おきに通知
    for {
        select {
        case <-t.C:
            // 3秒経過した。ここで何かを行う。
        }
    }
    t.Stop() // タイマを止める。
}()
```

select文のなかにcase節を足すことによってクロック待ち以外に処理を分岐させることができる。

最後にTicker.Stopを呼び忘れるとリソースリークが起こるので注意。ランタイムがtの参照を持ち続けているのでtはGCされないし、そうなるとランタイムはtにずっと値を一定周期で送り続けることになるので、それによってプログラムが間違った動作をしたりはしないかもしれないが、無駄が発生することになってしまう。
MEAN stack / Ubuntu を Heroku にデプロイする

### Herokuの準備

Heroku Toolbeltをインストール：

```
$ wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
```

Herokuにログインしてアプリケーションの器を作る：

```
$ heroku login
$ heroku create mean-app
```

### MongoDBをHerokuで使えるようにする

HerokuのアドオンのMongoHQを有効にする：

```
$ heroku addons:add mongohq
```

MongoHQに新しいユーザを追加する：

![heroku05.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/c0b2a768-903f-a442-2dcd-46435752c6a9.jpeg)

![MongoHQ.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/db4efc7d-c4fb-3e3d-6261-27efed81b809.jpeg)

Production環境でMongoHQが使われるようにする：

![MongoHQ2.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/468ea37b-95f5-9d1d-a3d5-f9adb0927085.jpeg)

以下のファイルの該当箇所に貼り付ける：

```js:config/production.js
'use strict';

module.exports = {
    // <user>:<password>を実際のものに置き換える
    db: "mongodb://<user>:<password>@kahana.mongohq.com:10034/app29381220",
  .
  .
  .
}
```

ソースを変更したので、ここでコミットする。

### Herokuにpushする

gruntで動くように以下の一行を実行する：

```
$ heroku config:add BUILDPACK_URL=https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt.git
```

Herokuの環境変数を変える：

```
$ heroku config:add NODE_ENV=production 
```

Herokuにpushする：

```
$ git push heroku master
```

最後にProduction環境にする：

```
$ heroku config:set NODE_ENV=production
```

### おつかれさま！

![mean.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/37294b93-2254-dc73-bd68-bbe238bbb015.jpeg)
AngularJSで$httpの返すPromiseにどのようにsuccess / errorが追加されているか調べてみた

応用可能性の低そうなメモ。

AngularJSの\$httpでは、戻り値のpromiseについて、通常のthenのほかに、success / errorを使うことができます。これはどうしてなのでしょうか？AngularJSのpromiseの隠し仕様で、戻り値の関数名を指定することができるのか、それとも隠しメソッドとして、sucess / errorを持っているのか？などと妄想が膨らんでしまいます。

そこで、AngularJSのコードを読んでみると、大したことはなく、

```js
		promise.success = function(fn) {
			promise.then(function(response) {
				fn(response.data, response.status, response.headers, config);
			});
			return promise;
		};
		promise.error = function(fn) {
			promise.then(null, function(response) {
				fn(response.data, response.status, response.headers, config);
			});
			return promise;
		};
```

上記コードでsuccess, errorが追加されているだけでした。単にthenのシンタックスシュガーというだけでなく、responseオブジェクトを変数に展開する役割を持っていたんですね・・・。となると、これがPromise全般に実装されていないのも納得できます。

さて、これを応用して、promiseではない通常のデータを\$httpと同じ仕様で戻すための変換処理を書くと以下のようになります。\$httpのキャッシング処理を自前で実装するとき（しかも、どうしても\$httpの外側で処理を行いたいとき）に使える方法です。$q.whenというのがまさにこの用途で使われるメソッドなので、そこにsuccess / errorの追加を実装しただけです。

```js
	function httpize(data, status, headers, config){
		var promise = $q.when({
			data: data,
			status: status,
			headers: headers
		})
		promise.success = function(fn) {
			promise.then(function(response) {
				fn(response.data, response.status, response.headers, config);
			});
			return promise;
		};
		promise.error = function(fn) {
			return promise;
		};
		return promise;
	}
	//Demo
	httpize('target data', 200)
		.success(function(data, status){
			console.log(data, status)
		})
```

ちなみに、本来自分がやりたかったことはこちらで、sucess / errorの実装方法を調べたのもこのためでしたが、応用可能性が低そうなので、タイトルは違うものにしてみました。
HTML5 カスタムデータ属性とjQueryを使用したカレント表示

# 仕様
色々なカレント表示方法がありますが、カスタムデータ属性とjQueryを使用した場合の処理です。
カスタムデータに任意で登録できるので、リンク先URL（href属性）とカレント表示させたいURLが異なる場合や、複数ディレクトリが同一カレント表示の場合などに対応させやすいかと思います。
下記サンプルはクラス付与のみなので、cssにてのスタイル調整か画像をロールオーバーさせるスクリプトのカスタマイズ等していただければと思います。


# ソース
■Javascript

    $(function() {
      $('#gnav .target').each(function(){
        var url = $(this).data('link');
        if(location.href.match(url)) {
           $(this).addClass('current');
        } else {
           $(this).removeClass('current');
        }
      });
    });

※jQueryを使用しますので適宜読み込んでください


■HTML

    <nav id="gnav">
      <ul>
        <li><a href="#" class="target" data-link="dir01">nav01</a></li>
        <li><a href="#" class="target" data-link="dir02">nav02</a></li>
        <li><a href="#" class="target" data-link="dir03">nav03</a></li>
        <li><a href="#" class="target" data-link="dir04">nav04</a></li>
      </ul>
    </nav>

※マークアップは適当なのであしからず
[JavaScript] Arrays.forEach内でthisを参照した時に陥った罠

お昼休みにこんにちわ。Qiita初心者なので，こんな投稿でいいのかいささかわかりかねるのですが。。。
Markdown記法の練習をかねて，一発ハマったことを投稿してみます。

# やりたいこと

- オブジェクトのインスタンス後からカスタマイズして関数を加える
- 関数の内容: 配列を引数に取り，その各要素とカスタマイズされるオブジェクトのメンバ変数とを作用させる

# コードで書くとこんな感じ
```javascript:foreach_this.js

var hogeObj = {
	hogeInt:10;
};

var customFunc = function(nums){
	nums.forEach(function(num){
		relation(num, this.hogeInt);
	});
};

hogeObj.customFunc = customFunc;
```

`relation`はたとえば，`function(hoge,piyo){console.log(hoge*piyo);}`とかなわけですが，残念ながらこれはうまく動きませんでした。


# 原因
ひとえに勉強不足… たとえばGoogle JavaScriptスタイルガイドにおけるthis参照の項を見ると，

> オブジェクトのコンストラクタとメソッド、クロージャの作成時にのみ使います。

と，書いてあります。こういうthis参照はやめて，うまいコト(継承とか使って解決できないか？)を考えるべきなのでしょうが，それはそれとして，，，

`Arrays.forEach`は引数が2つあります。

- １つ目は各配列の要素を引数とする関数
- ２つ目は第一引数の関数内で参照されるthisの参照

そして第二引数を省略すると，グローバルオブジェクトが参照されるようになります。
`window.hogeInt` (node.jsなら`global.hogeInt`)が定義されていないので，先ほどのロジックはうまく動きません。

# 解決方法
```javascript:foreach_this_revised.js

var hogeObj = {
	hogeInt:10;
};

var customFunc = function(nums){
	nums.forEach(function(num){
		relation(num, this.hogeInt);
	}, this);
};

hogeObj.customFunc = customFunc;
```

こうやってあげると，とりあえずはうまく動きました！
iOS8でUITableViewのseparatorInsetに値をセットしても上手く行かない場合の対処法


iOS8 beta5で検証。

UITableViewでiOS7から、デフォルトでテーブルの境界線（separator）が左から15pxマージンを取るようになってますが、それを左いっぱいから境界線を引きたい場合は、

```objective-c
self.tableview.separatorInset = UIEdgeInsetsZero;
```

のように設定したり、StoryboardのSeparatorのleftを0に設定しているとします。

iOS8（beta5）はなぜか上記の設定が反映されずに、デフォルトの15pxマージンが取られるようになってしまっていました。

その時の対処法。

```objective-c
- (void) viewDidLoad {
	[...]

	self.tableView.separatorInset = UIEdgeInsetsZero;
	if ([self.tableView respondsToSelector:@selector(layoutMargins)]) {
    	self.tableView.layoutMargins = UIEdgeInsetsZero;
	}
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	[...]

	cell.separatorInset = UIEdgeInsetsZero;
	if ([cell respondsToSelector:@selector(layoutMargins)]) {
    	cell.layoutMargins = UIEdgeInsetsZero;
	}
}
```

こんな感じで、iOS8から追加されたlayoutMaginsというプロパティに設定してあげると、左端から境界線が引かれるようになりました！

---
iOS8の対応、それなりに大変ですね〜。

今日の未明（2014/09/09）にiPhone6発表ありそうですが、特に横幅の変更を考慮した修正を入れていくのが結構大変です。Portrait限定で、横幅320px前提で作っちゃってたりしてると特にしんどいですね。対応しないアプリの場合、iPhone4s→iPhone5のときのように端を黒くしたような対応がされるのかな・・・
Ubuntu14.04 / Vagrant に MEAN stack をインストールする

### MongoDB

```shell-session
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
$ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/10gen.list
$ sudo apt-get update
$ sudo apt-get install mongodb-10gen
```

### curl

```shell-session
$ sudo apt-get install curl
$ sudo apt-get update
```

### Node.js

```shell-session
$ sudo su
# curl -sL https://deb.nodesource.com/setup | bash -
# exit
$ sudo apt-get install nodejs
```

### git

```shell-session
$ sudo apt-get update
$ sudo apt-get install git
```

### Grunt、Bower

```shell-session
$ sudo npm install grunt-cli -g
$ sudo npm install bower -g
```

### MEAN

```
$ sudo npm install -g meanio@latest
$ mean init <myApp>
$ cd <myApp>
$ npm install ←こける（下記）
```

最後の`$ npm install`が`Error: EACCES, mkdir '/home/vagrant/.npm/ms/0.6.2`と言われて書き込めないので、

```
$ sudo chmod 777 /home/vagrant/.npm/*
```

これで無事`$ npm install`できる。（もっと適切な方法があれば、ぜひ教えて下さい）

### アプリケーションを起動する

```
$ grunt
```

これで`http://localhost:3000`でアプリケーションが動いているのを確認できる。

![mean.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/0e048737-e734-b8d7-ce10-993481c1a45e.jpeg)
rails アプリ 準備と構成

#準備
RVM経由でrubyをインストール, `gem install rails` 


# scaffoldを使ってみる
```bash:アプリを作る
$ rails new newapp
$ cd newapp/
# Gemfileを書き換える
$ bundle install
```

```bash:scaffold
$ rails g scaffold blog title:string author:string content:text
$ rake db:migrate
```

```bash:動かす
$ rails s
```

http://localhost:3000/blogs で見ることができます.

#scaffoldを使わずに作る
##model
モデルはデータベースを扱う
例えばblogという名前で,title(string), author(string), content(text)のデータベースを作るときは

```bash:model_blog
$ rails g model blog title:string author:string content:text
```

これで `app/models/blog.rb` `db/migrate/*_create_blogs.rb` `test/models/user_test.rb` が作られる.
作ったら,

```bash
$ rake db:migrate
```

するとデータベースが実際に作られる.

##controller
コントローラーは,ユーザーからの入力に対して

```bash
rails g controller blogs
```

なんかいろいろ作られるけどコントローラーとビューが大切.

`app/controller/users_controller.rb` にメソッドを追加する.メソッドとはこうきたらこうしてね,みたいなこと

blogの一覧を表示するindexを作るときは,こう書く.

```rb:app/controller/users_controller.rb
def index
  @users = User.all
end
```

このメソッドに対するビューは `app/view/users/index.html.erb` になる.

```erb:index.html.erbの一部
<% @users.each do |user| %>
  <p><%= user.title %>
<% end %>
```

これだとリンクないけどね
macで作られたvagrant boxをもらったときに出るネットワークエラーの対処法

#トラブル
macで開発をしている人からvagrantのboxをもらって、それをvagrant upすると、ip addressをふる設定がエラーになる。

vagrantfileに下記のように書いておいて、vagrant upをすると、eth1がどうのとかのエラーが出る。

```
  config.vm.define :drive do |drive|
    drive.vm.box = "drive"
    drive.vm.network :private_network, ip: "192.168.131.131"
  end
```


```
[drive] Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

ARPCHECK=no /sbin/ifup eth1 2> /dev/null

Stdout from the command:

Device eth1 does not seem to be present, delaying initialization.


Stderr from the command:
```

こんな感じのエラーがでて、ifconfigをしてみても、指定したipがふられていない。

# 解決法
一回、sshでvagrantのinstanceにloginする。そして下記を打つ。

```
sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

その後、

```
vagrant reload
```

これで割り振られるようになる。
[Apache]指定した名前以外でのアクセスを制御する

Apacheのバーチャルホストは指定した名前以外でアクセスされた場合、ひとつめに設定したバーチャルホストがデフォルトで使われます。なので自分が管理していないDNSとかで間違って自分のサーバーのIPアドレスを指定されたりするとその名前でアクセスが可能なんですね。
これを回避する方法をメモ。

## 正しいURLにリダイレクトする場合

以下をhttpd.confのはじめのバーチャルホストに書きます。
意図しない名前でのアクセスをすべて自分の管理する hogehoge.com にリダイレクトできます。

```httpd.conf
<VirtualHost *:80>
    ServerName any
    Redirect / http://hogehoge.com/
</VirtualHost>
```


## アクセス禁止にする場合

```httpd.conf
<VirtualHost *:80>
    ServerName any
    <Location />
        Order Deny,Allow
        Deny from all
    </Location>
</VirtualHost>
```

デフォルトのテストページを無効にしておきます

```/etc/httpd/conf.d/welcome.conf
<LocationMatch "^/+$">
#    Options -Indexes
#    ErrorDocument 403 /error/noindex.html
</LocationMatch>
```



### 参考URL
* [【apache】サーバーのIPでアクセスできないようにするには？](http://sterfield.co.jp/programmer/%E3%80%90apache%E3%80%91%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AEip%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B.html)
* [[Apache]意外と知られていない(と思う)VirtualHostの「デフォルト」の活用方法](http://dqn.sakusakutto.jp/2011/07/apachevirtualhost.html)
* [バーチャルホスト設定(Apache)](http://centossrv.com/apache-virtualhost.shtml)
Rでちゃんとしたプログラムを書くために


しっかりしたRのプログラムを書こうとした時に、とりあえず知っておくと良い知識をまとめました。

ソースとしては以下を参照：

* Creating R Packages: A Tutorial (http://cran.r-project.org/doc/contrib/Leisch-CreatingPackages.pdf)
* Google's R Style Guide (https://google-styleguide.googlecode.com/svn/trunk/Rguide.xml)
* CRANのPackege一覧 (http://cran.r-project.org/web/packages/available_packages_by_name.html)
* Rの拡張を書く (http://cran.r-project.org/doc/contrib/manuals-jp/R-exts.jp.pdf)

### ディレクトリ構成

以下の関数で自動生成することができる。

```
package.skeleton
```


```
.
├── DESCRIPTION
├── NAMESPACE
├── MD5
├── R
│   └── package_name.R
├── data
│   └── sample_data.Rda
├── man
│   ├── some_function.Rd
│   └── the_other_function.Rd
└── tests
    └── package_name_test.R
```


### ファイル名

アンダースコアでつなぎ`.R`と大文字で終わる。

```
great_program.R
```

### 変数名

`dot.splited`というように`.`でつなぐこと推奨。`-`や`_`は使わない。場合によっては、`camelCase`もOK。

### 関数名

付け方は特に規定されていないが、Googleは`CamelCase(arg1, arg2 = val)`というように大文字始まりのキャメルケースを推奨している模様。

Rのデフォルトは`is.func(x)`というように変数名と同様だが、この方法だと`is`インスタンスの`func`メソッドとも解釈できてしまうので良くない。大文字始まりが嫌いなら小文字の`camelCase`にすると良い。

### 関数の引数

デフォルト引数のあるものは最後に書く。(デフォルト引数は`=`を使う。)
折り返すときは、`=`の前後では折り返さない。

```R
short <- function(a1, a2, a3 = value)

LongFunction <- function(arg1,
                         arg2,
                         arg3 = default_value) 
```

### 代入

`<-`を使う。`=`は使わない。

### コメントの書き方

`#`の後に1つ空白を空けた後、コメントを書く。
ソースと同じ行にコメントを書く場合、前に2つスペースを空ける。

```R
# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pct.spent,
     breaks = "scott",  # method for choosing number of buckets
```

## 起動方法

### インタプリタとしてRを起動したい時
`-no-save`をつけると作業スペースを保存しないので便利。

```bash
$ R –no-save
```

### プログラムを実行したい時

```bash
$ R --vanilla --slave < sample.R
```

### プログラムを実行したい時（引数あり）

`--args`パラメータを渡すと、Rプログラムから`commandArgs()`として受け取れるようになる。

```bash
$ R --vanilla --slave --args 1 2 str < test.R
```

`commandArgs()`の中身は`"R" "--vanilla" "--slave" "--args" "1" "2" "str"`となり使いにくい。
`commandArgs(trailingOnly = T)`とすると`"1" "2" "str"`となり、扱いやすくなる。
数字を数値として扱うときは、`as.numeric`を使って変換する必要がある。
Gitで変更していないはずのファイルが変更とみなされる

EclipseでGitを使っていたら変更していないはずのファイルに`>`が付いていて、変更したファイルと見なされていました。
リセットしても変わらず、削除→HEAD改訂に戻すなどしても変わらず、ブランチの移動も「コミットしてないのありますよ」と言われてできない・・。

Git Bashで`git diff`した場合に


```
old mode 100755
new mode 100644
```
などとなっていてファイル内容の変更がない場合は、`git config core.filemode false`とするとこの変更が無視され、以後変更と見なされないようです。

※[こちら](http://d.hatena.ne.jp/naga_sawa/20101220/1292806729)を参考にさせていただきました。
【WebGL】inka3DでMAYAからwebGL書き出し

iOS8からwebGLが実装されたり、Unity5でwebGL書き出しが標準搭載される事で
いよいよ需要が高まってきそうなので、MAYAユーザーはぜひinka3Dに注目してほしい。

とりあえず、簡単ではあるけども、Unitychanを表示してみた。
[光の影響を受けないようにマテリアル設定したユニティちゃん]
(http://amano-kiyoyuki.github.io/unitychan/unitychan.html)
※一式githubに公開しているのでソースとかダウンロードしちゃってください。

実績例として以下に記載。
--
去年、お台場合衆国のイベントでwebGLを使ったデジタルサイネージを作ったのだが
その時に、非常に便利だったのがこのinka3Dだ！
![スクリーンショット 2014-09-09 11.12.28.png](https://qiita-image-store.s3.amazonaws.com/0/38279/08b59bab-dd6f-9698-ad5b-08281998e1c3.png)
[inka3D](http://www.inka3d.com/)


これをつかえば、MAYAから書き出すだけで3Dを表示することができる。
表示はこんな感じである。これは特にシェーダープログラムなどしていない。
![スクリーンショット 2014-09-09 11.13.57.png](https://qiita-image-store.s3.amazonaws.com/0/38279/7930eb5e-7176-00aa-1cd6-6e5e682f6db1.png)

実際に動いているのはこちら
ソースは、弊社エンジニア監督が公開している。
[http://jsdo.it/edo_m18/en8o
](http://jsdo.it/edo_m18/en8o
)

さて、inka3Dの書き出し方法についてですが
[inka3D](http://www.inka3d.com/)ここからプラグインをダウンロード

macであれば、プラグインを以下に入れてから起動
/Applications/Autodesk/maya2015/Maya.app/Contents/MacOS/plug-ins
必要なプラグインはこちらのもの
![スクリーンショット 2014-09-09 11.17.55.png](https://qiita-image-store.s3.amazonaws.com/0/38279/24cc6477-64b4-1d4c-9928-1a5393a858c9.png)

プラグインマネージャーからinka3Dにチェックを入れる。
![スクリーンショット 2014-09-09 11.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/38279/67446341-ca66-471b-53be-af01d373e70e.png)

書き出したいなオブジェクトを選択してファイルの種類をinka3Dにして書き出せば終わり！
![スクリーンショット 2014-09-09 11.22.35.png](https://qiita-image-store.s3.amazonaws.com/0/38279/43ac2e20-9a28-564f-dde8-f7c89404b34f.png)

これで、あっという間に3Dの書き出しが終わってしまうのだ。
なんて、簡単なんだ。
ということで、表示までをあっという間にやってくれるinka3Dは
本当にオススメなので、ぜひ購入して使ってみたらどうでしょうか！

【紹介した案件の実績ページ】
[お台場合衆国2013](http://www.kayac.com/service/client/1122?per_page=10)
anyenvをシステムワイドにインストールする

雑めも

ANYENV_ROOTを設定しないと
anyenv install -l
で何も表示されなかった。

```
cd /opt
git clone https://github.com/riywo/anyenv
echo 'export PATH="/opt/anyenv/bin:$PATH"' >> /etc/profile.d/anyenv.sh
echo 'export ANYENV_ROOT="/opt/anyenv"' >> /etc/profile/anyenv.sh
echo 'eval "$(anyenv init -)"' >> /etc/profile
exec $SHELL -l
```

実行環境はcent6.5
VBAでExcelのグラフ(レーダーチャート)を作成する

VBAでグラフを作成するのに必要なものは、
1. ヘッダ
2. データセット
の2つ。 
新規作成したchartオブジェクトに、上記2つを渡せばグラフを作成できる。

各データセットの装飾(色や塗り)は、chartオブジェクトから取得したSeriesオブジェクトを操作することで可能。


## グラフを作成

```

'ヘッダを Range オブジェクトとして設定
Set headerRange = sheet.Range(cell-1, cell-2)

'データセットを Range オブジェクトとして設定
Set dataRange = sheet.Range(cell-3, cell-4)

'chartオブジェクトに渡すため、ヘッダRangeとデータセットRangeを結合する
Set gRange = Union(headerRange, dataRange)

'chartオブジェクトを作成する
Set  rChart = sheet.ChartObjects.Add( x, y, width, height )
rChart.Chart.setSourceData gRange
rChart.Chart.ChartType = xlRaderFilled  'レーダーチャート以外のタイプにする場合はここを変更
```

## グラフの設定を変更

```
'グラフの種類を変更する
rChart.Chart.ChartType = xxxx

'凡例を表示するかどうか
rChart.Chart.hasLegend = True / False

'値の目盛りラベルを表示しない
rChart.Chart.Axes(xlValue).TickLabelPosition = xlNone

```

## レーダーチャートグラフで、データセットの設定を変更
```
'※ 指定したいデータセットは
'rChart.Chart.SeriesCollection(x)で取得できる

'塗りつぶしの色を変更する
rChart.Chart.SeriesCollection(x).Format.Fill.ForeColor.RGB = RGB( r, g, b )

'塗りつぶしを無し(透明)にする
rChart.Chart.SeriesCollection(x).Format.Fill.Visiblae = msoFalse


'線の細さを変更する
rChart.Chart.SeriesCollection(x).Border.Weight = XXXX

'線の色を変更する
rChart.Chart.SeriesCollection(x).Format.Line.ForeColor.RGB = RGB( r, g, b )

'線にマーカーを表示する
rChart.Chart.SeriesCollection(x).ChartType = xlRaderMarkers


'順番を変更する(凡例の順番も準じる)。xxxxの値が小さいほど上になる。
rChart.Chart.SeriesCollection(x).PlotOrder = xxxx

```
Virtualboxのホストオンリーアダプターvboxnet0について知る


* Virtualboxのホストオンリーアダプターはvboxnet0を通して通信する。
* Vagrantfileに以下設定している場合、vboxnet0と192.168.33.10は同一ネットワークアドレスにいる必要がある。

```Vagrantfile
  config.vm.network "private_network", ip: "192.168.33.10"
```


```bash:vboxnet一覧を表示
$ VBoxManage list -l hostonlyifs
Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.33.1
NetworkMask:     255.255.255.0
IPV6Address:
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet0

Name:            vboxnet1
GUID:            786f6276-656e-4174-8000-0a0027000001
DHCP:            Disabled
IPAddress:       192.168.43.1
NetworkMask:     255.255.255.0
IPV6Address:
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:01
MediumType:      Ethernet
Status:          Down
VBoxNetworkName: HostInterfaceNetworking-vboxnet1
```

`IPAddress`欄を参考。


## vboxnet1を削除

```bash:
VBoxManage hostonlyif remove vboxnet1
```

## vboxnet1を作成

```bash:
VBoxManage hostonlyif create
```


## ホストOSがmacの場合


* ゲストOSのIPに、ホストOSのvboxnet0と同一サブネットに割り振る

```bash:ホストOSがmacの場合
$ /sbin/ifconfig vboxnet0
vboxnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 0a:00:27:00:00:00
	inet 192.168.33.1 netmask 0xffffff00 broadcast 192.168.33.255
```

* 上記よりホストOSのmacのvboxnet0のIPが`192.168.33.1/24`だとわかる。


* http://192.168.33.10/ にアクセスしページが見れることを確認。


## ホストOSがCentOS7の場合

```bash:ホストOSがCentOS7の場合
$ ip -f inet addr show vboxnet0
4: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic vboxnet0
       valid_lft 896sec preferred_lft 896sec
```

* 上記よりホストOSのCentOS7のvboxnet0のIPが`192.168.56.101/24`だとわかる。

```diff:Vagrantfile
+  config.vm.network "private_network", ip: "192.168.56.10"
```

* http://192.168.56.10/ にアクセスしページが見れることを確認。
JUnit4.11にしたら、Hamcrestが無いってエラーが出たよ・・・

JUnit4.11 でなぜか、ClassNotFoundエラー。

org/hamcrest/SelfDescribing

ここらあたりから、hamcrest-coreのJarファイルをダウンロードしてライブラリに入れてあげて下さい。
https://code.google.com/p/hamcrest/

Gradleとか使ってれば、自動的に依存は解決してくれると思いますが、
レガシーなやつをJUnit4.11とか最新の環境を使ってテストしてる人は一度お試しあれ。
キーワードを含んだ複数ファイルの文字列を一括置換

ディレクトリ配下にあるファイルに記述されている文字列 **hoge** を **bar** に置換する場合。

```bash:block_replacement_for_multi_files.sh
find . -type f -print | xargs grep -l hoge | xargs sed -i "s/hoge/bar/g" ;
```

`` find . -type f -print ``
カレントディレクトリ内の相対パスを含むファイル名をリストアップ。

`` xargs grep -l hoge ``
hogeを含むファイルに絞り込む。
このコマンドは必要ないかも。
でも、``sed``に流し込むファイル名は置換対象ファイルのみに絞りたかったので入れている。

`` xargs sed -i "s/hoge/bar/g" ``
**hoge** を **bar** に置換。
eclipse　コード補完設定

#コード補完
eclipseの補完機能を使用することで、コーディングが楽になる。
macの場合、content assistのキーバインドが初期設定では[ctrl + space]なので
[command + space] にすると使いやすい

##設定
eclipseのsettingから
Java > Editor > Content Assist の
Auto Activation　から設定します。
auto activation delay (ms) : 自動有効化機能の自動起動時間の設定、80msぐらいに設定すると楽な気がします。
auto activation triggers for java : Javaの自動有効化機能の起動トリガーの設定、ここに入力されている文字を入力した際に補完機能が起動します。
.abcdefghijkemnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_
私はこのように設定しています。
auto activation triggers for javadoc : Javadocの自動有効化機能の起動トリガーの設定。

##余談
code recommenders というものがあって、補完するものを使用頻度でソートしてくれます。
eclipseの help > install new software から以下のアドレスをwork withに貼付けて,
http://download.eclipse.org/recommenders/updates/stable/
code recommenders にチェックを入れる(4.4で確認
CakePHP(2.x)のSecurityComponentをさくらの共有SSLに対応させる

#共有SSLでお手軽セキュア→失敗

とっても便利なSecurityComponent。以下のように記述すると、HTTP接続時、自動的にHTTPSへリダイレクトしてくれます。

```php:HogesController
public function beforeFilter() {
	$this->Security->blackHoleCallback = 'forceSSL';
	$this->Security->requireSecure();
}

public function forceSSL() {
	$this->redirect('https://'.env('SERVER_NAME').$this->here);
}
```

しかしさくらインターネットのレンタルサーバー環境では、SSLの判定に失敗します。
https付きでアクセスしても、SSLではないと判定されてリダイレクトループに。なんでや。


#悪いのはどいつだ
SecurityComponent.phpを読んでみると、下記のようにsslの判定を行っていました。

```php:/lib/Cake/Controller/Component/SecurityComponent.php
if (!$this->request->is('ssl')) {
	if (!$this->blackHole($controller, 'secure')) {
		return null;
	}
}
```

試しにコメントアウトするとブラックホールに吸われなくなったので、このロジックを修正すれば良さそうです。

CakeRequestを読むと、\$_detectorsに\$_SERVER変数からの抽出条件が記載されています。

```php:/lib/Cake/Network/CakeRequest.php
	protected $_detectors = array(
		...
		'ssl' => array('env' => 'HTTPS', 'value' => 1),
		...
	);
```

さくらの共有SSLでは、「HTTPS」の代わりに「HTTP_X_SAKURA_FORWARDED_FOR」としてIPアドレスを出力してくれます。
なのでこうしました。

```php:/lib/Cake/Network/CakeRequest.php
	protected $_detectors = array(
		...
//		'ssl' => array('env' => 'HTTPS', 'value' => 1),
		'ssl' => array('env' => 'HTTP_X_SAKURA_FORWARDED_FOR', 'pattern' => '/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/'),
		...
	);
```

正規表現でIPアドレス（v4）のパターンを記述しています。
ただ、接続環境によってはIPv6で返ってきたりするかもしれないので、ちょっと不安ですね。


#コンポーネントを使わない方法
コントローラ中でSecurityコンポーネントを使用しないなら、手っ取り早くenv('PARAM')で判断するのが簡単です。

```php:HogesController
public function beforeFilter() {
	if(is_null(env('HTTP_X_SAKURA_FORWARDED_FOR'))) {
		$this->redirect('https://'.env('SERVER_NAME').$this->here);
	}
}
```
ディレクトリはハードリンクできないのでバインドマウントしましょう。


* vagrantを使っている時、Vagrantfileで
  `config.vm.synced_folder`を設定すれば別ディレクトリにアクセスできますが、設定変更には`vagrant reload`しないといけないため

# 失敗

```bash:シンボリックリンクを貼った場合
$ ln -s ~/ansible_centos7_host link_ansible
```

![スクリーンショット 2014-09-09 8.07.21.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d194963f-8ffa-4b2b-330b-19e68b27a62a.png "スクリーンショット 2014-09-09 8.07.21.png")

* ゲストOSからホストのディレクトリにアクセス出来ない。

```bash:ディレクトリのハードリンクはできない
$ ln ~/ansible_centos7_host link_ansible
ln: `/home/vagrant/ansible_centos7_host`: ディレクトリに対するハードリンクは許可されていません
```


# 成功

```bash:バインドマウント
mkdir link_ansible
sudo mount --bind ~/ansible_centos7_host/ link_ansible/
```

![スクリーンショット 2014-09-09 8.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1ace68a8-bfb0-db9f-3315-242b74180246.png "スクリーンショット 2014-09-09 8.16.45.png")


# その他

* バインドマウント一覧を確認

```bash:忘れるよね・・・
grep home /proc/mounts
```

```bash:バインドマウントしたものは以下特徴あり(真似しないように)
$ mv link_ansible/ aa
mv: `link_ansible/` から `aa` へ移動できません: デバイスもしくはリソースがビジー状態です
$ rm -rf link_ansible
rm: `link_ansible` を削除できません: デバイスもしくはリソースがビジー状態です
$ ls -l link_ansible
# フォルダの中身は空になるので注意！
```


## httpd

DocumentRootの差し替えに便利かもしれない。

```bash:mount
$ sudo mount --bind /usr/share/hoge/htdocs/ /var/www/
```

これならapache再起動不要。

```bash:umount
$ sudo umount /var/www/
```
injectとeach_with_objectって何が違うのさ？


`inject`と`each_with_object`の違いが分からない。
どちらもEnumerableなオブジェクトの要素を使って何かしらのオブジェクトを得る。

でもやっぱり違いがあったのでメモ。

## イメージで説明
* `inject`は、各要素が力を合わせて一つのオブジェクトを作る
* `each_with_object`は、ターゲットとなるオブジェクトに対して、各要素を作用させる

## 挙動で説明
配列の各要素を2乗する処理を書く。表面上は同じ挙動をする。
でも`do`の後の`result`は、同じ`result`でも意味合いが違っていて、

* `inject`の場合はresultにはブロック内で最後に評価した値が入る
* `each_with_object`の場合は、resultは常に`each_with_object`の引数として渡されたオブジェクトを指す

```hoge.rb
# inject
[1, 2, 3].inject [] do |result, i|
  result << i*i
end

# each_with_object
[1, 2, 3].each_with_object [] do |i, result|
  result << i*i
end
```

## injectを使いたい場合の例
たとえば配列の和を求める場合

```hoge.rb
sum = [1, 2, 3].inject 0 do |s, i|
  s + i
end
```

(この場合は`sum = [ 1, 2, 3].inject :+`でいいけど敢えてこの形で。)

ここで`each_with_object`を使おうとしてしまうと、

```hoge.rb
sum = [ 1, 2, 3].each_with_object 0 do |i, s|
  s += i
end
```
とすればよさげだけど、`s`は破壊的に変更できない`0`（Fixnum）を指しているので、
`sum`に入るのは`0`となってしまう。

## each_with_objectを使いたい場合の例
たとえば`[["Alice", 50], ["Bob", 40], ["Charlie", 70]]`から、`{"Alice" => 50, "Bob" => 40, "Charlie" => 70}`を得たい場合、

```hoge.rb
ret = [["Alice", 50], ["Bob", 40], ["Charlie", 70]].each_with_object({}) do |(key, value), hash|
  hash[key] = value
end
```
こんな感じでかける。

ここで`inject`を使おうとすると、できないわけではないけど、
作成中のハッシュをブロックの最後に評価しないといけないので1行余分に必要になる。

```hoge.rb
ret = [["Alice", 50], ["Bob", 40], ["Charlie", 70]].inject({}) do |hash, (key, value)|
  hash[key] = value
  hash    # ブロックの最後の評価を作成中のハッシュにしないといけない
end
```

参考:
[プログラミングは素晴らしい - [プログラミング] each、each_with_object、inject、map](http://d.hatena.ne.jp/cuzic/20091231)
依存ライブラリの脆弱性チェック


# OWASP Depedency Check

[OWASP Dependency Check](https://github.com/jeremylong/DependencyCheck) は

> Dependency-Check is a utility that identifies project dependencies and checks if there are any known, publicly disclosed, vulnerabilities. Currently Java and .NET dependencies are supported; however, support for Node.JS, client side JavaScript libraries, etc. is planned.

とあるように、未知の脆弱性ではなく、既知の脆弱性を含むライブラリを検査してくれます。
このツールは、常にライブラリのバージョンを最新にしている開発チームでは必要がないと思う。けれども、なかなかライブラリのバージョンを上げようとはしない開発チーム(or上司)に対して、バージョンを上げる説得材料を提供してくれるます。

## 実行方法

Maven でも実行できるけれども、Ant の場合は以下のようなスクリプトです。このスクリプトは OWASP Dependency Check のダウンロードからタスクの定義、検査までを実行します。またレポートを HTML で出力しているけれども、Jenkins の[プラグイン](https://wiki.jenkins-ci.org/display/JENKINS/OWASP+Dependency-Check+Plugin)と連携する場合は、 reportformat="XML" に変更してください。

```XML:build.xml
<project>
    <!-- OWASP Dependency Check のバージョン -->
    <property name="dependency.check.version" value="1.2.4" />
    <!-- OWASP Dependency Check のダウンロード先ディレクトリ -->
    <property name="dependency.check.lib.dir" location="target/vendor/dependency-check" />
    <!-- OWASP Dependency Check のファイル名 -->
    <property name="dependency.check.filename" value="dependency-check-ant-${dependency.check.version}.jar" />
    <!-- OWASP Dependency Check のダウンロード先ファイルパス -->
    <property name="dependency.check.jar" location="${dependency.check.lib.dir}/${dependency.check.filename}" />
    <!-- OWASP Dependency Check のダウンロード元URL -->
    <property name="dependency.check.url" value="http://dl.bintray.com/jeremy-long/owasp/${dependency.check.filename}" />

    <!-- 依存ライブラリを置いているディレクトリ -->
    <property name="dependency.check.target.dir" location="lib/runtime" />

    <target name="dependency-check.html"
            description="依存ライブラリの脆弱性を検査する"
            depends="-dependency-check.jar">
      <taskdef name="dependency-check"
               classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask">
        <classpath location="${dependency.check.jar}" />
      </taskdef>

      <dependency-check applicationname="Sample Application"
                        autoupdate="true"
                        reportoutputdirectory="${target.dir}"
                        reportformat="HTML">
        <fileset dir="${dependency.check.target.dir}">
          <include name="*.jar"/>
        </fileset>
      </dependency-check>
    </target>

    <!-- OWASP Dependency Check をダウンロードする -->
    <target name="-dependency-check.jar"
            depends="-downloaded.dependency-check.jar"
            unless="downloaded.dependency-check.jar">
      <delete dir="${dependency.check.lib.dir}">
        <include name="*.jar" />
      </delete>
      <mkdir  dir="${dependency.check.lib.dir}" />
      <get src="${dependency.check.url}" dest="${dependency.check.lib.dir}" />
    </target>

    <!-- OWASP Dependency Check をダウンロード済みかチェックする -->
    <target name="-downloaded.dependency-check.jar">
      <available property="downloaded.dependency-check.jar"
                 file="${dependency.check.jar}" />
    </target>
</project>
```

初回実行時は20〜30分くらいかかるので、コーヒーでも飲んで気長に待ってください。
４０行でライフゲーム

ニコニコ生放送「寝ながらライフゲームつくる」にて

![20140909-034959-152.png](https://qiita-image-store.s3.amazonaws.com/0/34295/b97bf68b-735a-6355-a3e4-8b9456c10b88.png)

```cpp:Main

# include <Siv3D.hpp>

void Main()
{
	const Point size = Window::Size();
	Image image(size.x, size.y);
	DynamicTexture tex;

	std::array<std::vector<bool>, 2> worlds;
	const int num = size.x*size.y;
	worlds[0].resize(num);
	worlds[1].resize(num);

	std::array<Point, 8> neighbors = { { { -1, -1 }, { 0, -1 }, { 1, -1 }, { -1, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } } };
	std::array<bool, 9> boneRule = { false, false, false, true, false, false, false, false, false };
	std::array<bool, 9> surviveRule = { false, false, true, true, false, false, false, false, false };
	std::array<std::array<bool, 9>, 2> rule = { boneRule, surviveRule };
	
	while (System::Update())
	{
		if (Input::MouseL.clicked)
			for (int y = 1; y < size.y - 1; ++y)
				for (int x = 1; x < size.x - 1; ++x)
					worlds[0][y*size.x + x] = RandomBool(0.5);

		//update
		for (int y = 1; y < size.y - 1; ++y)
			for (int x = 1; x < size.x - 1; ++x)
				worlds[1][y*size.x + x] = rule[worlds[0][y*size.x + x]][std::count_if(neighbors.begin(), neighbors.end(), [&](const Point& v){return worlds[0][(v.y + y)*size.x + (v.x + x)]; })];

		worlds[0].swap(worlds[1]);		

		//draw
		for (int y = 1; y < size.y - 1; ++y)
			for (int x = 1; x < size.x - 1; ++x)
				image[y][x] = ColorF(0.0, worlds[0][y*size.x + x], 0.0);

		tex.tryFill(image);
		tex.draw();
	}
}

```
Berkshelf 実行エラー

berkshelf のインストールは上手くいったが、
実行した時にエラーが出たので、発生したエラー内容と対処方法のメモ

以下、github に投稿されているのと同じエラーが発生。
https://github.com/berkshelf/berkshelf/issues/1234

投稿の返事に書いてあるように、
Chef-DK をインストールして解決。

berkshelf 公式にも Chef-DK を使うのが簡単で早いって書いてますね。
UIAlertControllerをiPadで使用する際の注意点



# ポイント
* スタイルは2種類`UIAlertControllerStyleActionSheet`と`UIAlertControllerStyleAlert`
* デフォルトは`UIAlertControllerStyleActionSheet`
* スタイルは `alertControllerWithTitle:message:preferredStyle`以外では指定できない

# 対策
* UIAlertControllerの`popoverPresentationController`プロパティを使用する
 
***iPadで`UIAlertControllerStyleActionSheet`を`popoverPresentationController`の指定なしに使うとクラッシュします***

## 例

(@kishikawakatsumi さんご指摘ありがとうございます)

```objc
    UIAlertController *alertController
    = [UIAlertController alertControllerWithTitle:@"タイトル"
                                          message:@"メッセージ"
                                   preferredStyle:UIAlertControllerStyleActionSheet];

    [alertController addAction:[UIAlertAction actionWithTitle:@"アクション1" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        // アクション1 の処理
    }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"アクション2" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        // アクション2 の処理
    }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"閉じる" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {}]];

    // iPad用の設定
    alertController.popoverPresentationController.sourceView = self.view;
    alertController.popoverPresentationController.sourceRect = CGRectMake(100.0, 100.0, 20.0, 20.0);
    //RectではなくUIBarButtonItemを起点にできるプロパティもある
    //alertController.popoverPresentationController.barButtonItem
    
    // 表示
    [self presentViewController:alertController animated:YES completion:^{}];

```

![ac2.png](https://qiita-image-store.s3.amazonaws.com/0/8920/3764eb00-24ff-49dc-734e-fb07b71c2df4.png)

右iPad: 指定したRectを起点として"閉じる"(UIAlertActionStyleCancelで指定した部分)を除いて表示されます。外側をタップすることでアクションを実行せずに閉じることができます。
静的ファイルがキャッシュされる（ブラウザキャッシュじゃない場合）

### 現象
* cssを更新しても、更新内容が反映されない
* 下記を行っても、反映されない  
  * キャッシュクリアする
  * ブラウザのシークレットモードで開く
  * cssのURLクエリパラメータ強制変更

### 環境
* [hostOS]Mac 10.9.4
* Vagrant 1.6.3
* [guestOS]CentOS 6.5
* VirtualBox 4.3.12
* FuelPHP 1.7
* Apache 2.2.15
* cssはsass使ってない。

 
### 推測
* ブラウザキャッシュではない
* サーバ側でキャッシュされてる
* apacheあたり？

### 調べた
http://tipshare.info/view/4f3481ee4b21227814000001
http://httpd.apache.org/docs/2.0/ja/mod/core.html
VirtualBoxの共有フォルダに設定したディレクトリは、外部ストレージ的な扱いになる。  
その際、apacheがファイルの更新を検知できない。ということでOK?  

### 解決方法
httpd.confにキャッシュしない設定を追記する。（要再起動）
具体的には以下のように設定することで解消できました。  

```
<Directory [対象のディレクトリ]>
EnableMMAP Off
EnableSendfile Off
</Directory>
```
Railsのdefault_scopeは悪だ！(default_scope is evil) ということらしい

Rails Best Practiceのサイトを見ていたら、結構あおり気味なタイトルの記事があった。

**[default_scope is evil | Rails Best Practices](http://rails-bestpractices.com/posts/2013/06/15/default_scope-is-evil/)**

要約すると、Rails(ActiveRecord)の `default_scope` は２つの理由から使うべきではないとのことです。

1. default_scopeのオーバライドができない
2. モデルをイニシャライズするときにdefault_scopeの副作用が影響する


サンプルコードもあったので自分の環境でも試してみました。
以下の環境で試してみました。

- Rails4.1.5
- Ruby2.1.2
- ベースとなるモデルは以下の様なUserクラスがあると想定(default_scopeを指定)

```rb:Userモデル
class User < ActiveRecord::Base
  default_scope ->{where(role: "admin").order('created_at ASC')}
end
```

```rb:サンプルとして10件取得してみると、デフォルト条件が効いたSQLとなる
> User.limit(10)
# SELECT `users`.* FROM `users` WHERE `users`.`role` = 'admin' ORDER BY created_at ASC LIMIT10

```

1. default_scopeのオーバライドができない
---------------------------------------------

```rb:updated_at順に並び替えて、10件取得するようにしたいが必ずdefault_scopeの条件が優先的に入ってしまう。

> User.order('updated_at DESC').limit(10)
SELECT  `users`.* FROM `users`  WHERE `users`.`role` = 'admin' ORDER BY created_at ASC, updated_at DESC LIMIT 10
```

そこで、default_scopeを無効にするために、 ***unscoped*** を使う

```rb:一時的に無効にするunscopedをはさむ必要がある

> User.unscoped.order('updated_at DESC').limit(10)
SELECT  `users`.* FROM `users` ORDER BY updated_at DESC LIMIT 10
```

まー、これについては想定通りだと思う。その名の通り、default_scopeとしてデフォルトの検索条件を指定しているので、無効にしたいときは明示的に無効にしないといけない。
要するにUserモデルのクエリを考えるときは常に **default_scope** のことを意識しとかないといけない。


2. モデルをイニシャライズするときにdefault_scopeの副作用が影響する
---------------------------------------------------

```rb:default_scopeを定義したUserモデルをnewすると、、、
> User.new
<User id: nil, name: "", role: "admin", created_at: nil, updated_at: nil>
```

？！ newしただけで、 ***`role`*** に ***`admin`*** というデフォルト値が入ってる。
default_scopeで定義している `where(role: "admin")` 部分が効いている状態です。

ほとんどの人が意図していない挙動かと思います。
default_scope は **read** する時のみ効果のあるものかとおもいきや、モデルをイニシャライズするときにも値がセットされてしまう。。。


まとめ
---------------------------

個人的には特に ***2番目*** の **「モデルをイニシャライズするときにdefault_scopeの副作用が影響する」** は想定外の挙動なので、出来る限りdefault_scopeは使用しない方が賢明なのかなと思いました。

使用する場合も、意図せず値が設定されないように、 **default_scope** に設定する条件は **order** などのみで、カラム属性に影響しない条件のみ入れるなどを考慮する必要がありそうです。
上記２点の挙動を許容した上で利用する必要があるなと。

[Rails Best Practice](https://github.com/railsbp/rails_best_practices) は結構色んな発見があります！！！
スペシャル引数を使う時のおまじない


オプショナル引数で、この関数が `*problem*` に依存していることが明確になる。
気が変わったら指定も出来る。
絶対変えないって自信があるなら、 `&aux` 指定にしても良い。

```cl
(defun reverse-problem (macro-pair &optional (*problem* *problem*))
  )
```
bash内部コマンド history, fc

#コマンド履歴の利用

##履歴の操作

shellの内部コマンド history, fc とイベント指示子を使う。

#### 想像だけど・・

shell上に打ち込んだコマンドはhistory コマンド・プログラムにより
入出力ライブラリ・バッファにバッファリングされているようです。
親プロセスのshellがexit()するとディスク・ファイルにフラッシュされる様子。


<small>
「履歴ファイル」と書いているものは.bash_historyなどの履歴をファイルに書き出されたファイル。
「履歴リスト」と書いているものはメモリ内の入出力用バッファです。（想像）

履歴ファイルは /home/ 以下にある ".bash_history"に記録されているものとします。
</small>


###履歴リストのクリア
history -c
履歴ファイルは変更されない。

```
$ history -c
$ vi $HOME/.bash_history  # <- 履歴ファイルは残ったまま。$ fc -l コマンドでも確認出来る。
```

```
$ history -cw # 履歴リストをクリアし、履歴ファイルに空の履歴リストを書き込む
```

```
$ history 5 <- 直前の5件表示（ファイル履歴の最終行からマイナス5行分）
95 cd
96 vi file.c
97 gcc file.c
98 ./a.out
99 clear
```

```
$ !96  # 96番のコマンドを実行
$ history -d 99 # 99番のコマンドを削除
```

```
$ history -s "/`gcc` $1/gcc new.c/" # gcc コマンドに渡されていたファイル名を'new.c'に置き換え履歴リストに追加
```

### 現在までの履歴リストを履歴ファイルに書き込み

```
$ history -a
```


### 履歴リストを履歴ファイルの内容で更新

```
$ history -n
```


###履歴操作のまとめ

-c ：履歴リストのクリア
-d ：<i>[行番号</i>] <i>行番号</i>で指定したコマンドを履歴ファイルから削除
-w ：履歴ファイルへの上書き
-r ：履歴ファイルから履歴リストへの読み込み
-a ：履歴ファイルにまだ書き込まれていない履歴リストを履歴ファイルに書き込み。
-n ：履歴ファイルから履歴リストに未取得分を読み込み

-p ：コマンド置き換え。ただし、実行はしない。実際に置き換える前に確認できる。
-s ：<i>追加したいコマンド</i> ：履歴リストに"追加したいコマンド"を追加。履歴ファイルには追加しない。

###shellの内部コマンド fc をつかう

■ fc [-e <i>エディタ名</i>] [-lnr] [<i>開始位置</i>] [<i>終了位置</i>]

-l 標準出力にコマンド履歴を表示
-n コマンド番号非表示
-r 逆順に表示

開始位置、終了位置には文字列、または履歴の番号を指定。
終了位置はファイルの現在位置からのオフセット。ファイル現在位置はファイル末尾から。-n 行で n行前へ。

履歴ファイルが辞書順にソートされている場合

```
 fc -l a z 
```

とするるとコマンド名aから始まり、コマンド名zで始まるコマンドの範囲を指定出来る。
バケツソートの有用性がよくわかりますね。

■ fc -s [<i>パターン=置き換えたい値</i>] [<i>コマンド</i>]

<i>"パターン"</i> を <i>"置き換えたい値"</i> に 置き換えて <i>"コマンド"</i> を実行

##履歴リストの参照

###イベント指示子を使う

!<i>n</i> ：n個目のコマンド
!! ：直前のコマンド
!-<i>offset</i> ：マイナスの数値を指定で現在位置から<i>offset</i>前のコマンド。

その他

環境変数を利用した設定などは他の方が書いたドキュメントで。ここには書きません。

参考サイト

JM Project
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html
Arduino Micro入門 - サーボモータを動かすところまで


Arduinoの入門でLEDの13番光らせる(Lチカ)してもしょうがないので、その次のステップとしてサーボを動かす例を公開してみる。これができてうまくハード組み合わせればロボットアーム位なら作れるはず。

## Arduino Micro

Arduinoはマイコンボードで、簡単なハードウェアを制御するのに使う。
Arduinoで最も一般的なのはArduino Unoだが、Arduino Microは小さいっていうのと、Micro USB端子で通信できるのが特徴。

![Arduino Micro](http://arduino.cc/en/uploads/Main/ArduinoMicroFront.jpg)

http://arduino.cc/en/Main/arduinoBoardMicro


## Arduino書き込みソフトの準備

PC用の書き込みソフトもArduinoという名前で配布されている。

http://arduino.cc/en/Main/Software

からArduinoをダウンロード

使うときにはマイコンボードの種類と、シリアルポート（PCとArduino間）を選ぶ必要がある。

具体的には、

- ツール -> マイコンボード -> Arduino Micro
- ツール -> シリアルポート -> /dev/tty.usbserial...

と選択する。


## ピン配置
![ピン配置](http://arduino.cc/en/uploads/Main/ArduinoMicro_Pinout2.png)

この中で今回使うのは、+5V, GNDと9版ピンだけ。

ArduinoでのHello world的な、「Lチカ」と言われるのに使われる13番ピンは、Arduino Microには存在しないが、ちゃんとそれに相当するLは基板の中央下寄りに存在している。
 
## サーボモータ

サーボモータは普通のモータと違って、回転し続けるというものではなく、指定した角度まで回転させることができるモータ。
ロボットアームを作るとかに使える。

今回使ったのはこれ (EMAX-ES08A)

![ES08A.png](https://qiita-image-store.s3.amazonaws.com/0/6664/97a09e87-0b1d-ad2f-91e7-1f25bf82bf40.png "ES08A.png")


http://www.switch-science.com/catalog/1385/

```
スピード： 0.12秒/60度 (4.8Ｖ時）／0.10秒/60度 (6.0Ｖ時）
トルク： 1.5kgf-cm（4.8Ｖ時）／1.8kgf-cm（6.0Ｖ時）
動作電圧： 4.8V～6.0V
入力パルス幅： 1500usec〜1900usec
コネクター: JRタイプ（オレンジ：信号、赤：電源、茶：GND)
```


GNDを茶色、5V電源を抵抗とか挟まずに赤につないだ後、9ピンを黄色につなぐ。9ピンじゃなくてもいいはずだけれど、Servoの例では9がデフォルトだった。

実際に動かしたプログラムはこれ。
ファイル -> スケッチブックの例 -> Servo -> Sweep
を選択後、`attach(9, 1500, 1900)`というように入力パルス幅を入力しただけ。

```cpp:Sweep.c
// Sweep
// by BARRAGAN <http://barraganstudio.com> 
// This example code is in the public domain.


#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(9, 1500, 1900);  // attaches the servo on pin 9 to the servo object 
} 
 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}
```

そこら辺にあったレゴを適当にくっつけてみたら扇風機みたいになった。

![arduinomicro_servo.gif](https://qiita-image-store.s3.amazonaws.com/0/6664/29d1458c-9dc0-f28a-40d1-47ad3150e1ed.gif "arduinomicro_servo.gif")
全角文字をsedやAWKの正規表現にかけると……

# 気が利いてるのか、お節介なのか

ロケール環境変数(`LC_*`や`LANG`)を認識してくれる**GNU版のgrepやsed、AWKコマンドの正規表現は、キャラクタークラスを用いた場合、全角の文字を半角で対応する文字と同一視**してくれます。

知ってました?

それを知らずにハマったことのある人には、「なんてお節介な!」と思える機能かもしれませんが、知っていれば便利な機能です。

# [[:alnum:]]で試してみる

正規表現には**[キャラクタークラス指定](http://www.kt.rim.or.jp/~kbk/regex/regex.html#CLASSNAME)**というものがあります。例えば`[[:alnum:]]`は、アルファベットと数字にマッチするクラスです。

UTF-8やEUC-JPなど、マルチバイト文字に対応するようにロケール環境変数が設定されていると、`sed`や`AWK`における`[[:alnum:]]`は全角文字にも反応します。

```sh:
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | sed 's/[[:alnum:]]/*/g'
*** ****　****＋
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | awk '{gsub(/[[:alnum:]]/,"*");print}'
*** ****　****＋
$ 
```

というように、行頭にある半角の“MSX”もその後に続く全角の“ＭＳＸ２”も`*`に置換されます。

ちなみに、`[]`の中に`^`を付ければ意味が反転するわけですが、それもちゃんと効きます。やってみましょう。

```sh:
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | sed 's/[^[:alnum:]]/*/g'
MSX*ＭＳＸ２*ＭＳＸ２*
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | awk '{gsub(/[^[:alnum:]]/,"*");print}'
MSX*ＭＳＸ２*ＭＳＸ２*
$ 
```

というわけで、アルファベットでも数字でもない、全半角スペースとプラス記号が`*`に置換されました。

# [[:blank:]]で試してみる

もちろん他のキャラクタークラスでも同様です。例えば、半角スペースやタブに反応する`[[:blank:]]`というクラスでやってみましょう。

```sh:
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | sed 's/[[:blank:]]/*/g'
MSX*ＭＳＸ２*ＭＳＸ２＋
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | awk '{gsub(/[[:alnum:]]/,"*");print}'
MSX*ＭＳＸ２*ＭＳＸ２＋
$ 
```

というように、行頭から4文字目の半角スペースもそれ以降にある全角スペースも`*`に置換されました。つまり、全角スペースも半角スペースも同一視されていることがわかります。

ですが、AWKのフィールド区切りは飽くまで半角のみなようで、上記文字列の最大フィールド番号(NF)を確認してみると2だったりします。

```sh:
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | awk '{print NF}'
2
$ 
```

へんなのー。

# 全角に反応させたくない場合はどうすればいいのか

全角と半角を区別し、半角だけにマッチしたいという場合も当然ありますよね。そういう場合は、環境変数を無効にしてやればOKです。

例えば`env`コマンドに`-i`オプションを付けてその後にコマンドを書いてやれば、ロケールを含めて全ての環境変数が渡されなくなりますので全角文字はマルチバイト列と見なされて反応しなくなります。

```sh:
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | env -i sed 's/[[:alnum:]]/*/g'
*** ＭＳＸ２　ＭＳＸ２＋
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | env -i awk '{gsub(/[[:alnum:]]/,"*");print}'
*** ＭＳＸ２　ＭＳＸ２＋
$ 
```

あるいは、環境変数`LANG`を`C`にしたり、unsetしたりしてもいいです。

```sh:
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | LANG=C sed 's/[[:alnum:]]/*/g'
*** ＭＳＸ２　ＭＳＸ２＋
$ unset LANG
$ echo 'MSX ＭＳＸ２　ＭＳＸ２＋' | awk '{gsub(/[[:alnum:]]/,"*");print}'
*** ＭＳＸ２　ＭＳＸ２＋
$ 
```

都合よく使い分けましょう。
GitHubで自分が関係しているIssueを見逃さないようにするためのページ一覧


世の中には、いろんなツールがあるけれど、ここではデフォルトでGitHubが用意してくれているページを駆使して、自分が関係しているIssueに気づかない問題を解決する方法を紹介する。



## Notificationの活用

![スクリーンショット 2014-09-08 22.17.05.png](https://qiita-image-store.s3.amazonaws.com/0/6664/f661e997-a94b-8614-e04f-eadec01d8427.png "スクリーンショット 2014-09-08 22.17.05.png")

まずは、通知を意味あるものにしたうえで、毎日見に行くという習慣付けが大事。

ショートカットとしては`g`+`n`でいける。

運用にあたっては、まず、今までのNotificationを全てクリアして、必要なものだけがNotifyされるように[Watch設定](https://github.com/watching)をちゃんとする。
実際、Notificationが多すぎて役に立たなくなっている人は全てUnwatchすることから始めてもいいかもしれない。
そうするとNotificationが結構役に立つようになる。

https://github.com/notifications

Watchしてるものの中で、自分が関係しているものだけを見たい場合は、`Participating`タブを選べば良い。
なお、全てUnwatchしている場合は、`Unread`の中身が`Participating`と同じになるはず。

https://github.com/notifications/participating


ノーティフィケーションの詳細については、以下の公式ヘルプを参照。
https://help.github.com/articles/about-notifications

Notificationのメリットとしては、普段見ていないレポジトリでメンションされても来付けるところにある。ただし、一度見て「後でレビューしよ」などと放置してしまうと見失ってしまう可能性がある。そんな時は以下の「Issueの活用」をし、アクティブに自分が処理するものを見に行くとよい。


## Issueの活用


### リポジトリごとのIssue

![スクリーンショット 2014-09-08 22.24.23.png](https://qiita-image-store.s3.amazonaws.com/0/6664/f780a814-83eb-79e7-2912-35505badaf93.png "スクリーンショット 2014-09-08 22.24.23.png")

GitHubではPullRequestも一つのIssueとして扱われており、Issueページでは、そのIssueがPullRequestなのか否か、open/closeの状態、誰が作って誰がアサインされているか、ラベルなどで絞り込むことが出来る。

最近Githubではキーボードショートカットが強化され、`g`+`i`でissueに行き、その後`a`でassigneeから絞り込みというようなことができるようになった。もっと知りたければ、githubの各ページ上で`?`を押してみるとよい。


フィルタのかけ方としては、基本的には`author`, `asignee`, `label`での絞込み、Sortで`Recently Updated`の選択(`sort:updated-desc`)を使うことが主だと思う。

マイナーなところでオススメなのが`involves`というフラグ。これはNotificationのParticipatingと同じように自分が関係しているもの（自分がauthor,commenterか、mention,assignがあるもの)を表示してくれる

`https://github.com/[組織名]/[リポジトリ名]/issues?q=is%3Aopen+involves%3A[ユーザ名]`

railsでの例：https://github.com/rails/rails/issues?q=is%3Aopen+involves%3Adhh
![rails_issue.png](https://qiita-image-store.s3.amazonaws.com/0/6664/58fad459-01df-5b85-da0a-686edfd2bb01.png "rails_issue.png")

こういったissueのフィルタについては以下のヘルプを参照。
https://help.github.com/articles/searching-issues

### 組織ごとのIssue

リポジトリにまたがって活動している場合、各リポジトリのIssueを1つずつ見ていくのは億劫なので、組織ごとのIssueで、自分がassignされているものを見ると良い。

https://github.com/organizations/[組織名]/dashboard/issues/assigned?direction=desc&state=open

( 個人の場合: https://github.com/dashboard/issues/assigned?direction=desc&state=open )

これは自分がassignされている以上の絞り込みはできない。

組織をまたいでAssignされている全てを見られるViewは無いようだ。けれど、大抵Activeに活動している組織は一つでしょ？
Mac OSX Mavericks で pyenv

概要
-------------------------------------------------

他の人の紹介記事以上のことは書いてないです。

homebrew で pyenv インストール、
anyenv とかは使ってない、というかんじの内容。

awscli を入れたかったので。

PATH
-------------------------------------------------

> [Understanding Shims | yyuu/pyenv](https://github.com/yyuu/pyenv#understanding-shims "Understanding Shims | yyuu/pyenv")
> **Understanding Shims**
> 
> pyenv works by inserting a directory of shims at the front of your PATH:
> 
> ```
> ~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin
> ```
 


とのことなんで、
`~/.pyenv/shims` にパスを通す設定を、シェル起動時に読み込まれるファイルに書いておく。


以下の設定は `~/.pyenv` が存在する場合だけパスを追加して、pyenv を初期化する。

```bash
# pyenv -----------------------------------------
if [ -d $HOME/.pyenv ]; then
  export PATH="${HOME}/.pyenv/shims:$PATH"
  eval "$(pyenv init -)"
fi
``` 

Install
-------------------------------------------------

```console
// brew を利用して pyenv をインストール
$ brew install pyenv

// pyenv rehash を自動化する plugin をインストール
$ git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash

// インストール可能なバージョン確認
$ pyenv install -l

// python のバージョンを指定してインストール
$ pyenv install 2.7.8

// python パス確認
$ which python
/Users/qurage/.pyenv/shims/python

// python バージョン確認
$ python --version                                
Python 2.7.8

// easy_install パス確認
$ which easy_install
/Users/qurage/.pyenv/shims/easy_install

// easy_install バージョン確認
$ easy_install --version
setuptools 5.7

// pip バージョンとパス確認
$ pip —version
pip 1.5.6 from /Users/qurage/.pyenv/versions/2.7.8/lib/python2.7/site-packages (python 2.7)
```


### Python の安定版のバージョンを Python.org で確認

* [Our Downloads | Python.org](https://www.python.org/downloads/ "Our Downloads | Python.org")


参考
--------------------------------------------------------

* [yyuu/pyenv](https://github.com/yyuu/pyenv "yyuu/pyenv")
* [Python.org](https://www.python.org/ "Python.org")
expressでURLパスのパラメータ化だけを利用する

タイトルの通りです。
REST APIを応用して、一つのクエリで、複数の処理できるようにするとき、通常のREST APIとの整合性のために、express標準のパーサを使いたい・・・。そんなときのために使える話です。
かなり需要少なそうだけどメモとして。

```js
var PathParser = require('express/lib/router/layer');
var parser = new PathParser('/record/:id')
if(parser.match('/record/123456')){
    console.log(parser.params);
}