OmniAICreator/Qiita-1.07M huggingface dataset:
Distributed Fortran over Docker

Originally posted in <http://aespinosa.github.io/blog/2014-11-01-mpich3-over-docker.html>.

I will use this page as a notepad for my thoughts and notes for participating in
Docker's Global Hackday event in Tokyo [1].

I'll be using MPICH [2] and try to run an mpi-based app over containers.  Code
will be posted on Github
([aespinosa/mpich-docker](http://github.com/aespinosa/mpich-docker))

## Update: 2014-11-03 15:05

Working demo in <http://mpich-demo.allan.wikonec.com>.  Click on the
`Launch_Node` job first. Then launch all the compute nodes by clicking each
job's `Build` button.


## Workflow

* Building dependencies for a lean docker container
 <https://packages.debian.org/jessie/mpich>.

* Prepare the docker image with the your MPI program.  I write a sample in [4].
```
mpif90 /src/hello.f90 -o /app/hello
```

## Running mpi

Two parts of an mpich run [3]:

1. Launch node runs *UI Process* via mpiexec.  This listens to a *control port*
```
docker run --rm=true \
  -e MPIEXEC_PORT_RANGE=1000:1000 --expose=1000 \
  -h master --name master test \
  mpiexec -hosts one,two  -launcher manual -n 2 /hello
```

2. Compute node runs *Proxy Executable* and connects to UI Process (where the
   jobs are actually run) via `hydra_pmi_proxy`
```
$ docker run --rm=true --link master:master -h one test \
  hydra_pmi_proxy --control-port master:1000 \
  --rmk user --launcher manual --demux poll --pgid 0 --retries 10 --usize -2 \
  --proxy-id 0
$ docker run --rm=true --link master:master -h two test \
  hydra_pmi_proxy --control-port master:1000 \
  --rmk user --launcher manual --demux poll --pgid 0 --retries 10 --usize -2 \
  --proxy-id 1
```

## Next steps

Write a custom hydra launcher instead of the manual one. Maybe a worthwhile
project to work one.

## Abstract write-up for Hackday entry

I demonstrate how to run a distributed Fortran application in Docker. For this
demo, I will show how to build and run a Fortran90 program that computes the
value of Pi using a distributed monte carlo computation implemented in MPI.  I
go into the details on how the mpich implementation of MPI works and how to get
it running on Docker by descriptiong mpich (hydra)'s architecture.  I then show
the  sourcecode contains in GitHub that Dockerfiles to build the application
that uses the mpich MPI implementaton.

Full description of this hackday entry is in
<http://aespinosa.github.io/blog/2014-11-01-mpich3-over-docker.html>.

## References

1. <http://connpass.com/event/9491/>
2. <http://www.mpich.org>
3. <http://wiki.mpich.org/mpich/index.php/Hydra_Process_Management_Framework>
4. <https://github.com/aespinosa/mpich-docker/tree/master/test>
Git-Flowとは？

Git Flow
========
Github Flowと並ぶGitを利用したメジャーな開発ワークフローのひとつ。

概要
--
* それぞれのブランチがコードの状態を表している。
* リリースマネージャーが存在し（必要となる）、リリースを中心としたソフトウェア開発に向いている。
（メリット）
* 標準的なソフトウェアの開発状態遷移をブランチ名で表しているため、直感的に理解しやすい。
（デメリット）
* 覚えるブランチの状態が多く、複雑すぎる場合がある（人的ミスの可能性がある）。


ワークフロー
------
1. 開発版のブランチ（develop）から作業用のブランチ（feature branches）を作成して機能を実装及び修正する。
1. 作業用のブランチでの修正が終了すると、開発版のブランチに取り込まれる。
1. 上記の1と2を繰り返し、リリース出来るまで機能を作り上げる。
1. リリースするための作業をするためリリース用ブランチ（release branches）を作成し作業する。
1. リリース作業が終了するとmasterブランチに統合され、バージョンタグを打ってリリースする。
1. リリースしたものにバグがあれば、打たれたバージョンをもとに修正（hotfixes）する。

git-flow
------
Git Flowのワークフローをサポートしてくれるツール。ミスを防ぐために導入は必須か？

### インストール方法
例：Mac（Homebrew）

```
$ brew install git-flow
```

例：CentOS

```
$ sudo su -
$ cd /usr/local/src
$ wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
```

参考文献 / 参考URL
----
『GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus) 』（技術評論社）

CentOSにgit-flowをインストールする方法：
http://qiita.com/drapon/items/a510613ecb5b8dfaea45
Swiftを勉強しようとしたらFlappy Birdのデモコードが動かなくて詰んだ話

__使用環境 : Xcode6.1(6A1052d) / OS X Yosemite 10.10__
※ 注意 筆者はSwiftを勉強し始めてから1時間しか経っていないので詳しいことは分かりません
とりあえず動くようにするための方法を記録として残しておきます。

# Swiftを勉強しようとしてSwiftクローン版のFlappyBirdを落とした
→ これ（https://github.com/fullstackio/FlappySwift）

# コンパイルした
![スクリーンショット 2014-11-03 19.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/33480/bdff07b6-afda-86c0-603f-3b0fc1e8fe38.png)
なんかめっさエラー出た。

# エラーの詳細とその対処
>__'dataWithContentsOfFile(_:options:error:)' is unavailable: use object construction 'NSData(contentsOfFile:options:error:)'__

dataWithContentsOfFileのerrorオプションはコンストラクタで使えないとか言ってる？
Swiftの仕様変更だと思うのですが、当方1時間しか勉強していないので誰か教えて下さい。
このエラーは以下の行で出力されるので、

```swift:GameViewController.swift
let sceneData = NSData.dataWithContentsOfFile(path!, options: .DataReadingMappedIfSafe, error: nil)
```

こう直す。

```swift:GameViewController.swift
var sceneData = NSData(contentsOfFile: path!, options: .DataReadingMappedIfSafe, error: nil)!
```


下の方には同じエラーが2箇所出ています。
>__Method 'fromRaw' has been replaced with a property 'rawValue'__

これは以下の行で出ているので、

```swift:GameViewController.swift
return Int(UIInterfaceOrientationMask.AllButUpsideDown.toRaw())
```

toRaw()をrawValueに置き換えてやる

```swift:GameViewController.swift
return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue)
```

こちらについてはQiitaで解説を見つけられました。
Xcode6.1 Beta2での変更らしいです。
http://qiita.com/dankogai/items/fe86f43a0158c13082ad


# 参考にしたサイト
THE LAST DAY (http://ngw.jp/~tato/wp/?tag=swift)
EPPlusを使ったExcel Hello World

[EPPlus](http://epplus.codeplex.com/)はOpen XMLの仕様を元にExcelのデータ操作を行う為の.NET Framework向けのオープンソースライブラリです。Open XMLの仕様を元にXMLデータを直接操作するのでExcelのインストールやライセンスは必要ありませんし、サーバーサイドで使用した場合の[種々の問題](http://blogs.msdn.com/b/office_client_development_support_blog/archive/2012/04/12/1-office.aspx)もありません。ただし、Open XMLの仕様に依存するので、2007以降の.xlsx形式のファイルのみ扱え、それ以前の.xlsのファイルは扱えません。

また、ライブラリはNuGetを使ってプロジェクトに追加できます。

以下にExcelファイルを作り、Helloというワークシートを追加、A1セルにHello Worldを書き込んで保存するサンプルを載せます。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;

using OfficeOpenXml;
using OfficeOpenXml.Style;

namespace EPplusSample1
{
    /// <summary>
    /// EPPlusを使ったExcel操作のサンプル。
    /// </summary>
    class Program
    {
        /// <summary>
        /// エントリーポイント
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var newFile = new FileInfo(@"sample1.xlsx");

            using (var package = new ExcelPackage(newFile))
            {
                ExcelWorksheet worksheet = null;

                // Excelファイルが既に存在するなら、該当ワークシートが存在するか確認する。
                if (newFile.Exists)
                {
                    worksheet = package.Workbook.Worksheets.Where(s => s.Name == "Hello").FirstOrDefault();                    
                }                  
            
                // ワークシートが存在しなければ、ワークシートを追加する
                if (worksheet == null)
                {
                    worksheet = package.Workbook.Worksheets.Add("Hello");
                }

                // セルに文字列を挿入する。
                worksheet.Cells[1, 1].Value = "こんにちは、世界。";

                //フォントの色を設定。
                worksheet.Cells[1, 1].Style.Font.Color.SetColor(Color.Red);

                //Excelのファイルをセーブする。
                package.Save();
            }

        }
    }
}
```

詳しい使い方はCodePlexのサイトからZIPパッケージをダウンロードし、その中のSampleフォルダの各サンプルを見るとよくわかると思います。
GCE で local SSD の帯域性能を調べる.


漢なら PB 単位のフラッシュストレージでデータ処理したいですよね! 最近 TB 単位でデータを処理していてすぐに容量が足りなくなって, 涙で枕を濡らすつらい日々が続いていましたが, local SSD が解決してくれそうな予感がしてきました.

早速 GCE に(ベータ版として)追加された local SSD の帯域性能を調べてみましょう. 

## セットアップ

https://cloud.google.com/compute/docs/local-ssd

を参考に local SSD つきインスタンスを生成します.

サンプルを元に 1 個の SSD 領域をマウントして ext4 でフォーマットします.

## dd

dd で 32GB データを書いてみます.

```
# time dd if=/dev/zero of=32GB.dat bs=1GB count=32
32+0 records in
32+0 records out
32000000000 bytes (32 GB) copied, 84.5048 s, 379 MB/s

real	1m24.552s
user	0m0.008s
sys	1m2.348s
```

読んでみます.

```
# time dd if=32GB.dat of=/dev/null bs=1GB count=32
32+0 records in
32+0 records out
32000000000 bytes (32 GB) copied, 58.4087 s, 548 MB/s

real	0m58.454s
user	0m0.004s
sys	0m17.484s
```

cp してみます.

```
# time cp 32GB.dat 32GB.dat.2

real	2m0.825s
user	0m0.340s
sys	0m41.088s

```

Cool!

概ね write が 400MB/s, read が 550 MB/s くらいでしょうか. 昨今の SATA3 SSD と同じくらい性能出てますね. 
現在はベータ版ですが, 4 SSDs を利用できるので, 4 SSDs 構成なら CG/VFX 用の 1TB キャッシュ領域として使えますね! そのときはストライプで 1.5 ~ 2.0 GB/s くらい狙えそうです. 期待ですね.

## TODO

* ストライプ構成にしてより帯域性能高めてみたい.
* IO 発行をスレッド化して同時に行えば, 更に帯域性能上がりそうな予感.
sublimelinterでjshintが動かなかった時の対処法


##概要
sublimeLinter-jshintを入れても最初は上手く動かなかったのでその対処法をメモしておきます。

##Setup
###node.jsのインストール
[ここ](http://tsuchikazu.net/mac_node_js_star/)でも参考にして入れてください。
バージョン管理用のnvmから入れると後々便利かも、と思ったのがスタックの原因！

###jshintのインストール
jshintをnode.jsのパッケージ管理ツールであるnpmを使ってインストールします。

```terminal
% npm install -g jshint
```

###sublimeLinterとsublimeLinter-jshintをインストール
Package Control からsublimeLinterとsublimeLinterをインストールしてください。

##うまくいかない
最初に参照したサイトでは以上で使える様になるって書いてあったが、自分の環境では上手くいきませんでした。  
調べてみたところ、node.jsをインストールするのにnvmを使ったためjshintのpathが通っていないだけでした。  
preference->Package Settings->SublimeLinter->Setting-Userに以下を追記します。

```Setting-User
"paths": {
	"linux": [],
	"osx": [
	"/Users/xxxx/.nvm/v0.10.32/bin/"
	],
	"windows": []
}
```

pathはjshintがあるpathを入れます。jshintの場所は下記のコマンドを実行すれば分かります。

```terminal
% which jshint
```

##最後に
自分の場合はこれだけで動いたが、他の理由で詰まっている人もいるでしょう。
そんな時はsettingで```"debug": true,```とすればconsoleにエラーメッセージが出るので、参考にしてください。
CakePHP(2.x)で文字数の長さ定義(maxlength)を1箇所にまとめる

## 概要

* ビューの入力欄の maxlength とモデルのバリデートの maxLength の値を１箇所で管理したい。
* 下のサンプルだと"100"という値をビューで1回、モデルで1回記述している。

```php:View
<?= $this->Form->input('Post.name', array(
    'type' => 'text',
    'maxlength' => 100,
);?>
```

```php:Model
public $validate = array(
    'name' => array(
        'rule' => array('maxLength', 100),
        'message' => '%s 字以内で入力して下さい。',
    ),
);
```

## ソースコード

上記の"100"の定義を1箇所にまとめるサンプルを作成しました。
https://github.com/gold1/CakePHP-maxlength-sample
以下、解説していきます。

まずは、カラム名と文字列長さの配列定義をモデルに作成します。

```php:app/Model/It.php
	protected static $maxLengthJp = array(
		'name' =>  30,
		'note' => 100,
	);
```

配列定義にアクセス／判定を行う関数をAppModelに追加します。

```php:app/Model/AppModel.php
	public static function isMaxLengthJp($column)
	public static function getMaxLengthJp($column)
```

文字列長さのチェック関数（ruleMaxLengthJp）を独自実装します。

```php:app/Model/AppModel.php
	public function ruleMaxLengthJp($data, $length) {
		$encoding = Configure::read('App.encoding');
		$value = array_shift($data);
		return (mb_strlen($value, $encoding) <= $length);
	}
```

上記のチェック関数を実行する前にバリデートルールを変更。文字列の長さ定義を設定しています。

```php:app/Model/AppModel.php
	public function modifyValidateRure() {
		// ...
		if ($rule == 'ruleMaxLengthJp') {
			// ルール変更をおこなって文字数を引数に設定する
			$length = static::getMaxLengthJp($column);
			$this->validate[$column][$number]['rule'] = array($rule, $length);
		}
```

これで validate:rule 部分の記述を移動できました。

```php:app/Model/It.php
	public $validate = array(
		'name' => array(
			'ruleMaxLengthJp' => array(
				'rule'       => 'ruleMaxLengthJp',
				'required'   => true,
				'allowEmpty' => false,
				'last'       => true,
				'message'    => 'name は %s文字までです。',
			),
		),
```

次に FormHelper を継承した Form2Helper を作成して input() を上書きします。maxlength の値をここで設定します。

```php:app/View/Helper/Form2Helper.php
	public function input($fieldName, $options = array()) {
		list($model_name, $column_name) = $this->getModelAndColumnByFieldName($fieldName);
		if ($options['type'] == 'text' ||
			$options['type'] == 'textarea') {
			if (class_exists($model_name) &&
				$model_name::isMaxLengthJp($column_name)) {
				$options = array_merge(
					array('maxlength' => $model_name::getMaxLengthJp($column_name)),
					$options
				);
			}
		}
		return parent::input($fieldName, $options);
	}

```

AppController でこのヘルパーを指定する必要があります。

```php:app/Controller/AppController.php
	public $helpers = array(
		'Form' => array(
			'className' => 'Form2',
		),
	);

```

これでビュー側の定義を移動できました。

```php:app/View/It/form.php
<?= $this->Form->input('Post.name', array(
    'type' => 'text',
);?>
```

## 最後に
* プラグイン形式でまとめたかったけど、方法が思いつきませんでした。
Travis CI で GUI を利用しない Firefox を使ってエンドツーエンドテストをする

## 概要

Travis CI で GUI を利用しない Firefox を使ってエンドツーエンドテストする方法を調べました。

## 動作試験

`.travis.yml` では `before_script` で関連する gem のインストールと Xvfb の起動を行います。ここでは ブラウザの自動操作に watir-webdriver を使います。Xvfb の起動方法は Travis CI の[ドキュメント](http://docs.travis-ci.com/user/gui-and-headless-browsers/#Using-xvfb-to-Run-Tests-That-Require-GUI-(e.g.-a-Web-browser))に従い、下記のようにします。

```.travis.yml
language: ruby
before_script:
  - "gem install rspec"
  - "gem install headless"
  - "gem install watir-webdriver"
  - "export DISPLAY=:99.0"
  - "sh -e /etc/init.d/xvfb start"
script:
  - "rspec"
```

下記は Travis CI で Firefox を起動して Qiita のトップページのタイトルが正しいか確かめるテストです。(Travis CI から Qiita にアクセスするとタイトルが英語になるようです。)

```spec/e2e_spec.rb
# encoding: utf-8

require 'watir-webdriver'
require 'headless'

describe "qiita.com" do
  before do
    @headless = Headless.new
    @headless.start
    @browser = Watir::Browser.new :ff
  end
  it "has valid title" do
    @browser.goto "http://qiita.com"
    expect(@browser.title).to eq("Qiita - A technical knowledge sharing platform for programmers.")
  end
  after do
    @browser.quit
    @headless.destroy
  end
end
```

Travis CI にてテストがパスすることが確認できました。

```
$ rspec
.
Finished in 30.14 seconds (files took 0.24446 seconds to load)
1 example, 0 failures
```

上記の動作試験を行った GitHub のリポジトリです。
https://github.com/suzuki86/sample-of-using-headless-firefox-on-travisci

Travis CI での実行結果です。
https://travis-ci.org/suzuki86/sample-of-using-headless-firefox-on-travisci
BigQueryに放り込む用のCSVファイル生成（Twitter）

#今日は一日“歌う声優”三昧　ツヴァイ！

http://www9.nhk.or.jp/zanmai/program/141103.html#playlist_top

いっぱいツイートが手に入るし、BigQuery使ってみたいし

BigQueryに放り込む用のCSVを作ってみる。

# ソースコード

```clj:project.clj
(defproject tweet-bigdata-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.twitter4j/twitter4j-core "4.0.2"]
                 [clojure-csv/clojure-csv "2.0.1"]]
  :main tweet-bigdata-clj.core)
```

```clj:core.clj
(ns tweet-bigdata-clj.core
  (:import [twitter4j TwitterFactory Query QueryResult])
  (:require [clojure-csv.core :as csv]
            [clojure.java.io :as io]))

(declare twitter get-tweets tweets-to-map to-csvfile to-csv make-csv get-all-tweets)

(def twitter (.getInstance (TwitterFactory.)))

(defn get-tweets [hash-tag]
  "tweet取得"
  (let [query (doto (Query.)
                (.setQuery hash-tag)
                (.setCount 100)
                (.setSince "2014-11-03")
                (.setUntil "2014-11-04"))]
    (->> (.search twitter query))))

(defn tweets-to-map [tweets]
  "tweetsをmap形式に変換する"
  (map #(zipmap [:screenName
                 :name
                 :text
                 :createdAt]
                [(.. % getUser getScreenName)
                 (.. % getUser getName)
                 (clojure.string/replace (.getText %) #"\n" " ")
                 (.. % getCreatedAt toString)]) tweets))

(defn to-csvfile [text]
  "csvファイルを作成"
  (with-open [out-file (io/writer "out-file.csv" :encoding "utf-8" :append true)]
    (.write out-file (apply str text))))

(defn to-csv [{text :text name :name screen-name :screenName created-at :createdAt}]
  "カンマ分割"
  (csv/write-csv [[screen-name text created-at]]))

(defn make-csv [query]
  (->> query
       (.getTweets)
       (tweets-to-map)
       (map #(to-csv %))
       (to-csvfile)))

(defn get-all-tweets [#^QueryResult query]
  (loop [q query]
    (when (.hasNext q)
      (Thread/sleep 5000)
      (let [nq (doto (.nextQuery q)
                 (.setCount 100))
            nqr (.search twitter nq)]
        (make-csv nqr)
        (recur nqr)))))

(defn get-first-page [query]
  (let [q (.search twitter query)]
    (dosync(alter result-list conj q))
    q))

(defn -main[]
  (let [first-tweets (get-tweets "#zanmai")]
    (make-csv first-tweets)
    (get-all-tweets first-tweets)))
```
gzipの各圧縮レベルでの圧縮率と処理時間の計測

# gzipの各圧縮レベルでの圧縮率と処理時間の計測

Apache の mod_deflate で DeflateCompressionLevel を調整するにあたり、gzipで各圧縮レベルでの圧縮率と処理時間を調べました。

## 結果

圧縮率を指定しない場合は 6 が選択されるようです。

| レベル       | サイズ(Byte) | 圧縮率 | 10,000回圧縮時の<br />処理時間 | 6とのサイズ比 | 6とのサイズ差 |
|:-----------:|-------:|-------:|----------:|-----:|------:|
| 無圧縮       | 58,757 |      - |         - |    - |     - |
| 1           | 12,377 | 78.94% | 0m23.328s | 1.17 | 1,769 |
| 2           | 11,979 | 79.61% | 0m27.751s | 1.13 | 1,371 |
| 3           | 11,757 | 79.99% | 0m36.023s | 1.11 | 1,149 |
| 4           | 11,076 | 81.15% | 0m43.181s | 1.04 |   468 |
| 5           | 10,771 | 81.67% | 0m43.981s | 1.02 |   163 |
| 6(デフォルト) | 10,608 | 81.95% | 0m44.991s | 1.00 |     0 |
| 7           | 10,575 | 82.00% | 0m46.586s | 1.00 |   -33 |
| 8           | 10,519 | 82.10% | 0m54.098s | 0.99 |   -89 |
| 9           | 10,480 | 82.16% | 1m03.603s | 0.99 |  -128 |

1か2が良さそうですね。

## サンプルファイル

とあるサイトのトップページ(58,757Byte)

## 環境
CPU: Core2Duo E8400 3.0GHz
MEM: 5GB
OS: Ubuntu 14.04 32bit

## コマンド

それぞれの圧縮レベルで10,000回圧縮した時にかかった時間をtimeコマンドで計測。
timeコマンドのreal値を取りました。

```bash
$ for rate in $(seq 1 9) ; do echo "rate ${rate}"; time for i in $(seq 1 10000) ; do gzip -c -${rate} index.html > /dev/null ; done; echo ""; sleep 10; done
```

読みやすくしてみました。下は試してないので間違ってるかも

```bash
$ for rate in $(seq 1 9)
do
  echo "rate ${rate}"
  time for i in $(seq 1 10000) ; \
      do gzip -c -${rate} index.html > /dev/null ; \
    done;
  echo ""
  sleep 10
done
```
Guzzle3でResource Owner Password Credentials Grantでトークンを取得する


前回の[Guzzleについてちょっと調べた](http://mapyo.hatenablog.com/entry/2014/11/01/Guzzle3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)の続きです。



Guzzle3自体には、oauth2は対応しておらず、現状oauth2を使おうとすると、プラグインを使う事になる。


https://github.com/commerceguys/guzzle-oauth2-plugin

guzzle-oauth2-pluginというものを使うと簡単に実装できるっぽい。


## install
```sh
php composer.phar require commerceguys/guzzle-oauth2-plugin
```

composer.jsonは以下のようになった。

```json
{
    "require": {
        "guzzle/guzzle": "~3.9",
        "commerceguys/guzzle-oauth2-plugin": "~1.0"
    }
}
```

## 使い方
以下のような感じ。

```php
<?php
require 'vendor/autoload.php';

use Guzzle\Http\Client;
use CommerceGuys\Guzzle\Plugin\Oauth2\GrantType\PasswordCredentials;

$settings = parse_ini_file('config/settings.ini');

# Resource Owner Password Credentials Grant
$oauth2Client = new Client($settings['base_url'] . '/oauth/token');
$config = array(
    'username'      => $settings['username'],
    'password'      => $settings['password'],
    'client_id'     => $settings['client_id'],
    'client_secret' => $settings['client_secret'],
    // 'client_id'     => null, # null ã§ã‚‚ã‚ˆã„
    // 'client_secret' => null, # null ã§ã‚‚ã‚ˆã„
    'scope'         => $settings['scope'], // Optional.
);

$grantType = new PasswordCredentials($oauth2Client, $config);
$tokenData = $grantType->getTokenData();
var_dump($tokenData['access_token']);
```

https://gist.github.com/mapyo/b12b0cb651d02b76f5e9


## 所感
Resource Owner Password Credentials Grantというやつは、単純にpostするだけなので、特にライブラリを使う必要なんてなかったかー！

https://github.com/mapyo/php-client-sample/tree/0.1.1

とりあえず、githubに上げてみた。

## guzzle-oauth2-pluginを使わないように書きなおしてみる

commerceguys/guzzle-oauth2-pluginを削除

```
php composer.phar remove commerceguys/guzzle-oauth2-plugin
```

以下のようにプログラムを修正した。

```php
<?php
require 'vendor/autoload.php';

use Guzzle\Http\Client;

$settings = parse_ini_file('config/settings.ini');

# Resource Owner Password Credentials Grant
$client = new Client($settings['base_url']);
$params = array(
    'grant_type'    => 'password',
    'username'      => $settings['username'],
    'password'      => $settings['password'],
    'scope'         => $settings['scope'], // Optional.
);

$data = $client->post('/oauth/token', array(), $params)->send()->json();
var_dump($data['access_token']);
```

https://gist.github.com/mapyo/354fbb5c7c6a50c5574d


https://github.com/mapyo/php-client-sample/tree/95a1fbe2521217f98d681cb69234644911e097ad

## 所感２
まぁ、こんなもんか。
込み入った事をするんだったらプラグイン使う方がよさそうだけど、
こういうケースだったら、そこまで使うメリットはなさそう。
リフレッシュトークンとか絡んでくると、使ったほうがわかりやすそうだ。
[Swift] クラスのイニシャライザ１： イニシャライザの引数の書き方

# はじめに

この記事では、イニシャライザの引数の書き方について説明します。


# 他の記事へのリンク

* [[Swift] クラスのイニシャライザ１： イニシャライザの引数の書き方](http://qiita.com/cotrpepe/items/bfebe21e9f75c1fce60c)
* [[Swift] クラスのイニシャライザ２： プロパティの初期化方法](http://qiita.com/cotrpepe/items/db842f74b4c8ce16052c)
* [[Swift] クラスのイニシャライザ３： Designated Initializer と Convenience Initializer](http://qiita.com/cotrpepe/items/3052d91468f1b852582a)
* [[Swift] クラスのイニシャライザ４： override 修飾子](http://qiita.com/cotrpepe/items/8d197a9a288eb24c19fb)
* [[Swift] クラスのイニシャライザ５： required 修飾子](http://qiita.com/cotrpepe/items/3931c0c20ef43f4a18ac)
* [Swift] クラスのイニシャライザ６： Failable Initializer


# 環境

* Xcode 6.1 (Playground)


# イニシャライザの引数の書き方

イニシャライザの引数の書き方は、以下の４通りあります。


# 1. 引数が無い場合

* 宣言方法

```swift:例
init() {
    ...
}
```

* 呼び出し方法

```swift:例
var a = Animal()
```

# 2. 外部引数名と内部引数名を指定する場合

* 宣言方法

```swift
init(外部引数名 内部引数名: 型) {
    self.property = 内部引数名
    ...
}
```

```swift:例
init(outside inside: String) {
    self.property = inside
    ...
}
```

* 呼び出し方法

```swift
var a = Animal(外部引数名: "abc")
```

```swift:例
var a = Animal(outside: "abc")
```

# 3. 外部引数名と内部引数名が同一である場合

* 宣言方法

```swift
init(外部引数名でかつ内部引数名: 型) {
    self.property = 外部引数名でかつ内部引数名
    ...
}
```

```swift:例
init(name: String) {
    self.property = name
    ...
}
```

* 呼び出し方法

```swift
var a = Animal(外部引数名でかつ内部引数名: "abc")
```

```swift:例
var a = Animal(name: "abc")
```

# 4. 外部引数名を省略する場合

* 宣言方法

```swift
init(_ 内部引数名: 型) {
    self.property = 内部引数名
    ...
}
```

```swift:例
init(_ inside: String) {
    self.property = inside
    ...
}
```

* 呼び出し方法

```swift:例
var a = Animal("abc")
```


# 参考文献

[The Swift Programming Language](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_306)
Guzzleについてちょっと調べた

## Guzzleとは
Guzzle is a PHP HTTP client and framework for building RESTful web service clients

らしい


- https://github.com/guzzle/guzzle
- http://docs.guzzlephp.org/en/latest/
- http://d.hatena.ne.jp/hnw/20140824


まぁ、いい感じのPHPのHTTPクライアントライブラリという事でしょう。

Webサーバから並行にダウンロードとかも出来るらしいから、
サーバーサイドで複数のAPIを呼ぶ時はいいのかな。

## Guzzleは２つある
最新のバージョンと古いやつ

- https://github.com/guzzle/guzzle
 - ドキュメントはこちら  
http://guzzle.readthedocs.org/en/latest/
- https://github.com/guzzle/guzzle3
 - ドキュメントはこちら  
http://guzzle3.readthedocs.org/


## 対応PHPバージョン
- Guzzle  
http://docs.guzzlephp.org/en/latest/overview.html?highlight=php#guidelines
 - php5.4〜
- Guzzle3  
http://guzzle3.readthedocs.org/getting-started/installation.html
 - php5.3〜

今回はやんごとなき事情のため、Guzzle3を使ってみる。

※パッケージ名が、Guzzle 3は「guzzle/guzzle」、Guzzle 4+は「guzzlehttp/guzzle」となっているらしいので、
注意が必要。


- http://d.hatena.ne.jp/hnw/20140824



## Guzzle3の導入
http://guzzle3.readthedocs.org/getting-started/installation.html

こちらにて、導入方法が書いてある。


```sh
# Install Composer
curl -sS https://getcomposer.org/installer | php

# Add Guzzle as a dependency
php composer.phar require guzzle/guzzle:~3.9
```

composerだと導入が楽。以下のように、`composer.json`が作成される

```json
{
    "require": {
        "guzzle/guzzle": "~3.9"
    }
}
```

余談だけどcomposerで何か入れるときには`composer.json`を直に修正していたけど、
普通にコマンドラインで実行して入れた方が自動的にファイルを修正してくれるのでよさそう。

あたりまえかー


## 補足

https://github.com/aws/aws-sdk-php/blob/master/composer.json#L20
http://aws.amazon.com/jp/sdkforphp/

AWS SDK for PHPでも使われているので、（しかもGuzzle3の方）
それなりに信頼出来そうだ。

## とりあえず、サンプル
何か作ろうと思ったのだが、ちょっと疲れたのでココで一旦停止。
Vagrantのbox、VirtualBoxのVM、削除/パス


## boxのパス

```bash
~/.vagrant.d/boxes				
```

## boxの削除

```bash
$ vagrant box remove [Box名]
```

## VMのパス

```bash
~/VirtualBox VMs
```

## VMの削除
Vagranfileのあるディレクトリで

```bash
$ vagrant destroy
```

## ファイル容量確認
```bash
$ du -s -h ~/.vagrant.d/boxes/*
$ du -s -h ~/VirtualBox\ VMs/*
```
## 参考リンク
↓見やすくまとまっていた
[Vagrant のコマンドをメモしておく](
http://shindolog.hatenablog.com/entry/2013/04/15/235731)


[vagrantのboxとか、vagrantコマンド周りがよくわからなくなった](http://j-caw.co.jp/blog/?p=1228)


[VagrantでBox追加してvagrant upしてdestroyしてまたvagrant upするとか](http://masayuki5160.hatenablog.com/entry/2013/05/12/230327)
Dockerでnghttp2を動かす

[HTTP2Conference](http://http2study.connpass.com/event/9209/)にてHTTP2.0の実装を試すには[nghttp2](https://github.com/tatsuhiro-t/nghttp2)が良いという知見を得たので，OSX上でboot2dockerを使って楽しむことにした．

## イメージを作成する

`Dockerfile`は以下．

```bash
FROM buildpack-deps

RUN git clone https://github.com/tatsuhiro-t/nghttp2 \
    && cd nghttp2 \
    && autoreconf -i \
    && automake \
    && autoconf \
    && ./configure \
    && make

WORKDIR /nghttp2/src    
```

あとは以下でビルドしてイメージを作成する．

```bash
$ docker build -t tcnksm/nghttp2 .
```

## 動かす

サーバーを動かしてみる．

```bash
$ docker run --rm -p 8888:8888 tcnksm/nghttp2 ./nghttpd --no-tls 8888
```

boot2dockerで動かしている場合は，以下でアクセスできる．

```bash
$ curl $(boot2docker ip):8888
```

## 参考

- [tcnksm/dockerfiles](https://github.com/tcnksm/dockerfiles)
nginx

# directive
## =/~/~^ difference
http://wiki.nginx.org/HttpCoreModule#location

# wordpress setup on CentOS 5.10
http://www.if-not-true-then-false.com/2011/install-nginx-php-fpm-on-fedora-centos-red-hat-rhel/
Editing wp-config.php
http://codex.wordpress.org/Editing_wp-config.php#WordPress_address_.28URL.29
Rails Application Templates を導入する

# Rails Application Templates とは
[RailsGuides](http://guides.rubyonrails.org/rails_application_templates.html)

* 新たに Rails アプリケーションを作成する際に Gem の追加やイニシャライズを簡単に行うことができる仕組み
* 例えば、作成するアプリケーションは決まって、"認証に devise を使用する"、"テストには RSpec" など、お気に入りの Gem がある人に効果を発揮する
* rails new でアプリケーションを作成してから Gemfile を修正するのではなく、あらかじめ使用する Gem を記述したテンプレートを用意し、それを使って新規にアプリケーションを作成する

# テンプレートファイルの書き方

```rb:app_template.rb
# 常に追加する場合
gem 'devise'

# 常に追加するがグループを指定する場合
gem_group :development, :test do
  gem 'rspec-rails'
  gem "rails-erd"
end

# 追加するかどうか適宜判断する場合
if yes?('Does this app use nokogiri? (yes / no)')
  gem 'nokogiri'
end

# bundle install を続けて行う場合
run_bundle

# 任意のコマンドを実行する場合
## 例) README.rdoc を README.md に変更
run "mv README.rdoc README.md"

# config.rb に rooting 追加
route "root to : 'welcome#index'"
```

# テンプレートの使い方

```bash
# ファイルがローカルにある場合
$ rails new sample -m ~/app_template.rb

# ファイルが GitHub 上にある場合
rails new sample -m https://raw.github.com/[username]/[reponame]/master/app_template.rb
```
Higher Rank Type とは


#### 注意点
この文章は、自分が理解している範囲内でまとめたものなので、
正確性に欠ける、または、間違っている点を含んでいる可能性がありますのでご注意ください。

## Polymorphic function

Haskell には *polymorphic function* と呼ばれるものがあり、例えば、 *length* 関数の型は、

```haskell
length :: [a] -> Int
```
   
となっていて、任意の型 *a* について、実際の型を適用して具体化することができる。

```haskell
-- GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
ghci> length ([2,3,4] :: [Int])
3
ghci> length ("string" :: [Char])
6
```

という具合。

## forall

ここで、この polymorphic function をそのまま、関数の引数として渡したいとする。
単純に考えると型は以下のようになるが、

```haskell
foo :: ([a] -> Int) -> Int
foo f = f [1,2,3] + f "string"
```
   
これはエラーになってしまう。

```haskell 
-- => Couldn't match type ‘a’ with ‘Char’
```
   
上記の定義では、 *foo* に渡す関数 *f* は polymorphic function ではなく「 *a* は任意の型のうち何かの型を適用して具体化したもの」、
つまり *[Int] -> Int*, *[Char] -> Int* などのどれか一つ、と解釈されてしまう。
そのため ``f [1, 2, 3]`` と ``f "string"`` のように異なる型を適用することはできない。

では、どうすればよいのか。
そもそも、 polymorphic function の型:

```haskell 
length :: [a] -> Int
```

は、本来は、

```haskell 
length :: forall a. [a] -> Int
```

という具合に ``forall a.`` で全体を修飾したものを意味する。
同様に *foo* 関数の型は、

```haskell 
foo :: forall a . ([a] -> Int) -> Int
```

となる。
この ``forall a.`` は「任意の型 a に対して」という意味になるのだけれど、 
上記の場合では ``forall a.`` は *foo* 関数の型全体を修飾しているので、 *foo* 関数の定義内部では、型変数 *a* は何かひとつの型に定まったもの、として扱われてしまう。
このため、 polymorphic function のまま渡すことができない。
そこで、 polymorphic function のままの型で渡せるように、この ``forall a.`` が修飾している部分を、以下のように明示的に限定してやる必要がある。

```haskell 
{-# LANGUAGE RankNTypes #-}

foo' :: (forall a. [a] -> Int) -> Int
foo' f = f [1,2,3] + f "string"
```

```haskell 
ghci> foo' length
9
```

と、確かに polymorphic function が渡せるようになった。上記のような型を定義するには ``RankNTypes`` という GHC 拡張を使う必要がある点に注意。

## Higher rank type

*length* 関数や *foo* 関数のように forall が型全体 ( 最外側 ) を修飾しているような型を *rank-1 type* と言い、
foo' 関数のように rank-1 type を引数に持つ関数の型を *rank-2 type* と言う。
一般的に *rank-n type* は rank-(n-1) type の型を引数に持つ、とのこと。

もう一度、 rank-1 type と rank-2 type の意味の違いを整理しておくと、

#### rank-1 type
```haskell
foo :: forall a. (a -> Int) -> (Char, Bool)
```
とした時の、 *foo* の定義内での型変数 *a* は、任意の型のうち、何らかのひとつの型を表す。

#### rank-2 type
```haskell
foo' :: (forall a. a -> Int) -> (Char, Bool)
```
とした時の、 *foo'* の定義内での型変数 *a* は、また具体化してないので、任意の型のうち、全ての型を (同時に) 表す。 


## 参考にしたサイト

- [Haskell/Polymorphism - Wikibooks, open books for an open world](http://en.wikibooks.org/wiki/Haskell/Polymorphism)
Dockerでh2oを動かす

[HTTP2Conference](http://http2study.connpass.com/event/9209/)にてkazuhoさんの["H2O - the optimized HTTP server"](http://www.slideshare.net/kazuho/h2o-20141103pptx)を聞いて，h2oを試したくなったので，Dockerで動かしてみた．

## イメージを作成する

`Dockerfile`は以下．

```bash
FROM buildpack-deps

RUN apt-get update && apt-get install -y \
    cmake \
    && rm -rf /var/lib/apt/lists/*
    
RUN git clone https://github.com/h2o/h2o \
    && cd h2o \
    && git submodule update --init --recursive \
    && cmake . \
    && make h2o

WORKDIR /h2o    
ENTRYPOINT ["./h2o", "-c"]
```

あとは以下でビルドしてイメージを作成する．

```bash
$ docker build -t tcnksm/h2o .
```

## サンプルを動かす

`examples`の設定ファイルを使って動かしてみる．起動引数に設定ファイルを指定すればよい．

```bash
$ docker run --rm -p 8080:8080 tcnksm/h2o examples/h2o.conf
```

boot2dockerで動かしている場合は，以下でアクセスできる．

```bash
$ curl $(boot2docker ip):8080
```

## 参考

- [tcnksm/dockerfiles](https://github.com/tcnksm/dockerfiles)
tmuxのセッション、ウィンドウ、ペインの概念が曖昧だったのでまとめる

tmuxを自在に使えるようになりたい。


# セッション

**新しいセッションを開始**
新規にプロジェクトAが入ってきたのでセッションを作成する。

```
$ tmux new-session -s newprojectA
```

**別の書き方**

```bash
$ tmux new -s newprojectB
```

**セッションの切り替え**
Project Aが終わったので、ProjectBに切り替える。

```bash
$ PrefixKey :choose-session
```

切り替えたいセッションを選択してEnter

**コマンドラインからセッションの切り替え**

```bash
$ tmux a -t projectA
```

**セッションの名称を変更する**
プロジェクト名が気に食わなかったのでセッション名を変更

```bash
$ PrefixKey :rename-session newname
```

**セッションの一覧を表示する**

```bash
$ tmux ls
```

**セッションをデタッチ**
作業が一段落したのでセッションを切り離す。

```bash
$ PrefixKey d
```

**セッションをアタッチ**
プロジェクトの再開。この場合、最後に利用したセッションがアタッチされる。

```bash
$ tmux a
```

**セッション名を指定してアタッチ**

```bash
$ tmux a -t ProjectA
```

**セッションの削除**
プロジェクトが終わったのでセッションを削除

```bash
$ tmux kill-session -t ProjectA
```

**セッションをすべて終了する**

```bash
$ tmux kill-server
```

# ウィンドウ

**ウィンドウ名称を設定する**
今回さくらvpsにて作業を行うのでsakuraとします。
PrefixKey ,
「sakura」と入力してEnter

**新しウィンドウの作成**
PrefixKey c
PrefixKey ,

**ウィンドウ一覧を表示する**
PrefixKey w

**ウィンドウ移動**
PrefixKey p
PrefixKey n

# パネル

**パネルを横に分割**
PrefixKey :split-window
or
PrefixKey "

**パネルを縦に分割**
PrefixKey :split-window -h
or
PrefixKey %

**画面分割を解除する**
PrefixKey !

**パネルのサイズ調整**
PrefixKey スペース

**パネルの同期**
PrefixKey :set-window-option synchronize-panes on
↑
これめっちゃすごいww笑ってしまったw

**パネルの同期をoff**
PrefixKey :set-window-option synchronize-panes off

**パネルをいただく**
PrefixKey :join-pane -s :パネル番号

**パネルをあげる**
PrefixKey :join-pane -dt :パネル番号

**パネル番号を参照する**
PrefixKey q


# 余談
tmuxは体に染み付くまで何度も利用する。

# 参考
[できるtmux－5分でわかる？仮想端末入門－](http://techracho.bpsinc.jp/yamasita-taisuke/2013_03_08/6766)
[tmuxを使いこなそう（ウインドウ、ペイン、セッション、アタッチ、デタッチ）](http://qiita.com/shoma2da/items/2e68c1e59938eb0c2f83)
分散メモリ型並列(MPI)にも対応するC++用並列線形代数ライブラリTpetraをWindowsで使う

世の中uBLASやViennaCLなど（共有メモリ型並列）線形代数ライブラリは数あれど、多ノードなど分散メモリ型並列に対応する線形代数ライブラリはなかなかありません。

そんなな中 **[Tpetra](http://trilinos.org/docs/r11.8/packages/tpetra/doc/html/index.html)** というライブラリを見つけたので使ってみました。

私を個人的にご存知のかたはご存知の通り **Visual Studio以外で開発したくない派** なので、そのための手順メモです。

## 環境

<dl>
<dt>OS</dt><dd>Windows 7 Pro</dd>
<dt>IDE</dt><dd>Visual Studio 2012(Cygwinなどは使わない）</dd>
</dl>

## 準備

0. MS-MPIが使用できる状態にします（[以前の投稿](http://qiita.com/aokomoriuta/items/cecaf3d5a3258606323b)も参照）
0. [CMake](http://www.cmake.org/)をインストールします

## Tpetraのビルド

0. Tpetraは実際には[Trilinos](http://trilinos.org/)というライブラリの中の1パッケージなので、まずは[Trilinosをダウンロード](http://trilinos.org/download/)します（[公開gitレポジトリ](http://trilinos.org/download/public-git-repository/)もあるので私はそっちを使いました・・・これならユーザー登録いらないし）。
0. Cmake-guiを起動します
0. "Where is the source code:"に先にダウンロード（＆解凍）したフォルダを指定します。
0. "Where to build the binaries:"に適当な場所（ダウンロードしたフォルダ以外）を指定します。私はダウンロードしたフォルダの直下にbuildというフォルダを作ってそこを指定しました。
0. Configureします。
0. Specify the generator for this projectでVisualStudioを指定します。
0. 1回めは失敗します（たぶん）ので、以下の設定に変えてください。失敗しなくても再設定したほうがよいと思います。
他のパッケージも使いたければここで設定するとよいと思います（試してないので使い方は不明）
   * `TPL_ENABLE_MPI`をON
   * `Trilinos_ENABLE_ALL_OPTIONAL_PACKEGES`をオフ
   * `Trilinos_ENABLE_TEUCHOS_THE_MONITOR`をオフ
   * `Trilinos_ENABLE_Tpetra`を **オン**
   * `Trilinos_INSTALL_EXECUTABLES`を **オン**
   * `Trilinos_ASSERT_MISSING_PACKEGES`をオフ（gitレポジトリから持ってきた場合は必須 - おそらく通常は見えないのでAdvancedで設定）
0. もう一度Configureします。赤い文字で警告っぽいのがずらーっと出てきますが、とりあえず最後の`Finished configuring Trilinos!`とか`Configuring done`が見えたら大丈夫っぽいです。
0. Generateします。
0. さっき指定したbuildフォルダにVisualStudio用のファイルができてます。
0. **VisualStudioを管理者権限で起動** します。あとでインストール時にProgram Filesの中を触るためです。
0. 管理者権限で起動したVisualStudioから、`Trilinos.sln`を開きます。
0. `ALL_BUILD`プロジェクトをリビルドします。割りに時間がかかるので、気長に待ちましょう。
0. ビルドは成功するはず。
0. `INSTALL`プロジェクトをビルド（リビルドじゃないよ！）します。そうすると、`C:\Program Files (x86)\Trilinos`あたりにインクルード＆ライブラリが一式入ります。
0. ここまで、[Hello world](http://trilinos.org/docs/r11.8/packages/tpetra/doc/html/Tpetra_Lesson01.html)ぐらいは動くようになっているはずです。お試しプロジェクトを作って試してみましょう（プロジェクトのVC++ディレクトリや、リンカーの追加依存ファイルの設定を忘れずに）。

## 線形代数ライブラリを使う

実は↑までだと、BLASライブラリがないので実際に行列計算などしようとするとビルドできません。 *Tpetra自身は別の（基礎となる）BLASライブラリ* が必要です。

ので、今回は[CLAPCK](http://www.netlib.org/clapack/)を入れます。既にMKLなど別のBLASライブラリを入れてる方はこの手順要らないと思います（たぶん）。

0. CLAPACKを手に入れます。自力ビルドする方法もGoogle先生に聞けば一杯見つかるんですが、[実はビルド済みバイナリがある](http://www.netlib.org/clapack/CLAPACK-3.1.1-VisualStudio.zip)のでこれをそのまま使います。
0. 先のビルド済みバイナリを解凍すると、INCLUDEとLIBが既にあるので、それを適当な場所（`C:\clapack\INCLUDE`とか`C:\clapack\LIB`とか）にコピーします。
0. VisualStudioで先にコピーしたINCLUDEとLIBを設定します。追加依存ファイルももちろん設定します。
0. [基礎的な線形代数演算](http://trilinos.org/docs/r11.8/packages/tpetra/doc/html/Tpetra_Lesson02.html)が動くようになったはずです！
0. なんかリンカーの警告が出たりするかもしれませんが、とりあえず動くはずです。
0. ほんとに複数プロセスで並列化できてるのか実感ないですが、とりあえず動くはずです！

## まとめ

* Tpetraは手順通りやればビルドできる（どっちかというとCMakeの使い方が難しい）。
* 基礎的なBLASライブラリがないとTpetraは動かないので、ちょっとめんどい。

では、 ***良き並列化ライフを！***
（なんか試したけどうまくいかないとか、こうした方がいいとかあれば是非コメントください）
Matlabにてディレクトリ内のファイル全部を順番にまとめて走らせるスクリプト書いた

#目的
研究中にコードを書き換えていっていると、
過去の解析用ファイルがちゃんと走らなくなっている可能性があります。

そんな怖さを解消するために、
特定ディレクトリ以下のファイル全部を走らせるスクリプトを
作ってみました。

そんなにしょっちゅうは使わないんですが、参考までに。

#コード
1. dirでフルパスの文字列をみたすファイルのファイル名をフルパスごとObject Cellとして取得
2. Object Cellに番号を入れて、.nameとするとしっかりファイル名が取得できる
3. run(FileName)でそのスクリプトファイルを実行

下記、実行するファイルです。

```matlab:debug_dependencies.m
DebugFiles = 'E:\{USERNAME}\{PROJECT_DIRECTORY}\{TARGET_DIRECTORY}\*.m';
D=dir(DebugFiles);

for k = 1:length(D),
	run(D(k).name);
	DebugFiles = 'E:\{USERNAME}\{PROJECT_DIRECTORY}\{TARGET_DIRECTORY}\*.m';
	D=dir(DebugFiles);
end
```

[元ネタ](http://loudspeaker.sakura.ne.jp/devblog/2014/07/23/run-all-script-files-in-a-directory-in-matlab/)にも同じこと書いてます。

他の方法ご存知でしたらコメントいただきたいです。
よろしくお願いいたします。
GitLabのインストール


GitLabのインストールについて、自分用にまとめていなかったなぁと思って仮想環境で環境ごと作ってみたら、あまりに簡単になっていたのでびっくりした。

以前は、[gitlabhqのインストール手順](https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md)に従ってインストールしていたが、現在はオープンソースの方はGitLab Community Editionとしてdebやrpmによってパッケージ化されていて、非常に簡単にインストールできるようになっていた。

## 環境

OS: Ubuntu x64 14.04 LTS
GitLab: Community Edition Ver 7.4.3

## インストール手順

[GitLabのダウンロードページ](https://about.gitlab.com/downloads/)からUbuntu 14.04を選択し、書かれている手順通りインストールするだけ。
ただし、

```
sudo gitlab-ctl reconfigure
```

とする前に、初期設定だけは済ませておく必要がある。ダウンロードページのOther Linksに、[Troubleshooting and configuration options for Omnibus packages](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md)のリンクがあるので、ここを参考に設定を済ませておく。

最低限の設定は以下の通り。

```/etc/gitlab/gitlab.rb
external_url 'http://localhost'
unicorn['worker_timeout'] = 180
```

`external_url`の設定はデフォルトだとPCのホスト名になっていて、このままだとエラーになってGitLabが起動できないので変更する。

もう1行の`unicorn['worker_timeout']`の方は、行追加して適当なタイムアウト時間を設定しておく。
最初、`external_url`だけ設定して、

```
sudo gitlab-ctl reconfigure
```

と起動してみたところ、ちゃんと起動できたみたいだったので、ブラウザから [http://localhost:8080](http://localhost:8080)にアクセスしてみたが、応答が遅すぎて全く使いものにならない感じだった。
どうにもタイムアウトっぽい動きをしていたのでログを調べてみたところ、
/var/log/gitlab/unicorn/unicorn_stderr.log
にworkerのtimeoutが出ているのが分かった。
そこで、上記のようにunicornのタイムアウト時間を長くしてみたところ、初回アクセスは少し時間がかかるものの、その後のレスポンスは即返ってくる感じになった。

## まとめなど

細かい調整などの環境設定をしようとする場合、`gitlab.rb`にどう書けばいいかいちいち調べないといけない感じなのが残念。GitLabのインストール先にある各設定ファイルを直接変更するのも1つの手だが、`gitlab-ctl`コマンドを通じて設定できるようにしておくほうが、今後のメンテナンスには便利だと思われる。

あと、ちょっと気になった点としてGitLabの以前のバージョンではMySQLも選択できるようになっていたのに、今回はデフォルトでPostgreSQLで動作するようにセットアップされていたことがある。
気になったので少しぐぐってみたところ、
https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/database_mysql.md
とあって、MySQL側の問題で推奨しないようになったようだった。
PostgreSQLの範囲型で期間の重複をチェックするミニサンプル

## 経緯

「パラメータで渡す開始日時・終了日時の期間が、テーブルのtimestamp型のカラムに入っている開始日時・終了日時の期間と重複しているか確認するSQLを書きたいんですが...」

（これ、PostgreSQL勉強会＠札幌でやったとこだ！）

というわけでミニサンプル書いておく。

## ミニサンプル

### やりたいこと

```postgres
create table bar (
	bar_id bigserial,
	open_at timestamp without time zone,
	close_at timestamp without time zone,
	primary key (bar_id)
);
-- 10月1日0時（以上）から10月2日0時（未満）を比較対象に見立てる
insert into bar(open_at, close_at) 
values ('2014-10-01 00:00:00', '2014-10-02 00:00:00' );
```

こんなテーブルがあったときに、パラメータで渡される他のopen_at, close_atと重複しているレコードがあるかどうか調べたい。

### 方法
tsrange関数で、レコードとパラメータを範囲型に変換して、&&演算子で比較する方法が一番わかりやすいかなと思う。

```postgres
-- 9月30日12時から10月1日0時までの重複を確認（重複しない想定）
select name 
from (
  select bar_id, strange (open_at, close_at, '[)') as range from bar
) as A
where range && tsrange('2014-09-30 12:00:00'::timestamp, '2014-10-01 00:00:00'::timestamp, '[)')

-- 9月30日12時から10月1日12時までの重複を確認（重複する想定）
select bar_id
from (select bar_id, tsrange(open_at, close_at, '[)') as range from bar) as A
where range && tsrange('2014-09-30 12:00:00'::timestamp, '2014-10-01 12:00:00'::timestamp, '[)')

-- 10月1日0時から10月2日12時までの重複を確認（重複する想定）
select bar_id
from (select bar_id, tsrange(open_at, close_at, '[)') as range from bar) as A
where range && tsrange('2014-10-01 00:00:00'::timestamp, '2014-10-02 12:00:00'::timestamp, '[)')

-- 10月2日0時から10月2日12時までの重複を確認（重複しない想定）
select bar_id
from (select bar_id, tsrange(open_at, close_at, '[)') as range from bar) as A
where range && tsrange('2014-10-02 00:00:00'::timestamp, '2014-10-02 12:00:00'::timestamp, '[)')
```

重複があればbar_idカラムの値が検索される。

今回は open_at以上〜close_at未満で比較したいので、境界値は'[)'を利用しているけれども、境界値を変更すると、もちろん重複結果も変えることができる。

## 参考文献

範囲型の説明は以下が詳しい。

- [PostgreSQLの範囲型について](http://qiita.com/yancya/items/7dab25415fe5271c662f)
- @iakio さんの[PostgreSQLの範囲型と排他制約](http://www.slideshare.net/iakio/range-type-and)
- [PostgreSQLドキュメント 8.17. 範囲型](https://www.postgresql.jp/document/9.3/html/rangetypes.html)
Macでターミナル(Terminal) UNIXコマンド備忘録


##SCPコマンド

###基本
コマンドによる基本仕様

```Bash:comnad
$ scp <送るファイル> <送り先におけるユーザ名>@<送リ先サーバ>:<送り先のディレクトリ>
```
_例1_
ここではXREAサーバへアップしてみる

|項目         　    |コマンド      |
|:-----------------|------------:|
|送るファイル　　     |ローカルの sample.txt|
|送り先　　　　　     |s601.xrea.com|
|送り先におけるユーザ名|user         |
|送り先ディレクトリ   |work           |

```Bash:comnad
$ scp sample.txt user@s601.xrea.com:work
```

あとはパスワードを求められるので入力したら送信完了。

##tar gz コマンド

###基本

[file]tar.gz 解凍

```Bash:comnad
$ tar zxvf test.tar.gz
```

[file]tar.gz 圧縮

```Bash:comnad
$ tar zcvf test.tar.gz test.txt
```
Macでnginxを使ってPHPを実行させる手順

nginx, php, php-fpmがインストールされている前提。

##  php-fpmの設定

設定ファイルをコピーして作成

```bash
sudo cp -p /etc/php-fpm.conf.default /etc/php-fpm.conf
```

設定ファイルを編集

```text:php-fpm.conf
;pid = run/php-fpm.pid
pid = /var/run/php-fpm.pid

;error_log = log/php-fpm/php-fpm.log
error_log = /var/log/php-fpm/php-fpm.log
```

エラーログ用にディレクトリ作成

```bash
sudo mkdir /var/log/php-fpm
```

## nginxの設定

nginx.confの```location ~ \.php$```の部分のコメントアウトを削除
※ドキュメントルート等はお好きな様に

## php-fpmとnginxを起動

```bash
sudo php-fpm
sudo nginx
```

おわり。
おれのgit config


毎回「git config オススメ」とかで調べるのがめんどくさいので自分用に作ります。

## 最初にこれ

普通にシェルのエイリアス設定しときます。

```
alias g="git"
```

それから、`--global` 打つのがダルいので。

```
g config --global alias.cfg "config --global"
```

## 設定

```
[core]
	excludesfile = ~/.gitignore_global
	autocrlf = false
	pager = less -r
	editor = vim
	precomposeunicode = true
	quotepath = false
[alias]
	cfg = config --global
	c = commit
	p = push
	pl = pull
	a = add
	b = branch
	rmt = remote -v
	co = checkout
	m = merge
	df = diff
	st = status
	f = fetch --all -p
	rsh = reset --hard
	fp = fetch origin+refs/pull*:refs/remotes/pull/*
[color]
	ui = auto
[push]
	default = current
[pull]
	rebase = true
[hub]
	protocol = https
[credential]
	helper = gcloud.sh
[pager]
	log = diff-highlight | less
	show = diff-highlight | less
	diff = diff-highlight | less
[diff]
	compactionHeuristic = true
```

``` command
g cfg core.excludesfile ~/.gitignore
g cfg core.autocrlf false
g cfg core.pager "less -r"
g cfg core.editor vim
g cfg color.ui auto
g cfg core.precomposeunicode true
g cfg core.quotepath false
g cfg push.default current
g cfg pull.rebase true
```

## alias

ここは完全に趣味ですよね

```
[alias]
	cfg = config --global
	c = commit
	p = push
	pl = pull
	a = add
	b = branch
	rmt = remote -v
	co = checkout
	m = merge
	df = diff
	st = status
	f = fetch --all -p
	rsh = reset --hard
	fp = fetch origin+refs/pull*:refs/remotes/pull/*
```

``` command
g cfg alias.c "commit -v"
g cfg alias.b branch
g cfg alias.co checkout
g cfg alias.p push
g cfg alias.st status
g cfg alias.df diff
g cfg alias.rmt "remote -v"
```
h2oをamazon linux環境(aws)でビルドするためのメモ

@kazuho さんが最近作ったnginxの2倍速いという噂のh2oをamazon linuxでビルドするメモ。
さすがにh2oをmacでbuildするのはこの短時間じゃ無理だった。前に一度まとめた事があるのでメモを開放しておく。

# cmake を 3.0.2 にする
```shell-session
sudo yum install curl curl-devel 
sudo yum install libarchive libarchive-devel
sudo yum install expat expat-devel
wget http://www.cmake.org/files/v3.0/cmake-3.0.2.tar.gz
tar -xvf cmake-3.0.2.tar.gz
cd cmake-3.0.2
./bootstrap --prefix=/usr       \
            --system-libs       \
            --mandir=/share/man \
            --docdir=/share/doc/cmake-3.0.2   &&
make
sudo make install
```

# libyaml を install
```shell-session
wget  http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar -xvf yaml-0.1.5.tar.gz
cd yaml-0.1.5
./configure
make
sudo make install
```

# h2o を install
```shell-session
git clone https://github.com/kazuho/h2o.git
cd h2o
git submodule update --init --recursive
cmake .
make h2o
./h2o -c examples/h2o.conf
curl http://localhost:8080/
```

#example h2o.confの中身
```yaml
listen: 8080
hosts:
  default:
    paths:
      /:
        file.dir: examples/doc_root
    access-log: /dev/stdout
```
Pythonを問題を解きながら勉強もできる「CheckiO」

#CheckiOって知ってる？
**CheckiO**というゲーム(?)に登録したので簡単にご紹介してみます。
人によっては「今更？」といわれてしまいそうですが、
どうかお許しください。。。

##CheckiOとは
プログラミングをゲーム感覚で学べるWebサービスです。
どの辺がゲームっぽいかというと、まずUIですかね。↓
![checkio.png](https://qiita-image-store.s3.amazonaws.com/0/53719/c4193fc1-2785-274d-449b-96981698fea2.png)

すごーーーくざっくりした流れとしては
1.問題を解く
2.レベルが上がる
3.挑戦できる問題が増える
となっているのですが、2、3あたりはまんまゲームですね。

問題自体は単純だけど、少し考えるくらいの問題(最初だけ？)

また、解いた問題は他のプレイヤーの解答が見れる上に
それにに対して「イイね」見たいな事とかコメントができるので、
世界のPythonista目線での良解答がわかるってのもすごくいいと思います。


##対応言語
プログラミング言語としては**Python**です。
外国語とかの言語は基本英語。
**だがなんと！**問題は日本語対応してくれているんです！すばらしい。

なので問題解くよりヘルプとかの方が難しかったりもするw

-----

登録方法とかは調べればいくらでも出てくるので省略。
ということで、以上！

###関連リンク
CheckiO公式：http://www.checkio.org/
参考サイト：http://himazines.com/web/checkio/
QMLのQTCOMPOSEがどうとか言われるWarningを潰す

Qt5がアツいらしいので試してみてる。
まあとりあえずこんなん書いてみて、

```qml
import QtQuick 2.0

Rectangle {
    id: window
    color: "white"
    width: 150; height: 75
     Text{
        id: label
        anchors.centerIn: parent
        text: "こんちわ"
    }
}
```

こんなかんじでうごかしてみたんだけど、何かでた。

```
% /usr/local/lib/qt5/bin/qml hello.qml
Qt Warning: Could not find a location of the system's Compose files. Consider setting the QTCOMPOSE environment variable.
Qt Warning: Could not find a location of the system's Compose files. Consider setting the QTCOMPOSE environment variable.
```

Compose file がないから ```$QTCOMPOSE``` にセットしろボケェ、といってるみたいなんだけど、QTCOMPOSEでググってもロクな情報がでない。まあComposeっていってるしXのcompose.dirでも渡せばいいんだろうということで

```
% QTCOMPOSE=/usr/local/lib/X11/locale/ /usr/local/lib/qt5/bin/qml hello.qml
"Qt Warning - invalid keysym: dead_actute" 
```

うまいこと消えた。そして別のWarningが。
メッセージ見るとdead_actuteなんてkeysym無いよと言ってる。たしかにそんなもの知らん。というかdead_acuteのtypo感がすさまじい。

・・・あまりにアホらしくなったのでQTCOMPOSEとPATHの設定だけ済ませて深入りしないことにした。
Capistranoでデプロイ先のディレクトリについて

Vagrant上のゲストへCapistranoでデプロイしようとして失敗。
以下を参考に、パーミッションを変更した。

[Rails環境構築（5）Capistranoによるデプロイ ※未完 - そのねこが学ぶとき # パーミッション](http://d.hatena.ne.jp/keyword/%A5%D1%A1%BC%A5%DF%A5%C3%A5%B7%A5%E7%A5%F3 "パーミッション")
> ### デプロイ先ディレクトリのパーミッション
> 
> 大変アホみたいな話だが最初これでmkdirが上手くいかなかった。公式ドキュメントのココに書いてあるけど、SSHユーザーはsudoなしでデプロイ先ディレクトリを操作できる権限がなきゃダメです。vagrantユーザーは~/var配下の操作権限なかったので弾かれた次第。。。
> 
> 対応としてはさっきのリンク先に書いてある手順通りsgidの設定とかしてあげたらなんとかなりました。あるいはパスワードなしでsudo実行可能にしてやっても動くみたいだけど、当然ながらサーバーセキュリティ的にはNGなので。まぁvagrantであればどうでもいいかもしんないけど。
gemをローカルで修正

# 手順

1) gem の取得  

```
$ gem fetch [pakcage]
```

2) gem をローカルに展開  

```
$ gem unpack [pakcage]-x.y.z.gem
```

3) ファイルの修正

```
$ cd [pakcage]-x.y.z
$ vim ...
```

4) specファイルの取得

```
$ gem spec [pakcage] > [pakcage].gemspec
```

5) パッケージのビルド

```
$ gem build [pakcage].gemspec
```

6) 修正した gem のインストール

```
$ sudo gem install ./[pakcage]-x.y.z.gem
```

# 参考

* [インストールできない gem を修正してインストールする : とってもやる気がないんです。](http://blog.livedoor.jp/denpa_yunyun/archives/52476081.html "インストールできない gem を修正してインストールする : とってもやる気がないんです。")
* [gem パッケージをローカルで修正](http://yaplog.jp/nkmu/archive/5 "gem パッケージをローカルで修正")
Ansible では su でなくて sudo が良いのか

構成管理のために Ansible を使ってみるべ、と評価をしていたのですが ssh 経由の su 作業が上手くできなくてひっかかっていました。

# Ansible がログインで固まる
悩まされたのはこの固まる現象でした。
```-c ssh``` だと ^C が効くのでまだ良いのですが ```-c paramiko``` だと何故か ^C が効かず、やむを得ず kill する状況となっています。
どうも su 設定だとログイン後 su を使用とするタイミングで待ちに入る様で、調べて見ると su が出す ```password:``` というラインの文字列を待っている状態の様です。文字列マッチなので、ロケールが日本語になっていて ```パスワード:``` と表示されているとマッチせず何時までも待ち続けるということの様です。

じゃあ ```LANG=C``` を環境に持つユーザーアカウントを作ってそこ経由で利用すれば良いのではないかということになるのですが、debian7 では解消しきれませんでした。ちょっと文字列がちがうのかな？

ひとしきり試したあと su はやめて sudo 経由でのオペレートにしようという結論に至りました。
これまで sudo は使っていなかったのですが、これで始めて設定を行いました。

# Cygwin 上だと paramiko でログインできないサーバーがある
Ansible は Python スクリプトなので特に Cygwin 上でも問題無いだろと思っていたのですが、なぜかログインできないサーバーがありました。

```
"FAILED: (11, 'Resource temporarily unavailable')"
```
と表示されてログインできない状態です。

今のところ現象も理由も良くわからないのでお手上げ中。
Linux 上では問題なく動いているのでそちらで使う様にして問題放置。

# メンテナンス用アカウント
複数サーバーの一斉アップデートとかする用途では、それぞれのサーバーにメンテナンス用のアカウントを作ると環境を揃えられてやりやすい様です。
[vim] Emmet (Zen-Coding)にてTabキーで展開する

[emmet-vim] (https://github.com/mattn/emmet-vim)はHTMLを簡単に書くことができるプラグイン。

しかし、標準のキーマップが Ctrl + Y + , という手が疲れる感じなので他の主要対応エディタのように Tabキー で展開できるようにしたい。

```vim
autocmd FileType html imap <buffer><expr><tab>
    \ emmet#isExpandable() ? "\<plug>(emmet-expand-abbr)" :
    \ "\<tab>"
```

Tabキーの動作を変更しているので他の操作と衝突するかもしれない。
[vim] Ctrl + / (スラッシュ) キーをマップする

`<C-/>`ではなく`<C-_>`を使うとマッピングできる

```vim
nmap <C-_> expr...
```

## 設定例：ctrl + / で選択範囲のコメントアウト切り替え

```vim
NeoBundle "tyru/caw.vim.git"
nmap <C-_> <Plug>(caw:i:toggle)
vmap <C-_> <Plug>(caw:i:toggle)
```
[Unity] C#プログラム側からシェーダに値を渡す


当然、CPUプログラム側からGPUプログラム（シェーダ）にデータを渡すことができますが、UnityのGameObjectにアタッチされたスクリプトからもシェーダに値を設定することが出来ます。

シェーダに値を送るには`Material`クラスを利用します。

```cs:trasferData2shader
private Material material;

// Use this for initialization
void Start () {
	// 初期化時にマテリアルを保持しておく（ダイレクトにアクセスしてももちろんOK）
    this.material = gameObject.renderer.material;
}

// Update is called once per frame
void Update () {
	// 経過時間に応じて値が変わるよう適当な値を入れる
    float r = Mathf.Sin(Time.time);
    float g = Mathf.Sin(Time.time) + Mathf.Cos(Time.time);
    float b = Mathf.Cos(Time.time);

	// Materialクラスの`Set****`メソッドを使ってシェーダに値を送信
    this.material.SetColor("_Color", new Color(r, g, b, 1.0f));
}
```

見てもらうと分かるように、シェーダにデータを送るのはとてもシンプルです。
第一引数の`"_Color"`の部分はシェーダ側で定義されたプロパティ名です。
`SetColor`という名称から分かるように、シェーダのプロパティで宣言できる型それぞれにSetterがあるようです。

第二引数はそれぞれの型に応じたクラスを使って値を設定します。
上記の例で言えば`Color`クラスですね。

[こちらのUnityのドキュメント](http://docs-jp.unity3d.com/Documentation/ScriptReference/Material.SetFloat.html)を見ると、`SetFloat(int nameID, float value)`とあるように、文字列による名前だけではなく、int型の`nameID`を指定してもいいようです。
Rails link_to にHTMLタグを含む文字列を挿入する


最近は、`CSS`のスタイル等が複雑で、`link_to` で生成される文字の部分にHTMLタグを挿入したい場合がある。
この場合は、どうやら `link_to` のブロック構文というものも存在するようだ。

```index.html.erb
<%= link_to index_index_path do %>
    <i class="icon-home"></i>Home</a>
<% end %>	
```

これによって、下記のHTMLタグが生成される。

```index.html
<a href="/index/index">
    <i class="icon-home"></i>Home
</a>
```

これは便利。
今後はブロック構文というものも勉強しよう。
Swift / 文字列を１行ずつ抜き出す

String.enumerateLinesを使う
-
テキストファイルから文字列を読み込んだ時等に役立つと思います。
定義は下記

```swift:String.enumerateLines
func enumerateLines(body: (line: String, inout stop: Bool) -> ())
```


サンプルコード
-
enumerateLinesの引数をクロージャで記述したサンプルコードです

```swift:文字列を１行ずつ抜き出す
var text: String = "hogehoge\npiyopiyp\nfugafuga"

var lineIndex = 1

//１行ごとに文字列を抜き出す
text.enumerateLines{
    line, stop in

    //下記に１行ごとに行いたい動作を記述
    println("\(lineIndex) : \(line)")
    lineIndex += 1
}

```

```swift:出力結果
1 : hogehoge
2 : piyopiyp
3 : fugafuga
```