OmniAICreator/Qiita-1.07M huggingface dataset:
関数合成Composeが初めて役に立った話


高階関数の例としてよく出てくるわりに使い道のわからなかった関数合成（`compose`）が、初めて実用的な役に立ったので、参考のために記録に残しておく。

## たくさんあるAPIにたらい回しされた

あるとき、Aに問い合わせた情報をもとにBに問い合わせて、さらにその答えをもとにCに問い合わせて、さらに……
みたいな組み合わせがたくさん出てきて大変なことになった。

説明のために簡略化したコードを例として挙げる。

API呼び出しがこんな関数だとしたら、

```ruby
def query(site, api, key)
  ... 
end
```

たらい回しされるところのコードはこんな感じになってて

```ruby
def fetch_foo()
  foo = query("site1", "api1", key)
  return foo
rescue => e
  logger.error(e)
  return FetchError.new(key, e)
end

def fetch_bar(key)
  value1 = query("site1", "api1", key)
  bar = query("site1", "api2", value1)
  return bar
rescue => e
  logger.error(e)
  return FetchError.new(key, e)
end

def fetch_baz(key)
  value1 = query("site1", "api3", key)
  value2 = query("site2", "api4", value1)
  baz = query("site3", "api5", value2)
  return baz
rescue => e
  logger.error(e)
  return FetchError.new(key, e)
end
```

以下略みたいな`fetch_xxx()`っぽい関数がたくさん増えた。

## 問題点

* 同じようなコードがいっぱい増えてカオスになってきた。
* 情報がどこにあるのかという知識が、どうやって取得するかという手続きに埋め込まれてしまい、容易に読み取れない。

## 解決策

コードに法則性がありそうだったので、気になる部分を取り出して並べてみた。

```ruby
# 1段でとれるパターン
foo = query("site1", "api1", key)

# 2段必要なパターン
value1 = query("site1", "api1", key)
bar = query("site2", "api2", value1)

# 3段必要なパターン
value1 = query("site1", "api3", key)
value2 = query("site2", "api4", value1)
baz = query("site3", "api5", value2)
```

これは単純化するとこういう形なので、

```ruby
a = f(x)
b = g(a)
c = h(b)
```

一時変数への代入を省くとこうなり、

```ruby
h(g(f(x)))
```

関数合成（`compose`）の例そのままの形になっている。

つまり`fetch_xxx()`を共通化するには、任意の数の関数のリストを受け取ってすべて合成する関数（`concat`）があればいいということが分かる。

`concat` を実装するにあたっては以下の性質が使える。

> 引数と返り値の型が等しい関数は、恒等関数`id`を単位元とし`compose`を演算子とした _Monoid_ とみなせるので、`foldl`/`foldr`による畳み込みができる。

静的型のないRubyでは引数の数が1であればとりあえずいい感じに合成して適用できる。
（ただし引数と返り値の型が合わなければ実行時エラーになる）

Rubyでの`foldl`は`inject`なので下記のように書ける。


```ruby
def compose(f, g)
  ->(x) { f.call(g.call(x))) }
end

def concat(list)
  id = ->(x) { x }
  list.inject(id) { |memo, f| compose(memo, f) }
end
```

これを使えば`query()`の呼び出しの連鎖をひとつの関数にまとめられる。

```ruby
def refer(*access_path)
  queries = access_path.map do |pair|
    site, api = pair
    ->(key) { query(site, api, key) }
  end
  concat(queries.reverse)
end

# 1段でとれるパターン
query_foo = refer(["site1", "api1"])
# 2段必要なパターン
query_bar = refer(["site1", "api1"], ["site2", "api2"])
# 3段必要なパターン
query_baz = refer(["site1", "api3"], ["site2", "api4"], ["site3", "api5"])
```

単なる１引数関数にまとまっているので、これを実行するのは`.call()`するだけでいい。

```ruby
def fetch(query, key)
  query.call(key)
rescue => e
  logger.error(e)
  return FetchError.new(key, e)
end
```

## まとめ

複数のAPI呼び出しのたらい回しを関数合成とみなすことで、

* 似たようなたくさんの関数をひとつに共通化できた
* 呼び出しの連鎖を文字列のリストとして表現することができた
PostgreSQLのダンプとリストア

# 平文形式でバックアップ

## ダンプ作成
```bash
pg_dump -U "ユーザー名" --no-privileges --schema=public --blobs "DB名" | gzip > dump.sql.gz
```

## リストア
### 1. 受取る側のユーザーとデータベース作成
```sql
create user 'ユーザー名';
create database 'DB名' owner 'ユーザー名';
```

### 2. リストア実行
```bash
gzip -cd dump.sql.gz | psql -U "ユーザー名" -d "DB名"
```

# 独自アーカイブ形式でバックアップ

## ダンプ作成
```bash
pg_dump -Fc --no-privileges --schema=public --blobs "DB名" > db.dump
```

## リストア
### 1. 受取る側のユーザーとデータベース作成
```sql
create user 'ユーザー名';
create database 'DB名' owner 'ユーザー名';
```

### 2. リストア実行
```bash
pg_restore -U "ユーザー名" -C -d "DB名" db.dump
```

# [おまけ] タブ区切りファイルで出力

```bash
psql "DB名" -U "ユーザー名" -c "SELECT文;" -A -F $'\t' > ./export.tsv
```
GTUG Girls+PyLadiesTokyo Meetup 初めての機械学習に行ってみた

まだまだWebプログラマーのひよっこですが、行ってきましたよ。pythonで機械学習。

