OmniAICreator/Qiita-1.07M huggingface dataset:
tink_langマクロでHaxeのシンタックスを拡張する

# Wthat is tink_lang ?

[Haxetink](https://github.com/haxetink)ライブラリの一つで、マクロによってHaxeのシンタックスを拡張してくれるライブラリです。
https://github.com/haxetink/tink_lang

# Install & Setting

haxelibからインストールできます。

```
haxelib install tink_lang
```

コンパイル時に指定すればtink_langを利用出来るようになります。

```
haxe -main <class> [-swf|-js|-neko|-php|-cpp|-as3] <output> -lib tink_lang
```

# Usage

class名の前にアノテーションをつけることで拡張シンタックスが利用出来るようになります。
ソースコード中でtink_langをimportする必要はありません。

```hx
@:tink class Main {
	// any where...
}
```

## コンストラクタ

```hx:普通のHaxe
class Sample {
	var x: Int;
	var y: Int;
	var value: String;

	public function new(x: Int, y: Int, ?value: String) {
		this.x = x;
		this.y = y;
		this.value = if (value == null) "default" else value;
	}
}
```

```hx:tink_langによる拡張
@:tink class Sample {
	var x: Int = _;
	var y: Int = _;
	var value: String = ("default");
}

class Main {
	static function main() {
		// 1がxに、2がyに設定され、"default"がvalueに設定される。
		new Sample(1, 2);

		// valueには"assign"が設定される。		
		new Sample(1, 2, "assign");
	}
}
```

## アクセサ

```hx:普通のHaxe
class Sample {
	var x(get, null): Int;
	function get_x(): Int return x;
	
	@:isVar var y(get, set): Int;
	function get_y(): Int return y;
	function set_y(y: Int): Int return this.y = y;
}
```

```hx:tink_langによる拡張
class Sample {
	@:read var x(get, null): Int;
	@:property var y(get, set): Int;
}
```

## ループ

様々なfor文の拡張があります。

### キー・バリューループ

```hx
var map = new Map();
map.set("one", 1);
map.set("two", 2);
map.set("three", 3);

for (key => value in map) {
	trace('$key: $value'); // one: 1, two: 2, three: 3
}
```

### パラレルループ

```hx
var arr1 = [1, 2, 3];
var arr2 = [4, 5, 6];

for ([v1 in arr1, v2 in arr2]) {
	trace('${v1 * v2}'); // 4, 10, 18
}

var arr3 = [7, 8, 9, 10];

for ([v1 in arr1 || 100, v3 in arr3]) {
	// v3が10の時、v1はループが終わっているので100がv1に設定される。
	trace('${v1 * v3}'); // 7, 16, 27, 1000
}

```

### 型フィルタ

```hx
var anyArray: Array<Dynamic> = [1, "a", "b", 2, [1,2]];
var nums  = [ for ((num: Int) in anyArray) num ]; // [1, 2]
var chars = [ for ((char: String) in anyArray) char ]; // ["a", "b"]
```

## 匿名関数

パラメータに型を指定できませんが、以下のようにシンプルに匿名関数を記述することが出来ます。

```hx
x => 2 * x;
// function(x) x * 2;

[x, y] => x * y;
// function(x, y) x * y;

@do trace('something');
// function() trace('something');

@do(v) {
	trace('Hello $v');
}
// function (v) {
//     trace('Hello $v');
// }
```

---

tink_langのほんの一例をあげてみました。
他にも便利な拡張シンタックスがたくさんあるので、
「Haxeはこんな記述も出来ないのか！」なんて思ったらtink_langのGithubにあるREADMEを眺めてみるといいと思います。
Zenlogic に concrete5 をインストールする方法


ファーストサーバー社の新しいホスティングサービス、[Zenlogic](https://zenlogic.jp/) へ concrete5.7.4.2 までのインストールの確認が出来ました。

PHP の mbstrings の設定を変更して頂く必要がありますが、.htaccess でちょちょいと変更していただくだけで設定が可能です。

＊この記事は 2015/5/26 時点のものです
＊この記事は concrete5.7.4.2 で動作確認を行っています
＊動作確認は Zenlogick「ホスティング 1vCPU/1GB、100GB」で行いました。


# 最新版

この記事は、concrete5 日本語公式サイトに掲載するために書いたチュートリアルです。最新版は下記で公開しています。

http://concrete5-japan.org/help/5-7/install/hosting/zenlogic/




# 準備

## FTP や MySQL などの準備

- FTP アカウント設定
- MySQL データベースの設定
- phpmyadmin インストール

をコントロールパネルから行いましょう。

上記は、普通にコントロールパネルから、パスワードなどを設定していきます。パスワードは堅牢なものにして、全て違うパスワードを使うようにしましょう。

## phpMyadmin: concrete5 専用の MySQL ユーザーを作成

そして、phpmyadmin を使って concrete5 インストール用の MySQL データベースを作成します。できれば、ユーザーは root ではなく、concrete5 専用のユーザーを作成するようにしましょう。

- phpmyadmin に root ユーザーでログイン
- タブメニューから **ユーザー** を選択
- **ユーザーを追加する** を選択
- ログイン情報を入力
	- ユーザー名は任意の
	- ホストはプルダウンから「ローカル」を選択 (* 今回はローカル想定なので)
	- パスワードは堅牢なものを作ってください。
	- 「同名のデータベースを作成して全ての特権を与える」をチェック

これで準備完了です。

## concrete5 をダウンロード

[concrete5 をダウンロード](http://concrete5-japan.org/about/download/)し、FTPにアップします。

ただ concrete5 のFTPへのアップロードは、結構時間がかかるので、PHP ファイルを使って、ブラウザから一発でダウンロード & 解凍できるプログラム「concrete5 CMS Simple Downloader」があります。

### concrete5 CMS Simple Downloader を使う

- [concrete5 CMS Simple Downloader](https://github.com/concrete5japan/c5downloader)

1. [こちらから c5download.php](https://github.com/concrete5japan/c5downloader/archive/master.zip)のZIPファイルをダウンロードして解凍
2. 「c5download.php」ファイルをFTPサーバー上にアップ。concrete5 を走らせたいディレクトリに配置してください。ドメインルートをご希望であれば「default」フォルダ配下などに配置してください。
3. ファイルを直接ブラウザから訪問してください
4. concrete5.x.x.x.zip というファイルがダウンロードされます
5. concrete5.x.x.X というフォルダが作成され、そのフォルダに一旦ファイルが解凍されたあと、元々アップされたフォルダに展開されます。
6. ZIP ファイルや、解凍時に作られたフォルダ、そして **c5download.php を必ず削除してください**。

Zenlogic では、2015/5/26 時点で、PHPからのサーバー書き込みが許可されているので、上記作業をシームレスに行うことができます。

何度も繰り返しますが、c5download.php をサーバー上に残しておくと、だれでも concrete5 ファイルをダウンロード&解凍できてしまう危険なファイルですので、一時的な使用のみにしてください。


## .htaccess の設定

FTPでアクセスして、.htaccess ファイルを作成し、下記のコードを入れてください。

```.htaccess
php_value mbstring.translation off
```

# concrete5 インストールの開始

準備が整いました。

Zenlogick 上の concrete5 サイトにブラウザから訪問し、画面に従って、インストール作業を進めてください。



以上
bashで数値の1と0を相互に反転

変数に数値の1が入っていたら0に、0が入っていたら1にする方法。

# 方法1

```bash
num=1
num=$((1&~num)); echo $num
# ->0
num=$((1&~num)); echo $num
# ->1
```

`~`でビット反転し、1との論理積をとって1bit目のみ有効にする。

# 方法2

```bash
num=1
num=$((1!=num)); echo $num
# ->0
num=$((1!=num)); echo $num
# ->1
## もしくは
num=$((1-num)); echo $num
# ->0
```

trueが0、falseが1というのを利用しているが、falseが絶対1になるかどうかは知らない。


# 備考


で、これを一体どんなときに使うんだ？と。
たぶんほとんど用途は無い。
入力契機でtoggleとかだろうか。

※以下、本題とあまり関係ありません
ちなみに自分は、2つで1セットの定数値をある条件の時は1個目、2個目の順に処理し、またある条件の時は2個目、1個目の順に処理したい、みたいな時に使った。
って言葉で説明が難しいのでコードを書くと、

[普通にやった版]

```bash
readonly VAL_A1="値A1"
readonly VAL_A2="値A2"
readonly VAL_B1="値B1"
readonly VAL_B2="値B2"
myfunc() {
  echo $1 $2
}
if [ "一致" == "$1" ]; then
  myfunc $VAL_A1 $VAL_A2
else
  myfunc $VAL_A2 $VAL_A1
fi
echo "～中間処理～"
if [ "一致" == "$1" ]; then
  myfunc $VAL_B1 $VAL_B2
else
  myfunc $VAL_B2 $VAL_B1
fi
```


[1,0反転版]

```bash
readonly ARR_A=("値A1" "値A2")
readonly ARR_B=("値B1" "値B2")
myfunc() {
  echo $1 $2
}
[ "一致" == "$1" ] && idx=0 || idx=1
idx2=$((1&~idx))
myfunc ${ARR_A[$idx]} ${ARR_A[$idx2]}
echo "～中間処理～"
myfunc ${ARR_B[$idx]} ${ARR_B[$idx2]}
```

値のセットが一つだけとか、複数セットあっても一つ目のif文に収められるなら、多少冗長でも普通にやった版の方が見やすいかもしれない。。
というか、1,0反転版って反転しなくても`[ "一致" == "$1" ]`のところで変数`idx`と一緒に`idx2`にも固定値セットすれば済むっちゃ済む。
ということで利用例として微妙だった。
※普通にやった版で配列を使っていないが、別に使えないわけではないので、使えば2step減る
Swiftドキュメンテーションコメント（JavaDoc的なやつ）


## 更新 2015.09.27
Xcode 7 で記述のしかたが変わったようなので「[Swiftのドキュメントコメント - Qiita](http://qiita.com/hironytic/items/12589b4735f4c95eec0c) 」を参照


---

JavaDoc的なやつ。

![Swiftドキュメンテーションコメント.png](https://qiita-image-store.s3.amazonaws.com/0/41522/43c7c827-6a4c-355c-a860-057d00d460a9.png)

```swift:MyPlayground.playground
/**
* 箇条書き
    - aaa
    - aaa
    - aaa

* 番号付き
    1. aaa
    2. aaa
    3. aaa

* コード1
 // ほげほげ
 let hoge = Hoge()
 hoge.doSomething()


* コード2

    // ふがふが
    let fuga = Fuga()
    fuga.doSomething()


:param: 引数1
:param: 引数2
:returns: 戻り値
*/
```
- 「コード1」は、スペース1つ
- 「コード2」は、改行を入れて、スペース4つ
- 「*」「-」「+」は、どれもリスト表示のためのもので、同じものとして解釈される模様

## 参考
- [Does Swift have documentation comments or tools? - Stack Overflow](http://stackoverflow.com/questions/24047991/does-swift-have-documentation-comments-or-tools)
- [Swift Documentation - NSHipster](http://nshipster.com/swift-documentation/)
CSSでテキストにアンチエイリアスをかける

```css
.antialias {
    transform: rotate(0.028deg);
    -o-transform: rotate(0.028deg);
    -ms-transform: rotate(0.028deg);
    -moz-transform: rotate(0.028deg);
    -webkit-transform: rotate(0.028deg);
}
```
IE9以上のブラウザであれば、これでMacとほぼ同じレベルのアンチエイリアスがかかる。
よっぽどでかい要素だったりborderがついている要素でなければ傾きは全く気にならないレベル

Google Chromeだと若干細めに文字がレンダリングされるから細字のフォントには注意。

##追記（2015/10/16）
antialiasのclassをつけた要素の中に画像が入ると若干荒くなる
対策としては画像だけ角度を戻せばOK

```css
.antialias {
    transform: rotate(0.028deg);
    -o-transform: rotate(0.028deg);
    -ms-transform: rotate(0.028deg);
    -moz-transform: rotate(0.028deg);
    -webkit-transform: rotate(0.028deg);
}

.antialias img{
    transform: rotate(-0.028deg);
    -o-transform: rotate(-0.028deg);
    -ms-transform: rotate(-0.028deg);
    -moz-transform: rotate(-0.028deg);
    -webkit-transform: rotate(-0.028deg);
}
```
LEF(Lisp Flavored Erlang)ハジメマシタ #0 - Hello World



## LFEとは

最近流行りのErlangで書かれたLispです。


## この記事

LFEについての日本語の情報が少ないので書いてみました。


## 著者

* ちょっぴりLispが好きな普通のプログラマ
* とある勉強会で[@voluntas](https://twitter.com/voluntas)さんの話を聞き、最近Erlangの勉強を始める


## 環境構築(Mac OSX)

[QuickStartガイド](http://lfe.gitbooks.io/quick-start/content/1.html)を参考にインストールします。


Erlangのインストール

```
brew install erlang
```


バージョンの確認

```
$ erl -V
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V5.10.4  (abort with ^G)
1> q().
ok
```

LFEのインストール

```
git clone https://github.com/rvirding/lfe.git
cd lfe
make
```


## Hello World

replの起動

```
./bin/lfe

Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

LFE Shell V5.10.4 (abort with ^G)
```

Hello World

```
> (io:format "LFEハジメマシタ~n")
LFEハジメマシタ
ok
```


replの終了

```
> (exit)
ok
```


## 文法

基本的な文法については、既に[@nobkzさんが解説されている記事](http://qiita.com/nobkz/items/2be2b6806237d8ea6e21)があるので、そちらを参照してください。みなさんお馴染みのLispです、バリバリ書けそうですね。


## 次回

何かプログラムを書きます。
PlayFramework: play2-authのサンプルを動かしてみたい

Play Frameworkの認証・認可のライブラリの[t2v/play2-auth]のサンプルを動かす方法です。基本的に[GitHubのREADME]のとおりなのですが、一点つまづいたところがあったので書いてみました。

## play2-authのサンプルを動かす手順

play2-authのリポジトリをクローンします。

```
git clone https://github.com/t2v/play2-auth.git
```

sbtでサンプルを起動します。

```
cd play2-auth
sbt "project sample" run
```

ここで`sbt`がMacに入っていない場合は、`brew install sbt`します。

http://localhost:9000/ をブラウザで開く。

開くとエラーっぽい画面が出ますが、これはDBをセットアップするかどうかのお伺いだけなので、「Apply this script now!」を押します。

![](https://qiita-image-store.s3.amazonaws.com/0/889/07d0219a-b5c1-eaef-74ee-a553f19d2e31.png)

なお、サンプルのDBはメモリ上で動くので、別途データベースをインストールする必要はりません。(自分はよく読まずに、dbまわりの設定を確認してしまった…)

以上の手順を終えると、ログインページが出るのでログインしてみることができます。

予め使えるアカウントとして下記の3つが用意されています。

Email             | Password | Role
---|---|---
`alice@example.com` | secret   | Administrator
`bob@example.com`   | secret   | NormalUser
`chris@example.com` | secret   | NormalUser


[t2v/play2-auth]: https://github.com/t2v/play2-auth)
[GitHubのREADME]: https://github.com/t2v/play2-auth#running-the-sample-application
sat の Mac 初期設定

**1- はじめに**
***

はじめまして学生の Sat です。自称 mimi エンジニアです。今回がはじめての投稿です。
先日 Mac Pro を新規に購入しました。そのときにした初期設定を載せます。

**2- Install**
***

*とりあえずインストールするもの一覧*

・Google Chrome
  https://support.google.com/chrome/answer/95346?hl=ja
  Google が開発しているウェブブラウザ。これか Safari を主に使用している。


・clipMenu　
  http://www.clipmenu.com/ja/
  コピーしたテキスト等を履歴管理できる。元上司が教えてくれた。ありがとう sh さん。

・sequelPro
  http://www.sequelpro.com/
  Mysql をあれこれする GUI。上司曰くパンケーキと呼ぶらしい。

・Xcode
  app store で検索
  アップルが出している IDE。IOS アプリの開発なんかもできて Good。

・homebrew
  http://brew.sh/index_ja.html
  パッケージ管理システム。詳しくはこちらの記事を参照 ->
  http://qiita.com/omega999/items/6f65217b81ad3fffe7e6

・evernote
  https://evernote.com/intl/jp/
  ファイルなりメモなりを保存できる。最近いろいろな機能をつけてわけわかんない。

・Anaconda
  http://continuum.io/downloads
  Pythonの数値計算環境を構築するために様々なパッケージをまとめた無料のディストリビューション。
  最近 python を使用することが多いので install しておく。

**3- vim の初期設定**
***
*3-1. vim の version を 7.3 -> 7.4 へ*
````$ brew update
$ brew install vim ````    
クリップボード連携ができるかを確認する
````$ /usr/local/Cellar/vim/7.4.712/bin/vim --version | grep clipboard
+clipboard +iconv +path_extra -toolbar
+eval +mouse_dec +startuptime -xterm_clipboard
````

既存の vim を置換する
```` $ sudo mv /usr/bin/vim /usr/bin/previous_vim 
$ sudo ln /usr/local/Cellar/vim/7.4.712/bin/vim /usr/bin/
````

vim が変わったか確認する
```` $ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled May 25 2015 18:42:58)
以下略 ````

*3-2. vim プラグインの管理を NeoBundle で行う*
http://qiita.com/muran001/items/3080c4816b7c2e65e40b

**4- bash から zsh へ**
***
*4-1. デフォルトを bash ではなく zsh にする*
install されている shell とその pass を確認
```` $ cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh ````

/bin/zsh がある。OK。
ログインシェルを変更
```` $ chsh -s /bin/zsh ````

*4-2. zsh の初期設定*
以下を ~/.zshrc に記述

````   
# 補完機能
autoload -U compinit
compinit

# ls をしたときにディレクトリ等に色をつけてくれる
export LSCOLORS=cxfxcxdxbxegedabagacad
alias ls="ls -G"

# rm で間違ったファイルを消すことがあるため、rm するときは必ず確認するようにする。
alias rm="rm -i"

# コマンド訂正
setopt correct

# 補完候補を詰めて表示する
setopt list_packed 

# 補完候補表示時などにピッピとビープ音をならないように設定
setopt nolistbeep
````

**5- 最後に**
****
とりあえずこんなところ。他にもやったほうがいいこといっぱいありそう。
なんかあったら投げやりに伝えてください。
ちなみに vim の設定は非常に長いので省略しました。

**6- 参考記事**
****
* MacのVimでHomebrewを使ってクリップボード連携を有効にする
http://qiita.com/shoma2da/items/92ea8badcd4655b6106c
* NeoBundleを用いたVimプラグイン管理と色設定メモ
http://qiita.com/muran001/items/3080c4816b7c2e65e40b
* homebrewとは何者か。仕組みについて調べてみた
http://qiita.com/omega999/items/6f65217b81ad3fffe7e6
* zsh入門してみたら便利すぎて鼻息が抑えられない
http://ama-ch.hatenablog.com/entry/20090109/1231526834
LaravelでSeederを使ったSQLiteデータベーステーブルへの値の挿入

LaravelのSeedクラスを使ってテーブルに値を挿入します。

Laravelでのテーブル作成については[ここ](http://qiita.com/f00tba11artist/items/009860851078726055d0)を参照してください。

postsというテーブルがありid, title, messages, userというカラムを持っているとします。
このテーブルをオブジェクトとして扱うためにモデルクラスを作る必要があります。
プロジェクト/app/models/以下にPost.phpというファイルを作りましょう。
ここで大事なのがテーブルがpostsというのに対してモデルクラスはPostというふうに最初が大文字かつ単数系でなければなりません。
中身は、

```
<?php
class Post extends Eloquent
{   
}
```
とりあえずクラス内はまだ特になにもなくていいですが、LaravelではEloquentクラスを継承しなければなりません。

これでこのPostクラスをインスタンス化することで、postsテーブルを簡単に扱うことができます。





次にプロジェクト/app/database/seeds/以下にSeedクラスのためのphpファイルをPostTableSeeder.phpみたいに新規作成します。
そしてそのseedsディレクトリ以下にはすでにDatabaseSeeder.phpがありますがこれはそれぞれのSeedsファイルをよびだすためのものです。開いてみると、

```lang:DatabaseSeeder.php
<?php

class DatabaseSeeder extends Seeder {

	/**
	 * Run the database seeds.
	 *
	 * @return void
	 */
	public function run()
	{
		Eloquent::unguard();

		// $this->call('UserTableSeeder');
	}

}
```
となってるはずです。今作ったPostTableSeederを呼び出すためにはrun()関数の中で、

`$this->call('PostTableSeeder');`

と書き込みます。
これでPostTableSeederを呼び出すことができます。

さて問題のPostTableSeederの中身なんですが、

```lang:ProductTableSeeder.php
<?php
class PostTableSeeder extends Seeder {
    public function run()
    {
        $post = new Post;
        $post->title = 'Apple watch';
        $post->messages = "Nice product";
        $post->user = "Sam";
        $post->save();
    
    }
}
```

てな感じです。先ほど作成したPostクラスを使って$postを作り、それぞれのカラムに直接値を入れていきます。このモデルクラスの扱うための関数はほかにもいろいろありますので詳しくは[Laravel公式サイト](http://laravel.com/docs/4.2/eloquent)で。

これでpostsテーブルに初期値データ挿入の準備ができました。
あとはartisanコマンドを実行するだけです。
`php artisan db:seed`

はい、これで実際のテーブルに値が挿入されたはずです。

今回モデルクラスの中身はなにも書いていませんが、実際はデータベースのOne-to-Manyなどの関係をつけたいときなどに使われます。
例えば、
ポストにコメント機能をつけたいとき
commentsテーブルでid, messages, user, post_idがあり、
Commentクラス内で

```lang:Comment.php
<?php
class Comment extends Eloquent
{
    function post()
    {
        return $this->belongsTo('Post');
    }
}
```

Postクラス内では

```lang:Post.php
<?php
class Post extends Eloquent
{
    function comments()
    {
        return $this->hasMany('Comment');
    }
    
}
```
これでそれぞれの関係を結び付けることができます。

以上で簡単なSeedクラスによるデータベースの初期データの作成でした。
【殴り書き】Linuxでのうるう秒の調査

えっと、まず初めに断っておくと、サーバーのことは良く分からないので、『ふーん』ぐらいで聞き流してくらさい。
コマンドの『date』を使って調査しました。
実行環境はUbuntu 14.04です。

#### 2015-07-01 08:59:60をパースしてみる。
```bash
date -d '2015-07-01 08:59:60'
```
**結果**
date: invalid date ‘2015-07-01 08:59:60’

#### 次に、2015-07-01 08:59:60を、タイムゾーン指定してパースしてみる
```bash
TZ=/usr/share/zoneinfo/right/Asia/Tokyo date -d '2015-07-01 08:59:60'
```
**結果**
date: invalid date ‘2015-07-01 08:59:60’

#### 前回の2012-07-01 08:59:60をパースしてみる。
```bash
date -d '2012-07-01 08:59:60'
```
**結果**
date: invalid date ‘2012-07-01 08:59:60’

#### 前回の2012-07-01 08:59:60を、タイムゾーン指定してパースしてみる
```bash
TZ=/usr/share/zoneinfo/right/Asia/Tokyo date -d '2012-07-01 08:59:60'
```
**結果**
Sun Jul  1 08:59:60 JST 2012

---
おおーー！？
前回のうるう秒はタイムゾーン指定するとちゃんと60秒が出てきますねー
でも今回のはエラーになるということは、アップデートしたらいいんかな？
2015年5月26日、apt-get update -yやってみたけど結果はかわらず。鯖はそっち専門の人に任せよう・・。
【殴り書き】javascriptにおけるうるう秒の調査

##実行環境1： chromeの開発者ツール？F12押したら出てくるやつ

#### まずは、1秒手前の正常？な時間をUnixTimeStampで表示してみる。
```js
new Date('2015/07/01 08:59:59') / 1000
```
**結果**
1435708799

#### 次に、2015-07-01 08:59:60をDateTime型にパースしてみる。
```js
new Date('2015/07/01 08:59:60');
new Date('2015/07/01 08:59:60') / 1000;
```
**結果**
Invalid Date
NaN

#### 次に、2015-07-01 08:59:60のUnixTimeStampをDateTime型に入れるとどう表記されるか見てみる。
```js
new Date(1435708800 * 1000);
```
**結果**
Wed Jul 01 2015 09:00:00 GMT+0900 (東京 (標準時))

#### ちょっと気になって前回のデータ入れてみる。
```js
new Date('2012/07/01 08:59:60')
```
**結果**
Invalid Date

##実行環境2： node.js v0.10.25 On ubuntu 14.04

#### まずは、1秒手前の正常？な時間をUnixTimeStampで表示してみる。
```js
new Date('2015/07/01 08:59:59') / 1000
```
**結果**
1435708799

#### 次に、2015-07-01 08:59:60をDateTime型にパースしてみる。
```js
new Date('2015/07/01 08:59:60');
new Date('2015/07/01 08:59:60') / 1000;
```
**結果**
Invalid Date
NaN

#### 次に、2015-07-01 08:59:60のUnixTimeStampをDateTime型に入れるとどう表記されるか見てみる。
```js
new Date(1435708800 * 1000);
```
**結果**
Wed Jul 01 2015 09:00:00 GMT+0900 (JST)

#### ちょっと気になって前回のデータ入れてみる。
```js
new Date('2012/07/01 08:59:60')
```
**結果**
Invalid Date

---
まぁそりゃそうか・・・っていう感じの結果。
ブラウザは一種類しか試してないけど、node.jsでも同じ動作。
timestampで扱っている場合は大丈夫。
59分60秒のtimestampを9時としてしまうが、1秒ぐらいの差はそんなに問題ではないような。
当日は9時丁度に終わるイベントとかがなければ問題になることはなさそう。
ただ、文字列で『2015-07-01 08:59:60』をパースするとエラーでるので、node.jsは気をつけたほうがいいかな。すぐ落ちるし。
AptanaStudioとRailsとGitの環境のつくりかた

### 1. PCに以下のものを事前にインストールしておく

* Ruby
* Rails
* Git
	* Gitのグローバル設定も済ませておく


### 2. AptanaStudioをインストール
* Google先生に聞きましょう

### 3. AptanaStudioを日本語化
* Google先生に聞きましょう

### 4. AptanaStudioのGitの設定

*  「PortableGit」は不便なので、無効にする
	* 環境設定 > チーム > Git
		* 「Automatically attach our git support to projects added that have git repositories」のチェックボックスを外す

* EGitプラグインをインストール

	1. ヘルプ > 新規ソフトウェアのインストール
	2. 以下の項目を入力
		* 名前: Egit
		* URL: http://download.eclipse.org/egit/updates
	3. 以下の2つにチェックを入れて、インストール
		* Eclipse Gitチームプロバイダー
		* JGitにチェック

* EGit用のビューの表示方法
	1. ウィンドウ > ビューの表示 > その他 
	2. フィルター入力欄に「Git」と入力
	3. 以下の3つのビューをクリック
		* Gitステージング
		* Gitリポジトリ
		* Git参照ログ

### 5. RailsプロジェクトをGitクローンから作成する手順
1. ファイル > 新規 > Railsプロジェクト
2. 以下の項目を入力
	* 名前: 任意
	* ロケーション: 任意
	* Generate App:
		* 「Clone an existing git project」にチェック
		*  ロケーション: github(またはBitbucketなど)のリポジトリURL
3. 「完了」ボタン押下
4. 作成されたプロジェクトファイルで右クリック
5. 「プロパティー」をクリック
6. 「プロジェクト・ネーチャー」を選択して、「Rails」のチェックボックスをチェック
7. ダイアログが表示されるので、「はい」を押下

### 6. RailsプロジェクトとGithub(またはBitbucketなど)と連携させる方法
##### 1. sshの設定
1. 環境設定 > フィルター入力欄に「ssh」と入力
2. 「一般 > ネットワーク接続 > SSH2」と表示されるので、「SSH2」を押下
3. 一般タブでの設定
	* SSH2ホーム: 自分の環境での「.ssh」ディレクトリの場所
	* 秘密鍵: 「.ssh」ディレクトリ内にある秘密鍵ファイル(id_rsaなど)

##### 2. gitの設定
1. 環境設定 > フィルター入力欄に「git」と入力
2. チーム > Git > 構成
3. リポジトリ設定ボタンをクリック
4. 「リポジトリー」セレクトボックスから、対象のリポジトリを選択
5. 「ロケーション」欄の「開く」ボタンを押下
6. 「構成」ファイルが表示されるので、[remote "origin"]のurlに、リポジトリのURLを入力して保存

### 7. Railsプロジェクトの修正箇所をGithub(またはBitbucketなど)へPushする手順
1. ファイルを修正すると、修正ファイルがグリーンで表示される
2. Gitステージングビューの「ステージされていない変更」欄に、修正ファイルが表示される
3. 修正ファイルを、ステージされていない変更」欄からステージされた変更」欄へドラッグ・アンド・ドロップ
4. コミットメッセージ欄に、メッセージを入力
5. 「コミット」ボタンを押下
6. プロジェクトを右クリック > チーム > `Push Branch master...`


### 8. Railsプロジェクトの実行(サーバー起動方法など)
1. 実行 > Rails Console 
2. コンソール用のビューが開く
3. このコンソールビューで、`rails s` を実行
4. `bundle install` や `rake db:migrate`などのコマンドも、このコンソールビューで実行できる


いかがだったでしょうか？
参考になれば、幸いです。
Visual Studio CodeでTypeScriptをコンパイルする

[Visual Studio Code](https://code.visualstudio.com/)はMicrosoftが作っているだけあって、TypeScriptの補完がいい感じなのですが、
VS Code上で.tsファイルをコンパイル（トランスパイル）する方法がわからなかったので、調べてみました。

ここに書いてありました。
https://code.visualstudio.com/docs/tasks

予めtscがインストールされている必要があります。

※以下はVisual Studio Code 0.7.0 で確認しています。

#設定方法
VS Codeでプロジェクトを開いた状態で、`Ctrl + Shift + P` (Macは`Command + Shift + P`)を押して
コマンドパレットを開き、"Task"とかを入力し、「Tasks: Configure Task Runner」を検索、選択します。
※プロジェクトを開いた状態（「EXPLORE」が表示されている状態）でないと、Tasks〜は表示されません。

すると、以下のような**tasks.json**というファイルが生成されます。

```json:tasks.json
// Available variables which can be used inside of strings.
// ${workspaceRoot}: the root folder of the team
// ${file}: the current opened file
// ${fileBasename}: the current opened file's basename
// ${fileDirname}: the current opened file's dirname
// ${fileExtname}: the current opened file's extension
// ${cwd}: the current working directory of the spawned process

// A task runner that calls the Typescript compiler (tsc) and
// Compiles a HelloWorld.ts program
{
	"version": "0.1.0",

	// The command is tsc. Assumes that tsc has been installed using npm install -g typescript
	"command": "tsc",

	// The command is a shell script
	"isShellCommand": true,

	// Show the output window only if unrecognized errors occur.
	"showOutput": "silent",

	// args is the HelloWorld program to compile.
	"args": ["HelloWorld.ts"],

	// use the standard tsc problem matcher to find compile problems
	// in the output.
	"problemMatcher": "$tsc"
}

(以下省略)
```

これがそのままTypeScriptをコンパイルするタスクの設定となるようです。
`args`がコンパイル対象のファイルなので、ここに.tsファイルを列挙していきます。

~~npmでtscをインストールしている場合で、このままでエラーになる場合は、
`"isShellCommand": true`を追記し、`tsc.exe`を`tsc`にすればOKでした。~~
（0.1.0で確認した際はMacでもWindows用のTaskが自動生成されていたっぽいですが、最新版では修正不要でした）

これで`Ctrl + Shift + B`を押すと、.tsファイルがコンパイルされ、.jsファイルが生成されます。
左下でクルクル回っているのがコンパイル中の表示で、それが消えるとコンパイル完了です。

#おわりに
**Tasks**は他にも色々できそうな感じなので、使いこなすと便利そう。

~~できれば[atom-typescript](https://atom.io/packages/atom-typescript)みたいに、.tsファイルを保存した時に、
自動でコンパイルしてくれるといいんだけど。。。できるのかな？~~
（コメントで情報をいただきました）

.tsファイルを保存した際に自動でコンパイルを実行するには、いくつか方法があるようですが、
一番簡単な方法は"args"に"-w"（または"--watch"）オプションをつけてしまうことです。
つまり`tsc -w`で実行するということですね。

```json:tasks.json
	// args is the HelloWorld program to compile.
	"args": ["-w", "HelloWorld.ts"],
```

この状態で一度`Ctrl + Shift + B`を実行すると、watchオプション付きでtscが実行されるため、
それ以降は指定ファイルを保存した際に自動でコンパイルされます。

この方法の場合、Taskが実行されたままの状態となりますが、もしTaskを停止したい場合は
コマンドパレットから「Tasks: Terminate Running Task」を実行することで停止できる。。。
はずですが、時々停止できないことがあるようです。。。


以上
【殴り書き】C#におけるうるう秒調査

#### まずは、1秒手前の正常？な時間をUnixTimeStampで表示してみる。
```csharp
var localDate = "2015-07-01 08:59:59";
var timespan = DateTime.Parse(localDate).toUniversalTime() - new DateTime (1790,1,1,0,0,0, DateTimeKind.Utc);
Debug.Log((uint)timespan.TotalSeconds);
```
**結果**
1435708799

#### 次に、2015-07-01 08:59:60をDateTime型にパースしてみる。
```csharp
var localDate = "2015-07-01 08:59:60";
var timespan2 = DateTime.Parse(localDate).toUniversalTime() - new DateTime (1790,1,1,0,0,0, DateTimeKind.Utc);
Debug.Log((uint)timespan2.TotalSeconds);
```
**結果**
FormatException: String was recognized as a valid DateTime.

#### 次に、2015-07-01 08:59:60のUnixTimeStampをDateTime型に入れるとどう表記されるか見てみる。
```csharp
double timestamp = 1435708800u;
var localDate = new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc).Addseconds (timestamp).ToLocalTime ();
Debug.Log(localDate.ToString("yyyy-MM-dd HH:mm:ss"));
```
**結果**
2015-07-01 09:00:00

まぁそりゃそうか・・・っていう感じの結果。
timestampで扱っている場合は大丈夫。
59分60秒のtimestampを9時としてしまうが、1秒ぐらいの差はそんなに問題ではないような。
当日は9時丁度に終わるイベントとかがなければ問題になることはなさそう。
ただ、文字列で『2015-07-01 08:59:60』をパースするとエラーでるので、どちらかといえば、サーバー側とかログとかで時間を扱っている部分に気をつけて欲しいところ。

※.NETのunix timestampは0000年1月を基点としているので、1970年の1月1日に合わせる必要がある
Ansible で Zeppelin 動かす

Ansible で Zeppelin 動かす時の role を作ってみた。


# 環境

* Ubuntu 14.04.2 LTS x86_64
* Incubator-zeppelin 2015/05/22

```roles/zeppelin/tasks/main.yml
myuser: zeppelin
maven_ver: apache-maven-3.3.3
maven_url: http://ftp.riken.jp/net/apache/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz
```

# Role for Zeppelin 

1. 必要パッケージ入れる
2. Maven ダウンロード
3. Maven 解凍
4. Zeppelin ユーザ作る
5. Zeppelin ダウンロード
4. PATH を適用
4. Maven ビルド

```roles/zeppelin/tasks/main.yml
- name: Install Packages
  apt: name={{ item }} state=latest update_cache=yes
  with_items:
    - openjdk-7-jdk
    - git
    - npm

- name: Get maven
  get_url: url={{ maven_url }} dest=/tmp/ owner=root
- name: Unarchive a file
  unarchive: src=/tmp/{{ maven_ver }}-bin.tar.gz  dest=/usr/local creates=/usr/local/{{ maven_ver }} copy=no

- name: Create user
  user: name={{ myuser }} shell=/bin/bash groups=sudo append=yes

- name: Get Zeppelin source
  git: repo=https://github.com/apache/incubator-zeppelin.git dest=/home/{{ myuser }}/incubator-zeppelin
  sudo: yes
  sudo_user: zeppelin

- name: Set a maven path
  lineinfile: "dest=~/.bash_login line='export PATH=/usr/local/{{ maven_ver }}/bin:$PATH' state=present create=yes"
  sudo: yes
  sudo_user: zeppelin

- name: Set a java path
  lineinfile: "dest=~/.bash_login line='export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64'"
  sudo: yes
  sudo_user: zeppelin

- name: Build
  shell: /bin/bash -lc "mvn clean package -Pspark-1.3 -DskipTests" chdir=/home/{{ myuser }}/incubator-zeppelin
  sudo: yes
  sudo_user: zeppelin

- name: Start Zeppelin
  shell: /bin/bash -lc "/home/{{ myuser }}/incubator-zeppelin/bin/zeppelin-daemon.sh start" chdir=/home/{{ myuser }}/incubator-zeppelin
  sudo: yes
  sudo_user: zeppelin
```

#補足
## プロキシ環境にて
プロキシ通す環境の場合、環境変数以外に、Maven の方のプロキシ環境設定も入れてやらないとビルド部分でこけます。（あとで追加）

```~/.m2/settings.xml
<settings>
  <proxies>
    <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.example.com</host>
      <port>8080</port>
      <username>proxyuser</username>
      <password>somepassword</password>
      <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
    </proxy>
  </proxies>
</settings>
```

# 参考
* http://zeppelin.incubator.apache.org/
* https://zeppelin.incubator.apache.org/docs/install/install.html
* https://github.com/apache/incubator-zeppelin
* http://spark.apache.org/
* https://maven.apache.org/
Microsoft Visual Studio Community 2013でVimキーバインド(VsVim)を使ってみた

## 動作確認バージョン
Microsoft Visual Studio Community 2013 Version 12.0.31101.00 Update 4
![vsc4.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/520955b1-161d-819a-b4e5-226e16ef732a.png)

## インストール方法
[ツール]→[拡張機能と更新プログラム]
![vsc1.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/e3343fd8-6668-24fc-85e1-42005a43f488.png)
[オンライン]→[Visual Studio ギャラリーの検索]から「VsVim」を検索しインストールする。
![vsc2.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/a42e4846-5aad-f94b-01fb-1cba4ec33f98.png)
指示通り再起動を行う。
![vsc3.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/16994701-f46f-b5fe-1cc5-8587235dfcc9.png)

Visual Studioと競合するキーバインドをVsVim優先にする
[ツール]→[オプション]
![vsc4.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/7efd8db9-201c-6aed-fc0a-8415775b1aa8.png)

[VsVim]→[Keyboard]から競合するキーバインドを見つけたら、[Visual Studio]から[VsVim]に変更してOKボタンをクリックする。
![vsc5.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/acb05aab-9425-f0ed-f8a5-2e2fb69a062e.png)

## 個人的に対応しておいてほしい機能
| 機能 | 可否 |
|:--|:--:|
| : [Exコマンド] | ○ |
| / [ファイル内検索] | ○ |
| * [カーソル位置の単語を検索] | ○ |
| 検索時のハイライト | × |
| % [カッコなどの始端から終端への移動] | ○ |
| gg [先頭行への移動] | ○ |
| G [最下行への移動] | ○ |
| :w [保存]| ○ |
| :clo [カレントウィンドウを閉じる]| ○ |
| :q [カレントウィンドウを閉じる]| ○ |
| :qa [アプリケーションを閉じる]| ○ |
| :vs [横分割] | ○ |
| :sp [縦分割] | ○ |
| Ctrl + w + k [上ウィンドウへ移動]| ○ |
| Ctrl + w + j [下ウィンドウへ移動]| ○ |
| Ctrl + w + h [左ウィンドウへ移動]| × |
| Ctrl + w + l [右ウィンドウへ移動]| ○ |
| Ctrl + f [一画面下へ移動]| ○ |
| Ctrl + b [一画面前へ移動]| ○ |
| gt [次のタブへ移動]| ○ |
| gT [前のタブへ移動]| ○ |
| Shift + v [行単位の範囲選択]| ○ |
| Ctrl + v [単一行の矩形の範囲選択]| ○ |
| Ctrl + v [複数行の矩形の範囲選択]| ○ |
| クリップボードレジスタ共有 | :set clipboard=unnamed と入力するか ~/.vsvimrc に同じ内容を記述することで可能 |
| u [アンドゥ] | ○ |
| Ctrl + r [リドゥ] | ○ |
| yi( [指定文字「(」の内側のみコピー] | ○ |
| ya( [指定文字「(」の外側までコピー] | ○ |
| yf( [カーソル位置から指定文字「(」まで含めてコピー] | ○ |
| yt( [カーソル位置から指定文字「(」の1文字手前までコピー] | ○ |
| di( [指定文字「(」の内側のみ削除] | ○ |
| da( [指定文字「(」の外側まで削除] | ○ |
| df( [カーソル位置から指定文字「(」まで含めて削除] | ○ |
| dt( [カーソル位置から指定文字「(」の1文字手前まで削除] | ○ |
| vi( [指定文字「(」の内側のみビジュアルモードで選択] | ○ |
| va( [指定文字「(」の外側までビジュアルモードで選択] | ○ |
| vf( [カーソル位置から指定文字「(」まで含めてビジュアルモードで選択] | ○ |
| vt( [カーソル位置から指定文字「(」の1文字手前までビジュアルモードで選択] | ○ |
| f( [カーソル位置から指定文字「(」までカーソル移動] | ○ |
| t( [カーソル位置から指定文字「(」の一文字手前までカーソル移動] | ○ |
| >> [右へインデント] | ○ |
| << [左へインデント] | ○ |
| = [オートインデント] | ○ |
NetBeans8でVimキーバインド(jVi)を使ってみた

## 動作確認バージョン
Windows版 NetBeans IDE 8.0.2 (Build 201411181905)
![nb1.png](https://qiita-image-store.s3.amazonaws.com/0/23093/beda93e4-bdbd-a5b3-8c09-df6338d6e96c.png)



## インストール方法
[ツール]→[プラグイン]→[使用可能なプラグイン]から「jVi」を検索するとNetBeans7用のものがインストールされてしまうので、NetBeans8の場合は↓この辺りを参考にインストールを行います。

- [NetBeansでvim風の操作が出来るjViプラグインを使ってみる](http://qiita.com/mapyo/items/8d47d2cf592a9230f93c)
- [NetBeans8にvimプラグインをインストールする](https://cheaparchitec.wordpress.com/2015/01/08/netbeans8%E3%81%ABvim%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)

インストール後、[ツール]→[オプション]→[jVi Config]から設定を行います。
![nb3.png](https://qiita-image-store.s3.amazonaws.com/0/23093/6414a537-f77e-3931-5161-a036d20166fb.png)

非常に多くの設定項目が準備されているので、必要に応じて修正してください。
![nb2.png](https://qiita-image-store.s3.amazonaws.com/0/23093/70347f49-3d42-620e-ab07-cbafedfcd815.png)

## 個人的に対応しておいてほしい機能
| 機能 | 可否 |
|:--|:--:|
| : [Exコマンド] | ○ |
| / [ファイル内検索] | ○ |
| * [カーソル位置の単語を検索] | ○ |
| 検索時のハイライト | ○ |
| % [カッコなどの始端から終端への移動] | ○ |
| gg [先頭行への移動] | ○ |
| G [最下行への移動] | ○ |
| :w [保存]| ○ |
| :clo [カレントウィンドウを閉じる]| ○ |
| :q [カレントウィンドウを閉じる]| ○ |
| :qa [アプリケーションを閉じる]| × |
| :vs [横分割] | ○ |
| :sp [縦分割] | ○ |
| Ctrl + w + k [上ウィンドウへ移動]| ○ |
| Ctrl + w + j [下ウィンドウへ移動]| ○ |
| Ctrl + w + h [左ウィンドウへ移動]| ○ |
| Ctrl + w + l [右ウィンドウへ移動]| ○ |
| Ctrl + f [一画面下へ移動]| ○ |
| Ctrl + b [一画面前へ移動]| ○ |
| gt [次のタブへ移動]| ○ |
| gT [前のタブへ移動]| ○ |
| Shift + v [行単位の範囲選択]| ○ |
| Ctrl + v [単一行の矩形の範囲選択]| ○ |
| Ctrl + v [複数行の矩形の範囲選択]| ○ |
| クリップボードレジスタ共有 | ○ |
| u [アンドゥ] | ○ |
| Ctrl + r [リドゥ] | ○ |
| yi( [指定文字「(」の内側のみコピー] | ○ |
| ya( [指定文字「(」の外側までコピー] | ○ |
| yf( [カーソル位置から指定文字「(」まで含めてコピー] | ○ |
| yt( [カーソル位置から指定文字「(」の1文字手前までコピー] | ○ |
| di( [指定文字「(」の内側のみ削除] | ○ |
| da( [指定文字「(」の外側まで削除] | ○ |
| df( [カーソル位置から指定文字「(」まで含めて削除] | ○ |
| dt( [カーソル位置から指定文字「(」の1文字手前まで削除] | ○ |
| vi( [指定文字「(」の内側のみビジュアルモードで選択] | ○ |
| va( [指定文字「(」の外側までビジュアルモードで選択] | ○ |
| vf( [カーソル位置から指定文字「(」まで含めてビジュアルモードで選択] | ○ |
| vt( [カーソル位置から指定文字「(」の1文字手前までビジュアルモードで選択] | ○ |
| f( [カーソル位置から指定文字「(」までカーソル移動] | ○ |
| t( [カーソル位置から指定文字「(」の一文字手前までカーソル移動] | ○ |
| >> [右へインデント] | ○ |
| << [左へインデント] | ○ |
| = [オートインデント] | ○ |
PhpStormでVimキーバインド(IdeaVIM)を使ってみた


## 動作確認バージョン
Windows版 PhpStorm 8.0.3 Build #PS-139.1348, built on February 12, 2015
![ps1.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/0d3474e1-d821-61cd-50fd-d05848ce62f1.png)

## インストール方法
[File]→[Settings]
![ps2.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/a7275463-0954-921b-be0d-ec2729a2313f.png)

「Plugins」の画面で「Browse repositories」ボタンをクリックする。
![ps3.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/786ebea8-ef6d-5986-49a1-554357bb5faa.png)

「Browse repositories」の画面で検索欄に「IdeaVim」と入力し、「Install plugin」ボタンよりインストールする。
![ps4.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/2ecf5397-4799-1755-4721-61d58c72c333.png)

ダウンロードの同意を求められるので「Yes」ボタンをクリックする。
![ps5.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/79b4f851-f358-71f8-f53f-16bebf5ee2c0.png)

インストール完了後、PhpStormの再起動を求められるので、「Restart PhpStorm」ボタンをクリックする。
![ps6.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/796c9853-dd88-1754-8d8d-cbbb1f2cb81a.png)

すぐに再起動してプラグインを有効化するか同意を求められるので、「Restart」ボタンをクリックする。
![ps7.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/fb0e1f17-10ac-ef93-9d81-a32f60713a0a.png)


## 個人的に対応しておいてほしい機能
| 機能 | 可否 |
|:--|:--:|
| : [Exコマンド] | ○ |
| / [ファイル内検索] | ○ |
| * [カーソル位置の単語を検索] | ○ |
| 検索時のハイライト | :set hlsearch と入力するか ~/.ideavimrc に同じ内容を記述することで可能|
| % [カッコなどの始端から終端への移動] | ○ |
| gg [先頭行への移動] | ○ |
| G [最下行への移動] | ○ |
| :w [保存]| ○ |
| :clo [カレントウィンドウを閉じる]| ○ |
| :q [カレントウィンドウを閉じる]| ○ |
| :qa [アプリケーションを閉じる]| 全てのウィンドウを閉じるがアプリケーションは閉じない |
| :vs [横分割] | ○ |
| :sp [縦分割] | ○ |
| Ctrl + w + k [上ウィンドウへ移動]| ○ |
| Ctrl + w + j [下ウィンドウへ移動]| ○ |
| Ctrl + w + h [左ウィンドウへ移動]| ○ |
| Ctrl + w + l [右ウィンドウへ移動]| ○ |
| Ctrl + f [一画面下へ移動]| ○ |
| Ctrl + b [一画面前へ移動]| ○ |
| gt [次のタブへ移動]| ○ |
| gT [前のタブへ移動]| ○ |
| Shift + v [行単位の範囲選択]| ○ |
| Ctrl + v [単一行の矩形の範囲選択]| ○ |
| Ctrl + v [複数行の矩形の範囲選択]| ○ |
| クリップボードレジスタ共有 | :set clipboard=unnamed と入力するか ~/.ideavimrc に同じ内容を記述することで可能 |
| u [アンドゥ] | ○ |
| Ctrl + r [リドゥ] | ○ |
| yi( [指定文字「(」の内側のみコピー] | ○ |
| ya( [指定文字「(」の外側までコピー] | ○ |
| yf( [カーソル位置から指定文字「(」まで含めてコピー] | ○ |
| yt( [カーソル位置から指定文字「(」の1文字手前までコピー] | ○ |
| di( [指定文字「(」の内側のみ削除] | ○ |
| da( [指定文字「(」の外側まで削除] | ○ |
| df( [カーソル位置から指定文字「(」まで含めて削除] | ○ |
| dt( [カーソル位置から指定文字「(」の1文字手前まで削除] | ○ |
| vi( [指定文字「(」の内側のみビジュアルモードで選択] | ○ |
| va( [指定文字「(」の外側までビジュアルモードで選択] | ○ |
| vf( [カーソル位置から指定文字「(」まで含めてビジュアルモードで選択] | ○ |
| vt( [カーソル位置から指定文字「(」の1文字手前までビジュアルモードで選択] | ○ |
| f( [カーソル位置から指定文字「(」までカーソル移動] | ○ |
| t( [カーソル位置から指定文字「(」の一文字手前までカーソル移動] | ○ |
| >> [右へインデント] | ○ |
| << [左へインデント] | ○ |
| = [オートインデント] | ○ |
Sublime Text2でVimキーバインド(Vintageモード)を使ってみた


## 動作確認バージョン
Windows版 Sublime Text 2 Version 2.0.2, Build 2221
![st9.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/b85915b4-97e2-20cf-35d8-7d84c0b24ed0.png)


## インストール方法
https://packagecontrol.io/installation#st2
ココ↑でSublime Text2用として表示されているコマンドをコピーする。
![st1.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/3994dbd3-7b4a-335b-c15c-e0652938ba84.png)

[View]→[Show Console]
![st2.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/88704465-a65f-c547-05ad-8e587632b719.png)

コピーしておいたコマンドをコンソールに貼りつけて実行する。
![st3.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/013d137e-42df-70c9-3ce1-3fef613f4050.png)

Sublime Text2を再起動すると、[Preferences]に[Package Control]のメニューが追加されます。
再起動前
![st4.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/7ba2320b-271a-e61c-5a62-44a30d65c95d.png)

再起動後
![st5.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/4e0c0dfa-2b52-6dd7-2021-bf916a6147c9.png)

[Preferences]→[Settings - User]で以下のように入力し保存する。

```json:settings
{
    "ignored_packages": [],
    "vintage_ctrl_keys": true,
    "vintage_use_clipboard": true
}
```

Exコマンドを利用するために、VintageExパッケージをインストールする。
[Preferences]→[Package Control]
![st6.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/8074c90e-0dad-4122-27c7-5b1ecb756726.png)

「PackageControl: Install Package」と入力しエンター。
![st7.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/5d17605c-80e2-895f-f7a3-4cfd8c385a68.png)

「VintageEx」と入力しエンター。
![st8.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/b66f3a29-80e3-672a-234b-396fe43c9b31.png)

[Preferences]→[Settings - User]で以下のように入力し保存する。

```json:settings
{
    "ignored_packages": [],
    "vintage_ctrl_keys": true,
    "vintage_use_clipboard": true,
    "vintage_start_in_command_mode": true
}
```

## 個人的に対応しておいてほしい機能
| 機能 | 可否 |
|:--|:--:|
| : [Exコマンド] | 「VintageEx」をインストールすると : で起動 |
| / [ファイル内検索] | ○ |
| * [カーソル位置の単語を検索] | ○ |
| 検索時のハイライト | ○ |
| % [カッコなどの始端から終端への移動] | ○ |
| gg [先頭行への移動] | ○ |
| G [最下行への移動] | ○ |
| :w [保存]| ○ |
| :clo [カレントウィンドウを閉じる]| × |
| :q [カレントウィンドウを閉じる]| ○ |
| :qa [アプリケーションを閉じる]| ○ |
| :vs [横分割] | × |
| :sp [縦分割] | × |
| Ctrl + w + k [上ウィンドウへ移動]| × |
| Ctrl + w + j [下ウィンドウへ移動]| × |
| Ctrl + w + h [左ウィンドウへ移動]| × |
| Ctrl + w + l [右ウィンドウへ移動]| × |
| Ctrl + f [一画面下へ移動]| ○ |
| Ctrl + b [一画面前へ移動]| ○ |
| gt [次のタブへ移動]| × |
| gT [前のタブへ移動]| × |
| Shift + v [行単位の範囲選択]| ○ |
| Ctrl + v [単一行の矩形の範囲選択]| クリップボードのペーストが実行される |
| Ctrl + v [複数行の矩形の範囲選択]| クリップボードのペーストが実行される |
| クリップボードレジスタ共有 | ○ |
| u [アンドゥ] | ○ |
| Ctrl + r [リドゥ] | ○ |
| yi( [指定文字「(」の内側のみコピー] | ○ |
| ya( [指定文字「(」の外側までコピー] | ○ |
| yf( [カーソル位置から指定文字「(」まで含めてコピー] | ○ |
| yt( [カーソル位置から指定文字「(」の1文字手前までコピー] | ○ |
| di( [指定文字「(」の内側のみ削除] | ○ |
| da( [指定文字「(」の外側まで削除] | ○ |
| df( [カーソル位置から指定文字「(」まで含めて削除] | ○ |
| dt( [カーソル位置から指定文字「(」の1文字手前まで削除] | ○ |
| vi( [指定文字「(」の内側のみビジュアルモードで選択] | ○ |
| va( [指定文字「(」の外側までビジュアルモードで選択] | ○ |
| vf( [カーソル位置から指定文字「(」まで含めてビジュアルモードで選択] | ○ |
| vt( [カーソル位置から指定文字「(」の1文字手前までビジュアルモードで選択] | ○ |
| f( [カーソル位置から指定文字「(」までカーソル移動] | ○ |
| t( [カーソル位置から指定文字「(」の一文字手前までカーソル移動] | ○ |
| >> [右へインデント] | ○ |
| << [左へインデント] | ○ |
| = [オートインデント] | ○ |
AtomでVimキーバインド(vim-mode, ex-mode)を使ってみた

## 動作確認バージョン
Windows版 Atom Version 0.201.0
![atom4.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/a2afef90-aea1-38b5-3bbd-b16f6dc76a7f.png)


## インストール方法
[File]→[Settings]
![atom1.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/dd3554b0-1a22-b859-d3c8-29f7c4d6611f.png)
[Install]→[Search Packages]から「vim-mode」、「ex-mode」を検索しインストールする。
![atom2.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/8c790042-2625-30dd-32df-d530321a0ce7.png)

![atom3.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/7c53bc8a-ad9a-3f84-1a4a-680c282bed96.png)

## 個人的に対応しておいてほしい機能
| 機能 | 可否 |
|:--|:--:|
| : [Exコマンド] | 「ex-mode」をインストールすると Shift + : で起動可能 |
| / [ファイル内検索] | ○ |
| * [カーソル位置の単語を検索] | Exコマンドが起動する |
| 検索時のハイライト | × |
| % [カッコなどの始端から終端への移動] | ○ |
| gg [先頭行への移動] | ○ |
| G [最下行への移動] | ○ |
| :w [保存]| ○ |
| :clo [カレントウィンドウを閉じる]| × |
| :q [カレントウィンドウを閉じる]| ○ |
| :qa [アプリケーションを閉じる]| × |
| :vs [横分割] | ○ |
| :sp [縦分割] | ○ |
| Ctrl + w + k [上ウィンドウへ移動]| ○ |
| Ctrl + w + j [下ウィンドウへ移動]| ○ |
| Ctrl + w + h [左ウィンドウへ移動]| ○ |
| Ctrl + w + l [右ウィンドウへ移動]| ○ |
| Ctrl + f [一画面下へ移動]| ○ |
| Ctrl + b [一画面前へ移動]| ○ |
| gt [次のタブへ移動]| ○ |
| gT [前のタブへ移動]| ○ |
| Shift + v [行単位の範囲選択]| ○ |
| Ctrl + v [単一行の矩形の範囲選択]| ○ |
| Ctrl + v [複数行の矩形の範囲選択]| × |
| クリップボードレジスタ共有 | ○ |
| u [アンドゥ] | ○ |
| Ctrl + r [リドゥ] | ○ |
| yi( [指定文字「(」の内側のみコピー] | 指定文字が「[」、「{」の場合は成功するが、「(」、「'」、「"」の場合は失敗する |
| ya( [指定文字「(」の外側までコピー] | 指定文字が「[」、「{」の場合は成功するが、「(」、「'」、「"」の場合は失敗する |
| yf( [カーソル位置から指定文字「(」まで含めてコピー] | ○ |
| yt( [カーソル位置から指定文字「(」の1文字手前までコピー] | ○ |
| di( [指定文字「(」の内側のみ削除] | 指定文字が「[」、「{」の場合は成功するが、「(」、「'」、「"」の場合は失敗する |
| da( [指定文字「(」の外側まで削除] | 指定文字が「[」、「{」の場合は成功するが、「(」、「'」、「"」の場合は失敗する |
| df( [カーソル位置から指定文字「(」まで含めて削除] | ○ |
| dt( [カーソル位置から指定文字「(」の1文字手前まで削除] | ○ |
| vi( [指定文字「(」の内側のみビジュアルモードで選択] | × |
| va( [指定文字「(」の外側までビジュアルモードで選択] | × |
| vf( [カーソル位置から指定文字「(」まで含めてビジュアルモードで選択] | × |
| vt( [カーソル位置から指定文字「(」の1文字手前までビジュアルモードで選択] | × |
| f( [カーソル位置から指定文字「(」までカーソル移動] | ○ |
| t( [カーソル位置から指定文字「(」の一文字手前までカーソル移動] | ○ |
| >> [右へインデント] | ○ |
| << [左へインデント] | ○ |
| = [オートインデント] | × |
PrimeFacesでAjaxできなかったりテーマが反映されない場合

ヘッダがちゃんと記述されているか確認しよう

```lang:html
<h:head></h:head>
```

これな。

これが記述されていないとPrimeFacesで用意しているJSファイルやCSSファイルが展開されないのでAjaxするためのJSがないからFormがそのまま送信されちゃったり、CSSが適用されなくてテーマが反映されない自体に陥る。
Go言語でMac OS XのSerial Numberを求める

```go
package main

import (
	"fmt"
	"github.com/codeskyblue/go-sh"
	"log"
	"strings"
)

func main() {
	cmd := sh.Command("system_profiler", "SPHardwareDataType").
		Command("awk", "/Serial/ {print $4}")
	out, err := cmd.Output()
	if err != nil {
		log.Fatal(err)
	}
	serialNumber := strings.TrimSpace(string(out))
	fmt.Println("Serial number is", serialNumber)
}
```

まぁシェルなら 

```bash
system_profiler SPHardwareDataType | awk '/Serial/ {print $4}'
```

で済むんですが。

最初は標準ライブラリだけで書くかなぁと思いましたが、つい便利なライブラリ（[codeskyblue/go-sh](https://github.com/codeskyblue/go-sh)）を使ってしまいました。なぜGo？というツッコミはなしの方向で、、

おしまい
すべてのシートのページフッタを書き換える

あとから「この仕様書、下にコピーライトを印刷してほしい」などとほざかれたときのお供に。

```vbnet
Public Sub フッタ書き換え()
    Dim i As Long
    
    For i = 1 To Worksheets.count
        With Worksheets(i)
            ' 例えば、フッタの右側を書き換える
            .PageSetup.RightFooter = "All Rights Reserved, Copyright (C)hogehoge"
        End With
    Next
End Sub
```
TreasureDataでHiveクエリを書くとき - テーブルを結合しよう

## はじめに
HiveではRDBのSQLのように複数のテーブルを組み合わせて利用することができます。

## Joinの種類
身も蓋もない話ですが、[Hiveのドキュメント](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins#LanguageManualJoins-JoinSyntax)にあるように結合しましょう。

### 等価結合
テーブルaとテーブルbのidが共通しているデータ中のテーブルaのidとテーブルbのidを表示します。

```sql
SELECT a.id,b.name FROM a JOIN b ON (a.id = b.id)
```

### 外部結合
テーブルaの全データに対して、テーブルbにテーブルaのkeyと同じkeyがあった場合はテーブルbのデータを利用します。RIGHT JOINも使えますが、ややこしくなるの私はよっぽどじゃないと使いません。てか使わなくてもよくない？

```sql
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
```

### LEFT SEMI JOIN
Hiveですと0.13以前までは下記のように条件のinの後ろにサブクエリを書けなかったので、LEFT SEMI JOINで代用してました。

```sql:NG
SELECT a.key, a.value FROM a
WHERE a.key in (SELECT b.key FROM B)
```

```sql:OK
SELECT a.key, a.val FROM a 
LEFT SEMI JOIN b ON (a.key = b.key)
```

初めて見た時LEFT SEMI JOINってなんだよ！って思ったんですが、公式ドキュメントにご丁寧にサンプルまでバッチリ書いてありました。SQLはかけると自信持っていると足元すくわれたりするので気をつけて、初心を忘れずにドキュメントを読みましょう。（自分にいい聞かせている。。）

## Hive Version 0.13から
RDBのSQLのようにfromの後ろにテーブルを並べることによって等価結合に利用できるようになりました。便利なんですが、順序や結合理由を示すためにもJoinを利用した方がのちほろ読みやすいクエリになるようにも思えますがどうでしょ？

```sql
SELECT * 
FROM table1 t1, table2 t2, table3 t3 
WHERE t1.id = t2.id AND t2.id = t3.id AND t1.zipcode = '02535'
```

条件句のサブクエリも利用できる場合も出てきました。

```sql
SELECT *
FROM A
WHERE A.a IN (SELECT foo FROM B);
```

EXISTもサポートされたみたいです。ひー。

```sql
SELECT A
FROM T1
WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y)
```

## まとめ
あまりTreasureData独自という感じじゃなくなりました。私の周りのTD初心者の人に伝えたくて書いているんで、ただのHiveの説明の時もありますよ。ははは。
update_attributesが非推奨扱いになる

以前update_attributesについての記事を書いたのですが少し調べるとどうやらrails 4.1から非推奨になることがわかりました...orz

現在の環境はrails3.2だったかな？なんですがupdate_attributeが非推奨なので使わないようにというのは認識していました。ついでにupdate_attributesはこの時点では非推奨ではありません。

* * *
rails4.0にあげると若干雲行きが怪しくなります。
updateメソッドが導入されるみたいです。でこれによりupdate_attributes は update のエイリアス扱いになってしまいます。ただここでは「update_attributes は非推奨というわけではないため、好きな方を使用すれば良いと思います」と書かれているので問題ないといえば問題ないですが。。。

参考URL http://www.techscore.com/tech/Ruby/rails-4.0/model/#6_3

* * *
rails4.1にあげると事態は急変。
「非推奨のActiveRecord::Generators::ActiveModel#update_attributesが削除されました。ActiveRecord::Generators::ActiveModel#updateをご使用ください。」となっています。
あれ？非推奨ではなかったのではと思うのだがまあそれはさておき本格的に削除されてしましました。


参考URL　http://railsguides.jp/4_1_release_notes.html

* * *


こんな感じでいずれ非推奨になるものを使う気にもなれず。rails3.2なのでupdateメソッドをつかえるわけでもなく。ほかの更新するメソッドとして知っているのはsaveしかなので仕方なくsaveで対処しました。そのときに`モデル.attributes`ってのを使いました。


参考URL http://railsdoc.com/references/attributes


数ヶ月後にはrails4.0にupdateする予定みたいなので非推奨などこれからもアンテナはらないといけません。
td import:auto コマンドを使うときに気をつけたいこと

TreasureDataを操作するコマンドラインツールに「tdコマンド」があります。
これを使うとデータベースの操作、クエリの実行や結果のエクスポートや、バルクインポートなどが捗ります。
http://toolbelt.treasuredata.com/

このコマンドを利用するときにハマったことを紹介します。

## 複数のcsvファイルを一括でインポートする方法

カラムの構成が同じファイルが複数に分かれており、それを一括で取り込みたいときに便利な方法があります。
ファイル名を指定する際、`*.csv`という形でワイルドカード指定が出来ます。

```bash
td import:auto --format csv --column-header --encoding Windows-31J --all-string \
 --time-value `date +%s`,10  --auto-create foo_db.bar_table path/to/example_*.csv
```

**Tips:** 上記コマンド例で使っている、インポートするファイルに時刻が無い時の対処法

```--time-value `date +%s`,10```とすれば、10のパーティションに分かれるように良い感じにインポートできます。
細かい説明は次の通りです。

> --time-value (unixtime)オプションを付与することで、任意のtimeを付与させることができます。<br>注意点として、TreasureDataはtimeを1時間ごとにパーティションを区切って効率的なデータ処理を行うので、<br>全部のデータを--time-value 0にするとクエリの効率などが悪くなります。<br>そのため、データの更新日などでtimeの範囲がわかるのであれば、<br>--time-value UNIXTIME,HOURSのように指定することで、<br>ある時間からHOURS時間の範囲でtimeをばらけてデータを挿入してくれます。
> 引用元 https://oss.sios.com/bigdata-blog/ua59up

## 機種依存文字を含むcsvファイルのエンコーディング指定

td importコマンドでencodingに困ったときに参考になるTipsです。
いわゆるWindowsで作成された機種依存文字を含むcsvファイルを取り込む際、Shift_JISでの指定では化けてしまいます。
しかしながらCP932と指定しても、エラーとなります。その時は`Windows-31J`または`MS932`を指定しましょう。

* 動く
  * Windows-31J
  * MS932

* 動かない
  * CP932

こうなる背景としては、td importコマンドでは裏で`td-import.jar`を呼び出しており、これはJavaで書かれています。
そのためCP932ではなく、Windows-31JないしMS932を指定する必要があるようです。
少々不思議なことですが、このどちらを指定しても、結果は同じです。

> Javaの世界では、IBMのCP932とWindows-31Jを区別するために、MS932という用語が使われます。
> （中略）
![topics13_1.png](https://qiita-image-store.s3.amazonaws.com/0/19199/a62aa9c7-f19d-a363-3ab4-4ec7208abffc.png)
> たいていの場合はそれで問題ないかもしれませんが、プログラミングにおいて、文字コードに「Windows-31J」と指定すべきところを、「Shift_JIS」と指定したがゆえに、文字化けを引き起こすことがあります。「Windows-31J」で定義されている文字が「Shift_JIS」にはない場合です。
> 引用元 http://una.soragoto.net/topics/13.html

## バルクインポートに関するドキュメント

次のURLから、さまざまなTipsを参照できます。
http://docs.treasuredata.com/categories/bulk-import

* Bulk Import Overview
* Bulk Import from CSV file
* Bulk Import from TSV file
* Bulk Import from JSON file
* Bulk Import from Amazon S3
* Bulk Import from MySQL
* Bulk Import from PostgreSQL
* Bulk Import from MongoDB
* Bulk Import Internals
* Bulk Import Tips and Tricks

## あわせて読みたい

* マスタ情報を持つMySQLテーブルをTreasureDataへ簡単に転送する方法<br />
http://qiita.com/y-ken/items/ef48de726dcbc4d9de98
bashターミナルの改造

```
export PS1="\[\e[1;32m\][\u@\H]\[\e[00m\]\[\e[1;34m\][bash:\V]\[\e[00m\]\[\e[1;\
33m\][\d]\[\e[00m\]\[\e[1;33m\][\t]\[\e[00m\]\[\e[1;31m\][\w]\[\e[00m\]\n$"
```

![スクリーンショット 2015-05-26 11.49.08.png](https://qiita-image-store.s3.amazonaws.com/0/77643/e9ebc91f-62ce-321e-1bad-94a37cce9cac.png)
DTOからTypeScript定義をT4で自動生成

# 概要

サーバ側で定義したDTOとかTypeScriptでも同じように型定義するのが冗長でだるい。

# 解決方法

[TypeLite](http://type.litesolutions.net/)を使う
T4で指定したクラスをTypeScriptのインタフェースに変換してくれる

# 使い方

## DTOにTsClassAttributeを付ける（最低限モジュール名）

```csharp:DTO
    [TsClass(Module = "ModuleName")]
    public class HogeDto
    {
        public int Value { get; set; }
        public HogeType Type { get; set; }
    }

    [TsEnum(Module = "ModuleName")]
    public enum HogeType
    {
        Fuga = 1,
        Moge = 2
    }
```

## ビルドしてからT4実行で生成

以下自動生成される内容

```ts:t4.d.ts
declare module ModuleName {
	interface IHogeDto {
		value: number;
		type: ModuleName.HogeType;
	}
}
```

```ts:t4.enums.d.ts
module ModuleName {
	export enum HogeType {
		Fuga = 1,
		Moge = 2
	}
}
```

# Tips

## BugFix

デフォルトのT4の状態だと少し[バグ](https://bitbucket.org/LukasKabrt/typelite/issue/30/withformatter-throws-errors-vs-2012)ってるっぽいので、
以下の拡張メソッドに置き換える

```csharp:TypeScriptFluentExtensions
        public static TypeScriptFluent ForExecutingAssemblies(this TypeScriptFluent ts)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var types = assembly.GetTypes().Where(x => x.GetCustomAttributes(typeof (TsClassAttribute)).Any());
            foreach (var type in types)
                ts.For(type);

            return ts;
        }
```

これを

```csharp:呼び出し元のT4
TypeScript.Definitions().ForLoadedAssemblies()
```

こうする

```csharp:呼び出し元のT4
TypeScript.Definitions().ForExecutingAssemblies()
```

## チュートリアルが信用ならない件

公式のチュートリアルが古い実装（Obsolete）なので最新の実装に変える

### インタフェース名をIプレフィックスが付くようにする

```csharp:公式
WithFormatter((type, f) => "I" + ((TypeLite.TsModels.TsClass)type).Name)
```

```csharp:最新
.WithTypeFormatter((type, formatter) => "I" + ((TypeLite.TsModels.TsClass)type).Name)
```

### CamelCase対応

```csharp:公式
.WithFormatter((TypeLite.TsModels.IMemberIdentifier identifier) => 
       Char.ToLower(identifier.Name[0]) + identifier.Name.Substring(1)
   )

```

```csharp:最新
.WithMemberFormatter((identifier) => Char.ToLower(identifier.Name[0]) + identifier.Name.Substring(1));
```

## Nullableにしたい

TsPropertyAttributeでIsOptional = trueにする

```csharp:DTO
    [TsClass(Module = "ModuleName")]
    public class HogeDto
    {
        [TsProperty(IsOptional = true)]
        public int Value { get; set; }
        public HogeType Type { get; set; }
    }
```
Swiftでのクロージャの記述について


Swiftをサンプルコードを見ながら学習していて、以下の記述に戸惑いました。

```swift
PHPhotoLibrary.requestAuthorization{ status in
	if status == .Authorized {
   		self.prepareAnnotations()
   	}ｚ
}
```

上記は、以下と同じ意味になります。

```swift
PHPhotoLibrary.requestAuthorization({ (status) -> Void in
	if status == .Authorized {
    	self.prepareAnnotations()
    }
})
```

後者の記述から、requestAuthorizationメソッドの引数にクロージャを渡している事が理解できました。

Swiftでは、最後の引数がクロージャである場合は、()内から追い出して、メソッド呼び出しの後ろの{}内に記述する事ができるようです。前者のコードの場合は引数が１つであるため、()すら不要となっています。