OmniAICreator/Qiita-1.07M huggingface dataset:
Google Maps SDK for iOSの使用に関して


# 基本
以下のURLを参考に基本的な使い方は理解できるかと思います。
* [Google Maps SDK for iOSを使う](http://qiita.com/masa2sei/items/50b33cf0a93afe3871ff)
* [Google Maps SDK for iOSの導入手順](http://qiita.com/shu223/items/bfb5ef3e45682c2bb763)
* [Google Maps SDK for iOSの使い方](http://qiita.com/koogawa/items/adc2dd19015586bda39b)
* [Google Maps SDK for iOSでマーカーを配置する](http://qiita.com/myaaaaa_chan/items/ef1790c9c695a74263e0)

# Delegate Method 
よく使用するDelegateに関しては以下を。
[GMSMapViewDelegate 一覧 - [開発] - Google Maps SDK for iOS ](http://www.sachostore.com/2013/03/gmsmapviewdelegate-google-maps-sdk-for.html)

# 現在地を取得する方法
アプリで現在地を取得する際は以下を。
[アプリで位置情報を取得する方法](http://zutto-megane.com/objective-c/post-384/)

# マップ上に図形を描画する方法
## 日本語まとめ
[Shapes](http://sos.hatenablog.jp/entry/2013/08/23/054352)

## 該当箇所公式ドキュメント
* [線の描画](https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_polyline?hl=ja)
* [点をつなぐ](https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_polyline?hl=ja)
* [円の描画](https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_circle?hl=ja)
herokuでRailsとMySQLの組み合わせで動かす


# heroku toolbeltのインストール
https://toolbelt.heroku.com/
herokuコマンドが使用できるようになる。

## CentOSの場合
CentOSの場合、以下でインストール可能。

```
~ wget --no-check-certificate https://toolbelt.heroku.com/install.sh
~ sudo sh ./install.sh
~ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.zshrc
~ source ~/.zshrc

~ heroku --version
heroku-toolbelt/3.10.5 (x86_64-linux) ruby/2.1.0
```

# herokuでアプリケーションの作成を行う

```
~ heroku create app_name
```

# 既存リポジトリをherokuに登録
作成したアプリケーションのgitリポジトリを見て、以下は書き換える。

```
~ heroku git:remote -a app_name
```

# ~/.ssh/configの設定
herokuに接続するためにはconfigの指定が必須です。

```
~ vim ~/.ssh/config
```

```config
Host heroku.com
	User username
	port 22
 	Hostname heroku.com
 	IdentityFile ~/.ssh/heroku_id_rsa
 	TCPKeepAlive yes
 	IdentitiesOnly yes
```

```
~ chmod 600 ~/.ssh/config
```

# herokuへのデプロイ
以下のコマンドでデプロイ

```
~ git push heroku current_branch:master
```

# MySQLの設定
## 初期設定
add-onによりClearDBを追加。後に以下のコマンドにて接続情報を確認。

```
~ heroku config --app applicationID
CLEARDB_DATABASE_URL:        mysql://xxxxxxxxxxxxxxxxxxx@us-cdbr-iron-east-01.cleardb.net/heroku_xxxxxxxxxxxxxxxxxxx?reconnect=true
```

この情報をもとにherokuの環境変数を変更します。

```
~ heroku config:set DATABASE_URL='mysql2://xxxxxxxxxxxxxxxxxxx@us-cdbr-iron-east-01.cleardb.net/heroku_xxxxxxxxxxxxxxxxxxx?reconnect=true'
```


## Migration実行

```
~ heroku run rake db:migrate
```


# ドメインの設定

## herokuにドメインの登録
[Custom Domains](https://devcenter.heroku.com/articles/custom-domains)
こちらを参考に。

```
~ heroku domains:add hoge.com
~ heroku domains:add www.hoge.com
```

## AWS Route53 + S3を使用したドメインの設定
[herokuで独自ドメインをRoute53で設定する](http://kayakuguri.github.io/blog/2014/07/07/heroku-set-domain/)
こちらをそのまま参考に。

以下は公式ドキュメント
[Configuring Amazon Route 53 DNS for your Heroku App](https://devcenter.heroku.com/articles/route-53#naked-root-domain)
EC2の初期設定(メモ)

# インスタンスの作成
[【AWS始めました】EC2インスタンス作成＆最初にしたこと](http://qiita.com/tuboc/items/38da97cb96b2ebc69f88)
こちらを参考に。

# ElasticIP
[Amazon EC2 インスタンスに固定 IP を割り当てる](http://d.hatena.ne.jp/january/20130918/1379457703)
こちらを参考に。

# ログイン後にやること
* 新規ユーザー登録(sudoもたせるならwheelに)
* sshの設定
* sudoの使用をできるようにvisudoの設定
* 時刻設定
```
~ sudo cp /usr/share/zoneinfo/Japan /etc/localtime
```

# 参考
* [【AWS始めました】EC2インスタンス作成＆最初にしたこと](http://qiita.com/tuboc/items/38da97cb96b2ebc69f88)
* [EC2インスタンス(Amazon Linux)の初期設定](http://www.agilegroup.co.jp/technote/ec2-initial-settings.html)
JQueryで自動補完


# 概要
Google検索などでよく使われるAutocompleteをjQueryのAutocomponentで実現します。サジェストする内容に関してはAjaxでGETして取ってきます。

# 実装手順
以下の手順で実装していきます。
1. jQuery Autocompleteを静的コンテンツにて実装
2. 静的コンテンツ部分をAjaxで入力した内容に応じて取ってくる

## JQuery Autocompleteの実装

```html:autocomplete.html
// 以下３ファイルを読み込みます。
<link type="text/css" rel="stylesheet"
  href="http://code.jquery.com/ui/1.10.3/themes/cupertino/jquery-ui.min.css" />
<script type="text/javascript"
  src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript"
  src="http://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>
```

続いて以下のJSを作成します。要素でformのIDを指定してください。

```js:autocomplete.js
  $(function(){
    var data = [
    	'sample1',
    	'sample2',
    	'sample3',
    	'sample4'
    ];
    $('#input_form_id_here').autocomplete({
    	source: data,
      	autoFocus: true,
      	delay: 500,
      	minLength: 2
    });
  });
```

この状態でフォームにsampleと入力すると下に候補でdata変数の中身がでてきます。これで基本形は完成です。続いて、source部分で読み込む部分をajaxを使用して動的に変えていく処理を書いていきます。

## proposalを動的にする

表示する内容を動的にするためにautocomplete.jsを書き換えていきます。

```js:autocomplete.js
$(function(){
    $('#input_form_id_here').autocomplete({
    	source: function( req, res ) {
			$.ajax({
				url: "http://example.com/autocomplete/" + encodeURIComponent(req.term),
				dataType: "json",
				success: function( data ) {
					res(data);
				}
			});
		},
      	autoFocus: true,
      	delay: 500,
      	minLength: 2
    });
  });
```

sourceの部分の書き換え、data部分の消去の２点を行いました。
これで動的に表示されるデータが変わります。

# 参考
* [AutoCompleteウィジェットでオートコンプリート機能付きのテキストボックスを生成するには？](http://www.buildinsider.net/web/jqueryuiref/0017)
* [jQuery UI Autocompleteで候補をAJAXで取得＆スペース区切りで絞り込み](http://www.petitec.com/2011/10/jquery-ui-autocomplete-customize/)
Railsでログの設定＋ローテートを行う


# ログの設定に関して

## ログレベル
Railsのログのレベルは以下の5つがあります。

<table>
<tr>
	<th>レベル</th>
	<th>内容</th>
	<th>値</th>
</tr>
<tr>
	<td>:debug</td>
	<td>すべて書き出し</td>
	<td>0</td>
</tr>
<tr>
	<td>:info</td>
	<td>一般的な情報</td>
	<td>1</td>
</tr>
<tr>
	<td>:warn</td>
	<td>警告</td>
	<td>2</td>
</tr>
<tr>
	<td>:error</td>
	<td>エラー</td>
	<td>3</td>
</tr>
<tr>
	<td>:fatal</td>
	<td>致命的なエラー</td>
	<td>4</td>
</tr>
</table>


## レベルの設定
基本的にはconfig/environments/production.rbといったファイルで設定は行います。

```rb:config/environments/production.rb 
# 以下を追記
config.log_level = :error
```

## 特定メソッド内のみレベルを変更
ある特定の部分だけ表示ログの出力レベルを変更したい場合が有るかと思います。その際は以下のように設定すれば変更することができます。

```rb:users_controller.rb
class UsersController < ApplicationController
  def index
    Rails.logger.level = Logger::DEBUG
  end
end
```

# ログローテートの設定
ログローテートを設定する方法は以下の2つがあります。
1. ログのファイルサイズでのローテート(規定を超えた場合)
2. 日数を指定してローテート
それぞれについて、設定方法を以下で説明していきます。

## サイズでのローテート
10Mを超えた際にproduction.0, production.1というファイルを作成し、５ファイルを超えた場合は古いファイルを削除するコードが以下です。

```config/environments/production.rb
config.logger = Logger.new("log/production.log", 5, 10 * 1024 * 1024)
```

## 日数でのローテート
以下のように設定します。

```config/environments/production.rb
config.logger = Logger.new("log/production.log", 'daily')
```

dailyの部分をweekly, monthlyに変えることで周期を変更することができます。


# 参考
* [ログに書き出すログレベルを変更する](http://rails.hatenadiary.jp/entry/2013/02/06/181430)
* [Railsでログローテーションする方法](http://rails.hatenadiary.jp/entry/2013/02/06/201302)
swiftでiosアプリケーションをバックグラウンドで実行してみた


どうも、iron千葉です。
ぐぐっても、あまり記事なかったので残しておきます。

# 環境
* Xcode6.1.1
* swift

# やりたいこ
iosアプリケーションで、バックグラウンドで処理をしたい。swiftで。
UIApplicationDelegateを利用して、バックグランドで非定期的に処理を実行する。

# バックグラウンドの有効化

バックグラウンド実行の有効化をします。
![全画面_2015_02_11_18_37.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/7c39cc3a-0a63-acfc-3e4b-61acbee8342f.jpeg)

# コード

Appdelegate.swiftに処理を追加します。

```Appdelegate.swift
…略

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

…略

```

アプリ起動時に実行される ***didFinishLaunchingWithOptions***　の中に、バックグランドで実行されるインターバルを指定する。これを指定しないと、バックグラウンド実行は有効にならない。

そして、 ***performFetchWithCompletionHandler*** にバックグラウンドで実際に実行させる処理の内容を書く。
例として、printlnで現在時間をコンソールに出力する処理を書いてます。


```Appdelegate.swift
    func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        let now = NSDate()
        
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
        
        let string = formatter.stringFromDate(now)
        
        println(string)
        completionHandler(UIBackgroundFetchResult.NewData)
    }

```

また、処理が完了したらcompletionHandlerにて、処理の終了ステータスを返す必要があります。

* フェッチ処理にてデータが取得できた場合：UIBackgroundFetchResult.NewData
* フェッチ処理にて更新データがなかった場合：UIBackgroundFetchResult.NoData
* フェッチ処理が失敗した場合：UIBackgroundFetchResult.Faild


# テスト
シュミレータを起動して、動作テストをします。
メニューのDebug　＞　Simulate Background Fetch

日付と時間が出力されます。

![全画面_2015_02_10_23_05.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/ab4801ac-3241-5870-0591-85a48f2d2e9c.jpeg "全画面_2015_02_10_23_05.jpg")

![全画面_2015_02_11_9_23.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/518e662b-7b61-e555-8de0-4c3f058604c2.jpeg "全画面_2015_02_11_9_23.jpg")



# まとめ
と、簡単ですが以上です。
実機で試してないですが、動くはずです。
Rでデータフレームを行ごと・列ごとに処理した結果を再度データフレームに戻す

すぐにわからなかったのでメモ
2つ方法見つけましたが上のほうが簡単かな

```sample.R
df <- data.frame(x=1:3,y=3:5,z=5:7)

# 行ごと
data.frame(t(apply(df, 1, function(d){ c(d, Z=sum(d)) })))
data.frame(do.call(rbind, lapply(split(df, 1:nrow(df)), function(d){ c(d, Z=sum(d)) })))

# 列ごと
data.frame(apply(df, 2, function(d){ c(d, sum(d)) }))
data.frame(do.call(cbind, lapply(df, function(d){ c(d, sum(d)) })))
```

```:結果
> df <- data.frame(x=1:3,y=3:5,z=5:7)
> 
> # 行ごと
> data.frame(t(apply(df, 1, function(d){ c(d, Z=sum(d)) })))
  x y z  Z
1 1 3 5  9
2 2 4 6 12
3 3 5 7 15
> data.frame(do.call(rbind, lapply(split(df, 1:nrow(df)), function(d){ c(d, Z=sum(d)) })))
  x y z  Z
1 1 3 5  9
2 2 4 6 12
3 3 5 7 15
> 
> # 列ごと
> data.frame(apply(df, 2, function(d){ c(d, sum(d)) }))
  x  y  z
1 1  3  5
2 2  4  6
3 3  5  7
4 6 12 18
> data.frame(do.call(cbind, lapply(df, function(d){ c(d, sum(d)) })))
  x  y  z
1 1  3  5
2 2  4  6
3 3  5  7
4 6 12 18
```
mackerelでfluentdのmonitor_agent監視するplugin作った


経緯
-----
[go-mackerel-plugin](https://github.com/mackerelio/go-mackerel-plugin)を使って何か作ってみたかったので、fluentdのretry_countを監視するものを作ってみました。

リポジトリはこちら。
https://github.com/y-matsuwitter/mackerel-fluentd

使い方
------
### インストール
Linux向けのコンパイル済みバイナリを用意してあるのでcurlして権限与えるだけでOKです。

```shell:
$ curl -L -o /path/to/mackerel-fluentd  https://github.com/y-matsuwitter/mackerel-fluentd/releases/download/v0.0.1/mackerel-fluentd.linux
$ chmod a+x /path/to/mackerel-fluentd
```

### 設定
mackerel-agent.confに下記を追記して下さい。

```toml:mackerel-agent.conf
[plugin.metrics.fluentd]
command="/path/to/mackerel-fluentd -host=localhost -port=24220"
```

### サンプル
retry_countが全て0なので見にくいですがこんな感じでメトリクスを取得できます。

![スクリーンショット 2015-02-11 7.49.51.png](https://qiita-image-store.s3.amazonaws.com/0/182/0d958bc9-7f5e-d3a2-9ffb-f299913868ef.png "スクリーンショット 2015-02-11 7.49.51.png")


### 注意点
fluentdの監視にあたり、monitor_agentを経由していますが、ここで得られるpluginのidは、指定がなければ再起動ごとに切り替わります。
より良い監視のためには、fluentdの設定ファイルにて、下記のようにidの指定をお願いします。

```td-agent.conf
<match **>
  id   mystdout
  type stdout
</match>
```

最後に
-------
mackerel使おう。
https://mackerel.io
Ruby - includeして使うモジュールの中でdefine_methodする

モジュールに`attr_accessor`のような、動的にメソッドを定義する機能を持たせたい時の書き方でハマったのでメモしておきます。

通常なら、クラスメソッドを定義したClassMethodsというサブモジュールを作成して、include元のクラスに継承させるのですが、これだと`define_method`が`ClassMethods`のコンテキストで呼ばれるため、include元のクラスにはメソッドが定義されません。

```rb:
module Hoge
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def my_define_method(name)
      define_method(name) do
        # ...
      end
    end
  end
end
```

`class_eval`を使って、include元のクラスコンテキストの中でdefine_methodを呼んだらうまく行きました。

```rb:
module Hoge
  def self.included(base)
    base.class_eval do
      def self.my_define_method(name)
        define_method(name) do
          # ...
        end
      end
    end
  end
end
```

```rb:
class Fuga
  include Hoge
  my_define_method :my_method
end

fuga = Fuga.new
fuga.my_method
```
大学生・研究者のための助成金情報の一覧（前期分）

卒論・修論も終わり、3月ってほとんどなにもないから、そのときに準備しよう。主に昨年の助成金情報の一覧を作成しました。今年もだいたい同じ時期に募集されると思います。

# 通年
## [電気通信普及財団](http://www.taf.or.jp/josei/b04.html)
海外渡航旅費援助(平成26年度)
受付期間: 平成26年4月1日～平成27年2月1日

- お申込みの締め切りは、4月、6月、8月、10月、12月、2月の各1日まで（必着）
- お申込み月の翌月1日から6ヶ月先までに開催される学会への
参加についてお申込み

# 3月 
## [IPA未踏事業](http://www.ipa.go.jp/jinzai/mitou/portal_index.html)
2015年度 未踏IT人材発掘・育成事業
「独自性・革新性があり、将来社会的インパクトを与えイノベーションを創出する可能性を秘めたテーマを実現しようとしている若い逸材（2015年4月1日時点で25歳未満の方）」からのテーマ提案を募集
事前エントリ: 2015年3月16日（月）12:00（正午締切り）

# 4月 
## [村田学術振興財団](http://www.murata.co.jp/zaidan/)
エレクトロニクスを中心とする研究分野に関する研究助成、研究会助成（平成26年度）
平成26年4月11日締切
※平成27年度募集要項は、2015年3月10日頃に掲載

# 5月
## [情報科学国際交流財団](http://www.iisf.or.jp/)
研究者海外派遣助成(平成26年度)

| 対象渡航期間 |	募集締切日 | 結果通知 |
|:-----------:|:------------:|:------------:|
| 平成26年7月1日～平成27年3月31日 | 5月31日 | 6月末頃 |

## [日揮･実吉奨学会](http://www.jgcs.or.jp/index.html)
給与奨学金制度、研究助成制度（大学担当課に問合せ）
毎年4～5月に募集

## [マツダ財団](http://mzaidan.mazda.co.jp/bosyu/science_serach/index.html)
研究助成（平成26年度）
2014年5月30日（金）（必着）

## [中部電気利用基礎研究振興財団](http://www006.upp.so-net.ne.jp/refec/WELCOME.HTM)
海外渡航費援助(平成26年8月～平成27年3月の国際会議)
平成26年5月26日（月）（必着）

# 6月
## [学術振興会特別研究員](http://www.jsps.go.jp/j-pd/pd_sin.html)
DC1、DC2、PD
提出（送信）期限: 平成27年6月2日（火）17:00【厳守】

## [住友財団](http://www.sumitomo.or.jp/)
基礎科学研究助成
2014年度は4月15日から6月30日まで公募

## [カシオ科学振興財団](http://casiozaidan.org/)
研究助成(平成26年度)
募集期間：平成26年4月10日～6月5日

## [日本建設情報総合センター](http://www.jacic.or.jp/jacic-hp/index.php)
研究助成(平成26年度)
応募期限：平成26年6月30日

# 7月
## [井上科学振興財団](http://www.inoue-zaidan.or.jp/)
井上リサーチアウォード

- 自然科学の基礎的研究で博士の学位取得後9年未満のわが国の国公私立大学及び大学共同利用機関に所属（予定を含む）する研究者
- 毎年4月～7月に公募

## [稲盛財団](http://www.inamori-f.or.jp/ja_fd_gra_out.html)

## [大川情報通信基金](http://www.okawa-foundation.or.jp/application/research_grant.html)
研究助成（2014年度）
2014年7月1日（公募終了）
※2015年度の公募は2015年5月頃

# 8月
## [中部電気利用基礎研究振興財団](http://www006.upp.so-net.ne.jp/refec/WELCOME.HTM)
研究助成(平成26年度)
平成26年8月25日（月）（必着）

## [中島記念国際交流財団](http://www.nakajimafound.or.jp/index.html)
海外留学、研究助成(平成26年度)
平成26年8月1日(金)～8月29日(金）

## [矢崎科学技術振興記念財団](http://www.yazaki-found.jp/)
一般研究助成(平成26年度)
応募締切: 平成26年8月31日

## [旭硝子財団](http://www.af-info.or.jp/subsidy/about.html)
研究奨励(平成26年度)
応募締切: 平成26年8月8日

## [栢森情報科学振興財団](http://www.kayamorif.or.jp/j.html)
情報科学に関する研究助成（平成26年度）
平成26年6月1日（日）～8月31日（日）必着

# 研究助成情報一覧
- [研究助成財団：締切り順]
(http://www.aise.ics.saitama-u.ac.jp/~gotoh/LimitOrder.html)
- [研究助成情報 - 東京芸術大学](http://www.geidai.ac.jp/office/kenkyo/kenkyukyoryoku/index.html)
- [外部資金等公募情報 — 大阪大学 - Osaka University](http://www.osaka-u.ac.jp/ja/research/researchinfo)
- [研究助成 - UMIN](http://www.umin.ac.jp/find/)
JSDOMとReact.addons.TestUtilsでReactをヘッドレスにテストする


JSDOMはnode環境でDOMをシミュレートするやつ。React.addons.TestUtilsはReactに同梱されているテストツール。この2つがあわさり最強に見える。


今作ってるライブラリのために、しばらくブラウザ使わずにテストしてたけど、ブラウザ立ち上げる必要なくて非常に快適。これ https://github.com/mizchi/arda/tree/master/test


JSDOM、昔はとにかく不安定な印象だったけど、最近はよくできてる印象。見なおした。


## コード

```coffeescript
# globalにdocumentとwindowを定義することで、DOM環境を参照できるようにする
# 必ずReactの前に読み込むこと
jsdom = require('jsdom').jsdom
global.document  = jsdom('<html><body></body></html>')
# global.window    = document.parentWindow # 追記 jsdom v4.0で parentWindow -> defaultView
global.window    = document.defaultView
global.navigator = window.navigator

# TestUtilsを使うためにreact/addonsを読み込む
React = require 'react/addons'

# 0.13.0-beta.1 以降で使える ES6 Class記法
# ※ 別にReact.createClassでも良いがgetInitialStateになる
class HelloComponent extends React.Component
  constructor: ->
    super
    @state = cnt: 0

  render: ->
    React.createElement 'button',
      className: 'counter'
      ref: 'counter'
      onClick: @onClick.bind(@)
    , 'cnt:'+@state.cnt

  onClick: ->
    @setState cnt: @state.cnt+1

# アサーション
assert = require 'assert'

# renderIntoDocumentはDOMにマウントせずcomponentを生成する
# ただしDOM環境は必要
component = React.addons.TestUtils.renderIntoDocument React.createFactory(HelloComponent)()

assert.equal component.refs.counter.getDOMNode().innerHTML, 'cnt:0'

# クリックをシミュレート
React.addons.TestUtils.Simulate.click component.refs.counter.getDOMNode()

# 再レンダーされているか確認
assert.equal component.refs.counter.getDOMNode().innerHTML, 'cnt:1'

# もう二回ぐらい叩いてみる
React.addons.TestUtils.Simulate.click component.refs.counter.getDOMNode()
React.addons.TestUtils.Simulate.click component.refs.counter.getDOMNode()
# 確認
assert.equal component.refs.counter.getDOMNode().innerHTML, 'cnt:3'

```

実はちょっと前まで動かなったけど、最近動くようになった。

ReactTestUtils.Simulate.click does not work with jsdom · Issue #1185 · facebook/react https://github.com/facebook/react/issues/1185

## 懸念点

jsdom v3.3.1 がまだ io.js v1.1.0でビルドできないので node v0.10を使った。jsdomの初期化、ちょっとだけ時間かかって、テストの実行のたびに0.6秒ぐらい必要。まあPhantomよりは遥かにマシ。

## 参考
- http://www.asbjornenge.com/wwc/testing_react_components.html
- http://facebook.github.io/react/docs/test-utils.html
C++  TCP Client&Server part1【boost::asio】

# 始めに
低レイヤーの事は他のページみてください
TCP/IP、バークレーソケット等を知らなくてもいい前提でなるべくかきます
毎週１記事、勉強した事をQiitaに書き留めるので
間違っている部分あれば マサカリお願いします！


# 環境
## IDE
MacでCLionを使っています。ので CMakeです。
他のmakeでも動きますが、今のうちにCMakeに慣れておくと良いと思います
（私もCMakeは初めてです）

## boost
現時点で最新のboost1.57.0 を使ってます。他のバージョンでもだいたい大丈夫と思います
Homebrewなりportsなりaptなりでインストールしてもいいと思います
私はソースからインストールしました
$ cd BOOSTのルート
$ ./bootstrap.sh
$ ./b2 install --prefix=ライブラリパス
で終わり。簡単です。
--prefixを省略すると /usr/local/lib　以下に作成されます


# サーバー側ソース
```cpp:server.cpp
#include <iostream>
#include <boost/asio.hpp>

using namespace std;
using namespace boost::asio ;

static const int PORT_NO = 8080;

int main() {

    boost::asio::io_service     io;


    while(true) {

        ip::tcp::iostream           buf;
        ip::tcp::acceptor           accept( io, ip::tcp::endpoint(ip::tcp::v4(), PORT_NO ));
        accept.accept(*buf.rdbuf());

        std::string temp;

        while (true) {
            buf >> temp;
            if (temp == "quit") {
                buf << ">>bye" << std::endl;
                break;
            }
            buf << ">>" << temp << std::endl;
        }
    }

    return 0;
}
```

```cmake:cmake
cmake_minimum_required(VERSION 2.8.4)
project(asio1)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_HOME_DIRECTORY}/bin")
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_HOME_DIRECTORY}/bin")

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
include_directories(${Boost_INCLUDE_DIRS})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)



find_package(Boost 1.57.0 COMPONENTS system)
if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(asio1 ${SOURCE_FILES})
    target_link_libraries(asio1 ${Boost_LIBRARIES})
endif()
```

localhostの PORT_NOポートに 文字列を送ると同じ文字列を返す
echoサービスです
"quit" を送るとクライアントは終了する
再び接続出来る

実行して telnetで動作確認してみます

```bash:telnet
miyatake_y$ telnet -4 localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
yahoo
>>yahoo
hoge
>>hoge
moge
>>moge
quit
>>bye
Connection closed by foreign host.
```

正常に動きましたね！

クライアントソースは省略します（telnetで確認できるので）


上記のプログラムは
最も基本的な（実践ではあまり使わない）シングルスレッドモデルです
試しに複数telnetから接続しても ２つ目以降は接続できません
これをマルチスレッドにすれば、非同期通信が出来ますが
リソースの問題、コンテキストスイッチの問題等のため
ReactorパターンやProactorパターンを使う事が多いです


次は Proactorパターンを実装してみたいと思います。
OpenMP プログラムのマルチコアプロセッサへのスレッド割当

### 概要
 OpenMP プログラムをマルチコアプロセッサで実行する場合に、どのスレッドをどの物理コアに割り当てるかを手動で制御する方法についてのメモ。

 昨今の SMT なプロセッサであれば、物理コア 1 つに対して複数の論理コアを備えているように見えるため、意識しないと、マルチコアプロセッサで別の物理コアがあるにもかかわらず、複数のスレッドが同じ物理コアに割り当てらてしまうことがあるようです。割り当て方法については掘り下げませんが、別の物理コアが余ってるならそちらに振り分けたい！ということで。

（追記）OMP_PLACES の挙動が Intel OpenMP Runtime Library と GOMP で違うっぽいので別々に分けました。。。

### OMP_PLACES を使った方法
 環境変数 OMP_PLACES でスレッドIDと物理コアの関連付けを指定できます。物理コア内は中括弧で記述します。例えば、

 `export OMP_PLACES="{0,1},{2,3}"`

であれば、CPU0 にスレッド0とスレッド1が、CPU1にスレッド2とスレッド3が割り当てられます。

 `export OMP_PLACES="{0,2},{1,3}"`

であれば、CPU0 にスレッド0とスレッド2が、CPU1にスレッド1とスレッド3が割り当てられます。2スレッドでプログラムを動かす場合、後者の方が性能がよい場合が多いです。

 実行時に指定してももちろんOK
 `OMP_PLACES="{0,2},{1,3}" <exec_prog>`

### GOMP_CPU_AFFINITY を使った方法 (GOMP)
GCC の OpenMP 実装 (GOMP) は OMP_PLACES が上記のように動いていない気がするので、GOMP_CPU_AFFINITY を使うほうがよさげです。CPU0 にスレッド0とスレッド2を、CPU1にスレッド1とスレッド3を割り当てる場合は以下のとおり。

 `GOMP_CPU_AFFINITY="0,2 1,3" <exec_prog>`

### 参考資料
 OMP_PLACES 自体は OpenMP の仕様（[OpenMP 4.0 Complite specification](http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf) p.241）に書いてあったりします。指定の記法は他にもいろいろあるみたい。実際の振る舞いは実装依存のようなので、ランタイムによっては未実装だったり、うまくいかない場合もあるかもしれません。私は Intel OpenMP Runtime Library で動作を確認しています。
Gradleには設定ファイルがいっぱい

gradle便利ですね。でもgradle界隈の人が言うほど簡単じゃない・・・。
gradleは柔軟な代わりにいろいろ設定の書き方があって混乱するので整理してみました。

## 基本的な構成

```
myproject/
├── build.gradle
├── gradle.properties
└── settings.gradle
```

build.gradleも設定ファイルといえば設定ファイルなのですが、ここではbuild.gradleの外のものを設定ファイルとして書き連ねることにします。

## init.gradle

初期化スクリプトで、[Gradleオブジェクト](http://gradle.monochromeroad.com/docs/dsl/org.gradle.api.invocation.Gradle.html)に対するなにがしかを行うものだそうです。
今のところそんなに興味がないのでリンクを貼るだけで終わります。

* http://gradle.monochromeroad.com/docs/userguide/init_scripts.html

## settings.gradle

設定スクリプトで[Settingsオブジェクト](http://gradle.monochromeroad.com/docs/dsl/org.gradle.api.initialization.Settings.html)に対するなにがしかを行うものだそうです。
ほとんどマルチプロジェクト用の設定ファイルと考えて良さそうです。
ルートプロジェクトの直下に置きましょう。

* http://gradle.monochromeroad.com/docs/userguide/multi_project_builds.html
* [Gradleでマルチプロジェクト](http://qiita.com/shiena/items/371fe817c8fb6be2bb1e)

## gradle.properties

これが一番使えるやつかと。
設定が効く強さは```ユーザーホームディレクトリのファイル＞プロジェクト直下のファイル```という順序です。

いわゆるpropertiesファイル形式で、こんなかんじです。

```properties:gradle.properties
hoge.fuga=hogehogefugafuga
piyo=piyopiyo
```

ただ若干クセがあります。
下記は正常に処理されますが、

```groovy:build.gradle
task hoge << {
  println "value:${piyo}"
}
```
下記はNGです。

```groovy:build.gradle
task hoge << {
  println "value:${hoge.fuga}"
}
```

このように書く必要があります

```groovy:build.gradle
task hoge << {
  println "value:" + getProperty("hoge.fuga")
}
```

なんでだろ・・・

## apply from で好きなファイルを取り込める

```:ディレクトリ構造
myProject
├── build.gradle
└── settings
    └── confA.gradle
```

```groovy:build.gradle
apply from: "settings/confA.gradle"

task hoge << {
  println "value:${nanika}"
}
```

```groovy:settings/confA.gradle
ext {
  nanika="なにか?"
}
```

* groovyスクリプトで記述できるのでIF文を入れたり柔軟にできます。
* ext {...} ブロックを使用する必要があります。

## 設定ファイルじゃないけど・・・

### -Pオプション

コマンドラインから前述の```gradle.properties```ファイルと同じことができます。

```shell-session
$ ./gradlew hoge -Phoge.fuga=commandline
```

```gradle.properties``` と被った場合にはこちらのほうが強いです。

### -Dオプション

```shell-session
$ ./gradlew hoge -Dhoge.fuga=commandline
```
-Pオプションと違ってJVMのプロパティになります。
build.gradle内で参照するためのものではなく、その目的は-Pを使ってくれと。
(System.getProperty("hoge.fuga")で参照はできるんだろうけど・・・素直に-Pがいいと思われ）

### 環境変数

```ORG_GRADLE_PROJECT_piyo=envpiyo``` は ```-Ppiyo=envpiyo``` と同じ意味です。
環境変数名に.(ドット)は使えないので ```ORG_GRADLE_PROJECT_hoge.fuga=envvv```というのはできないっぽいです。

### ext{...}ブロック

```apply from``` のところでも登場していますが、これはbuild.gradleの中に書いてもいいです。
その実態は[ExtraPropertiesExtensionオブジェクト](http://gradle.monochromeroad.com/docs/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html)です。

これも癖があって、

```groovy
ext {
  hoge.fuga="extで設定したよ"
}
```

これはエラーになります。

```groovy
ext {
  set("hoge.fuga","extで設定したよ")
}
```

これなら出来るんだけどタスクの中で ext.get("hoge.fuga")で取り出せるのかと思ったら怒られた・・・

----

ということで、

* gradle.properties
* apply from で取り込む
* -Pで指定
* 環境変数で指定

この辺りじゃないかなと思います。
MTOS(MovableType 5.2.x)のソースコードを読む(2)

前回の記事はこちら　[MTOS(MovableType 5.2.x)のソースコードを読む(1)](http://qiita.com/DQNEO/items/b8e6e85f375ac224076f)

# mt.psgiの2行目

```perl:mt.psgi
use strict;
use lib $ENV{MT_HOME} ? "$ENV{MT_HOME}/lib"    : 'lib';
```

今回は2行目を読み解きます。

## use libとはなにか？
`perldoc lib`によると、

```
 Adding directories to @INC
    The parameters to "use lib" are added to the start of the perl search path. Saying

        use lib LIST;

    is almost the same as saying

        BEGIN { unshift(@INC, LIST) }
```
とのことで、「@INCにディレクトリを追加する機能」だと雑に理解しておけばよいでしょう。

で、何を追加しているのか。

```perl
$ENV{MT_HOME} ? "$ENV{MT_HOME}/lib"    : 'lib';
```

この三項演算子が返す値は何でしょうか？
`$ENV{MT_HOME}`にはどんな値が入っているのでしょうか？

デバグしてみましょう。
モダンなデバグ手法を知らないので、おとこは黙ってwarnデバグです。

```mt.psgi
#!/usr/bin/env perl
use strict;
use Data::Dumper;
warn Dumper $ENV{MT_HOME};
```

実行

```
$ plackup
$VAR1 = undef;
```

$ENV{MT_HOME}はundefでした。
ということは、

```perl
use lib $ENV{MT_HOME} ? "$ENV{MT_HOME}/lib"    : 'lib';
```
は
```
use lib 'lib';
```
と評価されていることになります。

use libに相対パスを渡した場合はどうなるのでしょうか？
@INCに相対パスを追加したのと同じことになるので、これはおそらくplackupを実行したときのカレントディレクトリからの相対指定になるのでしょう。

つまり、これ https://github.com/movabletype/movabletype/tree/mt5.2.11/lib を@INCに追加したのと同じことになるのではないかと思います。

では実際に確かめてみましょう。
まずmt.psgiを書き換えて、

```mt.psgi
#!/usr/bin/env perl
use strict;
use MT;
```
実行

```
$  plackup
Error while loading /Users/DQNEO/blog/mt/app.psgi: Can't locate MT.pm in @INC (you may need to install the MT module) (@INC contains: /Users/DQNEO/.plenv/versions/5.20.1/lib/perl5/site_perl/5.20.1/darwin-2level /Users/DQNEO/.plenv/versions/5.20.1/lib/perl5/site_perl/5.20.1 /Users/DQNEO/.plenv/versions/5.20.1/lib/perl5/5.20.1/darwin-2level /Users/DQNEO/.plenv/versions/5.20.1/lib/perl5/5.20.1 .) at /Users/DQNEO/blog/mt/app.psgi line 10.
```
うむうむ。( ˘ω˘)"
予想どおりです。`./lib`を見ていないので`MT.pm`が見つからないとのこと。

では`use lib 'lib'`してみましょう。

```mt.psgi
#!/usr/bin/env perl
use strict;
use lib 'lib';
use MT;
```
実行

```
$ plackup
PSGI app should be a code reference: undef at /Users/DQNEO/.plenv/versions/5.20.1/lib/perl5/site_perl/5.20.1/Plack/Middleware/Lint.pm line 13
```

コンパイルエラーが消えました   ₍₍⁽⁽(ી(ˇωˇ)ʃ)₎₎⁾⁾

予想どおり、`use lib 'lib'`によって、`lib/MT.pm`がちゃんと読み込まれたようです。

なんと、連載第２回目は2行目のソースコード解読するだけで終わってしまいました

MTのソースコードは28万行くらいあるのであと28万回連載が続くかもしれません。
お楽しみに。(つづく）
小さなお友だちの為の　MacOsXでBASIC #6 関数で円を描く


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#コード
第一象限から順次描画しています。

##06.BAS

```basic:06.BAS
10 DEF f(x)=  SQR(16-x^2)
20 SET WINDOW -8,8,-8,8
30 DRAW GRID
40 FOR x=0 TO 4 STEP 0.001
50    PLOT LINES: x, f(x)
60 NEXT x
70 FOR x=0 TO 4 STEP 0.001
80    PLOT LINES: x, -f(x)
90 NEXT x
100 FOR x=-4 TO 0 STEP 0.001
110    PLOT LINES: x, f(x)
120 NEXT x
130 FOR x=-4 TO 0 STEP 0.001
140    PLOT LINES: x, -f(x)
150 NEXT x
160 END
```

##実行結果
おお！きれいに描画できてます。（x軸でちょっと切れてます。）
![スクリーンショット 2015-02-11 2.24.41.png](https://qiita-image-store.s3.amazonaws.com/0/33317/649a39cb-d6ae-1111-5251-7eead6b5ba3f.png "スクリーンショット 2015-02-11 2.24.41.png")
はじめから覚えるGitコマンド


Gitのコマンドを，ワタシが覚えた順に記載していきます。
デザイナーさんとか生粋のエンジニアでない人でも，この順番でコマンドを覚えていけば，周囲に迷惑をかけず，かつ最低限便利にGitをつかえるハズです。

## 最初に知っておかねばいけない概念  

まずはこれらの言葉を理解しておきましょう。ざっくりとしたイメージが持てれば十分です。

・リポジトリ
　ファイルやディレクトリの変更履歴が保存されているところ。ローカルとリモートに存在しています
　
・ローカル 
　自分のPCのことです。自分のPC（ローカル）のリポジトリに，まずは変更履歴を保存していきます。

・リモート
　いろんな人がファイル等の変更履歴を保存するところ。リモートにあるリポジトリとローカルのリポジトリを同期することよって，自分の成果物を他人と共有したり，逆に他人の成果物を取得してきたりできます。

・ブランチ
　Gitをつかっていくうちに，変更履歴を分岐させて保存させたい場面が出てきます。たとえば，ある時点でのデータを残したまま，実験的にデータを改変していきたいときです。このような場合に，変更履歴を枝分かれさせ，元のデータを残しておく部分と，実験的にデータを改変しておく部分とに分けることができます。
　この分岐したそれぞれの変更履歴のことをブランチ（枝）と呼びます。
　ブランチは，いつでも合流させることができますし，さらに細かくブランチを切っていくこともできます。
　
## Gitコマンドを使ってみる

### なにはなくともpull

設定がひととおり終わったら，まずはpullをしてみましょう。pullを行うことで，最新のファイルを自分のPC（ローカル）に取得することができます。

```
git pull
```

他人の成果物をもらってくるだけですから，pullだけしている分には誰にも迷惑をかけません。気兼ねなくpullして，最新情報をガンガン取得してみましょう。

それから上記のコマンド，実は省略形です。
「どのリモート」の「どのブランチ」からファイルを取得するかを指定して書くこともできます。

```
git pull "リモート名" "ブランチ名"
```

例えば，よく使うのはこんな書き方でしょうね。

```
git pull origin master
```
いろんなブランチからpullしてこようとすると，問題が起こることもあるので，pullの後にブランチ名を指定するときは注意しましょう。どのブランチから取得すれば問題ないのかは，それぞれの環境によって異なります。担当者に確認してみてください。

### branchを切ってcheckout  

さて，リモートから最新の情報をpullしてきたら，今度は自分でファイルを更新していきましょう。pullしてきたブランチ（先ほどの例でいうとmaster)は，そのままの状態で保持しておき，自分の作業結果を保存しておくための別のブランチを切っておくことにします。

```
git branch "ブランチ名"
```
これで新しいブランチができます。

```
git checkout "ブランチ名"
```
これでブランチを移動することができました。リモートからpullしてきたmasterブランチの内容はそのまま保持されているので，気兼ねなく作業ができます。


### addしてcommit

ここからはGitの肝とも言える部分です。自分の作業結果を，Gitに保存してみることにしましょう。
ポイントは，作業結果の保存が，以下のように二段階に別れているということです。

- 第一段階：自分が変更したファイルを，Gitの監視対象として追加する
- 第二段階：監視対象のファイルのうち，特定のファイルをGitの変更履歴に保存する  

この，第一段階で使うコマンドが"add"，第二段階で使うコマンドが"commit"です。

ではまず，自分が新たに作成・更新したファイルを，Gitの監視対象にしてみましょう。コマンドは以下のとおりです。

```
git add "変更するファイルのパス"
```
もし，"変更するファイルのパス"がわからないのなら，以下のコマンドを使いましょう。

```
git status
```

"Untrackd files:"と表示されたところに，Gitの監視対象になっていないファイルのパスが表示されているハズです。これをコピペして，対象ファイルをaddします。

次に，addされたファイルの変更履歴を保存します。

```
git commit
```

これで保存完了。複数のファイルをaddしておけば，全てのファイルの変更がまとめて保存されます。


### 意を決してpush!

ラストです。最後はリモートに，自分の作業結果を反映させてみましょう。
ここで注意が必要なのは，リモートのどのブランチに作業結果を反映させるのか，ということです。
たとえば，先ほどのpullの説明ででてきたmasterというブランチは，作業者全員が共有しても問題ないことが確認済みのファイルだけが保存されていることが多いです。
もし，あなたが作成・変更したファイルにミスがあり，大きなバグが仕込まれていた場合，これをこのままリモートのmasterブランチに保存してしまうと，他の作業者に多大な迷惑をかけてしまいます。
そこで，いきなりmasterブランチに作業結果を保存するのではなく，まずは別のブランチに保存するのがよいと思います。
具体的なコマンドは以下のようになります。

```
git push "リモート名" "保存先のブランチ名"
```

これで作業結果がリモートに保存されました。

## 最後に
これでGitの基本的なコマンドの説明は終わりになります。正確さよりもわかりやすさ重視で書いてあるので，ある程度慣れてきたら，もう少し詳しい解説を探して読んでみるとよいでしょう。mergeとかfetchとか，知らなければいけないコマンドは他にもたくさんあるので。
map, unordered_map のキーとして shared_ptr<MyClass>を使う

std::map, std::unordered_map のキーとして std::shared_ptr\<MyClass>を使うと、そのままではポインタ同士の比較になってしまいます。
それでは不都合で、比較関数やハッシュ関数をカスタマイズしたいということも多いかと思います。
そのような場合、std::less(mapの場合)やstd::hash, std::equal_to(unordered_mapの場合)を std::shared_ptr\<MyClass> に対して特殊化する必要があります。

__前提として、MyClass は operator<() や operator==(), hash() を持っているとします。__

以下のようになります。

std::mapの場合:

```cpp
namespace std {
template <>
struct less<shared_ptr<MyClass>>
{
  bool operator()(const shared_ptr<MyClass> &a, const shared_ptr<MyClass> &b) const {
    return *a < *b;
  }
};
}
```

std::unordered_mapの場合:

```cpp
namespace std {
template <>
struct hash<shared_ptr<MyClass>>
{
  size_t operator()(const shared_ptr<MyClass> &ptr) const {
    return ptr->hash();
  }
};
template <>
struct equal_to<shared_ptr<MyClass>>
{
  bool operator()(const shared_ptr<MyClass> &a, const shared_ptr<MyClass> &b) const {
    return *a == *b;
  }
};
}
```

std::set や std::unordered_set の場合も同じです。

関数のシグニチャが間違っている（const が足りないなど）と使われないままになるので、よく確認してください。
[iOS]UITableViewで中身のないセルの下線を消す

フッターを上書きしてしまえば消える。

```swift
tableView.tableFooterView = UIView()
```

しかしそう簡単には行かない時もあります。`tableFotterView`にはプロパティが設定されていて、これに値を代入すると表の要素数やら何やらが再計算されます。つまり、UITableViewのカスタムクラスを操作したいときに`awakeFromNib`などで上記のコードを実行すると、表示したいデータの個数がまだ分からなくて死ぬことがあるかもしれないということです。

このバグを発見した時はiOSの闇を垣間見たような気分でいましたが、回避するのは案外簡単で、

```swift
func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
	return UIView()
}
```

という関数をデリゲートクラスに実装すればOKです。よく考えたらヘッダーの処理と対象になっていなければおかしいので、これが素直な実装ということになりますね。
MTOS(MovableType 5.2.x)のソースコードを読む(1)

MTOS(=MovableType v5.2.x)のソースコードを読んでいきます。

目的は、MTを自分で改造できるようになることです。

ソースはこちら
https://github.com/movabletype/movabletype/tree/mt5.2.11

## 準備
あらかじめ plenv + perl-build + cpanmで環境を整えておきます。
perlのバージョンは現時点の最新版(5.20.1)を使います。

## エントリポイントはmt.psgi

MTをPlackで起動する場合、mt.psgiが全てのスタート地点になります。
起動する最も簡単な手順はこう。

```
$ plackup mt.psgi
```

私は`mt.psgi`と`app.psgi`(MTには存在しない)をよく混同してしまうので、いっそのことシムリンクをはって`app.psgi`という名前で起動することにしました。

```
$ ln -s mt.psgi app.psgi
```
こうすればplackup時にpsgiファイル名を省略できます。

```
$ plackup
```

## mt.psgiを読む

https://github.com/movabletype/movabletype/blob/mt5.2.11/mt.psgi

```perl:mt.psgi
#!/usr/bin/perl

# Movable Type (r) Open Source (C) 2001-2013 Six Apart, Ltd.
# This program is distributed under the terms of the
# GNU General Public License, version 2.
#
# $Id$

use strict;
use lib $ENV{MT_HOME} ? "$ENV{MT_HOME}/lib"    : 'lib';
use lib $ENV{MT_HOME} ? "$ENV{MT_HOME}/extlib" : 'extlib';
use MT::PSGI;
my $app = MT::PSGI->new()->to_app();
```

## 1行目のshebangを読み解く

```perl
#!/usr/bin/perl
```

system perlだと・・・？
plackup(~/.plenv/shims/plackup)から起動してるのでこのshebangは効いてないのでは？
確認してみましょう。

2行目にdieを仕込みます。

```perl:mt.psgi
#!/usr/bin/perl
die "my perl is $^X";
```

ちなみにこの`$^X`(発音がわかりませんw)は、実行中のPerlバイナリのフルパスを表示する変数のようです。
@lestrrat 先生に教えていただきました。
https://twitter.com/lestrrat/status/564708982061666305
ありがたやありがたや。

そしてplackup

````
$ plackup
Error while loading /Users/DQNEO/blog/mt/app.psgi: my perl is /Users/DQNEO/.plenv/versions/5.20.1/bin/perl5.20.1 at /Users/DQNEO/blog/mt/app.psgi line 2.
```

my perl is **/Users/DQNEO/.plenv/versions/5.20.1/bin/perl5.20.1** 
と表示されています。
やはりshebangは効いていないようです。
まぎらわしいので`#!/usr/bin/env perl`に書き換えてしまうことにします。

```diff
- #!/usr/bin/perl
+ #!/usr/bin/env perl
```

これで見た目と挙動が一致するようになりました。

なんと、記念すべき第一回目はソースコードを1行読むだけで終わってしまいました・・・！
(つづく)
Playframeworkのフォームで良く使うバリデーション


Playframeworkでフォームを扱うときに、個人的に良く使うバリデーションのまとめ。
ただ制約など書き方が複数あるものは、良く使う１パターンのみ書きます。

複雑なフォームを定義しない限り、ここにあるもので大体カバーできると思う。


# 種類
文字とか数値とか

```Scala
case class MyForm(name:String, age:Int)

val myForm = Form(
	mapping(
		// 文字列
		"name" -> text,	
		// 数値
		"age" -> number	
	)(MyForm.apply)(MyForm.unapply)
)
```

# 制約
長さとかパターンとか

```Scala
case class MyForm(naem:String, handleName:String, age:Int, email:String)

val emailPattern = Constraints.pattern("[\\w\\d_-]+@[\\w\\d_-]+\\.[\\w\\d._-]+".r)

val myForm = Form(
	mapping(
		// 必須
		"name" -> nonEmptyText,
		// 文字数 (3文字以上、７文字以下)
		"handleName" -> text(minLength = 3, maxLength = 7),
		// 最大最小 (最小:0、最大:100)
		"age" -> number(min = 0, max = 100),
		// 正規表現 (メールアドレス)
		"email" -> text.verifying(emailPattern)
	)(MyForm.apply)(MyForm.unapply)
)
```

# 入力値の一致確認
パスワードとパスワード(確認)とか


```Scala
case class MyForm(password:String)

val myForm = Form(
	mapping(
		// password1とpassword2が一致すること
		"password" ->
        	tuple(
          		"password1" -> nonEmptyText,
          		"password2" -> nonEmptyText
        	).verifying(passwords => passwords._1 == passwords._2)
	)(MyForm.apply)(MyForm.unapply)
)
```


# 複数のバリデーション
制約を複数つける

```Scala
case class MyForm(password:String)

val halfWidthAlphaNum = Constraints.pattern("[a-zA-Z0-9]+".r)

val myForm = Form(
	mapping(
		// password1とpassowrd2が一致、かつ、半角英数字
		"password" ->
        	tuple(
          		"password1" -> nonEmptyText,
          		"password2" -> nonEmptyText
        	).verifying(passwords => passwords._1 == passwords._2).verifying(halfWidthAlphaNum)
	)(MyForm.apply)(MyForm.unapply)
)
```



# デフォルト値
入力あればその値、無かったらデフォルト値

```Scala
case class MyForm(year:Int, month:Int)

val myForm = Form(
	mapping(
		// デフォルト値: 2015
		"year" -> default(number, 2015)
		// 最小:1、最大:12、デフォルト値: 1
		"month" -> default(number(min = 1, max = 12), 1)
	)(MyForm.apply)(MyForm.unapply)
)
```

# 省略
あったら使うし、無かったら使わない

```Scala
case class MyForm(comment:Option[String])

val myForm = Form(
	mapping(
		// 省略可、文字数140文字以下
		"comment" -> Option(text(maxLength = 140))
	)(MyForm.apply)(MyForm.unapply)
)
```
Visual Studio のデバッガで文字列を UTF-8 で表示させる

Visual Studio のデバッガでウォッチ式のカスタマイズができることはよく知られています。
例えば、次のサイトなどに詳しく書かれています。

[ウォッチをより便利に使う10の書式](http://srz-zumix.blogspot.jp/2014/01/visual-studio-10.html)


しかし、クラスメンバとして含まれているもののような場合、いちいち指定するのは面倒です。
例えば、デフォルトでローカルエンコーディング(CP932)で表示されてしまう非Unicode文字列をすべてUTF-8で表示させたいということがあると思います。
このような場合、Natvis ファイルによってカスタマイズが可能です。

[Create custom views of native objects in the debugger](https://msdn.microsoft.com/en-us/library/jj620914.aspx)

例えば、文字列を UTF-8 で表示させたい場合、%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers\stl.natvis の以下の部分で、"\_Bx.\_Buf,s" を "_Bx.\_Buf,s8" に変更します。


```xml
<Type Name="std::basic_string&lt;char,*&gt;">  
    <DisplayString Condition="_Myres &lt; _BUF_SIZE">{_Bx._Buf,s}</DisplayString>  
    <DisplayString Condition="_Myres &gt;= _BUF_SIZE">{_Bx._Ptr,s}</DisplayString>  
    <StringView Condition="_Myres &lt; _BUF_SIZE">_Bx._Buf,s</StringView>  
    <StringView Condition="_Myres &gt;= _BUF_SIZE">_Bx._Ptr,s</StringView>  
```

Visual Studio を再起動すると適用されます。

この記事は、以下の記事を参考にしました。

[Visual Studio 2010/2013 string对UTF8的支持总结](http://dewei.iteye.com/blog/1941099)
Lisp入門メモ

見てるページ
[Lisp入門](http://wisdom.sakura.ne.jp/programming/lisp/)

#基本演算

```cl
>(+ 10 20)
30
```

#代入

```cl
>(setq x 10)
10
```

#特別式
`setq` は言語仕様上は関数ではなく **特別式** と呼ばれる.
(関数とは違う振る舞いをするから)
##quote識別子

```cl
> (quote var)
```

varを記号型にする.
記号型:=変数みたいなもの
`(setq x 10)` はできるけど, `(set x 10)` はできない.
`set` のときは,引数に記号型を渡さなければならない.

ということで, `(set (quote x) 10)` とすればいい.
'(set 'x 10)' も可.

# リスト
配列とは違うけど似てる

```cl
>(list 1 2 3 4 5)
(1 2 3 4 5)

>(list (list 1 2 3) (list 10 20 30) 100 200 300)
(1 2 3) (10 20 30) 100 200 300)
```

`(1 2 3)` は,関数1と引数2 3と評価されてしまう
評価しないようにするには, `'(1 2 3)` とすればいい.

```cl
> (setq x 10 y 20 z 30)
30
> x
10
> (list x y z)
(10 20 30)
> '(x y z)
(X Y Z)
```

## リストの操作
**car**  *list*
リストの先頭を取得
**cdr**  *list*
先頭以外を取得
**cons** *addValue* *list* 
先頭にデータを追加

```cl
>(setq x '(10 20 30))
(10 20 30)

>(car x)
10

>(cdr x)
(20 30)

>(car (cdr x))
20

>(cons 5 x)
(5 10 20 30)
```

##リストの長さ
**length** *seqence*
要素がないリストを `nil` と表記する.

#すべてはリスト
`(+ 10 20)` も,正体はリスト

##リストを評価(実行)する
**eval** *form*

```cl
>(setq add '(+ x y))
>(setq x 10 y 20)
>(eval add)
20
```

#比較演算
多項比較できる

```cl
>(< 1 2 3)
T
>(< 1 2 2)
F
```

#if文
これも特別式

```cl
(if (< x y) (setq z 20))
```

##progn 特別式
ifによって,複数の式を評価するときにつかう

```cl
>(if (< 1 2) (setq x 10) (setq y 20))
10
>x
10 ;動く
>y
error ;動かない
```

```cl
>(if (< 1 2) (progn (setq x 10) (setq y 20)))
20
>x
10
>y
20
```

whenとかunlessっていうマクロもある

##else ifのようなもの

```cl
(cond
    ((= x y) (setq z 1))
    ((< x y) (setq z 2))
    ((> x y) (setq z 3))
)
```

##switchのようなもの

#gotoのようなもの
2つのテキストファイルを join コマンドで結合する


csvファイルのある列をキーにjoinしたいときってありますよね？
データベース使えばすぐなんだけど，ファイルだけでできないのかなーと思って調べたところ join コマンドが便利そうだったのでメモです．


# 元ファイル

こんな感じのファイルがあるとします．2つのファイルを結合して加工したいときってありますよね！！！！

```a.txt
100,a
200,b
400,c
```

```b.txt
200,x
300,y
500,z
```

# join コマンド！！！

## 内部結合（INNER JOIN）

```bash
$ join -t, a.txt b.txt
200,b,x

（明示的にした場合）
$ join -t, -1 1 -2 1 -o 0 1.2 2.2 a.txt b.txt
200,b,x
```

`-t`は，デリミタ（区切り文字）です．```-1, -2``` は結合の条件で，SQLでいう INNER JOIN ON `〜` の条件式にあたります．`-1` は，a.txt でキーとする列，`-2` はb.txtでキーとする列です．

`-o` は出力する列番号を指定します．`1.2` は1つ目のファイル（a.txt）の2列目を表示せよという意味になります．`0` を指定するとjoin条件としたキーを表示します．

## 外部結合（LEFT OUTER JOIN）

内部結合できるなら外部結合ももちろんできます．

```bash
$ join -t, -a 1 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' a.txt b.txt
100,a,NULL
200,b,x
400,c,NULL
```

`-a` は `-1, -2` でマッチしなかった行も表示させよという意味になります．`-a` のあとにはファイル番号を指定することになります． 

具体的には `-a 1` だと左外部結合(LEFT OUTER JOIN)，`-a 2`だと右外部結合(RIGHT OUTER JOIN)になります．


## 完全外部結合（FULL OUTER JOIN)

滅多に使うことないけど，使いたくなるよねー．ということで，これは `-a` を2つとも指定することでできます．

```bash
$ join -t, -a 1 -a 2 -1 1 -2 1 -o 0 1.2 2.2 -e "NULL" a.txt b.txt
100,a,NULL
200,b,x
300,NULL,y
400,c,NULL
500,NULL,z
```

## 交差結合（CROSS JOIN）

互いのファイルのすべての行の組み合わせですね．
ちょっと試そうとしたんですが，すぐにでてこなかったので今回は省略．どなたか教えて偉い人！


# さいごに

シンプルな結合ならRDBMSなんていらなかったんや！
unboundでアクセス元によって名前解決応答を変更する

##概要
bindの脆弱性対応に心底疲れたので、unboundを試してみようと思った。
調べたところ、unboundではbindのviewに相当する機能は実装されていない。
確かにキャッシュサーバには必要のない機能かもしれない。
しかし諸事情でアクセス元によって応答を変更したかったのでpython-scriptで実現できるか試してみた。

##unboundに下記の動作をさせる
1. 特定のNWからの private.com ドメインへの問い合わせは、プライベート用の権威サーバへ問い合わせ(テストの為、8.8.8.8を使用)
2. 特定のNW外からの private.com ドメインへの問い合わせは、NXDOMAINを応答
3. private.com ドメイン以外の問い合わせは、普通に名前解決

##python-scriptがすること
1. アクセス元NWの判定
2. 問い合わせドメインの判定
3. プライベート用ドメインの名前解決が成功した場合は、TTLを0で応答  
   (キャッシュに載ってしまうとpython-scriptが効かなくなる為)

##動作マトリックス

|アクセス元|問い合わせドメイン|unboundの動作|
|:--|:--|:--|
|プライベートNW|private.com|8.8.8.8に再帰問い合わせし、TTLを0で応答|
|プライベートNW|yahoo.co.jp|yahoo.co.jpの権威サーバに非再帰問い合わせ|
|外部NW|private.com|NXDOMAINを応答|
|外部NW|yahoo.co.jp|yahoo.co.jpの権威サーバに非再帰問い合わせ|

##unboundの設定
pythonモジュールの設定

```/etc/unbound/unbound.conf
server:
	module-config: "validator python iterator"
python:
	python-script: "/var/unbound/private-check.py"
```

stubゾーンの設定

```/etc/unbound/conf.d/ma3ki.net.conf
stub-zone:
	name: private.com
	stub-addr: 8.8.8.8
```

プライベートドメインリスト

```/var/unbound/private-domain.list
private.com.
```

プライベートNWリスト

```/var/unbound/private-network.list
175.177.0.0/16
```

##privateネットワークからのアクセステスト
175.177.36.124 から unbound へ名前解決要求を実施
privateネットワークと判定され、TTL が 0 が返って来たので成功

```dig
$ dig @ma3ki.net private.com

;; ANSWER SECTION:
private.com.		0	IN	A	173.239.49.196
```

```log
Feb 10 23:53:18 ma3ki.net unbound: [25560:1] info: 175.177.36.124 private.com. A IN
Feb 10 23:53:18 ma3ki.net unbound: [25560:1] info: private=accept, network=175.177.0.0/16, clientip=175.177.36.124, query=private.com.
```

##外部ネットワークからのアクセステスト
133.242.186.90 から unbound へ名前解決要求を実施
外部ネットワークと判定され、NWDOMAINが返って来たので成功

```dig
$ dig @ma3ki.net private.com

;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 51486
;; flags: qr rd ra cd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
```

```log
Feb 11 00:01:08 ma3ki.net unbound: [25560:0] info: 133.242.186.90 private.com. A IN
Feb 11 00:01:08 ma3ki.net unbound: [25560:0] info: private=reject, clientip=133.242.186.90, query=private.com.

```

##普通の名前解決テスト

```dig
$ dig @ma3ki.net yahoo.co.jp

;; ANSWER SECTION:
yahoo.co.jp.		230	IN	A	183.79.135.206
yahoo.co.jp.		230	IN	A	182.22.59.229
```

```log
Feb 11 00:07:37 ma3ki.net unbound: [25560:1] info: 175.177.36.124 yahoo.co.jp. A IN
```

##まとめ
unboundのソースのサンプルコードを元に module を作成し、機能は実現できた。
でも使わないだろうな。。。
性能はでないだろうが、どこの国からのアクセスかをログに吐いたりしたら面白いかも。。。

[private-check.py](https://raw.githubusercontent.com/ma3ki/ma3ki/master/private-check.py)

スクリプトを試す場合は自己責任でお願いします。
Kinoma Create: PWM を前面ピンで使う


前回は PWM を使ってみましたが、前面ピンで使えないのが残念でした。

今日ここをのぞいていたら、こんなことがかいてありました！
http://kinoma.com/develop/create/pins/

```Text:英語引用
The majority of the back pins are fixed function, with 8 of the back pins mirroring the pin configuration on the Front-Left pins.
```

```Text:勝手に日本語訳
背面ピンの大半は機能が固定されておりますが、８つのピンに関しては左側前面ピンの設定を反映します。
```

なにー！

前面ピン
![front-pinmap.png](https://qiita-image-store.s3.amazonaws.com/0/60968/2f0f5fe0-ec2f-762f-865c-789d2378b5b8.png "front-pinmap.png")

背面ピン
![back-pinmap.png](https://qiita-image-store.s3.amazonaws.com/0/60968/2e89b391-c8ca-eaee-1819-c55ea25ae000.png "back-pinmap.png")

確かに、Front-LeftX とかいてある。
すなわち、 
Front-Left1(Pin51) = Pin38
Front-Left2(Pin52) = Pin37
Front-Left3(Pin53) = Pin40
Front-Left4(Pin54) = Pin39
... なわけである。

とすると、背面ピンの PWM をピンでつないでやれば、PWM を前面ピンで使えるのでは？？？
というわけで、ジャンプワイヤで以下のように PWM ピンをつなぐ。
Front-Left2: Pin28 <-> Pin37
Front-Left3: Pin34 <-> Pin40
Front-Left4: Pin30 <-> Pin39

![kobito.1423579327.698949.png](https://qiita-image-store.s3.amazonaws.com/0/60968/efeea8c9-8947-068b-7547-4078d440a16d.png "kobito.1423579327.698949.png")

前面ピンの設定を以下のようにしてやって、

![kobito.1423577239.097318.png](https://qiita-image-store.s3.amazonaws.com/0/60968/bf14394b-a278-2128-0422-2837570e02f0.png "kobito.1423577239.097318.png")

前面ピンを下の写真のようにつないでやるとできました。同様にして、UART通信も多分前面ピンからおそらく使えることでしょう。
![kobito.1423579795.093018.png](https://qiita-image-store.s3.amazonaws.com/0/60968/b3d56a88-3a81-2580-9ed4-82165ee523a4.png "kobito.1423579795.093018.png")

でも、本当にこんなことしていいのかはわからないので、 **良い子はマネをしないように！**
少なくとも、ピン設定で今回PWMをつないだところに Disconnected 以外のものを割り当てると壊れてしまうかもしれませんので。つないでたこと忘れちゃうかもしれないしね。
CaseClassかどうか判定する

#### CaseClassかどうか判定する 

```scala
import scala.reflect.runtime.universe._

def isCaseClass(typ: Type): Boolean =
  if (typ <:< typeOf[Product])
    ! typ.typeSymbol.fullName.startsWith("scala.")
  else
    false
```

判定基準は以下２点。

* Product であること
* fullName が "scala." から始まってないこと

FQCN文字列で切り分けるとか方法が原始的（？）だが、ワリとまともに動くはず。

---

以下、テスト。

```scala
case class Sample(text: String)

def test(typ: Type) {
  println(s"${typ} is CaseClass ? ${isCaseClass(typ)}")
}

test(typeOf[Sample])
// => Sample is CaseClass ? true

test(typeOf[List[Any]])
// => scala.List[Any] is CaseClass ? false

test(typeOf[::[Any]])
// => scala.::[Any] is CaseClass ? false

test(typeOf[Option[Any]])
// => scala.Option[Any] is CaseClass ? false

test(typeOf[Tuple2[Any,Any]])
// => (Any, Any) is CaseClass ? false

test(typeOf[util.Success[Any]])
// => scala.util.Success[Any] is CaseClass ? false

test(typeOf[util.Right[Any,Any]])
// => scala.util.Right[Any,Any] is CaseClass ? false
```
CentOSのサーバー上でApacheでNode.jsアプリを動かす


apacheでアプリを動かしている環境でnode.jsも動かしたいときは、apacheからnode.jsにproxyしてやるといい。
ちょっとapacheのproxy設定にはまったのでメモ。

# 環境

```
# cat /etc/redhat-release 
CentOS release 6.6 (Final)

# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Oct 16 2014 14:48:21

$ node -v
v0.12.0

$ mongo --version
MongoDB shell version: 2.6.8
```

# mongodbのインストール

次のサイトのとおりに実行する。

http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/

## yumの設定

```/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

## yumの実行

```
sudo yum install -y mongodb-org
```

## 起動

```
sudo service mongod start
mongo
exit
```

# nodeのインストール

https://github.com/hokaccha/nodebrew

## nodebrewのインストール

nodebrewをインストールすると、nodeのバージョンを切りかえられる。
バージョンによって変化が激しいので、入れておくと良い。

```
curl -L git.io/nodebrew | perl - setup
export PATH=$HOME/.nodebrew/current/bin:$PATH
source ~/.bashrc
```

## nodeのインストール

```
nodebrew install stable
nodebrew use stable
node -v
```

# apacheの設定

apacheのインストールや基本的な設定は省略。

## conf.d

/etc/httpd/conf.dにNode.jsアプリ専用の設定を追加する。
**末尾の'/'に注意**する。
これがないと、cssやjsなどの相対パスがうまくいかない。

```/etc/httpd/conf.d/node.conf
Alias /node /var/www/node

<Location /node/>
  ProxyPass http://localhost:3000/
  ProxyPassReverse http://localhost:3000/
  Order deny,allow
  Deny from all
  Allow from all
</Location>
```

# サービス起動

```
service httpd restart
cd YOUR_NODE_APP_PATH
node app.js &
```
nginx+php-fpm(5.5)+fastcgi+OPcacheでWordpressが重い

タイトル通りなのですが、一応解決（？）というか前よりはマシになったのでメモ書きです。というかかなりハマったので…
（fastcgiやnginx+php-fpmの構築などは割愛します。）

環境は
nginx 1.6.2
PHP 5.5.22
FPM/FastCGI + cache
Opcache v7.0.4
で、主にWordpressを利用したウェブサイトを運営しています。月間PVは大体30万くらいです

![2015-03-02_00-58-09.png](https://qiita-image-store.s3.amazonaws.com/0/54890/45933362-9b94-6c4c-31fd-633927c112e9.png)
ここ数日色々弄ってふとServer monitorを見るとこんなことになっていました。CPU使用率がやけに高くまともにサイトに接続できなくなっておりました。

topコマンドで様子を見ると
![2015-02-25_23-49-08.png](https://qiita-image-store.s3.amazonaws.com/0/54890/40053a92-53ed-5f67-a306-d13e8afd142e.png)
php-fpmプロセスがCPUを占拠していました。
この時の www.conf はこんな感じ

```lang:/etc/php-fpm.d/www.conf
pm = dynamic
pm.max_children = 20
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
```

色々調べると pm = dynamic は pm = ondemand の方がいいやら出てきますがこの部分を変えてもうちのサーバーではあまり変化はありませんでした。

fastcgiが作ったキャッシュへのアクセスは全く問題無いのですが、php-fpmプロセスが処理をし出すと途端に重くなります。Wordpressの管理画面にアクセスすると体感でよく分かります

php-fpmのUnixソケット通信の問題？ → 127.0.0.1:9000 に変えても変化なし

ということはOPcacheが効いてない?

```
$ php -v
PHP 5.5.22 (cli) (built: Feb 18 2015 17:54:45) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.2.7, Copyright (c) 2002-2015, by Derick Rethans
```

動いてる

```
$ vim /etc/php.d/opcache.ini
opcache.enable=1
```
ちゃんと1 になっている。



うーん

そしてふと気づいた

![h805yhge.jpg](https://qiita-image-store.s3.amazonaws.com/0/54890/a1d32587-0979-7fb6-2cb7-e0bdcd754ee8.jpeg)

with Xdebug v2.2.7, Copyright (c) 2002-2015, by Derick Rethans

...
まさか

デバッグ状態で動いていました。というか普通にインストールしただけなはずなんですけどね…なぜか with Xdebug v2.2 ~ が。原因はこれっぽい？


```
$ vim /etc/php.d/xdebug.ini
zend_extension=xdebug.so
xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.profiler_enable=0
```
0にして保存。
サーバーをリロードしてみましたが…変わりません。


```
$ vim /etc/php.d/xdebug.ini
;zend_extension=xdebug.so
xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.profiler_enable=0
```
```
;zend_extension=xdebug.so
```
強制的にコメントアウト！

![2015-03-02_23-44-42.png](https://qiita-image-store.s3.amazonaws.com/0/54890/abd14d4a-053a-0f23-08db-8557adacc188.png)

with Xdebug が消えた


```
php-fpm -t && service php-fpm reload
nginx -t && service nginx reload
```
すると

.
..
...
....

![2015-03-02_22-30-29.png](https://qiita-image-store.s3.amazonaws.com/0/54890/55c2d17e-be4b-7ccd-13c0-f513722601fd.png)

!

![2015-03-02_23-38-02.png](https://qiita-image-store.s3.amazonaws.com/0/54890/6de76a36-c0ae-f165-81de-3da1369cb03a.png)


　　　　　　　　　　　　　　　　　　　　　　　　　　　,. -‐＝=､､
　　　　　　 　　　　　　 ,. =＝=､､　ｏ 　 ○o. 　i 　　 　　 :::ト､
　　　　　　 　　　　　_,/ 　 　 　｀ヾ´´`ヽ、　ﾟ　.ｌ 　 　　 　:::ﾄ､＼イヤッッホォォォオオォオウ！
　　　　　 　　　　　 // 　　　　 .::::/　　:::::!=＝=l　　　　　 :::|ｽ.　',
　 　 　 　 　　 　 /./ 　 　 　 .::::/　　 ::::l　　　 |　 __ ..... _::::|} ヽ l-､
. 　 　 　 　 　 ,ｨｸ ,'..__ 　　　.::::/ 　　 ::::l　　　 :l '´　　　　｀)'｀ヽ ヾ;＼
　　　　　 　／::{ﾞ　ヽ、 ｀`丶､;/‐‐- ､::::l　　 　 `'::┬‐--＜_ 　 } ./;:::::＼
　　　　　／::::::::!　　 ,＞---‐'ﾞｰ- ...__)ｲ　,.　-‐‐-､ﾄ､　　 |l::ヽ ／;';';';';::::＼
. 　 　 ／|::::::;';';'＼／｝　（ヽ、　　_/| 　 (´　　　 _,.ｨ!::ヽ. 　ヾｰ'´;';';';';';';';';:: /ヽ、

…けどまだ高いような気もする
が、頭打ちになるよりはいいので一応このまま様子見…
何か他に原因があるんだろうか
MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.01

# Virtual BOX インストール編

MacOS X Yosemite で Heroku にアプリを公開するまでの環境構築を何回かに分けて書きます。

MacOSでは標準で Ruby が使えるし、仮想OSを使わずに開発してしまった方がお手軽ではあるのだけど、標準環境をガシガシと変更してしまうのにはやや抵抗があるし、後日誰かに共有や自分の環境を移行する可能性などを考えると、仮想OSを使っとくのは良いです。

## Virtual BOX を取ってくる

[Virtual BOX公式サイト ダウンロード先](https://www.virtualbox.org/wiki/Downloads)

Extension Packとか、SDKとか、いろいろ置いてあるけど、一番上にある「VirtualBox platform packages.」の最新版を落とせばOK。
当然、MacOS用の **VirtualBox #.#.# for OS X hosts** のファイルを選択。
2015/03/01現在、VirtualBox 4.3.22 for OS X hostsが最新のようです。

100MBぐらいはあるので、高速回線推奨。

## Virtual BOX をインストール、起動確認

ダウンロードした Virtual BOXの.dmgをファイルを起動し、以下のようなダイアログが表示されたら指示に従い 1 の VirtualBox.pkg をダブルクリック。
　
![VirtualBox.png](https://qiita-image-store.s3.amazonaws.com/0/57389/05fabc89-f214-b79e-55ab-70e15feaea3d.png)

インストールが問題なく進めば、自動的にアプリケーションフォルダに追加されます。
アプリケーションフォルダ、あるいは Launchpad 内にある VirtualBox のアイコンをクリックして起動したら、インストール完了。

起動が確認できたら、**VirtualBox は終了してしまってOKです。**

### キーワード

* MacOS X
* VirtualBox
* Vagrant
* CentOS
* Ruby on Rails
* RVM (Ruby Version Manager)
* Heroku