#そもそもPyLadies Tokyoってなに？
[PyLadies] (http://www.pyladies.com/) の日本支部なのですが
ECナビで有名な[VOYAGE Group](http://voyagegroup.com/)がなんか毎回主催してるっぽいです。
それで今回行ったのがこちら↓2016/2/23
[PyLadies Tokyo Meetup #9 初めての機械学習](http://pyladies-tokyo.connpass.com/event/26118/)

機械学習がなんか勤務先で流行ってたのもあるし、ウェイで有名なVOYAGE groupのオフィスとても見てみたかったので行ってきましたよ。（笑）

#事前準備

事前準備としてAnaconda環境を入れる必要があります。
[MacでPython3系ベースの機械学習環境設定（Python2系との共存](http://qiita.com/ken0nek/items/c51b8e2b83d902698fdf)
みたいな感じでやればいいでしょう。
一応私がやった流れとしては、macbook+homebrewを使いまして

**pyenvのインストール**
※rubyのrbenvみたいなバージョン管理システム

```
brew install pyenv
```

これで~に.pyenvディレクトリが入ってそこでバージョン管理されます。

**Anacondaのインストール**
※Anaconda入れればpythonと数値計算で使う便利ツール一式入るので別途pythonインストールしなくても大丈夫です。注意。

```
pyenv install anaconda3-2.5.0
```

あと今回のディープラーニングで使うテストデータダウンロード
http://deeplearning.net/data/mnist/mnist.pkl.gz

#内容
https://github.com/PyLadiesTokyo/intro_neural_network
これが教材でクローンしときます。

```
git clone https://github.com/PyLadiesTokyo/intro_neural_network.git
```

クローンしたらnotebooksディレクトリに移動して、

```
jupyter notebook
```
でJupyter起動します。localhost:8888が起動します。
それでノートの内容を進めていきました。Jupyter初めて使ったんだけど便利だね。いいね。
内容は

1. pythonの簡単な文法
2. Jupyterの使い方
3. Machine_Learning
4. MNISTで手書き文字認識
5. Neural_Network
6. Digit_Recognizer

というなんとなく機械学習の空気を触れる内容やれました。上辺だけなのでいまいち理解度微妙ですね。
そんな感じで初めての機械学習やりましたとさ。
最後に解答例もありました。https://github.com/amacbee/intro_deep_learning

あとgoogle女子エンジニア勉強会あるから良かったら参加してね～だって
https://www.womentechmakers.com/iwd16

#会場の様子
女の子いっぱい。
![IMG_1293.JPG](https://qiita-image-store.s3.amazonaws.com/0/110510/73f057dc-bfb1-e525-3cdd-55de49c050ac.jpeg)

おおお！？！？なんか意識高いぞ？？
![IMG_1294.JPG](https://qiita-image-store.s3.amazonaws.com/0/110510/cd11f58f-10f1-35fe-3792-75e22f566164.jpeg)

わわわ！！！！あのよくわからない船だ！!
![IMG_1295.JPG](https://qiita-image-store.s3.amazonaws.com/0/110510/c6ceaafe-56fb-cd1e-a05c-99db360264f9.jpeg)

タダ酒飲めた!
![IMG_1296.JPG](https://qiita-image-store.s3.amazonaws.com/0/110510/09785be8-2a6a-8d9c-a024-35b8940128df.jpeg)
Webシステム開発環境を考える2016

初投稿：2016/02/29

#概要
私がWebシステム開発(と呼べるか怪しいもの)をやり始めたころは
メモ帳で編集してFTPクライアントでレンタルサーバーにアップロードする
というのが日常でした。

そのうちサクラエディタやEclipseを使うようになって多少は作業効率が
上がったものの、編集→アップロード→ブラウザで確認という
なんとも非効率な開発環境を変えたいと思いつつもなかなか改善できてません(;´･ω･)

もちろんローカルにXAMPP環境を作って動作確認してからアップロードというのも
試したことはあるのですが、処理速度が遅かったり本番環境にアップロードしたら
動かなかったりすることもたまにあって結局敬遠するように…(;´･ω･)

そうこうしているうちに時代はクラウドへと移り変わり、gitでソース管理してみたり
SSHで接続してパッケージインストールしたりとインフラ部分での負荷も増えてきたので
どげんかせんといかん！(古)ということで2016年版の開発環境を整えようと思うのです。

#前提条件
理想は本番環境と同等の環境で開発＆デバッグして、動作確認したらgitなりなんなりに
コミット。本番環境へもgitなりなんなりからデプロイってのがいいですよね？

そしてなるべくファイルの移動はさせたくない。
動作確認やコミットする為にファイルを移動させるだけでも面倒だし**ミスの原因**にもなるし。

デバッグもホントはデバッグツールとか使うと効率いいんだろうけど
いざ本番運用を始めたら本番環境でデバッグツール動かす訳にはいかないので
そこはログ周りの環境を整えてサポートしたいところ。
※どっちにしても本番環境でどんなエラーが発生しているかは詳しく知りたいので

最後に**低コスト**で導入できるというのが忘れてはならないポイント。
そりゃあお金をつぎ込めばオーダーメイドで素晴らしい環境が構築できるかもしれないけど
コストパフォーマンスが悪かったら本末転倒ですからね。

#結論
表題のとおり「考える」に対する結論としては、「考えた」で終わっちゃうので実際に試してみるのは
この後の話。とりあえずざーっと調べてみた結論としては
**「Azureとgit(Backlog)とNetDriveでなんとかなるかも？」**

いやまぁ、やってみないとわかりませんよ？
私の嫌いなタイプの営業さんやお客さんにこんな回答した日にゃ
**「それじゃいつまでにいくらくらいでできますか？」**
なんてすーぐ聞いてくるけど
**「やってみないとわかりませんよ？」**

という訳で、やってみたら別エントリで報告するかもしれませんし
できなかったら、この下の行に「できませんでした(てへぺろ)」って書くだけかもしれません。
とりあえずざーっと調べてざーっと考えてみました。

##2017.3.13追記
いまんところクラウド上に環境構築して、NetDrive2使って直接編集して動作確認ってのがいい感じです。
デバグできない？echoやログでなんとかしましょうよ、どうせ本番環境でデバグなんてできないんだし。

#参考資料
<a href="https://blogs.msdn.microsoft.com/tsmatsuz/2015/03/16/azure-web-app-git/" target="_blank">Azure App Service の Git 活用 (さまざまなシナリオ)</a>
Elixirの"t"ってなに？ "remote type"ってなに？

Elixirの色々なパッケージのコードを見ていると、下記のような@specディレクティブが頻繁に登場します。

```ex
@spec foo(Bar.t | t) :: t
```

(@specディレクティブに関しては[こちら](http://elixir-lang.org/getting-started/typespecs-and-behaviours.html#function-specifications)をご参照ください)

「この"t"ってなんだよ？」と思ったことはありませんでしょうか？

# "t"について

ということで調べてみましたが、結論から言うと上記の"t"は、それぞれのモジュールで

```ex
@type t :: 色々な型定義
```

のような感じで定義されています。多くの場合は

```ex
@type t :: %__MODULE__{〜構造体のフィールドの型定義を羅列〜}
```

のような感じで、そのモジュール内でdefstructで定義している(`%モジュール名`で参照できる)構造体の型情報を返す目的で使用されているようです。

# "remote type"について

Elixirの[typespecsに関するドキュメント](http://elixir-lang.org/docs/v1.1/elixir/Kernel.Typespec.html)の途中に、「remote types」という用語が突然登場します。

![スクリーンショット 2016-02-29 15.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/22932/3494d796-682b-3cf7-3915-ef1094855c59.png)

この「remote type」とは一体なんだろう？ということで調べてみたのですが、これはerlang用語のようです。[こちら]
(http://erlang.org/doc/reference_manual/typespec.html#id78824)で説明されています。

![スクリーンショット 2016-02-29 15.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/22932/ed499b09-1cd7-720f-041a-baf10aaf9ac5.png)

要するに、あるモジュールからexportされて、他のモジュールで参照可能な型定義のことを「remote type」と呼ぶようです。

# まとめ

Elixirの場合、`@type`で外部にエクスポートする、そのモジュールの型情報を「t」という名称で定義することが慣例のようなので、「remote type」とは要するに`@type t :: 色々な型定義`という形式で定義された、`Hoge.t`のような構文で参照可能なそのモジュールの構造体情報のこと、と考えて良いと思われます。

# 補足

Elixirの型定義ディレクティブには、`@type`以外にも`@typep`および`@opaque`が使用可能です。[こちら](http://elixir-lang.org/docs/stable/elixir/typespecs.html#defining-a-type)でそれぞれ下記のように説明されています。

> A type defined with @typep is private. An opaque type, defined with @opaque is a type where the internal structure of the type will not be visible, but the type is still public.

`@typep`で定義された型はプライベートになりますので他のモジュールからは参照できません。そのため`@typep`で定義された型は「remote type」とは呼ばないと思われます。

`@opaque`で定義された型は、他のモジュールから参照可能ですが、その内部構造は隠蔽されているため、他のモジュールがその型の内部構造にアクセスするようなコードは不可ということになるようです。(おそらくdialyzer等の静的型チェックツールでチェックするとエラーになるのではないかと思われます)
PHP7.0をLinux素人がインストールする

## **※注意点**
この内容は[コチラ](http://dqn.sakusakutto.jp/2015/12/centos7_yum_install_php70.html)の方の記事を見ながらLinuxド素人の私が作業した内容の記録です。
詳しい内容はリンク先のページに載っていますので、そちらを御覧下さい。
両方の記事を見て補完してもらうような形になっています。

あまりにも素人すぎて解説を見ても躓いたので、これからLinuxを始める人の参考になれば


#PHP7.0のインストール手順

##リポジトリの追加
```bash
# epelを追加
$ sudo yum -y install epel-release
# remiを追加
$ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo rpm -ivh ./remi-release-7.rpm
```

<br>
##PHP7.0をインストール
有効なリポジトリを指定して実行

したら上手く入りませんでした。恐らく古いPHPが残っているのが原因？
という事でphpを全て削除！
(後で原因はパスを正しく通せていなかったからと分かりましたが、消した方が良さそうなんでやっぱり削除)

```bash
$ sudo yum remove php*
```

そして改めて有効なリポジトリを指定して実行

```bash
$ sudo yum --enablerepo=epel,remi,remi-php70 install php70
```
<br>
##パス(環境変数)を設定
 
```/opt/remi/php70/enable``` にパスを通すための設定が書かれているそうなので、そのままパスを通します。
...ところでパスを通すとは？(；´∀｀)
つまりは[こういう事](http://pocketstudio.jp/linux/?%A5%D1%A5%B9%28PATH%29%A4%CE%B3%CE%C7%A7%A4%C8%C0%DF%C4%EA%CA%FD%CB%A1%A4%CF%A1%A9)

パスを通すための設定とやらを見てみる。

```bash
$ cat /opt/remi/php70/enable
```

なにやら3行ほど書かれているので、それをそのまま入力する

```bash
$ export PATH=/opt/remi/php70/root/usr/bin:/opt/remi/php70/root/usr/sbin${PATH:+:${PATH}}
$ export LD_LIBRARY_PATH=/opt/remi/php70/root/usr/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
$ export MANPATH=/opt/remi/php70/root/usr/share/man:${MANPATH}
```

これでインストール終了！

```bash
$ php -v
#と入力して下記が出てくればOK細かいバージョン等は違うかもしれません。
PHP 7.0.3 (cli) (built: Feb  3 2016 10:42:03) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```

となれば無事に成功！
**なんですが！実は少し変更しておきたいファイルが！**

環境変数を
 
```bash
$ export ***~
``` 
と入れると、設定はできますが一時的な設定にしかすぎません。

```bash
$ exit
```

してしまうと消えてしまうので、永続的に設定しちゃいましょう。
環境変数は[こちら](http://d.hatena.ne.jp/Akineko/20090825/1251187210)のページを参考にしました。

>/etc/profile の最終行に、ユーザー単位の設定方法と同じくコマンドを追記

とあるので、

```bash
$ vi /etc/profile
```

で開いて最終行にさっき入力した3行を``` export~ ```から全て追加しましょう。

#参考にしたHP
- http://dqn.sakusakutto.jp/2015/12/centos7_yum_install_php70.html
- http://pocketstudio.jp/linux/?%A5%D1%A5%B9%28PATH%29%A4%CE%B3%CE%C7%A7%A4%C8%C0%DF%C4%EA%CA%FD%CB%A1%A4%CF%A1%A9
- http://d.hatena.ne.jp/Akineko/20090825/1251187210
情報劣化する組織の作り方と更生方法 Wiki編

情報が劣化していく組織のパターンが見えてきたので、共有。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">幼稚園→周りと合わせろ<br>小学校→周りと合わせろ<br>中学校→周りと合わせろ<br>高校→周りと合わせろ<br>大学→周りと合わせろ<br>会社→周りと合わせろ<br>パターンパターン！見えてきたよ！<br><br>「やりたいことが分からない」とよく相談受ける理由。　<br>自分で考える機会が今までなかったから。</p>&mdash; 厚切りジェイソン＠書籍発売 (@atsugirijason) <a href="https://twitter.com/atsugirijason/status/649486784917848064">2015年10月1日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

今回はWikiの使い方について (wiki使えない病)

# Wikiを書いても誰も見ない
## 症状
Wikiに書いたにも関わらず誰も見ない。
書いた本人は追記するかもしれないけど、他の人はそうしないから
本人はわかってるんだけど他の人がわからないところが書かれていない。
記載者が退社した途端にみんなが途方に暮れる

## 処方箋
- とりあえずwikiを読む習慣づけ
- なんか聞かれたら第一声は「wiki読んだ？」
- slackやhipchatで質問されたらまずwikiのURLを投げつける
- それでもわかんない場合のみ回答。
- 教えてもらった人はページに情報を追記

# 情報が古くなっても更新されない
## 症状
Wikiに1回でも記載したら、もうそれで安心してしまってそれ以降そのページが更新されなくなる。
でも情報や記載されている手順なんかは気づけば古くなっているので、
気づいた頃には使えないページになっている。
その時点で更新されたらいいほうだけど、それでも更新されない。

## 処方箋
- 古くなった情報は新しくするように習慣づける
- 気づいた人が更新する
- 新しく仕入れた情報はノートの前にwikiに書く

# Wikiのページは最初に書いた人のもの
## 症状
このケースは主なのは3パターン

- Wikiを更新しようとすると初回作成した人に承認が必要
- Confluenceとか更新履歴があったり、コミットメッセージ的なのを書けたりすることを知らない
- 間違った情報を記載したらどうしようとビビる

## 処方箋
- おまえのものは俺のもの、俺のものも俺のもの
- だれが書いたかわからなくなるんだったら更新履歴を残せばいいじゃない
- どこが変わったか知りたいんだったら差分を見ればいいじゃない

# 最悪のシナリオ
wikiをガッツリ書いていた人がやめることになり、
それまでわからないことは本人に聞いてたんだけど、
その人がいなくなったもんだからしょうがなくwikiを読むことに。
読んでみたものの肝心のところが記載されていないため呆然となり、
なくなくググる。

**パターン見えてきたよ！！**

※ 情報会議に投稿した自分の記事をまんまコピペしてます。
poderosaで[オブジェクト参照がオブジェクト インスタンスに設定されていません。]とエラーになって接続できなくなったら

#環境
poderosa　4.1.0
Windows 7

#事象
poderosaを使っていて、何度か、**「オブジェクト参照がオブジェクト インスタンスに設定されていません。」**というエラーになって、接続できなくなることがありました。

![poderosa.PNG](https://qiita-image-store.s3.amazonaws.com/0/108481/e2424eba-a0c0-42db-70aa-319c2ff2fda6.png)

error.logは下記の内容が出力されていました。
ちなみに、 C:\P4　というフォルダは存在しません。
<pre>
2016/02/29 10:43:51
オブジェクト参照がオブジェクト インスタンスに設定されていません。
   場所 Poderosa.Preferences.PlugInHost..ctor(PreferencePlugin parent, IPreferenceSupplier supplier, StructuredText root, Int32 index) 場所 C:\P4\src\Core\Preferences.cs:行 157
   場所 Poderosa.Preferences.PreferencePlugin.InitializeExtension() 場所 C:\P4\src\Core\Preferences.cs:行 76
   場所 Poderosa.Boot.InternalPoderosaWorld.RunRootExtensions() 場所 C:\P4\src\Plugin\PoderosaWorld.cs:行 149
   場所 Poderosa.Boot.InternalPoderosaWorld.Start() 場所 C:\P4\src\Plugin\PoderosaWorld.cs:行 105
   場所 Poderosa.Executable.Root.Run(String[] args) 場所 C:\P4\src\Executable\Main.cs:行 70
   場所 Poderosa.Executable.Root.Main(String[] args) 場所 C:\P4\src\Executable\Main.cs:行 77
</pre>

#原因
・何らかの原因で、「options.conf」が空になっていました。
　シャットダウン時に壊れてしまったようです。

#解決方法
今回は、方法1で対応しました。
options.confのバックアップを取ったので、また同じ現象が起きたら、方法2で対応してみようと思います。

- 方法1
再インストールする。
この時、ログや、鍵などを生成してインストールディレクトリ(C:\Program Files (x86)など)に置いている場合は、
バックアップをお勧めします。

- 方法2
options.confを正しいファイルで上書き。
インストール後、各種設定を終えたら、options.confをあらかじめバックアップしておき、
壊れた場合に上書きします。
削除したブランチの復元コマンドで fatal: Not a valid object name と言われるとき

## 問題
削除したブランチを復元させようとして
```
$ git reflog
0000000 HEAD@{0}: checkout: moving from develop to master
45hoge2 HEAD@{1}: checkout: moving from hoge to develop
hoge45i HEAD@{2}: commit: #0 Fix for hoge
```
でお目当てのコミット(とかcheckoutとか)を探してー……

```
$ git branch hoge HEAD@{0}
```
で復元出来るかと思いきや
```
$ git branch hoge -b HEAD@{0}
fatal: Not a valid object name: 'HEAD@0'.
```
確かにlogはあるのになんかエラー。
……んっ?

## 解決
でも復元がとにかくしたかった……。
調べてみたら、`HEAD@{0}`とかじゃなくって、`SHA-1ハッシュ`でも同じようなことが出来るとのこと。
以下操作で解決しました。
```
$ git checkout 0000000
```
```
$ git checkout -b hoge
Switched to a new branch 'hoge'
```

取りあえず解決法だけを紹介したけれど、これはなんのエラーだったんだろ……?
なんだか`{}`がエラー画面では出ていないから、そこが原因っぽい気はしている。
Android keysotreファイルの編集方法

コマンドプロントからkeytoolコマンドを使うことによって編集を行う。
自分の環境ではkeytoolはC:\Program Files\Java\jre1.8.0_65\binに移動後実行できる。（おそらくパスを通せばどこでも実行可能）

keyを削除
>keytool -delete -alias [key name] -keystore [keystoreファイルのパス]

keystoreのパスワード変更
>keytool -storepasswd -keystore [keystoreファイルのパス]

keyのパスワードを変更
>keytool -keypasswd -alias [key name] -keystore [keystoreファイルのパス]
[Pentaho::PDI]正規化ステップ(Row Normaliser)はETL Metadata Injectionを使うと便利


# 概要

PentahoのETLツールであるPDI(Kettle)の正規化ステップ(Row Normaliser)は、
そのステップ単体では、静的な正規化しかできない。
しかし、ETL Metadata Injectionを使用すれば動的な正規化が実現できる。

# ETL Metadata Injectionを使用しない場合

指定したフィールドに静的な値を紐付け、正規化を行う。
正規化する対象が固定であればいいのだが、大抵の場合、
任意のテーブル(マスタデータ)と紐付けて正規化する。
正規化するパターンが増えた場合はデータ変換の修正が必要になる。

# ETL Metadata Injectionを使用した場合

正規化するためのマスタデータをDBから取得後、
ETL Metadata Injectionステップにて、正規化ステップのあるktrファイルの
正規化フィールドをマスタデータを元に設定をする。
正規化するパターンが増えた場合でも、マスタデータとして登録されていれば
データ変換の修正は必要ない。

# どういう時に使うと便利か

CSVファイルからデータを取得後、取得したデータ行を正規化して
DBに登録、という処理などで使用するとCSVの列数が増減した場合でも対応できる。
その場合はCSVインプットステップもETL Metadata Injectionで動的に変更する。
CSV取得時のETL Metadata Injectionの使い方は下記のURL参照のこと。

# 参考URL

http://www.pentaho-partner.jp/blog/2013/12/csvmetadata-injection.html
スクリプトでLinuxの利用者登録

#ファイルを準備
<dl>
<dt>EXCELで下の内容のファイルを作成(ユーザデータ)</dt>
<dd><pre>
uxxx1:pxxx1::users::/home/uxxx1:/bin/bash
uxxx2:pxxx2::users::/home/uxxx2:/bin/bash
uxxx2:pxxx2::users::/home/uxxx2:/bin/bash
</pre></dd>
<dt>シェルコマンド(main)</dt>
<dd>
<pre>
#!/bin/sh

/usr/sbin/newusers $1
awk -F":" '{print $1":"$2 }' $1 |/usr/sbin/chpasswd
./skel2 $1
php newdb.php &lt;$1
</pre>
</dd>
<dt>シェルコマンド(skel2)</dt>
<dd>
<pre>
#!/bin/sh

for rec in `cat $1`
do
IFS_OLD=IFS
IFS=":"
set -- $rec
user=$1
group=$4
IFS=IFS_OLD
echo $user
(cd /etc/skel/;tar cf - .)|(cd /home/$user;tar xf -)
chmod 755 /home/$user
chown -R $user /home/$user
chgrp -R $group /home/$user
touch /home/$user
done
</pre>
</dd>
<dt>PHPスクリプト(newdb.php)</dt>
<dd>
<pre>
&lt;?php

$dsn = "mysql:host=127.0.0.1";
$user = 'root';
$pass = 'パスワード';
try {
  $dbh = new PDO($dsn,$user,$pass);
} catch(PDOException $e) {
  echo 'Connection faild: '.$e->getMessage();
}
$fp = fopen("php://stdin","r");

while($rec = fgets($fp)) {
        list($user,$pass) = explode(":",$rec);
        $sql = "CREATE USER {$user}@localhost IDENTIFIED BY '{$pass}'";
        $dbh->query($sql);
        $sql = "GRANT USAGE ON * . * TO '{$user}'@'localhost' IDENTIFIED BY '{$pass}' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0";
        $dbh->query($sql);
        $sql = "CREATE DATABASE IF NOT EXISTS `{$user}`" ;
        $dbh->query($sql);
        $sql = "GRANT ALL PRIVILEGES ON  `{$user}` . * TO  '{$user}'@'localhost'";
        $dbh->query($sql);
        print "$user $pass\n";
}
fclose($fp);</pre>
</dd>
</dl>
#実行
./main ユーザデータ
skel2はテンプレート(/etc/skel)をコピーします。
newdb.phpはMySQLのデータベースを個々の利用者に１つ作成します。
CQLでCassandraの指定したテーブル内の全レコードを削除する

# CQL
CQLの`DELETE`文は`WHERE`句が必須なので全件削除には使えません. `TRUNCATE`を用意してくれているので, こちらを使いましょう.

```CQL:CQL
TRUNCATE keyspace_name.table_name;
```

`DELETE`で`WHERE`句付け忘れの事故がなくなる分, 親切かも.

# ドキュメント
* http://docs.datastax.com/ja/cql-jajp/3.1/cql/cql_reference/delete_r.html
* http://docs.datastax.com/ja/cql-jajp/3.1/cql/cql_reference/truncate_r.html
Matt-Esch/virtual-dom を変換する npm package

# 概要

[Matt-Esch/virtual-dom][] を HTML や DOM と相互変換する npm package についてまとめた。[公式の Wiki にも書いてある](https://github.com/Matt-Esch/virtual-dom/wiki/Home/bf0fa4a4f4ef7bf548f7e84ad4e6009d49333304)が、分類が怪しかったので実装を確認しながら補足した。

# キーワード

- VDOM は VTree / VNode / VText のオブジェクト
- DOM は Node / Element のオブジェクト
- HTML は HTML 形式の文字列
- hyperscript は hyperscript 形式の文字列
- DOMParser は [DOM Parsing and Serialization](https://w3c.github.io/DOM-Parsing/) で仕様化されているもの。文字列→ DOM変換ができる。

# 一覧

## VDOM -> DOM

- [Matt-Esch/virtual-dom][] (公式)

## VDOM -> HTML

- [alexmingoia/virtual-dom-stringify][]
  - DEPRECATED : Use [nthtran/vdom-to-html][]
- [nthtran/vdom-to-html][]

## DOM  -> VDOM

- [bitinn/vdom-parser][]
  - DOMParser が要求される (もし "HTML -> VDOM" 変換を使わなくても)
- [marcelklehr/vdom-virtualize][]

## HTML -> VDOM

- [TimBeyer/html-to-vdom][]
  - [fb55/htmlparser2][] を HTML parser に利用
- [bitinn/vdom-parser][]
  - DOMParser が要求される ( HTML parser として利用 )
- [marcelklehr/vdom-virtualize][]
  - DOMParser を利用、なければ iframe を利用
- [yoshuawuyts/virtual-html][]
  - callback が要求される (非同期かも?)
  - [defunctzombie/node-htmltree][] を HTML parser として利用

## DOM -> hyperscript

- [AkeemMcLennon/dom2hscript][]
  - DOMParser が要求される

## HTML -> hyperscript

- [AkeemMcLennon/dom2hscript][]
- [unframework/html2hyperscript][]
  - CLI 。 HTML -> hyperscript
  - [fb55/htmlparser2][] を HTML parser として利用  

[AkeemMcLennon/dom2hscript]: https://github.com/AkeemMcLennon/dom2hscript
[Matt-Esch/virtual-dom]: https://github.com/Matt-Esch/virtual-dom
[TimBeyer/html-to-vdom]: https://github.com/TimBeyer/html-to-vdom
[alexmingoia/virtual-dom-stringify]: https://github.com/alexmingoia/virtual-dom-stringify
[bitinn/vdom-parser]: https://github.com/bitinn/vdom-parser
[defunctzombie/node-htmltree]: https://github.com/defunctzombie/node-htmltree
[fb55/htmlparser2]: https://github.com/fb55/htmlparser2
[marcelklehr/vdom-virtualize]: https://github.com/marcelklehr/vdom-virtualize
[nthtran/vdom-to-html]: https://github.com/nthtran/vdom-to-html
[unframework/html2hyperscript]: https://github.com/unframework/html2hyperscript
[yoshuawuyts/virtual-html]: https://github.com/yoshuawuyts/virtual-html

# 補足

この記事は以前 Gist に個人用途で書いたものの転載だ。Gist じゃ活用されなさそうなので。

- https://gist.github.com/bouzuya/369e1b48baeafcde5844

[Matt-Esch/virtual-dom]: https://github.com/Matt-Esch/virtual-dom
Elixirのボディレス句(bodyless clause)について

Elixirでは、一つの関数に対して複数の句を定義することが出来ますが、Ecto.Changesetモジュールから抽出した下記の例の一番目の句のように、do部分が存在しない「ボディレス句(bodyless clause」を定義することが出来ます。

```ex
# 実装(doの部分)が存在しない
def cast(model_or_changeset, params, required, optional)

def cast(_model, %{__struct__: _} = params, _required, _optional) do
  〜省略〜
end

def cast(%Changeset{changes: changes, model: model} = changeset, params, required, optional) do
  〜省略〜
end
```

bodyless clauseは単体でも定義可能ですが、呼び出すことは出来ません。実装の存在する句と一緒に使われることが前提のようです。

このbodyless clauseがどういう用途で使われるのかということに関してですが、下記の記事によると3種類の用法があるようです。

[Notes on Elixir: Bodyless Function Clauses](https://goo.gl/86jqXS)

# 1. ドキュメンテーション用

例えば下記のような関数が定義されていた場合に、この関数をExDocを使ってドキュメント化すると、ドキュメントに記載される引数名には自動的に`hash_dict`という名称が使用されます。

```ex
def size(%HashDict{size: size}) do
  size
end
```

ドキュメント化される変数名を変更したい場合、下記のようなbodyless clauseを定義すると、ドキュメント化される変数名を`dict`にすることが出来ます。これが一つ目の用法になります。

```ex
def size(dict)

def size(%HashDict{size: size}) do
  size
end
```

# 2. デフォルト引数用

デフォルト引数をとる関数に複数の句を定義したい場合、bodyless clauseを使う必要があるようです。

[こちら](http://elixir-lang.org/getting-started/modules.html#default-arguments)からのコピペですが、下記のような用法になります。

```ex
defmodule Concat do
  def join(a, b \\ nil, sep \\ " ")

  def join(a, b, _sep) when is_nil(b) do
    a
  end

  def join(a, b, sep) do
    a <> sep <> b
  end
end

IO.puts Concat.join("Hello", "world")      #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world
IO.puts Concat.join("Hello")               #=> Hello
```

# 3. プロトコル用

3番目の用法はプロトコルです。当然といえば当然ですが、プロトコル定義には実装が存在しませんので、[先日投稿](http://qiita.com/poly_soft/items/7da87d56ebdbb8755a3c)した記事で解説させて頂いたex_adminの認証用のプロトコルだと下記のような感じでbodyless clauseが使用されています。

```ex
defprotocol ExAdmin.Authentication do
  @fallback_to_any true
  def use_authentication?(conn)
  def current_user(conn)
  def current_user_name(conn)
  def session_path(conn, action)
end
```

# おまけ

下記のコードのパターンマッチ部分の`%{__struct__: _} = params`に関して、何をやってるんだろうと思った方がいるかもしれません。(私は思いました)

```ex
def cast(_model, %{__struct__: _} = params, _required, _optional) do
  〜省略〜
end
```

こちらは要するに「構造体かどうか」をチェックしているコードのようです。下記で説明されているように、構造体は実際には「\_\_struct\_\_」という特別なフィールドを持っているMapなので、上記の構文にマッチすれば構造体だと判断する、ということのようです。

[Structs are bare maps underneath](http://elixir-lang.org/getting-started/structs.html#structs-are-bare-maps-underneath)

ガード節では駄目なのだろうか？という疑問が当然湧いてきますが、Elixirには`is_list`、`is_tuple`、`is_map`のように「リストかどうか/タプルかどうか/マップかどうか」をチェックする関数はあっても`is_struct`という関数は存在しないので、上記のようにチェックせざるを得ないようです。
SalesforceのSOQLで数値条件値として2^31を指定するとエラーになる

整数の形式で2^31以上を指定すると落ちます。
エラーメッセージわかりづらい(Javaのメッセージそのままだし、むしろわかり易いのか？)。

```
$ force query SELECT Amount FROM Opportunity WHERE Amount = 2147483648
```
```
FROM Opportunity WHERE Amount = 2147483648
                                ^
ERROR at Row:1:Column:43
For input string: "2147483648"
```

条件値が整数っぽかったら内部でとりあえずIntegerとして変換かけようとしてその範囲外だとエラーになるのでしょうね。
.0をつけるか、Apexなら(Integer以外の)変数にして埋め込むことで回避できます。

```
$ force query SELECT Amount FROM Opportunity WHERE Amount = 2147483648.0
```
```
 Amount          
-----------------
 2.147483648e+09 
 (1 records)
```
[PHP]CakePHP 3.x でも、複数行INSERTできるよ！

#CakePHP3では、saveAllがない
cakephp2系だと、saveAllというのがあって、
複数行INSERTするときにはそれを使ってました。
でも、cakephp3.xだと、saveAllはなくなっていました。

## これがCakePHP3式のsaveAllだ...!
で、どうしたらいいか調べたところ、
ドキュメント（英語）にこんな記載がありました。

http://book.cakephp.org/3.0/en/orm/saving-data.html#converting-multiple-records

そちらで示されているサンプルコードを、一部変更して記述すると、
下記のような形になってます。

```php
// TableRegistryでモデル取得
$articles = TableRegistry::get('Articles');

// 保存するデータ(２つ)
$data = [
    [
        'title' => 'First post',
        'published' => 1
    ],
    [
        'title' => 'Second post',
        'published' => 1
    ],
];

// Entities作成
$entities = $articles->newEntities($data);

// Entitiesの分だけ保存処理
foreach ($entities as $entity) {
    // Save entity
    $articles->save($entity);
}
```

で、atomicに保存したいならトランザクションかければいいよ、とか書いてます。

```php
$articles->connection()->transactional(function () use ($articles, $entities) {
    foreach ($entities as $entity) {
        $articles->save($entity, ['atomic' => false]);
    }
});
```


## いやそうじゃねえよ、というあなたにクエリビルダー
複数行のsaveって、基本的にINSERT文ですし、
複数行INSERTしたいからといって、
行の数だけ数だけクエリ発行するのは、
パフォーマンスも損ねますし、
何より気持ち悪いですよね。

本当にここで発行したいSQLは、下記の形のはずです。

```mysql
INSERT INTO articles (title, published) VALUES ('First post', 1), ('Second post', 1);
```

とはいえ、クエリを直接ソースコードに入れるのも気持ちわるいので、
せめてクエリビルダーを使って、なんとかならないか試してみました。

で、うまく行ったのが、こちらになります。

```php
$articles = TableRegistry::get('Articles');
// 保存するデータ(２つ)
$data = [
    [
        'title' => 'First post',
        'published' => 1
    ],
    [
        'title' => 'Second post',
        'published' => 1
    ],
];
// 実行クエリ
$query = $articles->query();
$query->insert(['title', 'published']);
// dataの数だけvalues追加
foreach ($data as $d) {
    $query->values($d);
}
// 実行
$query->execute();
```

これで、先ほど示した形のSQLが発行されました。


状況に応じて、insert()でカラム指定する部分は、
array_keys()とかで省略したりとかもできそうですね。

より良いやりかたを発見されましたら、ぜひ教えて下さい！
AD2 > BNCコネクタを買おうとしたがGND共通だった > 自作検討

```txt:動作確認
Analog Discovery 2(以下AD2)
```

AD2にてプローブを接続しようと思いBNCコネクタ用拡張ボードを物色していた。
http://akizukidenshi.com/catalog/g/gM-07743/

ふと気になったのが

> ご注意: オシロスコープ入力の差動入力(2Chとも)は、この拡張ボードを使用することによりGND共通の入力となります。また、ファンクションジェネレータ出力のGNDとも同電位となります。

Scope ch1, ch2は差動入力であるのだが、上記の拡張ボードを使うとNegativeの計測が使えなくなる。

## 自分で作る?

部品を集めて拡張ボードと同等のものを作るというのを検討中。

- [ＢＮＣコネクタ（ジャック）ＤＩＰ化キット](http://akizukidenshi.com/catalog/g/gK-05362/)
- [ＢＮＣコネクタ（ＢＮＣ－Ｊ）（メス）基板取付型縦向き](http://akizukidenshi.com/catalog/g/gC-00094/)
- [ボードソケット30P
XG4H-3031 _](http://eleshop.jp/shop/g/g4A314Y/)

ボードソケットのL型がないか探している。
ない場合は、上記のソケットにL型ピンヘッダをはんだづけすることになりそう。

- [Ｌ型ピンソケット　２×３２　（６４Ｐ）](http://akizukidenshi.com/catalog/g/gC-05187/) : ピン数が多いが少ないよりはいい

[omron](https://www.omron.co.jp/ecb/products/pdf/xg4.pdf)にはなさそうだ。

作るときはこのあたりも検討。
> ストレート／５０Ω抵抗経由切替

寄生容量、寄生抵抗？、インピーダンスマッチング、などの特性が変わってしまうのだろうか?
CS-Cartのタブコンポーネントを使う

CS-Cartでタブコンポーネントを使う方法です。

![タブコンポーネント](https://qiita-image-store.s3.amazonaws.com/0/889/b9280f29-3cc2-484f-340d-b6764e24c12b.gif)


```html
{script src="js/tygh/tabs.js"}

<div class="ty-tabs cm-j-tabs clearfix">
  <ul class="ty-tabs__list">
    <li id="foo" class="ty-tabs__item cm-js active">
      <a class="ty-tabs__a">Foo</a>
    </li>
    <li id="bar" class="ty-tabs__item cm-js">
      <a class="ty-tabs__a">Bar</a>
    </li>
    <li id="buz" class="ty-tabs__item cm-js">
      <a class="ty-tabs__a">Buz</a>
    </li>
  </ul>
</div>

<div class="cm-tabs-content ty-tabs__content clearfix">
  <div id="content_foo">
    Foo
  </div>
  <div id="content_bar">
    Bar
  </div>
  <div id="content_buz">
    Buz
  </div>
</div>
```
leJOS 複数台制御 サンプルプログラム

# leJOS 複数台制御用のサンプルプログラムの作成
前の記事の続き
http://qiita.com/uchiyu/items/797e1172c1045aa8403f

前回のleJOSの複数台制御用のサンプルプログラムを作成した。とりあえず、動くようにしただけのものなのでもっと書きようはあると思う。また、EV3の名前がEV3AとEV3Bになっているので各自のEV3名に読み替えて下さい。

# モーターのサンプルプログラム

leJOS Newsにあったものを改良したもの
前に進み続ける処理をでその場で回るように変更した
このプログラムを実行すると、2台のEV3がその場で回り続ける。

https://github.com/uchiyu/InfoLego/blob/master/src/Multi/remoteMotorTest.java

# センサーのサンプルプログラム
親機のEV3のディスプレイに親機と子機のタッチセンサーの値が表示され続ける。
タッチセンサーが押し込まれた場合はtrue(1)である。

https://github.com/uchiyu/InfoLego/blob/master/src/Multi/remoteTwinSensorTest.java

# ライントレースの模倣

１台がライントレースを行い、もう１台がその動きと同じ動きをするプログラムである。
動画を撮ったので一緒に載せておく。

https://github.com/uchiyu/InfoLego/blob/master/src/Multi/twinTrace.java

* 動画

https://youtu.be/CWgdlzHSdXk
PythonからSlackに投稿

PythonからSlackに投稿してみるテスト。投稿時は自分のSlack名＋BOTとつくので場を読めない記述はBOTのせいにしてしまう作戦。


まずはSlackアプリから

![スクリーンショット-2016-02-29-12.16.jpg](https://qiita-image-store.s3.amazonaws.com/0/71585/c4f00c4d-26ce-678a-3d7e-ee74206cebab.jpeg)

画像の箇所をクリックするとブラウザが立ちあがります。

![t_スクリーンショット 2016-02-29 12.16.38.jpg](https://qiita-image-store.s3.amazonaws.com/0/71585/85cec765-e834-97dd-916b-e097fea04a8d.jpeg)

Build your ownをクリック。

![t_スクリーンショット 2016-02-29 12.17.03.jpg](https://qiita-image-store.s3.amazonaws.com/0/71585/409f993d-6372-e0b4-8192-46d520d9a2a8.jpeg)

Make aうんたらをクリックします。

![t_スクリーンショット 2016-02-29 12.17.15.jpg](https://qiita-image-store.s3.amazonaws.com/0/71585/f9acdac0-aa6b-d8bb-a537-4baed5894692.jpeg)


次にIcoming WebHooksをクリックして投稿するURLを選択。
スクリプト内の保存したURLにペースト。


```python:slackpost.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
import requests
import json

while True:

	post_words = raw_input(u"words?: ")

	requests.post('保存したURL', data = json.dumps({
    	'text': post_words, # 投稿するテキスト
    	'username': u'投稿ユーザー名',
	}))


```

ターミナルから起動してひたすらWhileで周る奴の出来上がりです。色々Slack遊べるようなので、そろそろTwitter APIで遊ぶのを卒業（諦めて）し、Slackで遊んでみようと画策中。
javaでメソッド毎のロギング

javaでメソッド毎に、引数にわたされた値や処理時間をログに出そうとした場合、AOPを使うのがよくあるようです。メソッド毎にloggerの記述を書くのは読みづらくもなってげんなりなので、どこかにまとめて書ける仕組みはありがたいです。

* [AspectJ](http://www.eclipse.org/aspectj/)
* [jcabi-aspects](http://aspects.jcabi.com/index.html)

あたりみたいです。[この記事](http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html)　がかなり参考になります。

## AspectJ

あるパッケージのpublicメソッドをロギングしたい場合は次のような感じです。

```
    @Around("execution(public * hoge.*.*(..))")
    public Object logging(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
          String method = proceedingJoinPoint.getSignature().toShortString(); 
          try {
              logger.info("START {}", method);
              return proceedingJoinPoint.proceed();
          } catch (Throwable t) {
              logger.warn("{} failed.", method);
              throw t;
          } finally {
              stopWatch.stop();
              logger.info("END {}", method);
          }
        }
    }
```

## jcabi-aspects

これは簡単で、ログをとりたいメソッドに`@Loggable` をつけるだけです

```
  @Loggable
  public int doSomething(int a) {
       ...
  }
```

これで次のように出力されます。

`[INFO] com.example.Foo #doSomething(10): 200 in 12μs`


フレームワークなどで用意されていなかったら、こういうので補うと良さそうです。

# 参考サイト

http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html
無料でSSL証明書を取得する方法について

#無料でSSL証明書を取得する
SSL証明書を取得して運用する為には今まで、ベリサインやGEOなどの認証局へ有料で審査してもらって証明書を発行してもらっていた。
しかし、2015/12に無料で使用できるLet's Encryptというサービスが公式に始まった。
これを使用して無料でSSL証明書を取得してみる。

Let's Encrypt
https://letsencrypt.org/

##準備
gitが必要となるのでインストールします。
`# yum install git`

##インストール
`# cd /usr/local/src/`
`# git clone https://github.com/letsencrypt/letsencrypt`
`# cd /usr/local/src/letsencrypt/`
`# ./letsencrypt-auto --help --debug`

上記で必要な物がインストールされます。
yum でインストールされる python 2.6 ではエラーが発生するので –debug オプションをつけて実行します。
helpが表示されれば成功です。

##証明書の発行
###サーバの80ポートを使用して証明書を発行する方法(--standalone)
この方法は80番ポートを使用していない状態にしないといけないため、既に起きているwebサーバなどを停止する必要がある。
`# ./letsencrypt-auto certonly --standalone --debug -d ドメイン名`

###ドキュメントルートに認証用ファイルを作成して証明書を発行する方法(--webroot)
この方法はドキュメントルートに認証用のファイルを作成して証明書を発行するので
既に起動しているWEBサーバを停止する必要がない。
`# ./letsencrypt-auto certonly --webroot --debug -w ドキュメントルート -d ドメイン名`

ここでは上記のサーバを停止する事なく発行できる方法を取り上げる。
だが、手順的にはどちらも同じはず。

コマンド実行後下記手順

メールアドレス入力
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/26c1dd79-818e-09b0-42dc-33e3db2060fc.png)

規約に同意するか
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/2fc90737-725e-50ac-7ff7-f65a063d799c.png)

上記が終了すると
/etc/letsencrypt/live/ドメイン名/
に鍵が作成されています。

##WEBサーバの設定
先ほど作成されたキーをWEBサーバに読み込ませます。
下記apache例

下記を追加、または変更します。

```lang:ssl.conf
SSLCertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ドメイン名/chain.pem
```

` # /etc/init.d/httpd restart`

httpsでの接続がきちんと認証された状態で接続できるようになっているはずです。

##鍵の自動更新について
鍵の有効期間は90日間と大変短いです。自動で更新できるようにしておきましょう。

`letsencrypt-auto renew`
上記で使用している全ドメインに対して期限が近づいてきたら更新されるらしいのですが、ちょっと曖昧で不安なので
`--force-renew`
オプションを付け、強制的に更新させるコマンドでcronに登録しておきましょう。

毎月1日の朝9時に自動更新
```lang:crontab -e
0 9 1 * * /usr/local/src/letsencrypt/letsencrypt-auto renew --force-renew --debug 2>&1 > /dev/null
```

以上。
nginxのTCPロードバランサーでロギング

通常nginxでアクセスログを吐くには`access_log`ディレクティブを利用するのだけど、streamモジュールによるTCPロードバランサーだとこのディレクティブが使えない。[公式ドキュメント](http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log)にもあるように`access_log`ディレクティブを利用できるのは`http`, `server`, `location`, `if in location`, `limit_except`コンテキストに限られる。（nginxのTCPロードバランサーの設定は`stream`コンテキストに記述する。）

```nginx
# 
# access_log is available in the contexts below
# 
# http, server, location, if in location, limit_except
# 
access_log /var/log/nginx/access.log;
```

というわけで`access_log`は利用できないのでかわりに`error_log`を使う。ログレベルは`info`以上じゃないと出力されない。

```nginx
stream {
    error_log /var/log/nginx/stream.log info;
}
```

出力はこんな感じ。

```
2016/02/29 11:38:16 [info] 76796#0: *4 client 127.0.0.1:63501 connected to 0.0.0.0:9999
2016/02/29 11:38:16 [info] 76796#0: *4 proxy 127.0.0.1:63502 connected to 127.0.0.1:9001
2016/02/29 11:38:16 [info] 76796#0: *4 client disconnected, bytes from/to client:78/171, bytes from/to upstream:171/78
```

## 参考

[access_log in stream context](https://forum.nginx.org/read.php?2,264641,264641#msg-264641)
newとbuildの違い

**コメント欄を先にご覧ください。現在のrailsのバージョンはbuildはnewのaliasで、newと同じメソッドです。**
**なので、以下の説明はbuildがnewのalias化される前のrailsのバージョンの説明となります。**





newメソッドとbuildメソッドはともにインスタンスを生成するが、
buildは自動的にuser_idをセットしてインスタンスを生成することができる。

user.rbに「has_many :posts」があると、「Userインスタンス.posts.build」というメソッドが使える」ようになる。これは「Userインスタンスに紐付いたPostインスタンスを生成する」メソッド。

`@post = Post.new`

`@post = @user.posts.build`

`@post = @user.posts.build`は、`@post = Post.new(user_id: @user.id)`と同じ。



```lang:post_controller.rb

def create
  @post = Post.new(post_params)
  @note.user.id = current_user.id
end

```

このcreteの定義が、

```lang:post_controller.rb

def create
  @post = current_user.posts.build(post_params)
end

```

関連付けを行うと、
この一文で書き換えることができるようになる。
グラフデータベースについて聞いてきた(OSS カンファレンス)

# グラフ型データベースとは
 - データをグラフ構造に持つ
   - データ間の関連性を管理
   - 基本的な要素はノードとプロパティとリレーションシップ
 - 大量データを高速処理
   - RDB は join を利用し、コストをかけて検索するが、グラフ型データベースはリレーションシップを辿るから早い

# インスタンスモデル
 - グラフ型データベースを設計する上で重要
 - 具体的なインスタンス(値を持ったオブジェクト)を作成しつつ、開発を進めていく
 - ノードを作り、ノードにプロパティ(属性)をつけて、ノード間にリレーションシップを設定していく

# グラフ型データベース
 - Neo4j
 - ハイパーグラフ
   - 数学の集合でよく表される  
 - トリプル
  - 主語(私は)、述語(通っていた)、目的語(大学)の3つを格納してデータを表す

# グラフ型データベースの利用例
 - EC サイト
   - 商品のレコメンデーション
 - SNS
   - 友達の候補表示
 - 通信機器の管理
   - 機器の故障時、他の通信経路の確認や通信速度の確認
 - 医療
   - 患者、地域、症状、持病、性別、習慣、くせなどの情報を関連付けた分析や研究
 - 道案内
   - 最短経路の提示

# Neo4j とは
 - Neo Technology 社が開発したグラフ型データベース
   - 2003年に設立
   - 拠点はもともとスウェーデン。今はアメリカ(シリコンバレー)に拠点を移している
 - 世界中で500サービス以上稼働し、グラフ型データベースの中では最も知名度が高い
 - Google/Facebook などでも利用されている
 - NoSQL

# Neo4j の特徴
 - ACID(原子性/一貫性/独立性/耐久性) 特性に準拠したデータベース
   - NoSQL 系データベースだが、「ACID 特性」に準拠し、整合性を確保できる
 - 高いパフォーマンス
   - データベースが肥大化しても、処理速度の低下は少なく、1秒あたり数百のトランザクションを実行できる
   - RDB の1000倍程のパフォーマンス
 - Cypher Query
   - RDB を操作する SQL 文と同様に、Neo4j を操作するクエリ言語
   - CRUD 操作が可能
   - ノードやリレーションのパターンマッチングを行う
   - インデックスや制約を管理
   - 慣れてしまえば、簡単に記述できる
   - コード量は SQL と比べ、10倍〜100倍少なくすることができる
 - 幅広い開発言語に対応
   - Java/.NET/JavaScript/Python/Ruby/PHP/R/Go
Google Driveの定例資料を自動でコピーするスクリプト

定例ミーティングの資料とか毎週同じフォーマット使うことって多いですよね？
でも、毎週自分でコピーするとかだるいじゃないですか・・・
「今週の資料まだっすか？」とか。
勝手にコピーしなよ！とか思うわけですよ。

# スクリプト
以下のスクリプトを自分のドライブに保存してスケジュール実行しておいて下さい。
フォルダIDはフォルダのURLの末尾
タイトルのフォーマットを設定して下さい。
定例の曜日を指定して下さい
※ 初回実行時に認証入ると思うのでテスト実行しておくと良いです

```js:copydocument.gs
var outputFile;
var result;

function copyReport(){
  var titleFormat = "資料名のフォーマット yyyyMMdd";
  var folder = DriveApp.getFolderById("資料フォルダのULRの末尾の英数字を入れる");
//  folder = ""; // test folderとか適当に作ってやるといいです
  var weeknum = 5; // 定例の日付(0=日曜日、　なので5=金曜日)
  
  // 先週のファイルを取得
  var date_last = new Date();
  var over_days = date_last.getDay() - weeknum ;
  over_days = over_days < 0 ? 7 + over_days : over_days;
  date_last.setDate(date_last.getDate() - over_days);
  
  var date_new = new Date();
  date_new.setDate(date_last.getDate() + 7);
  
  var filename_last = Utilities.formatDate(date_last,"GMT+09:00",titleFormat);
  var filename_new  = Utilities.formatDate(date_new,"GMT+09:00",titleFormat);
  Logger.log(filename_last + " -> " + filename_new);
  
  var files = folder.getFilesByName(filename_new);
  var file_new = (files.hasNext()) ? files.next() : undefined;
  if (file_new != undefined) {
    Logger.log("今週のファイルがすでに存在します。");
    return; 
  }
  
  files = folder.getFilesByName(filename_last);
  var file_last = (files.hasNext()) ? files.next() : undefined;
  if (file_last == undefined) {
    Logger.log("先週のファイルが見つかりません。");
    return; 
  }
  
  file_new = file_last.makeCopy(filename_new, folder);

  var doc_new = DocumentApp.openById(file_new.getId());
  
  // 本文の置換
  // 本文中の日付を置き換える
  doc_new.getBody().replaceText(
    Utilities.formatDate(date_last, "GMT+09:00", "yyyyMMdd"),
    Utilities.formatDate(date_new,  "GMT+09:00", "yyyyMMdd")
  );
  
  // 他にもルールがあればreplaceTextを追加していく
  
}
```

## 注意
- 金曜日以外テストしてないですすみません。
- 実施日にスクリプト実行すると来週分作りますので、前日までに資料は用意しましょう
[ chef ] kitchen.ymlでroleの指定

memo


```yaml
---
driver:
  name: 'vagrant'

provisioner:
  name: 'chef_zero'
  roles_path: './roles'

suites:
  - name: 'default'
    run_list:
      - 'recipe[test_cookbook]'
      - 'role[test_role]'
    attributes: 

  
```

これは省略してるのでそのまま使えるかどうか不確かだが、要するに
`provisioner/roles_path`には`.kitchen.yml`がある場所からの相対パスを指定する。
そしてrolesディレクトリ直下に置いたroleのjsonファイルを`Suites/run_list`でサンプルのように指定するとroleが使えた。

chefのwikiにはroles_pathが使えるとしか書いてなかったのでメモ。
CentOS6.xに後からデスクトップ環境を構築

# 経緯
JMeterでテストを行うことになり、適当に空いていたCentOS6.7があったのでJMeterをインストールしたのですが、GUIでテスト計画作成する必要があったので追加でインストールしました

# 手順
## 1. 必要なモジュールのインストール
- 下記必要なモジュールをインストール

```text
# yum -y groupinstall "Desktop" 
# yum -y groupinstall "X Window System" 
# yum -y groupinstall "General Purpose Desktop"
# yum -y groupinstall "Japanese Support"
```


## 2. 言語設定
- `/etc/sysconfig/i18n`の設定は`/etc/profile.d/lang.sh`でen_US.UTF-8に戻されてしまうため、シェル起動時スクリプトで環境変数を設定する

```text
# vim ~/.bashrc
export LANG=ja_JP.UTF-8
```

## 3. 起動時のランレベルの変更
- 起動時にデスクトップが起動するようにランレベルを変更する

```text
# vim /etc/inittab
id:3:initdefault:
↓
id:5:initdefault:
```

以上！

# 雑記
`/etc/sysconfig/network-scripts/ifcfg-ethxx`の`NM_CONTROLLED`というパラメータと`NetworkManager`のせいで`resolv.conf`が勝手に書き換わってしまっている事に気づかず少しハマリました(^_^;)
iTerm2 3.0 - Shell統合

##はじめに

[先週の記事](http://qiita.com/ksato9700/items/49539ec2f19027829f2f)で　iTerm2 3.0の新機能について書いたが、今回の機能追加で大きな役割を果たしている「Shellとの統合」についてもう少し調べてみる。元ネタは[こちら](https://iterm2.com/shell_integration.html)。

##導入方法
一番簡単なのは、iTerm2を立ち上げてメニューから "iTerm2" -> "Install Shell Integration"を選ぶこと。手動でやるのであれば

```
curl -L https://iterm2.com/misc/install_shell_integration.sh | bash
```

あるいは、このファイルを一度ダウンロードしておいてからSourceする。その結果、~/.iterm2_shell_integration.bash というファイルができて、それをsourceするコードが~/.bash_profileに追加される（bashの場合）。

##新機能の利用方法

###マーク
上記の導入を行うとマーク（プロンプト左の小さな青い三角）は自動的に追加される。
![marks.png](https://qiita-image-store.s3.amazonaws.com/0/30342/4e593750-ed3d-4585-174b-c7c90e3ea64e.png "marks.png")

コマンドを打つ度にこのマークが表示されるが、過去のマークは`Cmd-Shift-Up/Down`で行き来できる。

###アラーム表示
時間のかかるジョブが終わった時にお知らせしてくれるようにできる。コマンドの実行を始めたあと、メニューから"Edit" -> "Marks and Annotations" -> "Alert on Next Mark"　か、あるいは、`Cmd-Opt-A` をするとアラームセット。セットされるとウィンドウの右上に目のアイコンが現れる。
![eye.png](https://qiita-image-store.s3.amazonaws.com/0/30342/a37f4930-0142-703a-9f29-5da39cb6eec6.png "eye.png")

そして、時間が来るとお知らせされるのだが、モーダルのウインドウが現れるかNotificationにするかはメニューの上で選べるようになっている。

###コマンドの実行結果
コマンドの実行結果が0では無いときにはマークが赤くなる。こんな感じ。
![fail.png](https://qiita-image-store.s3.amazonaws.com/0/30342/00af9a00-b1a3-c4ad-59fa-0b1f18d0b02a.png "fail.png")

そして赤マークを右クリックするとステータスコードの詳細がわかる。
![status.png](https://qiita-image-store.s3.amazonaws.com/0/30342/c57a054f-44f2-1e19-66ce-b6ca77b05891.png "status.png")

###リモートホストからのファイルダウンロード・アップロード
リモートホストにsshなどでログインして、lsコマンドなどでファイル名を表示させたりすることはよくある。そこで見つけたファイルを手元にダウンロードするにはそこからこちら向きにscpするか、別セッションでこちらscpするか。いずれにしても面倒だ。iTerm2 3.0では、そんな時に、ダウンロードしたいファイル名を選択して右クリック→ "Download with scp from <ホスト名>" を選べば良い。メニューに "Downloads"という項目ができて、ダウンロードの履歴や進捗状況はそこで確認できる。ダウンロードが終わればNotificationが現れる。

同様にこちらからリモートにファイルを送りたい時には、リモートホストにログインしている状態で、ファイルを起きたい場所にディレクトリ移動。それから、手元のマシンのFinderで送りたいフィルを選んでiTerm2のWindowにドラッグ・アンド・ドロップ。その際、ドロップする時にOptionキーを押して置くのを忘れないように。そのままドロップするとこれまで同様、そのファイルパスがコマンドラインにコピーされるだけになる。Optionキーを押してドロップすると「このファイルをこのホストのこの場所にコピーするけどいい？」という確認が出てOKを押すとアップロードが始まる。ダウンロード同様に "Uploads"というメニュー項目が増えてそこで進捗状況の確認ができる。

これは地味に結構便利かもしれないなと思う。

###コマンド履歴
`Cmd-Shift-;`を押すとこれまで実行したコマンドのリストが現れる。ご丁寧なことにいつ実行されたのかのタイムスタンプつき。そこでタイプするとインクレメンタルサーチされ、入力にマッチするものが残されていくという仕掛けで、最近のブラウザのURL入力の部分とか、emacsのhelmに似た感じ。気の利いていることに、このコマンドのリストはホストごとに管理されていて、リモートログインしたものと混ざることがない。Shellのコマンドヒストリー機能を使う事が多かったが、見た目やわかりやすさの面ではこちらにもメリットありそう。

###ディレクトリ履歴
Shellとの統合をしているので、どのディレクトリに行ったのかもiTerm2側で把握している。`Cmd-Opt-/`でコマンド履歴同様にポップアップでリストが現れる。

###プロファイルの自動切り替え
ホスト名、ユーザ名、現在のディレクトリなどを条件にプロファイルを切り替えられる。設定は "Preferences"->"Profiles"->"Advanced"で、ルールをそこに記述できる。用途としては例えばrootになった時にバックグラウンドの色を変える（そして自分がrootであることを意識して気をつける）とかなのだが、そもそも最近はrootになって作業というのはあまりないので使いみちがあまりないかな。あとは、自分がリモートホストで作業している時に変えるとかもあるかもしれないが、これまで困ったことがないのできっと使うことはないかな。

###トリガー
正規表現である文字列が表示された時にそれに結びつけたアクションを行うものらしいのだが、これも有用な使い道を見つけられず。なにか便利な例があればまた紹介したい。

##最後に
ということで、iTerm2 3.0のShell統合の機能をもう少し詳細に見てみた。マークで実行結果が色表示されるのは地味に便利。そしてアラームで実行終了をお知らせして貰ったり、コマンド履歴でincremental searchなどは使うでしょう。あとは、時折リモートホストからのダウンロード・アップロードかな。
同一端末上でBitbucketの複数アカウントを使い分ける

# やりたいこと

Bitbucketには以下の制約があります（まぁ妥当な措置だと思います）

* 同一のSSH公開鍵を複数のアカウントに登録できない

ただ、bitbucketで個人用と会社用のようにアカウントが複数あると管理がめんどくさくなります。
上記制約のせいでbitbucketに接続する際、１つのアカウントしか利用できなくなります。

できればリポジトリごとにSSH接続情報を切り替えながらやりたいものです。

# ホスト名を偽装して接続を個別設定する

作業は２ステップです。

1. ~/.ssh/configの接続設定をリポジトリ毎につくる
2. リポジトリ毎にリモートのドメインを書き換える

## 1. ~/.ssh/configの接続設定をリポジトリ毎につくる


```
# Host repo1.bitbucket.orgの部分は区別できれば何でもいいです
$ vi ~/.ssh/config
===
Host repo1.bitbucket.org
  HostName        bitbucket.org
  User            git
  Port            22
  IdentityFile    ~/.ssh/id_rsa_repo1
  TCPKeepAlive    yes
  IdentitiesOnly  yes

Host repo2.bitbucket.org
  HostName        bitbucket.org
  User            git
  Port            22
  IdentityFile    ~/.ssh/id_rsa_repo2
  TCPKeepAlive    yes
  IdentitiesOnly  yes

```


## 2. リポジトリ毎にリモートのドメインを書き換える

```
# bitbucket.orgをrepo1.bitbucket.orgに書き換える
$ vi repo1/.git/config
===
[remote "origin"]
    url = git@repo1.bitbucket.org:<アカウント名>/repo1.git
===

# bitbucket.orgをrepo2.bitbucket.orgに書き換える
$ vi repo2/.git/config
===
[remote "origin"]
    url = git@repo2.bitbucket.org:<アカウント名>/repo2.git

```


# 解説

どのような流れで使われるかざっくり流れを追って説明します。

1. (人間が) git push origin master実行する
2. 対象リポジトリの.git/configからoriginの接続先ドメインを特定
3. .ssh/configから対応するドメインのSSH接続情報を取得
4. 指定されたSSH鍵を使ってbitbucketに接続
Java SE7 Gold 取得を目指して (5)

Java SE7 Gold をとりたい…!
===

本日は第5回目です。
これまでは、1回1章ペースでしたが、章のボリュームが多めなので2回に分けることにしました。

## 今日のこぼれ話
先日、こんな記事を見かけました。
http://www.itmedia.co.jp/news/articles/1602/26/news086.html
Javaを勉強している僕にはとてもつらい内容のように思えたのですが、
よく数字を見てみたら案外悪くないなというか、そんなにもらえるのかといった感じですね。
…いや、これ上の方の奴らが平均引き上げてるだけですわ!
そんなことより、僕のC#は?

## 本日知ったこと(5章 1/2)

* StringBuffer と StringBuilder
  * StringBuffer はスレッドセーフ
  * StringBuilder はスレッドセーフでない  
  (「ひとまずStringBulderを使え!」と伝え聞いていたので、逆な気がしていました。  
  マルチスレッド環境を考えていないから高速に動作する、ということで「**普段は**StringBuilder使え!」ってことだったのかな?)
  * 2つとも equals() はオーバーライドしていない
  * ので、以下の挙動になる(toString()してから比較しましょう)

    ```java
    StringBuilder sb1 = new StringBuilder("String");
    StringBuilder sb2 = new StringBuilder("String");
    System.out.pring(sb1.equals(sb2)); // false
    ```
  * append(null)、insert(null)すると"null"文字が追加される ~~、と書いてあったが、「appendの参照があいまいです」とコンパイルエラーになった (← ??)~~
  * ちなみに new StringBuilder(null);で初期化するとぬるぽで落ちる

* ラッパークラス
  * AutoBoxingでは暗黙の型変換が起こらない

    ```java
    double d = 10; // OK
    Double d = 10; // NG コンパイルエラー
    ``` 

* リソースファイル
  * リソースバンドルの参照順
     1. 言語コード、国コードが一致したリソースクラスファイル
     1. 〃 プロパティファイル
     1. 言語コードが一致したリソースクラスファイル
     1. 〃 プロパティファイル
     1. デフォルトロケール用リソースクラスファイル
     1. 〃プロパティファイル
     1. 見つからなければ例外(MissingResourceException)
  * クラスファイルのみ(orプロパティファイルのみ)検索させたい場合は

     ```java
     ResourceBundle.Control ctrl = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_CLASS);
     // ResourceBundle.Control ctrl = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_PROPERTIES);

     ResourceBundle bundle = ResourceBundle.getBundle("CustomResource", locale, ctrl);
     ```

AutoBoxingのとこなんて、いやらしい試験問題作り放題ですね…!
sublime text 2 + kotlin で Hello World

## Kotlinって何？

JavaじゃないけどJVMで動く言語のようです。
http://qiita.com/koki_cheese/items/bc68a4c765cd1f00c0d9

Java以外でAndroidアプリを作れる言語を探していたところ見つけ興味を持ちました。

比較的新しい言語のようで1.0のリリースが2016/02/15に行われたようです。
https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/

## 背景

こちらの記事( http://qiita.com/zonene_ozimasa/items/ca21fcaa79fadc6413e0 )を参考に設定したところ、Sublime Text2では素直に動作しなかったので動作するまでのメモ。

- Kotlinの挑戦は初めて。
- Sublime Text2でのBuildは初めて。
- 環境は、Windows 7 64bit。
- `java -version`

```
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
```

## 用意するもの

- Sublime Text2
- [kotlin-compiler-1.0.0.zip](https://github.com/JetBrains/kotlin/releases/tag/build-1.0.0)(2016/02/26時点での最新のコンパイラだと思われます)

## Hello, Kotlin!

- `HelloKotlin.kt`のファイル名で保存。  
※フォルダ問わず。

```kotlin:HelloKotlin.kt
fun main(args : Array<String>) {
    println("Hello, Kotlin!")
}
```

## ビルドシステムファイル

- `C:\Users\[username]\AppData\Roaming\Sublime Text 2\Packages\User`に保存。  
※[Tools]->[Build System]->[New Build System...]を選んで保存するとデフォルトの模様。

```Kotlin.sublime-build
{
    "cmd": ["C:\\kotlinc\\bin\\kotlinc-jvm.bat", "$file", "-d", "$file_path\\\\$file_base_name.jar"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "working_dir": "$file_path",
    "selector": "source.Kotlin",
    "windows": {
        "encoding": "cp932"
    },
    "variants": [
        {
            "name": "Run",
            "cmd": ["java", "-classpath", "$file_path\\\\$file_base_name.jar;C:\\kotlinc\\lib\\kotlin-runtime.jar", "${file_base_name}Kt"]
        }
    ]
}
```

3と2の違い

- `shell_cmd`は3用とのことで2用に`cmd`にします。
- `cmd` の値は配列の模様。
- `{}`や`[]`の最後の値の後に`,`があるとエラーになります。

Buildする上での注意

- kotlin-compiler-1.0.0では出力先を指定するオプションは`-d`の模様。

```
{
    "cmd": [..., "-d", "$file_path\\\\$file_base_name.jar"],
```

- [Tools]->[Build System]->[Automatic]でダメな場合は[Kotlin]を選ぶ。

Runする上での注意

- **`_DefaultPackage`が見つかりませんでした。**  
参考にしたサイトでは多々`_DefaultPackage`を指定しているものの`HelloKotlin.kt`ファイルと同じフォルダ内に生成された`HelloKotlin.jar`ファイルの拡張子を.zipに変えて中身を確認したところ`_DefaultPackage.class`ではなく、`HelloKotlinKt.class`が出来ていたため**"${file_base_name}Kt"**と指定しています。

```
    "variants": [
        {
            "name": "Run",
            "cmd": [..., "${file_base_name}Kt"]
        }
    ]
```

## ビルドしてラン

- [Tools]->[Build]が上手く行われると次のような表示が行われます。

```
[Finished in 3.2s]
```

- [Tools]->[Run]が上手く行われると次のような表示が行われます。

```
Hello, Kotlin!
[Finished in 0.2s]
```

## その他

- Kotlineを[View]->[Syntax]する上でこちらが便利でした。  
[Kotlin.sublime-package](https://github.com/vkostyukov/kotlin-sublime-package)  
※`C:\Program Files\Sublime Text 2\Pristine Packages`内に保存。

## 次のサイトも参考にさせて頂きました

- http://miffysora.wikidot.com/sublime-build
- http://tomlla.blogspot.jp/2015/06/title.html
- http://qiita.com/saba1024/items/d525fb6c89d1180b409a
- http://y-anz-m.blogspot.jp/2012/11/sublime-text-2-typescript.html
RealmSwiftでマイグレーション時にデータを一掃したい

# 目的
再取得可能なデータを扱う場合など、マイグレーション面倒なので古いスキーマバージョンのデータは一掃して移行してしまいしたい

# 参考情報
* Issuesを探してみたらありました。[Issue#1194](https://github.com/realm/realm-cocoa/issues/1194)
* もうすぐRealm.Configurationにオプション追加されるかも？ [PullRequest#3222](https://github.com/realm/realm-cocoa/pull/3222)

# コード
きっとこんな感じ（バージョン上げると古いデータが消される所までは確認した）

```swift
let schemaVersion = 2
let migrationBlock: RealmSwift.MigrationBlock = { migration, oldSchemaVersion in
    guard oldSchemaVersion < schemaVersion else {
        return
    }
    for objectSchema in migration.oldSchema.objectSchema {
        migration.deleteData(objectSchema.className)
    }
}
```
技術英語 > ... who have a boss that can come in and [overturn everything we've done]. / Thank you very much [for what you've done for me].

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> ... who have a boss that can come in and <font color=red>overturn everything we've done</font>.

最後の段階で「これはこうした方がいい」と言い出す人がいるのが一番困る。
今はそういう人がいないのが幸いだ。

<hr>
関連して思い出したのは

> Thank you very much <font color=red>for what you've done for me</font>.

ソースは失念。
ありがとうというのをきちんと伝えたいために覚えたのはもう大分昔のこと。今よりずっと英語力が劣っているときにこれだけは覚えた。

> Thank you very much <font color=red>for everything you've done for me</font>.

だったかも。