OmniAICreator/Qiita-1.07M huggingface dataset:
The Elements of Statistical Learning

## 統計科学輪講 [The Elements of Statistical Learning]

* これは慶応義塾大学数理科学科 - 火2統計科学輪講で使う資料です。



### --- 記号まわりを中心にちょっと整理... ---
$K$個のクラス、たとえば ${\cal G} = \\{1,2...,K\\}$ があって、$\boldsymbol{x} \in \mathbb{R}^p$ を引数にとって $1, 2, ... K$ を返してくれるような関数 $\hat{G}(\boldsymbol{x})$（$\hat{G}(\boldsymbol{x})\in {\cal G}$）を$N$個の学習データから構築したい。学習データは$N\times(p+1)$行列$\boldsymbol{X}$ と$N\times K$行列の$\boldsymbol{Y}$（指示行列）として与えられている。

N個の学習データはそれぞれのデータを列に格納したN*(p+1)行列XとN*K行列Yとして与えられている。

今回新たに登場登場

各クラス毎に線形回帰を行い


```math
\hat{f}_k(\boldsymbol{x}) = \hat{\beta}_{k0}
 + \hat{\boldsymbol{\beta}}_{k}^T \boldsymbol{x}
```

を得れば


```math
\hat{G}(\boldsymbol{x}) = argmax_{k \in {\cal G}}( \hat{f}_k(\boldsymbol{x}))
```

としてひとまず $\hat{G}(\boldsymbol{x})$ を得ることが出来る、が改善の余地がありそう。

そこで...


Gˆ(x) = argmax fˆ (x).


$\hat{f}_k(x) = x_{y^2}$
...おこあしい！



fˆ (x) = βˆ + βˆT x.




$\pi_k$...事前確率, 

...N_k/N: 事前確率、クラスkがどのくらいの割合で含まれているか

G(x)...
テストについて

現在所属しているプロジェクトではclassのメソッド単位のテスト（単体テスト・・・とは言い難い）とAPI単位でのテストを記述して開発を行っております。
テストはpytestを使っております。
複数のメンバーで開発を行っておりますので、マージし、リポジトリにpushされたらdeployする前にjenkinsがテストを自動で実行し、成功したらdeployする、ということをしております。
これについて（現在も進行中ですが）良いことと辛いこと、改善したほうが良いと思っていることをまとめます。
（以下、テキストのみ！）

# 良いこと

- 安心できる

```
テストが通るとホッとします。精神的に落ち着きます。これは健全に開発を進めるために重要なことです。
いつも「自分の書いたコードは大丈夫かな？」なんて不安を抱えながら仕事をせずに済みます。
```

- 早期にバグが発見でき、落ち着いて修正できる

```
サービスが開始されてから重大なバグが発生するとその対応は迅速かつ正確に行う必要があり、それでも当然ながら評判は下がってしまいます。
しかもその対応をしつつ、次のサービスの準備もしなければなりません。
そんな事態は極力避けたいものです。
テストを書いて、自分のコードがマージされるたびに自動的に実行されることですぐにそのバグが見つかり、余裕がある時期に修正対応ができます。
```

- 仕様の認識のズレを発見できる

```
エラーが発生したとき、原因を探っていくうちに仕様のズレに気が付くときがあります。
これもリリースされてから発見されると大変なことになります。
それを早期に発見できることは非常に助かります。
これはマスタデータについても言えます。
エンジニアが想定していなかったデータが作成されたとき、このデータはどういう意図で作成されたものかを確認し、対応をすることができます。
```

- コードが読める

```
修正対応をすると、メンバーが書いたコードを読むことができます。
コードレビューは別で行っておりますが、それ以後もコードを読む機会ができ、これによって知識が得られたり、問題点などの発見ができます。
```

# 辛いこと

- 時間がかかる

```
テストの実行時間がだんだん長くなります。特にメソッド単位でのテストは非常に長くなります。
現在全部実行するのに1時間ほどかかります（APIテストは数分ですが）。
これは正しい現象ですが問題でもあります。
現在は修正した箇所のテストを自分の環境で実行し、テストが通ったらjenkinsさんに全部やってもらってます。
```

- エラーが頻繁に発生する

```
所属プロジェクトでエラーが発生する要因は主に2つです。
一つはマスタデータの更新によるエラー。もう一つは仕様変更によるエラーです。
後者はたまにですが、前者は頻繁に発生し、対応が正直面倒です。
これは我々が書いているテストがマスタデータに密接に結びついているから発生しているものです。
簡単な例をあげると、IDが1のアイテムを売ったら100円もらえる、というテストを書いたりしてます。「単体テスト」と書かず、クラス単位のテスト、と書いているのはこのためです。
開発中は頻繁にマスタデータが変更されます。
売却金額が変更されたり、そのIDのデータそのものが消えたりします。
その度にマスタデータを確認し、修正をします（それでもエラーが発生し、原因がコードのバグだった、なんてこともあります）。
これはあまり良いことではないと思われますが、具体的な数値で結果を比較することで安心感を得ている恩恵も受けております。
```

- エラーがずっと発生し続ける時がある

```
忙しいとなかなか修正に着手することができません。
その結果、ずっとjenkinsさんがエラー通知を送ってくれます。
これではテストを自動化している意味がない、ということで、最低でもAPIテストのエラーが発生したらすぐに修正しよう、という決め事をチームで作りました。
とはいってもクラス単位のテストも極力対応するようにしております。
```

# 改善したほうが良いと思うこと

- テストの粒度

```
テストを書く人によって、単にエラーが発生しないことだけをチェックしてたり、事細かに結果を比較するテストを書いたり、とまちまちです。
プロジェクト立ち上げの際に、この辺の粒度をすり合わせしたほうがいいかもしれません。
まだデータが仮状態の時はプログラムが正常に動くだけのテストを書き、データができてきたら結合テストの粒度のテストを別途作成する、でもいいのかな、と思ったり、いや、そんな時間は作れないか？と思ったり。
```

- 実行時間の短縮

```
メソッド単位のテストが1時間ほどかかります。
今は開発中なのでまだ時間はありますが、リリース中にバグが見つかり、その修正を行ったあと、1時間かけてテストをしてから本番に反映、なんて悠長なことはしてられません。
さてどうしたものか。
```

# まとめ

今までの開発を振り返り（まだ開発期間中ですが）、テストは良いぞう～、ということが最終的には言いたかったことです。
辛いことはあります。
テストのメンテ、面倒です。
でもそのテストが通るとハッピーな気分になれます。
リリース後、修正するたびに別のバグが出て・・・なんてことはこのテストがあるお陰で回避できると思えばなんてことはありません。
まだテスト書いてないという方、是非テスト書いてみましょう。

今回はコードの安心確保について書きましたが、次回は性能改善について書こうと思います。
あと、もうちょっと見栄えのいい書き方はないか勉強してきます。
Backlogの予定時間と実績時間を集計するChromeエクステンションを作ったよ

# 概要

- backlogの検索結果の画面で、各課題の予定時間と実績時間の合計値を知りたい場合があった
    - マイルストーンごとだったり
    - 担当者ごとだったり
- なので、以下の画面のように合計値を確認できるChromeのエクステンションを作った ( [backlog-timeSum](https://github.com/akyao/backlog-timeSum) )

![実行サンプル.png](https://qiita-image-store.s3.amazonaws.com/0/24444/edf5306c-8090-f481-6622-7b7f92f99c0d.png)

# インストール方法

- [githubのページ](https://github.com/akyao/backlog-timeSum)から「Download Zip」でダウンロード & 解凍
    - ※なぜか自分の環境ではchromeだとダウンロードできなかった。why?safariでならダウンロードできた
- で、適当な場所に移動させる
- chromeの設定画面、拡張機能のタブを開く(※下記画面参照)
- 「デベロッパーモード」をチェック
- 「パッケージ化されていない拡張機能を読み込む...」をクリック
- さきほどダウンロードしたbacklog-timeSumの中の、backlog-timeSumフォルダを選択
- これでインストールはOKです。

![クローム拡張機能設定.png](https://qiita-image-store.s3.amazonaws.com/0/24444/b6b1d06e-de81-70c2-f103-9331b9df01b3.png)


# 使い方

- chromeのデベロッパーツール、consoleタブを開く
- その状態でbacklogの「課題の検索」画面を開く
- それでコンソール画面に以下のように「予定時間」と「実績時間」の合計が表示されていればOK。おめでとう！良いぬうらぼライフを！

![実行サンプル.png](https://qiita-image-store.s3.amazonaws.com/0/24444/edf5306c-8090-f481-6622-7b7f92f99c0d.png)

※一度表示したあとに再検索とかしても、予定時間は再計算されません。(Ajaxのため)
お手数ですが、F5などで画面を再描画しなおしてください。

# 追記

- 子チケットの時間を合計してしまっていたのを修正。(2015/11/24)
UIWindowのwindowLevelについて あるいはソフトウェアキーボードより上にViewを表示する方法

ソフトウェアキーボードより上にViewを表示したい！と思って方法を調べました。

## iOSのソフトウェアキーボードはUIWindow

iOSのソフトウェアキーボードの正体は、keyWindowとは別のUIWindowです。
ということで、独自にUIWindowを生成して表示すれば、キーボードより上にViewを表示することができます。

詳しくはこちら。

- [Objective-C - 独自UIWindowの生成と解放 - Qiita](http://qiita.com/usagimaru/items/624595410ae350386b25)
- [UIWindowを使用したUIを作成する方法と注意点](http://skyarts.com/blog/jp/skyarts/?p=29773)

UIWindowのサブクラスをわざわざ作る必要はありません。

````swift
let currentWindow = UIApplication.sharedApplication().keyWindow
let newWindow = UIWindow(frame:currentWindow.frame)
newWindow.windowLevel = UIWindowLevelNormal
newWindow.addSubview(hogeView)
newWindow.makeKeyAndVisible()
```

こんな感じでnewWindowを表示できます。
windowを消したいときには、`resignKeyWindow()` を実行するのではなく、nilを入れる。

## windowLevelの話

さて、`UIWindow` の表示順は、設定された `windowLevel` で制御されます。
UIWindowLevelはCGFloatのエイリアスです。
`UIWindow.h` に定数として定義されているのは以下の3種類。

- `UIWindowLevelNormal　// = CGFloat(0)`
- `UIWindowLevelAlert　// = CGFloat(2000)`
- `UIWindowLevelStatusBar // = CGFloat(1000)`

ここで問題です。
キーボードより上にWindowを表示するためにはどのwindowLevelを設定すればいいでしょうか！？


答え。
**全部ダメです。**
マジかよ。

## ためしにキーボードを表示した状態で、Windowの構成を見てみましょう。
検証環境はiOS9.1です。

検証コード：

```swift
UIApplication.sharedApplication().windows
```

結果：

```
[<UIWindow: 0x148214bb0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x148218980>; layer = <UIWindowLayer: 0x148215ea0>>,
 <UITextEffectsWindow: 0x146da70d0; frame = (0 0; 320 568); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x146da7450>>,
 <UIRemoteKeyboardWindow: 0x149391ce0; frame = (0 0; 320 568); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x149392270>>
]
```

3つめのUIRemoteKeyboardWindowがソフトウェアキーボード。
[iOS開発におけるウィンドウ「UIWindow」の知られざる活用方法とは？ #iOS｜CodeIQ MAGAZINE](https://codeiq.jp/magazine/2014/05/9493/)
によると、過去のバージョンのiOSではUITextEffectsWindowで表示されていたこともあったようですが…

なにはともあれ、これらのwindowLevelを確認してみると…

検証コード：

```swift
UIApplication.sharedApplication().windows.map { $0.windowLevel }
```

結果：

```
 [0.0, 1.0, 10000000.0]
```

10000000.0って何だよ…。

## 結論

独自のUIWindowをキーボードより上に表示したいなら、10000000.0より大きい数をwindowLevelに設定しましょう。
というか、 `UIApplication.sharedApplication().windows` をぶん回して、それより大きい数を設定しましょう。

```swift
newWindow.windowLevel = UIApplication.sharedApplication().windows.reduce(0, combine: { max($0, $1.windowLevel) }) + 1
```

みたいに書けばいいんじゃないかな。
Xcode 7.x にしたら XVim などのプラグインが動かない

自分用メモ。基本的にはこちらの記事と同じ。

http://qiita.com/redpanda/items/006d35a2277e31dfe8b3

上記URLは7.0 Beta のものなので、UUIDをXcode 7.0 (7Bxxxx?) のものに変えるだけで良い。

```
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add 7265231C-39B4-402C-89E1-16167C4CC990
```

その後、Xcodeを再起動し、起動時に出るポップアップで Apple 以外によって提供されているプラグインをロードするか聞かれるので、Load Bundle を選択する。

なお、バージョンが7.xでない場合、DVTPlugInCompatibilityUUIDを見ると良い。

```
defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID
```

(defaults コマンドはmacのappなどの設定変更・確認に使われるコマンド。)

参考

Xcode 7.0にアップデート後、使えなくなったプラグイン(XVim等)を使えるようにする
http://qiita.com/redpanda/items/006d35a2277e31dfe8b3
Does not work in XCode 7.1
https://github.com/XVimProject/XVim/issues/853
Xcodeの言語ファイルとタブ区切りテキストを相互変換するスクリプト

Xcodeの言語ファイル(Localizable.strings)をハンドリングしやすいタブ区切りテキスト(tsv)と相互変換するスクリプト。
今まで[Linguan](https://itunes.apple.com/us/app/linguan/id477163052?mt=12)で言語ファイルを管理していたが、プロジェクトが巨大になるにつれ管理しにくくなってきたためタブ区切りテキストで管理する事に。

### Pythonモジュールのインストール

```bash:bash

pip install unicodecsv

```

### Localizable.stringsをLocalizable.tsvに変換

```py:i18n_po2tsv.py

import sys, re
import unicodecsv as csv
from collections import OrderedDict

#
# Default encoding
#

reload(sys)
sys.setdefaultencoding('utf8')

#
# File paths
#

tsv_path = 'Localization/Localizable.tsv'
loc_paths = 'PROJECT_NAME/PROJECT_NAME/Resources/UI/{}.lproj/Localizable.strings'

#
# Convert Localizable.strings to Localizable.tsv
#

langs = [
	'ja',
	'en',
]
rows = {}

for lang_code in langs:
	loc_path = loc_paths.format(lang_code)

	print('Reading loc file... ' + loc_path)

	lines = [line.encode('utf-8').rstrip('\n') for line in open(loc_path)]
	for line in lines:
		# print line
		pattern = re.compile(r'\"(.*)\" = \"(.*)\"')
		match = pattern.search(line)
		if match:
			loc_key = match.group(1).encode('utf-8')
			loc_str = match.group(2).encode('utf-8')
	        if loc_key in rows.keys():
	            rows[loc_key].append(loc_str)
	        else:
	            rows[loc_key] = [loc_key, loc_str]

rows_orderd = OrderedDict(sorted(rows.items()))

print('Saving tsv file... ' + tsv_path)
print('')

with open(tsv_path, 'wb') as f:
    writer = csv.writer(f, csv.excel_tab)
    writer.writerows(rows_orderd.values())

print('All done!')

```






### Localizable.tsvをLocalizable.stringsに変換

```py:i18n_tsv2po.py

import sys
import unicodecsv as csv
import codecs
from collections import OrderedDict

#
# Default encoding
#

reload(sys)
sys.setdefaultencoding('utf8')

#
# File paths
#

tsv_path = 'Localization/Localizable.tsv'
loc_paths = 'PROJECT_NAME/PROJECT_NAME/Resources/UI/{}.lproj/Localizable.strings'

#
# Read Localizable.tsv
#

langs = {
    'ja': {},
    'en': {},
}

print('Reading tsv file... ' + tsv_path)

with open(tsv_path, 'rb') as tsv_in:
    tsv_in = csv.reader(tsv_in, delimiter='\t')
    # next(tsv_in, None)
    for row in tsv_in:
        loc_key = row[0]
        if row[1]:
            loc_str = row[1].encode('utf-8')
            langs['ja'][loc_key] = loc_str
        if row[2]:
            loc_str = row[2].encode('utf-8')
            langs['en'][loc_key] = loc_str

#
# Save Localizable.string
#

print('')

for key, value in langs.iteritems():
    lang_code = key
    loc_path = loc_paths.format(lang_code)

    print('Saving loc file... ' + loc_path)

    with open(loc_path, 'w') as loc_out:
        loc_orderd = OrderedDict(sorted(value.items()))
        for loc_key, loc_str in loc_orderd.iteritems():
            loc_out.write('"' + loc_key + '" = "' + loc_str +  '";\n')
        loc_out.close()

    print('Done!')
    print('')

print('All done!')

```
マイナンバーのチェックデジットをScalaで計算する

マイナンバーが届いたので、[マイナンバーのチェックデジットを計算する](http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64)を参考にscalaでマイナンバー検証コードを書いてみました。

```scala:
def validateMyNumber(myNumber: String): Boolean = {

  if (myNumber.length != 12 || !myNumber.forall(_.isDigit)) {
    return false
  }

  val remainder =
    (1 to 11).map(i => myNumber(11 - i).asDigit * (if (i <= 6) i + 1 else i - 5)).sum % 11

  val checkDigit = myNumber.last.asDigit

  if (remainder <= 1) {
    checkDigit == 0
  } else {
    checkDigit == 11 - remainder
  }
}
```

```:結果
validateMyNumber("123456789010") // false
validateMyNumber("123456789011") // false
validateMyNumber("123456789012") // false
validateMyNumber("123456789013") // false
validateMyNumber("123456789014") // false
validateMyNumber("123456789015") // false
validateMyNumber("123456789016") // false
validateMyNumber("123456789017") // false
validateMyNumber("123456789018") // true
validateMyNumber("123456789019") // false
```

合ってそうなので、届いた自分のマイナンバーを入れてみたらちゃんとtrueが返ってきました。
よかったよかった。
spark-shell上でcassandrarowを扱う

# spark-shellの起動

```
cd spark-1.5.0
bin/spark-shell --jars spark-cassandra-connector-assembly-1.5.0-M2-SNAPSHOT.jar --conf spark.cassandra.connection.host = 127.0.0.1
```

# cassandraTableの取得

```
import com.datastax.spark.connector._ //Imports basic rdd functions
import com.datastax.spark.connector.cql._ //(Optional) Imports java driver helper functions

val c = CassandraConnector(sc.getConf)

val d = sc.cassandraTable("test_from_spark", "fun");

scala> d.collect.foreach(println)
CassandraRow{k: 1, v: 10}                                                       
CassandraRow{k: 2, v: 20}


```

# columnの選択、column dataの取得、where句でfilter

```

d.select("k").where("k = ?", 10).foreach(println)

CassandraRow(k: 10)

d.select("k", "v").where("k = ?", 12).map(row => row.get[Int]("v")).collect
res2: Array[Int] = Array(120)


```
# cassandra tableへの書き込み

```
val d = [なんかRDD]

d.saveToCassandra("keyspace", "table", SomeColumns("col1", "col2", ....))



```

# link

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/2_loading.md

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/4_mapper.md

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/5_saving.md
MHA for MySQLを設定した時の備忘録的メモ

# はじめに

DBをマスタースレーブ構成で構築しても、そのままだとマスターが死んだら手動でアプリサーバなどからアクセスしているDBサーバ名の向き先をスレーブに変えてあげないと、サービスは停止したままになるので、人間が気づくまで困った事になります。

MHAを使うと、そのDBサーバの名前の向き先を自動で更新してくれて、フェイルオーバしてくれるので、DBでマスタースレーブ構成を組んだら、セットで使いたいシステムです。

MHAを設定してみて、ハマった事や気づいた事を中心に備忘録的メモを書いてみたいと思います。

# MHAの仕組みについて

MHAは、DBの死活監視を定期的に行います。
マスターDBが死ぬと、MHAが気づいて、フェイルオーバー用のスクリプトを呼び出してくれます。
フェイルオーバー用のスクリプトでは、各アプリサーバの/etc/hostsファイルを自動で書き換えてスレーブをマスターとしてアクセスするようにしたり、専用DNSサーバを用意している場合は、そのDNSのレコードを自動で書き換えて、アプリサーバからの名前解決結果を動的に変更できます。

そうする事によって、マスターが死んでアプリサーバからのDBアクセスが一時的にできなくなっても、自動でスレーブをマスターに昇格させてDBサービスが再開できるようになります。

障害は起きる前提でシステムは構築するべきなので、人間が気づくまでDBが死んだままにならないように、自動でスレーブがサービス復旧に使われるようなシステム構築が必須ですね。

## MHAのマネージャー

マネージャーは、DBサーバ以外のどこかに入れると良いですが、専用のサーバにするか、アプリサーバ自体に同居させるかは、リソースや負荷量と相談して決める事になります。

マネージャーのサーバからは、各DBやアプリサーバにroot権限でパスワード無しログインができるようになっている必要がありますので、ssh-keygenコマンドを使ってパス無しで公開鍵、秘密鍵を作成して全部のrootホームの.sshフォルダに格納し、公開鍵を全てのサーバのauthorized_keysに追記してあげると実現できます。

## MHAのノード

ノードは、マネージャーを入れるサーバにもインストールしますが、各DBサーバにもインストールします。

## MHAパッケージの依存関係

MHAはperlやmysql-libに依存していますので、それらを先に入れる必要があります。

MySQL公式から以下のパッケージを落としてインストール
`MySQl-shared-compat`

yumコマンドでBASEとepelから以下のパッケージをインストール
`yum install perl-Config-Tiny perl-DBI perl-Time-HiRes perl-DBD-MySQL`
`yum install --enablerepo=epel perl-Log-Dispatch perl-Parallel-ForkManager`

筆者の環境では、上記を入れる事によって以下のパッケージがインストール可能になりました。
`mha4mysql-manager`
`mha4mysql-node`

## MySQLユーザのアレコレ

マスタースレーブ構成のDBにする場合、rootユーザの他にレプリ権限を持ったレプリユーザを作ります。
そのレプリ用ユーザは、スレーブDBからマスターDBにログインしてデータをレプリケーションする時に使われますので、ユーザのホストが「localhost」になっておらず、スレーブのIPアドレスとかになっています。

その場合、マスターDB自身でmysqlコマンドを使ってレプリユーザでログインしようとしても、権限が無いのでログインできません。
逆にマスター自身から自分にレプリユーザでログインする用途が無いので、ログインできるようにする必要が無いというわけです。

なので、スレーブDBから-hでマスターDBを指定すると、レプリユーザでログイン可能です。
この場合実際に使われるログインルートと同じになるので、ログインできなければ逆にダメという事になります。

## レプリ設定時のアレコレ

MySQLにrootでログインした後に、CHANGE MASTER TOコマンドをスレーブで実行して、スレーブがどのマスターからデータを貰って来ればいいのかを設定します。
CHANGE MASTER TOコマンドを間違ってマスターで実行してしまうケースを何度か見かけたのですが、マスターは自分がマスターなので、設定してはいけません。
間違って入れてしまった場合は、MySQLにrootでログインして以下のコマンドで消しましょう、MHA設定時にエラーになります。

`reset slave;`

## MHA設定時のアレコレ

DBのrootユーザを、各ノードから入れるようにしていないとダメです。

マスターDBで、各ノードのIPアドレスをホストに持ったrootユーザをホストの数だけ追加する必要があります。
第四オクテットをワイルドカードの％にしたり、サブネットマスクを指定して範囲指定しても良いかもしれませんが、サーバの数が少ない時は、必要なサーバだけピンポイントで設定した方が安心できます。

# おわりに

初めてMHAを設定して、あらゆる部分でハマった経験から、備忘録的メモを書いてみました。
やってみて思ったのは、手順を調べてやるだけじゃなくて、レプリやMHAがどうやって何を実現しているのか？というアーキテクチャからきちんと理解して設定しないと、とんでもない設定ミスをしてしまうなぁ。という事でした。
VS2015でSwift2.0入門　①コマンドラインでSwift

# VS2015で、Swift(2.0)してみる
元ネタは、関西モバイルアプリ研究会 発表スライド[SwiftでAndroidアプリ書けるってよ](http://www.slideshare.net/syoikeda/swiftandroid-53371094)から頂いた。

Apple製のclangでLLVMなコンパイル言語Swift(2.0)に準拠した言語Silverで、.NETもandroidも開発できるよという話。

開発元は、古のDelphiユーザーやC#向けのクロスプラットフォーム環境を出している老舗remobjects社。
当初はためしに、Mac向けの環境を入れてみたものの、あまりに怪しかったので忘れていた。
が、なんとなくサイトを再訪してみると、**VisualStudio2015ベースのSwift2クロス開発環境が無償で手に入る**とのこと。

![win10_swift.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/e76081e0-ee50-efb1-2423-bfaaf47bc5c8.png)

...釣られてみることにした。以下からダウンロード:
http://www.elementscompiler.com/elements/download.aspx

ダウンロード後、NETの最新版などいろいろ入れた後に再起動し、ElementsのVS2015向けの拡張などをインストールすると、VS2015で、New > Projectで各種のSwiftプロジェクトが立ち上げられるようになる。

プログラム言語入門といえばまずは、コンソールから。
ディフォルトで、デモ用のswiftコードが入った状態で立ち上がる:

![vs_swift.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/14698e07-6ded-6af5-487c-bd9f93f928fd.png)


let=...からはじまるコードを早速Start。コンソールが立ち上がり、なにやらアスキーアートが出るが、、一瞬でコンソールが閉じてしまう。
では、とswiftでinputコードを作ろうとするが、iOSのライブラリを使わずに、、、がわからない。
*# Macの場合もちょっと面倒、、 : http://j.mp/swift_input*

ということで、コンソールアプリは後回しにして、Androidアプリを立ち上げてみる
*# Android SDKが入っていることが前提*
![vs_swift_android.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/274c06a6-ec66-bae0-96f9-336fab158314.png)

なんとなくKotlinっぽいコードで、無事立ち上がりはするのだが、Swiftで、androidのライブラリをどう呼ぶのか、不明、、

ということで、基本に立ち返り、今晩はコマンドラインでのswiftお試し環境を確立することに専念する。

#Windowsコンソールでswift
とりあえず、本家のドキュメントRemObjects Silver (Swift)を眺めると、
*#この環境で動作するのは、あくまで、Swift準拠のRemObjects Silverという言語。*
http://docs.elementscompiler.com/Silver/
コンソールを閉じさせないやり方はわかった:
> Console.ReadLine()

と書く。例えば、

```swift
import System.Collections.Generic
import System.Linq
import System.Text
import System.Threading.Tasks

println("Console App:")

let items = ["alice","bob","chaco"]
for i in items{
    println(i)
}

Console.ReadLine()
```
といった感じ。

実行結果:
![vs_swift_reuslt.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/203d92cc-fcbf-9206-db52-11ddb5db7cb9.png)

VS2015から立ち上がるコンソールのコピペが効かないので、キャプチャしなければならないのが、何か退化した気もするが、、Swiftがオープンソースとなる前に、VisualStudio上でSwift(準拠)を体験させてくれてありがという、ということで、良しとする。

どこまで、準拠かは、これから検証する。
gitコマンド備忘録

**個人的によく使うgitコマンドを随時メモとして追加していきます**

### gitでoriginのurlを確認したい
```
$ config --get remote.origin.url

# こっちのコマンドだと、fetch・pushの両方みれる
$ git remote -v
```

### gitレポの情報をみたい
```
$ git config -l
```

### ブランチ周りで使うコマンド
```
# ブランチの作成
$ git branch {branch_name}

# 今いるブランチを確認する
$ git branch 

# ブランチの向き先を変更する
$ git checkout {branch_name}
```

### コミットする時に使うコマンド

```
# 変更のあるファイルを確認
$ git status

# 変更したファイルをaddする
$ git add {file_path}

# 変更したファイルを指定してcommitする
$ git commit  {file_path} -m "commit message"

# 変更したファイルを一括でcommitする
$ git commit  {file_path} -am "commit message"

# うっかりコミットメッセージ間違えた時に変更する
$ git commit --amend -m "new commit message"

# コミットメッセージが変更されたことを確認する
$ git log

# 変更したbranchをoriginへpushする
$ git push origin {branch_name}
```
[Eclipseプラグイン開発] 便利なショートカット


# はじめに

- Eclipse プラグインを開発するときに便利なショートカットを２つ

# Plug-in Selection Spy

Eclipse の画面上で何かを選択している状態で Alt+Shift+F1 を押すと、選択しているものの詳細（クラス名など）を表示してくれます。

例えば、パッケージエクスプローラーで適当な Java の Package を選択した状態で Alt+Shift+F1 を押すと、以下のような画面が表示されます。

![plugin_selection_spy.png](https://qiita-image-store.s3.amazonaws.com/0/97350/9a9101f4-6ac6-13fa-83f7-f701c1bed7fb.png)

これを見ると、WorkbenchWindow(ウィンドウ)はともかく、アクティブビューが `PackageExplorerPart` というクラスであり、そのプラグインが `org.eclipse.jdt.ui` のものであることが分かります。またプラグインIDなども分かります。

さらに、選択されたツリー構造が `TreeSelection` となっており、そのノードが `PackageFragment` になっていることも分かります。

もちろん、リンクになっているところをクリックすれば該当のクラスが開けます。

（ソースがあるか、逆コンパイラなどが入っていれば）ソースを見たり、関連する plugin.xml などを調べたりすることも可能です。

# Plug-in Menu Spy

似た機能で、メニューの詳細を調べることができるショートカットがあります。

Alt+Shift+F2 を押すとマウスカーソルが変わると思います。
その状態で適当なメニュー項目を選択してください。
先ほどと似たような画面が開くと思います。

例えばメニューから "Help" - "Welcom" を選択すると、以下のような画面が開きます。

![plugin_menu_spy.png](https://qiita-image-store.s3.amazonaws.com/0/97350/2c492410-e3c4-fc6f-b1d4-4e4b99eeacd9.png)

メニューの場所やID、クラスなどが表示されると思います。
（メニューによっては表示される情報の種類が異なる場合があります）

プラグインで拡張した機能を標準のメニューに追加する場合や、既にある機能の詳細を調べたい時に役に立ちます。

# キーバインドの変更

上記のショートカットが、他のショートカット（ＯＳやその他アプリ）と衝突してうまく動かない場合には、キーバインドの変更が可能です。

メニューから "Window" - "Preferences" を選択し、プリファレンス画面の "General" / "Keys" で、キーバインドの変更画面が開くと思います。

"type filter text" と薄い文字で表示されている入力エリアに、例えば "spy" と入力すれば、Plug-in Selection Spy と Plug-in Menu Spy が絞り込まれると思います。

下のほうの Binding の場所にフォーカスを当てて削除後に、割り当てたいショートカットを入力すれば変更することができます。

# Show Key Assist

例えば何回か操作するだけなのでわざわざキーバインドを変更するほどでもない、あるいは他人の環境なので勝手にキーバインドを変更するのは気がひけるというような場合、Shift+Ctrl+L を押すとショートカットの一覧が表示されます。

そこから、カーソルキーなどで Plug-in Selection Spy や Plug-in Menu Spy を選択して、Enter すればとりあえず使えます（ちょっと使いにくいですが）。
AWS Lambda のデプロイ (CLI)


### zipでまとめる

```
$ zip -r /tmp/<function_name>.zip *
```

### デプロイ (CLI)

```
$ aws lambda \
    update-function-code \
    --profile <aws_profile> \
    --function-name <function_name> \
    --zip-file fileb:///tmp/<function_name>.zip \
    --publish

```
telnetでポートが開いてるかを確認する

## telnet [オプション] [ホスト] [ポート]

###telnetでXXX.XXX.XXX.XXXの443ポートへ接続してみる

####接続成功
```
telnet XXX.XXX.XXX.XXX 443
Trying XXX.XXX.XXX.XXX...
Connected to XXX.XXX.XXX.XXX.
Escape character is '^]'.
```

#### 接続失敗

```
telnet XXX.XXX.XXX.XXX 443
Trying XXX.XXX.XXX.XXX...
telnet: connect to address XXX.XXX.XXX.XXX: Connection timed out
```

#### 強制的に接続切断する

```
Ctrl+] 
telnet> q 
```

**ポートを指定しない場合は、ssh(23ポート)で接続されます**

#### オプション
|オプション       |説明                                                  |
|:---------------|:----------------------------------------------------|
|-8              |8ビット動作を行う                                      |
|-E              |エスケープ文字の機能を無効にする                        |
|-L              |出力に 8 ビットデータパスを指                          |
|-a              |自動ログイン                                          |
|-d              |debugの初期値をtrueにする                             |
|-S tos          |telnet接続のためのサービスタイプオプションの値をtosに設定する|
|-e エスケープ文字|エスケープ文字を指定する       |
|-l ユーザ名      |ログインユーザーを指定する  |
|-n トレースファイル|トレース情報を記録するためにトレースファイルを開く|
|--excludefile EXCLUDE_FILE|ファイルEXCLUDE_FILEから除外するターゲットを読み込む     |

**TELNET接続後のコマンドは下記のマニュアルを参考にして下さい**
[TELNETマニュアル](http://linuxjm.osdn.jp/html/netkit/man1/telnet.1.html)
nmapコマンドでポートスキャンする

## nmap [オプション] [ターゲット]

```
$ nmap google.com

Starting Nmap 6.47 ( http://nmap.org ) at 2015-11-17 21:32 JST
Nmap scan report for google.com (216.58.220.206)
Host is up (0.0012s latency).
rDNS record for 216.58.220.206: nrt13s36-in-f206.1e100.net
Not shown: 997 filtered ports
PORT     STATE SERVICE
80/tcp   open  http
443/tcp  open  https
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 5.09 seconds
```

#### オプション
|オプション |説明                                                |
|:--|:------------------------------------------------------------|
| -A |OSとバージョンの検知                |
| -sL |指定したネットワーク内のホスト一覧を表示する（リストスキャン）            |
| -sP |pingに応答するホストの一覧を表示する（Pingスキャン）                |
| -sS |TCPのSYNパケットを送ってSYN+ACKが返ってくるか調べる（TCP SYNスキャン/TCPハーフスキャン）|
| -sT |TCPでポートに接続できるか調べる（TCP Connectスキャン）               |
| -sV |ソフトウェア名とバージョンの表示を有効にする|
| -sU |UDPポートをスキャンする（UDPスキャン）|
| -sF |FINフラグだけのパケットを送って調べる（TCP FINスキャン）|
| -sN |まったくフラグなしのパケットを送って調べる（TCP Nullスキャン）|
| -sX |FIN/PSH/URGフラグを立てたパケットを送って調べる（Xmasスキャン）|
| -sA |ACKフラグだけのパケットを送って調べる（TCP ACKスキャン）|
| -b FTP_HOST |FTP_HOSTのFTPサーバを利用して調べる（FTPバウンススキャン） |
| -O |OSを検出しようとする|
| -P0 |Pingスキャンを行わない（アクティブなマシンを割り出すためのホスト発見プロセスが省略される）|
| -PS [PORTLIST]|PORTLISTで指定したポート（デフォルトは80番）にSYNフラグ付きの空TCPパケットを送信する（TCP SYN Ping）|
| -PA [PORTLIST] |PORTLISTで指定したポート（デフォルトは80番）にACKフラグ付きの空TCPパケットを送信する（TCP ACK Ping）|
| -PU [PORTLIST] |PORTLISTで指定したポート（デフォルトは31338番）に空UDPパケットを送信する（UDP Ping）|
| -PE [PORTLIST] |ICMPタイプ8（エコー要求）パケットをターゲットに送信する（ICMP Ping）|
| -PR |IPベースのスキャンより高速なARPスキャンを行う（ARP Ping）|
| -n |DNSによる逆引き名前解決を行わない|
| -R |すべてのターゲットに対して常にDNSによる逆引き名前解決を行う|
| -p PORT |スキャンするポートをPORTで指定する（1-1023、U:53,T:80）UはUDPポート、TはTCPポートを示す|
| -F |限定したポートのみ調べる（約1200ポート）|
| -r |調べるポートの順番を無作為（デフォルト）ではなく順に選ぶ|


#### ターゲット
|ターゲット                 |説明                                        |
|:-------------------------|:----------------------------------------------------|
|IPADDR                    |IPアドレスで指定(「xxx.xxx.xxx.1-250」「xxx.xxx.xxx.1,3,5」といった指定も可能)|
|IPADDR/MASK               |IPアドレスとサブネットマスクでNWの範囲を指定             |
|HOSTNAME/MASK             |HOSTNAMEで指定したホストのIPアドレスとサブネットマスクでNWの範囲を指定する|
|-iL TARGETFILE            |ファイルTARGETFILEから指定するターゲットを読み込む       |
|-iR NUM                   |NUMで指定した数のホストを無作為に生成する（0なら無制限）  |
|--exclude HOST1,HOST2     |指定したホストHOSTやネットワークをスキャン対象から除外|
|--excludefile EXCLUDE_FILE|ファイルEXCLUDE_FILEから除外するターゲットを読み込む     |

#### 返り値のステータス
|返り値のステータス  |説明                                            |
|:--------------|:--------------------------------------------------------|
|open      |ポートが開いている（TCPコネクションやUDPパケットをアクティブに受け入れている状態）|
|closed         |ポートが閉じている（探査パケットを受け入れたり応答したりするが、待機しているアプリケーションがない）|
|filtered       |パケットフィルタリングで、ポートが開いているかどうか判別できない|
|unfiltered     |ポートにアクセスできるがポートが開いているかどうか判別できない|
|open/filtered  |ポートが開いているのかパケットフィルタリングされているのか判別できない|
|closed/filtered|ポートが閉じているのかパケットフィルタリングされているのか判別できない|
latexmkの薦め


記事を書くのは今更ですが、論文を書くようになってからLaTeXのタイプセットに使っているlatexmkについて簡単に。

## <i class="fa fa-leaf"></i> latexmkとは？
LaTeXのタイプセットを自動的に実行してくれるツール。
図表番号や参照、BibTeXなど、数回のコンパイルが必要な場合でも必要回数分繰り返しコンパイルを実行してくれるので、一度コマンドを実行するとPDFが完成している。
つまり、`platex` 実行して、`pbibtex` 実行して、`platex` 実行して...みたいなことが不要になる！
さらに、ファイル変更すると自動的にコンパイルしてくれる機能つき（オプション）！

## <i class="fa fa-leaf"></i> インストール
TeXLiveとかに含まれているので特別な操作は不要。
もしない場合は `apt-get` とか `tlmgr` とかでインストールができるみたい。

## <i class="fa fa-leaf"></i> 設定
`~/.latexmkrc` というファイルに設定を記述。
このファイルで `latex` でコンパイルするか `platex` でコンパイルするかなどを指定。
ちなみにPerlで書きます。

```.latexmkrc
#!/usr/bin/perl
$latex = 'platex -guess-input-enc -src-specials -interaction=nonstopmode -synctex=1';
$latex_silent = 'platex -interaction=batchmode';
$dvips = 'dvips';
$bibtex = 'pbibtex';
$makeindex = 'mendex -r -c -s jind.ist';
$dvi_previewer = 'start dviout'; # -pv option
$dvipdf = 'dvipdfmx %O -o %D %S';
if ($^O eq 'darwin') {
    $pdf_previewer = 'open -a Preview %S';
} elsif ($^O eq 'linux') {
    $pdf_previewer = 'evince';
}
$preview_continuous_mode = 1;
$pdf_mode = 3;
$pdf_update_method = 4;
```

今の設定ファイルの中身。
LinuxとMacで書くことがあるので previewerをOSによって切り替えている。

## <i class="fa fa-leaf"></i> 使い方
``` bash
latexmk main
# latexmk main.texでも可
```
これで `main.tex` ファイルに対して一通りのコンパイルを実行してくれ、PDFの生成までできる。
（対象フォルダ内に.texファイルがひとつしかない場合、`latexmk`だけでも実行可能）

### <i class="fa fa-cog"></i> オプション
<i class="fa fa-list-ul"></i> -pv
コンパイル終了後、`$pdf_previewer` で指定したものでPDFをプレビューする。

<i class="fa fa-list-ul"></i> -pvc
`-pv` に加え、texファイルを監視し続け、変更を検知したら再度コンパイルしてくれる。

<i class="fa fa-list-ul"></i> -c
途中で生成した中間ファイル（.log, .auxなど）を削除してくれる。

<i class="fa fa-list-ul"></i> -C
生成したファイル（.pdf, .dviなど）を削除してくれる。

---
### <i class="fa fa-leaf"></i> つぶやき
大体の場合、`-pvc` オプションをつけて実行したいので `alias lmk='latexmk -pvc'` ってエイリアスかけてる。
あとは、`alias lmkc='latexmk -c'` とか。

(´・ω・\`) 「TeXstudioとかの統合環境を使わずに、vimとかemacsとかでTeX書くよー」って人には `Makefile` 作るよりお手軽でいいと思います。





<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
BEMよりもBMEがさいつよ

BEMといえば、`.block__element--modifier`で有名なCSSの命名規則ですが、現実問題、`.block--modifier__element`の順（BME）にした方が拡張性が高く、破綻しにくいので最強です[^1]。

[^1]: ここでは`element`は子要素だけに限定せず、子孫要素とします。（つまり`.block--modifier__element__element`の様にはなりません）

## 論拠

### 1. 継承が美しい。

```html:HTML
<!-- コンポーネントA -->
<div class="block"> ... </div>

<!-- コンポーネントAを継承したA" -->
<div class="block block--modifier"> ... </div>

<!-- Aの子孫要素 -->
<div class="block__element"> ... </div>

<!-- AとA"に共通の子孫要素 -->
<div class="block__element"> ... </div>

<!-- A"だけにある子孫要素 -->
<div class="block--modifier__element"> ... </div>
```

### 2. 子孫要素のモデファイには `is` の方が便利

```html:HTML
<div class="block--modifier__element is-hide"> ... </div>
```

誰も`.block--modifier__element--modifier`なんて望みません。

### 3. 親要素のモデファイには `is` が使いづらい

```html:HTML
<div class="block is-modified">
  <div class="block__element"> ... </div>
</div>
```

上記では、`A"だけにある子孫要素`なのかどうかを知る方法がありません。

## 結論

ということで、BEMよりもBMEがさいつよ。

証明終わり
MacでPython3のインストールと基本動作の確認その1

# はじめに
全くのPython初心者なので知らない事だらけですが、HelloWorldからはじまり、色々やっていこうと思います。

Pythonに詳しい方がご覧になってご指摘があれば是非とも頂きたいです！

OSはMacでPythonのバージョンは3を前提にやっていこいうと思います。

# インストール
Macには既にPythonの2系がインストールされています。
バージョンを確認すると以下のように表示されると思います。

```
python --version
Python 2.7.10
```

しかし、2系はもう開発終了しているので3系にします。

pkgからインストールしました。
https://www.python.org/downloads/
(brew経由でのインストールも出来ます)

インストールしたらバージョン確認してみましょう。

```
python3 --version
Python 3.5.0
```

この状態で、2系と3系が共存している状態になります。
しかし、間違ってもここで2系のPythonを削除してはいけません。

以下にあるように削除すると恐らく大変困った事になりそうです。
http://docs.python.jp/3/using/mac.html
> Apple やサードパーティのソフトウェアが使用するので、編集したり削除してはいけません。

# Hello World
鉄板の登竜門Hello World表示です。

エディタで以下のように書いて、``hello.py``で保存します。

```py:hello.py
print ("Hello World")
```

``hello.py``が保存されたディレクトリに移動して

```
python3 hello.py
```

と実行すると

```
Hello World
```
と表示されるはずです。

無事Hello Worldが表示されたので、にここからは実際にコードを書くにあたっての基礎を固めていきたいと思います。

# 対話モード
Hello Worldを表示するのに``hello.py``を作成して実行しましたが、この方法以外にコマンドラインのみで同じ事ができます。
それが対話モードです。

ターミナルで

```vim
python3
```
と入力します。すると以下のような表示になると思います。

```vim
Python 3.5.0 (v3.5.0:374f501f4567, Sep 12 2015, 11:00:19) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

この```>>>```の状態になっていれば対話モードが開始されています。

ここで、```print('HELLO')```をタイプしてエンターすると``HELLO``と表示されるはずです。

```vim
>>> print('HELLO')
HELLO
```

文字列の表示以外にも計算も出来たりします。

```vim
>>> 10+10
20
```

終了する時は

```vim
quit()
```

# 変数宣言
Pythonの変数ですが、動的型付けをしてくれるようなので、文字列、数値などの型をあらかじめ定義しないでも使えます。

```
# 数値として変数をセット
num1 = 1
num2 = 2
# 1+2
result = num1+num2
# 出力
print(result)

# 文字列として変数をセット
string1 = 'a'
string2 = 'b'
# ab
concat = string1 + string2
# 出力
print(concat)
```

結果は

```
3
ab
```

# 文字列
文字列は シングルクォーテーション`'`またはダブルクォーテーション`"`で囲む事によって文字列と認識されます。

# 数値
以下の数値型をサポートしています。
整数(int)
浮動小数点数(float)
複素数(complex)

# リスト
複数の値をまとめる時に使います。
``[]``で囲って``,``で値を区切ります。

以下の例ではlistsampleというリストにA,B,Cを入れて、全てのリストを返します。

(対話モードで実行)

```vim
>>> listsample = ['A','B','C']
>>> listsample
['A', 'B', 'C']
```

インデックス指定も出来ます。

```vim
>>> list = ['A','B','C']
>>> list[0]
'A'
```

# 定数
Pythonには定数が存在しないようです。
``TEST_VALUE``のように、一般的には大文字とアンダーバーで定義したものを定数として扱う場合が多いようです。


# タプル
定数では無いですがタプルと呼ばれるオブジェクトの要素を変更できない定義方法があります。

(対話モードで実行)

```vim
# タプルの定義
>>> taplesample = (100,200,300)
>>> taplesample
(100, 200, 300)

# インデックス指定すると0番目の100が表示
>>> taplesample[0]
100

# これはエラーになる
>>> taplesample[0] = 101

```

同じように100,200,300をリストに定義して、0番目の100を101に変更すると、こちらは書き換えが可能です。

```vim
>>> samplelist = [100,200,300]
>>> samplelist[0] = 101
>>> samplelist
[101, 200, 300]

```


# コメントアウト
`#` で単行のコメントアウト

複数行の場合は シングルクォーテーション`'`またはダブルクォーテーション`"`を３つ並べて囲むと複数行コメントアウトになります。

```
print('表示する')

'''
print('表示しない')
print('表示しない')
'''

```

# おわりに
今回はHello Worldの表示や簡単な値の操作までやりました。
この先はその2として書いていこうと思います。
破壊系のAssetを試す (Shatter Toolkit)

今回はこやつ。
<a href="https://www.assetstore.unity3d.com/jp/#!/content/1017" target="_blank">
<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/46444/193b1b56-c097-835c-4803-5fe9ae40c2a8.png"></a>

##インポートしたところ
Unity5対応と書いていないので不安があるかもしれないですがUnity5でも普通に動きます。
<img width="201" src="https://qiita-image-store.s3.amazonaws.com/0/46444/bc1438e5-4151-d7ce-93c8-d10a9695e47a.png">


##デモの感じ
好きな位置でスライスできます 割れたところのUVも指定できます
こちらは同じマテリアルでUV位置を指定するタイプ
また事前に割るタイプではないので意図した形に分割できる。
![explode10.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/59bed694-95d3-824b-2a1f-f17ce19647d3.gif)![explode11.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/8ff6ab2f-0ef8-3c9d-6025-68b9528febf2.gif)

##ぶつかったら壊れる系をつくってみる
前に作成したボールを
<img width="202" alt="スクリーンショット 2015-11-17 13.34.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/99e82b8c-5c1a-9b29-2f51-69067e7dbc2e.png">

UVはこれ
<img width="379" src="https://qiita-image-store.s3.amazonaws.com/0/46444/35015f32-964c-5c4e-386b-5a13497adb0f.png">

###ボールのインスペクタ
RIgidBodyとmeshColliderを追加。
MeshColliderのConvexにチェックをいれること!
ShatterTool.csを追加
ShatterOnCollision.csを追加。これがぶつかったときに割れるScript
TargetUvMapper.csを追加。これが割れた部分のUV。
今回のUVの場合はこんな感じに指定。開始位置終了位置をしていするのではなく
開始位置とそこからのサイズを指定する形。 
<img width="439" src="https://qiita-image-store.s3.amazonaws.com/0/46444/e5e0513d-e674-4131-7e1d-fff5bdb0ec7e.png">

###手っ取り早くボールを投げる
Helpers/Mouse/MouseInstantiate.csを空のオブジェクトなどにアタッチすればクリックした位置からオブジェクトを飛ばすことができます。
<img width="454" src="https://qiita-image-store.s3.amazonaws.com/0/46444/152a794b-1a55-eab6-38c0-aeb5f575cdb6.png">

出来上がり。
![explode12.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/8622d25c-a7f0-7aa2-b2a5-997310767623.gif)

##便利なScript
便利なScriptがそろっているので簡単に操作周りが作成できます。
<img width="172" src="https://qiita-image-store.s3.amazonaws.com/0/46444/9ac885f2-2b0c-a3e7-69c4-4e11d2cdd195.png">

HierarcheHandler.cs：modelに親子階層があるときなどに使用する
SHatterOnCollision.cs:何かかぶつかったら割れる

MouseForce.cs :クリックドラッグでつんで移動できる
MouseInstantiate.cs： オブジェクトを投げる
MouseShatter.cs：クリックした位置でオブジェクトを割る
MouseSprite:ドラッグした線でオブジェクトを切る

![explode13.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/aca0b377-9a58-2ff1-361f-79647d776db6.gif)

ステーキのカットだってこの通りw
<img src="http://ayumegu.daa.jp/img/Qiita/explode14.gif" />

##触った感想
できること
ユーザーの操作によるカット
クリック位置、ぶつかった位置での破壊。
割れた部分のUV指定(同じマテリアル)

できないこと：
複雑な形状なものでは動作しない。
そもそもMeshColliderのConverxをチェック入れる時点で、
Convex オンの MeshCollider は三角形面数の上限 255 に制限されています。という制約がつくためポリゴン数が多いものは対応できない
SkinnedMeshにはつかえない。
GALLERIA ZIにUbuntuを入れる時にハマったところ


~~ゲーム~~Deep learning用に良い感じのグラフィックボードを積んだPCが欲しくてGALLERIA ZIを買った。
構成はこんな感じ。

 https://www.dospara.co.jp/5goods_pc/user_custom_view.php?ucn=66319

ぎりぎり30万切るので一括して経費計上できて助かる。
今回はこれにUbuntu 14.04.3 LTSを入れた。

#ハマったところ

Ubuntuのディスクを入れてinstall ubuntuとか選んでも

``` Ignoring BGRT: invalid status 0 (expected 1) ```

とか出てきてそこから先に進まない。

色々調べてみると、起動パラメータの

``` quiet splash ```
を
``` nomodeset ```
に変更すると良いらしく、インストーラの起動に成功。

無事インストールが完了し、cudaのインストールと動作確認も完了。

ただ再起動後、今度は紫の画面のままうんともすんとも言わなくなる。
やっぱりこれも起動パラメータの
``` quiet splash ```
を
``` nomodeset ```
に変更すると動くようになるらしく、変更したら動いた。

GPUのドライバ周りの問題らしい。
http://cpplover.blogspot.jp/2012/03/nomodesetlinuxgpu.html
bash製dotfilesの管理を超絶楽にするフレームワークdot

作りました。

* [dot](https://github.com/ssh0/dot)

詳しくは[README](https://github.com/ssh0/dot/blob/master/README_ja.md)を読んでいただきたいのですが，なかなか便利なやつができたと思います。

# モチベーション

dotfilesに設定ファイルをまとめると便利ですね?

でもしこしこシンボリックリンク貼るの面倒ですね?

解決策，(既に)(たくさん)あります。

* [最強の dotfiles 駆動開発と GitHub で管理する運用方法 - Qiita](http://qiita.com/b4b4r07/items/b70178e021bef12cd4a2)
* [[Vim・Bash/Zsh使いなら]ドットファイル管理のススメ - Qiita](http://qiita.com/KENJU/items/4045861a4aaadaba19b4)
* [Vim - dotfilesをgithubで管理 - Qiita](http://qiita.com/himinato/items/7f5461814e8ed8916870)
* [UNIX - githubとrcmを使ったモダンdotfiles管理 - Qiita](http://qiita.com/manicmaniac/items/b50e1fc1a05202542fb0)
* [GitHub does dotfiles - dotfiles.github.io](https://dotfiles.github.io/)
    * [Alterant](https://github.com/autonomy/alterant)
    * [Config Curator](https://github.com/razor-x/config_curator)
    * [Dotbot](https://github.com/anishathalye/dotbot)
    * [dotfiler](https://github.com/svetlyak40wt/dotfiler)
    * [dotfiles.sh](https://github.com/wking/dotfiles-framework)
    * [Dotsync](https://github.com/dotphiles/dotsync)
    * [dotty](https://github.com/vibhavp/dotty)
    * [fresh](https://github.com/freshshell/fresh)
    * [Ghar](https://github.com/philips/ghar)
    * [Homemaker](https://github.com/FooSoft/homemaker)
    * [Homeshick](https://github.com/andsens/homeshick)
    * [Homesick](https://github.com/technicalpickles/homesick)
    * [rcm](https://github.com/thoughtbot/rcm)
    * [Super User Spark](https://github.com/NorfairKing/super-user-spark)
    * [vcsh](https://github.com/RichiH/vcsh)
    * [yadm](https://github.com/TheLocehiliosan/yadm)


で，いろいろと見ていたのですが，自分で毎回シンボリックリンクを書く，というのは嫌だし，
かと言ってめちゃめちゃすごい人が作ったであろうフレームワークは複雑で怖くて使えない。

ので自分で作ったのが`dot`です。

# 概要

簡単にできることを説明すると，

* テキストファイルにベタ書きされた対応関係を元にリンクを貼る(環境構築用)
* dotfilesに既存ファイルを登録と同時にリンク化，リンク対応をテキストファイルに上書き(普段使い用)
* PC依存の設定ファイルもまとめてdotfilesにあげ，対応表だけローカルに管理

bash製なのでWindowsは切り捨ててる感あるけど，*nix系では動くはず。

# 終わり

まだまだ改善点はあるかと思いますが，気になった方はぜひ試してみてください。
(そしてフィードバックをください...)
ソースコードはコメント入れて500行もないので，お気軽に。
EC2起動時roleをアタッチするときに必要なpolicy 

​​EC2にロールを使ってアクセス権限を付与する場合、PassRoleアクションを許可するポリシーが作成者に付与されている必要があります。

```
例）

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Action": "iam:PassRole"
      "Resource": "*"
    }
  ]
}
JSP/サーブレット セッション情報の設定・取得

JSP/サーブレットでセッション情報を設定・取得する方法です。

# セッション情報の設定
JSP/サーブレットの暗黙オブジェクト**session**（javax.servlet.http.HttpSessionの実装)に、setAttribute(String, object)メソッドで値を設定します。

```java:Sessionの設定
protected void doGet(HttpServletRequest request, HttpServletResponse response){
  String value = "XxxValue";
  // 第2引数は(Stringに限らず)任意のオブジェクトを設定可能
  session.setAttribute("XxxKeyString", value);
}
```

# セッション情報の取得
sessionオブジェクトのgetAttribute(String)メソッドで値を取得します。

```java:Sessionの取得
protected void doGet(HttpServletRequest request, HttpServletResponse response){
  String value = session.getAttribute("XxxKeyString");
}
```

# よく使うsessionオブジェクトのメソッド
| メソッド | 説明 |
|:--|:--|
| getAttributeNames() | セッションに紐づくオブジェクト名の一覧(Enumeration<String>)を取得 |
| getCreationTime() | セッションが生成された時刻(long)を取得 |
| getLastAccessedTime() | セッションID付きリクエストを受け取った最後の時刻 |
| setMaxInterval(int), getMaxInactiveInterval() | サーブレットコンテナに最終アクセスしてからセッションを保持する最大秒数を設定・取得 |
| isNew() | まだセッションが設定されていない場合にtrue |
| invalidate() | セッションを無効化 |
WindowsのVPN接続でリモートのデフォルトゲートウェイを使わない

通常はWindowsのネットワーク接続のプロパティからTCP/IPの「詳細設定」とかで設定するのだろうけど。。。
Windowsのバージョンによって方法が違ったりするのが面倒だと思っていたけどVPNの接続設定ファイルをテキストエディタで編集すればよいらしい。

ファイル名
` C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk `

項目
` IpPrioritizeRemote=0 `
メディアクエリ用 Mixin

# <i class='fa fa-flag fa-fw'></i> 目的

Sass でメディアクエリをいちいち書くと長くなるし DRY でなくなるので、
Mixin にして簡潔に書けるようにする。

# <i class='fa fa-pencil fa-fw'></i> 実装

```_respond-to.scss
// Breakpoints
$large-screen: 1200px;
$medium-screen: 992px;
$small-screen: 768px;

@mixin respond-to($media-list...) {
  @if index($media-list, large) {
    @media screen and (min-width: $large-screen) {
      @content;
    }
  }
  @if index($media-list, medium) {
    @media screen and (min-width: $medium-screen) and (max-width: $large-screen - 1) {
      @content;
    }
  }
  @if index($media-list, small) {
    @media screen and (min-width: $small-screen) and (max-width: $medium-screen - 1) {
      @content;
    }
  }
  @if index($media-list, extra-small) {
    @media screen and (max-width: $small-screen - 1) {
      @content;
    }
  }
}
```

# <i class='fa fa-cubes fa-fw'></i> 使用例
```main.scss
@import 'respond-to';

main {
  section {
    max-width: 600px;

    @include respond-to(medium) {
      max-width: 400px;
    }

    @include respond-to(extra-small, small) {
      max-width: 200px;
    }
  }
}
```

<i class="fa fa-fw fa-2x fa-arrow-down"></i> CSS はこのようになります。

```main.css
main section {
  max-width: 600px;
}
@media screen and (min-width: 992px) and (max-width: 1199px) {
  main section {
    max-width: 400px;
  }
}
@media screen and (max-width: 767px) {
  main section {
    max-width: 200px;
  }
}
@media screen and (min-width: 768px) and (max-width: 991px) {
  main section {
    max-width: 200px;
  }
}
```

# <i class='fa fa-book fa-fw'></i> 参考

## 記事

* [Responsive Web Design in Sass: Using media queries in Sass 3.2](http://thesassway.com/intermediate/responsive-web-design-in-sass-using-media-queries-in-sass-32)
    * 元ネタ

## 公式ドキュメント

* [Sass Documentation > Control Directives & Expressions > @if](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#_9)
    * `@if` について 
* [Sass Documentation > Mixin Directives > Arguments > Variable Arguments](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#variable_arguments)
    * `...` について  
* [Module: Sass::Script::Functions > List Functions](http://sass-lang.com/documentation/Sass/Script/Functions.html#list-functions)
    * list の index 関数について
CentOS 7上のnginxで終了時にUNIXソケットが削除されない問題

CentOS 7上にnginxをnginxリポジトリからインストールし、Unixソケットを使った場合、nginxを終了した際にUnixソケットが削除されず、nginxが再起動されないトラブルが発生します。

# 環境
* CentOS 7
* [nginxリポジトリ](http://nginx.org/en/linux_packages.html)からインストールしたnginx 1.8.0 （※CentOS標準のリポジトリからインストールしたものに同様の問題があるかは調べていません）

# 原因

原因はsystemdのUnit設定ファイル（/usr/lib/systemd/system/nginx.service）に定義されている終了処理で

```
ExecStop=/bin/kill -s QUIT $MAINPID
```

と記述されているのですが、SIGQUITではUnixソケットが削除されず、次回起動時にソケットファイルが存在するため「Address already in use」のエラーとなり起動しなくなります。

# 解決方法

```
ExecStop=/bin/kill -s TERM $MAINPID
```

のように書き換えることでこの問題は解決します。
（[書き換えた後のnginx.serviceファイル](https://gist.github.com/kuropen/682de72987cc5ff028d9)）

# 参考文献
[Nginx leaves old socket – StackExchange](http://unix.stackexchange.com/questions/164866/nginx-leaves-old-socket)
CircleCIのコンテナの状態に左右されずにビルドツールをインストールする


```bash:circle.yml
# ...
  dependencies:
    pre:
      # workaround for brew's bug https://github.com/Homebrew/homebrew/issues/45616
      - brew update || brew update
      - brew outdated xctool || brew upgrade xctool
      - xctool -v
      - >
        which carthage;
        if [ $? -eq "0" ]; then
          brew outdated carthage || brew upgrade carthage
        else
          brew install carthage
        fi
      - carthage version
```

carthageがインストールされててbrew outdatedの判定されれば -> brew upgrade
carthageがインストールされてなければ -> brew install
ubuntu, HHKB Lite2 JP での Superキー変更

ファンクションキーおしながらじゃないとSuperキーできないので変更.
半角全角キーとかなキーのをそれぞれかえる。windowsでは公式のツールがある。

~/.xmodmap　を作成して下記のように記述

```.xmodmap
clear mod4
keycode 49 = Super_L
keycode 101 = Super_R
add mod4 = Super_L
add mod4 = Super_R

```



自動起動するアプリケーションに

```
xmodmap .xmodmap
```

を記述する
VisualStudioをMarkdownの簡易WYSIWYGエディタとして使う

昨日初めてQiitaに記事を投稿しました。
記事はMarkdown形式で記述します。特に長くもない記事でしたが、プレビュー時にレイアウト崩れに気付かず、投稿後に何回か細かな更新をしました。
Qiitaに限らず最近Markdown形式で文書を書くことが多くなりましたが、素朴な疑問として「みんなどうやって編集しているのだろう?」と思っていました。

## WYSIWYG編集がしたい
…というのも、Markdownは書きやすいですが、例えば改行の有無で見た目が変わるなど、ちょっと分かりずらいところもあります。
一言で言うと[WYSIWYG](https://ja.wikipedia.org/wiki/WYSIWYG)編集がしたいですね。
Adobe Dreamweaverのような感じで。

![WYSIWYG editing using Dreamweaver](http://www.adobe.com/content/dotcom/jp/devnet/dreamweaver/articles/dw_html5_pt1/_jcr_content/articlecontentAdobe/image_20.adimg.mw.650.jpg/1303442251893.jpg)

Qiitaでは、ブラウザから記事のライブ編集とプレビューが出来ますが、個人的にはブラウザで書きたくないんですよね。ブラウザが落ちた時に記事が失われてしまうのはちょっと。。

素直に[Kobito](http://kobito.qiita.com/)を使えば良いのかもしれませんが、ロックインされるようで少し気になります。
そもそも他のツールで出来ないものか。

周りで評判のSublime Text2でWYSIWYG編集が出来ないかとインストールして試してみましたが、残念ながら未対応のようです。

とはいえ、Qiitaで記事を書く以上、何か見つけなければ。
そんな中、たまたまVisual Studio 上でWYSIWYGに近い編集が出来る事を発見しましたので共有します。

# 環境
- Windows 7 64-bit

# ソフトウェア
- Visual Studio 2013 Community Edition Update 5
 - [Visual Studio 2013 本体](https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx)
 - [Visual Studio 2013 Update 5](https://support.microsoft.com/ja-jp/kb/3021976)

- [Markdown Mode for Visual Studio](https://visualstudiogallery.msdn.microsoft.com/0855e23e-4c4c-4c82-8b39-24ab5c5a7f79)

- [Web Essentials 2013.5](https://visualstudiogallery.msdn.microsoft.com/56633663-6799-41d7-9df7-0f2a504ca361)
※これはMarkdown Modeが機能するのに_恐らく_必要だと思います。

# 使い方
全部順番にインストールすればOK。
あとは、MarkdownファイルをVisualStudioで開くと、自動でMarkdownのプレビューウィンドウが開きます。
(もし開いていなければ、メニューから、表示-その他のウィンドウ-Markdown Preview Modeを選択すればOK)

# 使用イメージ
![WYSIWYG Markdown Editing](https://raw.githubusercontent.com/dseg/dseg.github.io/master/img/qiita/02-wysiwyg-vs-md/02_01-wysiwyg_md.png)

# 終わりに
WYSIWYGというより、プレビューがなんとなく出来る感じですが、
**オフライン編集 + 大まかな確認**
が出来ることが個人的には一番重要なので、これでしばらく使ってみます。

・・・やっぱりKobitoを素直に使うのが良いのかな。
MarkdownのWYSIWYG編集の為に、VisualStudioを入れるのはちょっとやりすぎですかねw

### 2015/11/18 追記
すぐ忘れるので。
[Qiitaでシンタックスハイライト可能な言語一覧](http://qiita.com/Qiita/items/e84f5aad7757afce82ba)
Go言語の旧バージョンのパッケージ/関数/構造体の変更まとめ


Go言語で[golang.jp](http://golang.jp/)のサンプルコード実装時に、パッケージ/関数/構造体が以前のバージョンのもので実装されていた場合の変更メモ。
執筆時に最新バージョン（1.6）で実装されているものとする。
今後、随時追記予定。

##パッケージ
* http → net/http
* template→html/template

##関数
* template.ParseFile→template.ParseFiles

```Go:template_sample.go
t := template.Must(template.ParseFiles("view.html"))
```


##構造体
* os.Error → error
touchデバイスでもドラッグ＆ドロップでsortableしたい

###npmインストール
`npm i sortablejs`

###使い方
```html
<ul id="items">
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
</ul>
```

```js
var el = document.getElementById('items');
var sortable = Sortable.create(el);
```
ul/liじゃなくても親タグの下に子タグが並んでるようなdom構成なら、どこにでも使えます。

子要素全体を掴ませたくない場合は子要素の一部をdraggableにできます。
いろんなイベントが定義されていて動作のカスタマイズが出来ます。

```js
Sortable.create(this.$main[0], {
  handle: '.handleCol',
  onStart: () => this._onStartDragOnSort(),
  onEnd: () => this._onEndDragOnSort(),
  onUpdate: e => this._onUpdate()
});
```

###参考
RubaXa/Sortable
https://github.com/rubaxa/Sortable
demoページ
http://rubaxa.github.io/Sortable/
Dockerのsaveとexportの差異

Dockerでイメージを永続化するには通常`commit`を使うが、この他に状態保存に関するコマンドとして`save`と`export`がある。いずれもコンテナをtarにまとめて吐き出すような挙動をするが、それぞれ動作が異なる。

Dockerコンテナの内部構成
====================
その前にDockerコンテナの内部構成に関して把握する必要があるが、以下のページが大変詳しくて参考になった。

[Dockerイメージの差分管理についてまとめてみた | TANKSUZUKI.COM](http://tanksuzuki.com/post/docker-image-filesystem/)

Dockerコンテナは構成を「差分」という形で管理していく。Dockerfile内で`RUN`や`ADD`を行うと、それは都度差分として記録されるので、闇雲に`RUN`を重ねるとコンテナがぶくぶくと膨れていく。ちなみに差分（レイヤー）数の上限は127だそうだ。

saveとexportの差異
====================
そういったコンテナの構成を踏まえてのこれらのコマンドの差異を見る。

* `save` 上記のレイヤーやタグといったメタ情報含めてコンテナをtarでまとめる。
* `export` ファイルシステムを愚直にtarでまとめ、メタ情報は無視される。

つまりはいわゆる「Dockerコンテナ」として保存できるのは`save`の方であり、`export`はDockerとしての構造、情報などは無視され、通常のサーバーと同様のルート以下ファイルシステムが保存されるだけ。例えばDocker Hubを使わずにローカルでコンテナを別のDocker環境へ引き渡したい、といった用途であれば、`save`して`load`してもらう形になるかと思う。

（参考）
* [save](https://docs.docker.com/engine/reference/commandline/save/) (Docker Docs)
* [export](https://docs.docker.com/engine/reference/commandline/export/) (Docker Docs)
* [Difference between save and export in Docker – Thomas Uhrig](http://tuhrig.de/difference-between-save-and-export-in-docker/)
続・iterm2にもteratermみたいな複数行ペーストを確認する機能が欲しくて

may-i-pasteがとても良かったのだが、自分の環境ではうまく動かなくなってしまった。
http://qiita.com/kaorukit/items/09ef1551beacff866027
ので、作り変えてみた。
色々試してたらほぼ別物になってしまった。

System Eventsを呼び出してcommand + vを叩く挙動になっているので他のショートカットに設定する必要があるのがイマイチなんだが、これしか自分の環境で動かなかったので。。。

```lang:Paste.scpt
set strClip to get the clipboard
set asciiCr to ASCII character 13
set findCr to offset of asciiCr in strClip

if findCr = 0 then
    tell application "System Events" to keystroke "v" using {command down}
else if findCr > 0 then
    set EditTxt to the text returned of (display dialog "may i paste?" default answer strClip)
    set the clipboard to EditTxt
    tell application "System Events" to keystroke "v" using {command down}
end
```

オリジナルがどうだったか覚えてないが、確認窓のテキストを編集するとペーストに反映されるようにしてある。
embulk-filter-hashのご紹介

Embulkで任意の列をHash化するFilter Pluginを書いたのでご紹介

- [Github](https://github.com/kamatama41/embulk-filter-hash)
- [Rubygems](https://rubygems.org/gems/embulk-filter-hash)

## 用途
というか自分たちが使いたくなった経緯です。
本当はメールアドレスや電話番号といった個人情報を除去した状態でExportしたいけど、Export先のDBでJOINのキーとしてそういう情報を使いたいのでマスキングをしつつデータを一意にしたい、という要件があったので作りました。

## 使い方
詳しくは[README](https://github.com/kamatama41/embulk-filter-hash/blob/master/README.md)読んで、と言うとそれまでなんですが、簡単に設定方法をご紹介します。

```yaml
filters:
  - type: hash
    columns:
    - { name: username }
    - { name: email, algorithm: SHA-512, new_name: hashed_email }
```

- `columns`: Hash化したい列を配列で指定します
  - `name`: inputの列名です。
  - `algorithm`: Hashアルゴリズムを指定します。[MessageDigest](https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html)を内部的には使ってて、そこで指定可能なアルゴリズムを記述します。(デフォルトは`SHA-256`)
  - `new_name`: ハッシュ化した列に新しい名前を付けたい場合に記述します。デフォルトはinputの列名です。
perl上でexit codeを取得する際は要注意

`system('date')`とかでシステムコールした際のexit codeを取りたい時注意。

### どうしたらいいの？

exit code取りたいだけならこうしておく。

```pl
my $code = system('date') >> 8
```

### なんで？

unix的な戻り値を返すらしい。
左8bit: exit code
右8bit: コアダンプの有無とか停止時のシグナルとか

### 参照

perldoc
http://perldoc.jp/variable/%24%3F
[Objective-C]わかりやすいプロパティのnonatomic/strong/copy/retain/assignの意味

Objective-C のプロパティの属性を指定するとき、下記ことがあります。


|タイプ	      |オプション	              |説明 |
|:-------------------|:-------------------------|:-----------------------------------|
|独自メソッド名 |getter=(独自ゲッタ名)|ゲッタ名を指定する |
|             |setter=(独自セッタ名)|セッタ名を指定する |
|読み書き指定|readonly	              |読み取り専用 |
|             |readwrite	          |読み書き可能（デフォルト） |
|値の持ち方	  |assign	              |代入で値を取得 |
|             |retain	              |オブジェクトを保持 |
|             |unsafe_unretained	  |(ARC) assign に同じ |
|             |strong	              |(ARC) retain に同じ（デフォルト） |
|             |weak	                  |(ARC) 弱い参照 |
|             |copy	                  |オブジェクトをコピーして設定 |
|アトミック性|nonatomic	          |同時実行を許可 |




- ARCを使わない場合はassignがデフォルト、使う場合はstrongがデフォルト。

- retainは参照カウントが保持されて、assignは保持されないらしい。

参考：
http://kawairi.jp/weblog/vita/201312239804
http://qiita.com/uasi/items/80660f9aa20afaf671f3
http://nazo.hatenablog.com/entry/2012/05/30/objective-c-property