OmniAICreator/Qiita-1.07M huggingface dataset:
MailChimpを使用してHTMLメールのテストを行う



[前回](http://qiita.com/ararajp/items/52e2d03803b9a1ddc1cb) Litmusを試してみましたが、他サービスも検証しようと思い、今回はMailChimpでのHTMLメールのプレビュー機能がどんな物か試してみました。

**2016/4/9時点の情報です**

## MailChimp
- http://mailchimp.com/

メール配信ツールとして大手のようで、調べた感じだと実際に使用してる方も多そうでした。個人的には配信やマーケティングは今回求めていないのでHTMLメールプレビュー機能だけ使ってみます。

## 会員登録
EmailとUsername、パスワードだけで会員登録は完了です。

![3b32fd4465588a55d38719eada8f392f.png](https://qiita-image-store.s3.amazonaws.com/0/11156/19182df2-1db9-1385-612d-e8fea3b686c3.png "3b32fd4465588a55d38719eada8f392f.png")

ただし、会員登録後、使用するまでに少し時間がかかります。アカウント登録したメールに開始するためのURLが送られてくるのですが、そこそこの情報入力を求められます。

![87b095af991c3acd0a14ff0724460c1c.png](https://qiita-image-store.s3.amazonaws.com/0/11156/7a5da6cd-6c99-5dce-2bc6-3e9879da4771.png "87b095af991c3acd0a14ff0724460c1c.png")

名前などは良いのですが、Website URLが必須となっているので、試しに使いたいだけの人は入力に困る場面もありそうです。ヘルプにも書いてありますが、ブログやSNSなどでも良いみたいなので、何かしら作成して登録すれば大丈夫です。

はじめにLitmusを触ったので、比べると正直面倒でした。

# プレビュー
プレビュー画面はこのような感じです。
結構時間かかるなーという印象でした。そして見てみたら「Powered by litmus」

![baf2c365cde0903006c4e99f4acd211d.png](https://qiita-image-store.s3.amazonaws.com/0/11156/5f840dfd-7742-20aa-f698-7ec6bdc40a77.png "baf2c365cde0903006c4e99f4acd211d.png")



# サポートクライアント
ヘルプに書いてあったのは41クライアントでした。
同時期に試したLitmusは54だったので若干少ないです。
自分がどのクライアントをサポートしたいかによるところなので、この13クライアントの違いは気にする人と、全く問題ない人に分かれると思います。

# 料金
クライアントのテストをするにはtokenという物を購入し、課金をしてテストをする必要があります。最初は10token付与されており、今回はそれを使用しました。テストクライアントを増やすとそれだけお金がかかります。料金は下記のような感じでした。

![6775a615fa9fc5ec05581b5f3f2952ae.png](https://qiita-image-store.s3.amazonaws.com/0/11156/4e5d7256-4322-4f8d-cb66-90dec46c4b5a.png "6775a615fa9fc5ec05581b5f3f2952ae.png")

メール送信などについては違いますのでこちらで確認が必要です。
http://mailchimp.com/pricing/

# まとめ
登録の手間やUIを考えて、プレビューだけならLitmusで良いな−という印象です。「メルマガ送信の機能に加えてプレビューもあって欲しい」というメルマガサービスを総合的にサポートして欲しい場合はMailChimp選択なのでしょうね。無料で送信テストまで気軽に出来る点は良いと感じました。
analogRead()用の関数作ってみた5 もっと関数

#やりたいこと
は

+ analogRead()した値の平均を返す関数
+ 値が変更されたかを返す関数

を作って、可変抵抗を動かした時だけMIDI CCを出力する、ということです。

[analogRead()用の関数作ってみた4](http://qiita.com/ttatsf/items/8870b5fa6833cd955818)の続きです。
前の記事でだいぶ見易くなってやりたい事もできてるんで、いいっちゃいいんですけど。

#見直してみたら,やっぱりダサい
ところが残っていてお恥しいかぎりです。

+ 同じ式```foo = ++foo % bar```が複数箇所で使われている!関数にくくりださなくちゃ
+ ```break;```でforループを抜ける?なんか答が出たってことだからそこは関数でしょ

そうしたら(うすうす気がついてはいたのですが)、すごいH本に出てくるsuccとかmodとかelemに見えてきました。
#そっちに寄せた感じで書き直してみた
のがこれです。

```c++
#include <MIDIUSB.h>

int mod_succ(int x,int MOD){ //x+1をMODで割った余りを返す
  return (x+1) % MOD;
}
boolean elem(int x,const int ary[],int arySize){  //xはary[]に含まれているか?
  for(int i=0;i < arySize;i++){
    if(x == ary[i])return true;
  }
  return false;
}
```
mod_succ()は文字通りsuccしてmodする関数。
elem()はhaskellのelemにがんばって寄せてみました。

```c++
class GetAverage{        //関数GetAverageクラスを作る
  static const int MOD = 8;   //クラス変数 値の履歴の数
  
  private:    //インスタンスに内包される変数たち
    int history[MOD];  //値の履歴
    int sum;      //合計
    int index; //値を出し入れする場所のインデックス
  public:
    GetAverage(){   // コンストラクタ
      history[MOD] = {}; //配列を0で初期化するにはこうだそうな
      sum = 0;    // 0で初期化
      index = 0;
    }
    int operator()(int newVal){    //かっこ演算子()の(多重?)定義
      sum += ( newVal - history[index] ); //新しい値と一番古い値の差分を合計に加算
      history[index] = newVal;    //一番古い値を捨て新しい値を登録
      index = mod_succ(index, MOD);   //インデックスを一つすすめる
      return sum / MOD; //平均を返す
    }

};

class IsChanged{
  static const int MOD = 4;
  private:
    int history[MOD];
    int index;
  public:
    IsChanged(){
      history[MOD] = {};
      index = 0;
    }
    boolean operator()(int newVal){  //かっこ演算子()の(多重?)定義
      const boolean ANSWER = !elem(newVal, history, MOD); //新しい値が履歴に含まれていなければ真
      history[index] = newVal; //一番古い値を捨て新しい値を登録
      index = mod_succ(index, MOD);  ////インデックスを一つ進める
      return ANSWER;  //答を返す
    }
};
```
mod_succ()に関しては、見た目が変わる程度でした。
elem()はかなり効果ありです。

+ 制御構造がなくなって(隠蔽されて)見易くなった
+ 制御構造がシンプルになった break;がなくなった
+ 値の入れ替えがなくなったので返り値がconstで良くなった

関数オブジェクトGetAverage,IsChangedが、同じような動作

+ 引数と内部に記憶された配列から返り値を計算し
+ 引数を配列のある場所に保存し
+ その場所をひとつすすめ
+ 値を返す

をしているというのがより明確になるような気がします。
(っていうか、こう書き直してみて気がついた...)

使い方は前と同じです。必要な数だけインスタンス化して使います。

```c++
GetAverage getAverage[4];
IsChanged isChanged[4];
const int ANAPIN[4]={0,1,2,3};
const byte CHANNEL = 0;
const byte CC[4] ={25,26,27,28};

void setup() {
  Serial.begin(115200);
}

void loop() {
  int temp;
  for(int i=0;i < 4; i++){
    if( isChanged[i]( temp = getAverage[i]( analogRead(ANAPIN[i]) >> 3 ))){
      controlChange(CHANNEL,CC[i],temp);
      MidiUSB.flush();
    };
  delay(10);
  };
}

//controll value or velocity
// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}
```

#まとめ
Arduinoでも関数でけっこういける。かな...
あと、配列まわりが難しいです。

+ 要素数は固定。変更不可。
+ 作る前に要素数がわかってないといけない。定数かstaticかenum(か#define)。
+ 関数に渡すときは配列名と要素数を渡す。関数側で要素数が調べられないため。

だそうです。
Android 5.xにKBOX3をインストールしてみた。

# [KBOX3](http://www.kevinboone.net/kbox3.html)って何ですか？

- KBOX3は、Andorid端末上で Linuxに近いコマンドラインの動作環境を実現するものです。
- いわゆるBusyBoxと呼ばれる、一連の良く使われるLinuxコマンド群が実装されています。
- Android端末に root権限は不要です。

# どうやって

- 技術的には、libfakechroot.so を使って、libcのディレクトリアクセス関連の呼び出しを全部フックして、あたかもchrootが行われているように振る舞う、というものです。

# Android端末でLinuxコマンドライン ツールを動かすための方法

- まず、Jack Palevich 氏が作成、公開されている、Android Terminal Emulator (⇒GooglePlay[*1](https://play.google.com/store/apps/details?id=jackpal.androidterm)) という端末ソフトをインストールします。


- Android端末にroot権限は必要ありませんが、コマンドライン操作を行うためにキーボードが必須になります。

- 端末機種によっては、USB接続でPC用のUSBキーボードを接続することが出来ます。
(USB-microBからUSB Aメスに変換するケーブルが必要になります)

- あるいは、Bluetooth接続のキーボードを使うこともできます。

- 物理キーボードが使えない時の妥協案としては、
Klaus Weidner 氏の Hacker's Keyboard (⇒GooglePlay[*3](https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard) ) というソフトキーボードがお勧めです。
タブキーやコントロールキーをタッチ入力することが出来ます。

# 次に、KBOX3の導入 (at 2016-04)

http://www.kevinboone.net/kbox3.html （公式）のサイトを見ながら進めます。

- まず、インストーラーをダウンロードします。
- インストーラーはここです： http://www.kevinboone.net/kbox3-install-base

- Jackpal.Androidtermのコマンドライン上から、インストーラーを実行します。
```
 $ cd /data/data/jackpal.androidterm
 $ cat /sdcard/Download/kbox3-install-base > kbox3-install-base
 $ chmod 755 kbox3-install-base
 $ ./kbox3-install-base
```

# libfakechroot.soの差し替え

Android 5.x以降では、 dlopenに失敗してkbox3環境に移行できないようです。
```
$ ./kbox3/bin/kbox_shell
fakechroot: dlopen: undefined symbol: dlopen
```

なので、さらに次の操作を行います。

- 以下のURLから、対応版のlibfakechroot.so をダウンロード
- http://www.kevinboone.net/libfakechroot_fix_dlopen_1.so

```
 $ cd /sdcard/Download
 $ cat libfakechroot_fix_dlopen_1.so > \
   /data/data/jackpal.androidterm/kbox3/lib/libfakechroot.so
```

以上で準備は完了です。

# KBOX3の実行

```
$ /data/data/jackpal.androidterm/kbox3/bin/kbox_shell
```

Jackpal.Androidterm の設定メニューで、起動時に自動実行するファイルに上記コマンドを指定しておくと、ターミナルを起動するとそのままKBOX3のshellに入れるようになります。

# 他にソフトないの？

はいこれ
- http://kevinboone.net/kbox3_downloads.html

- gccとかPerl5とかPython3とかあります。
- 下の、関連投稿先を読めば、普通のLinuxで動くような（非特権な）コマンドなら自力でクロスビルド出来る可能性はありまーす。


# KBOX2がAndroid 5以降では使えなくなった理由とは？

- Android 5以降では、セキュリティ機能向上の為に [ASLR(アドレス空間配置のランダム化)](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E9%85%8D%E7%BD%AE%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E5%8C%96)が実装されました。

- これにより、ライブラリ形式にPIE(位置独立型実行ファイル)が強制されるようになり、PIE形式ではないKBOX2は動かなくなりました。

# 関連投稿

Android端末にEmacs風テキストエディタjedを移植する
- http://qiita.com/iruka/items/7a803eed6deb70a2c38e
Apple 公式の Swift iPhone アプリ作成のチュートリアルをやってみた

# はじめに
[Start Developing iOS Apps (Swift)](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html#//apple_ref/doc/uid/TP40015214-CH2-SW1)

Swift で iOS App を作るチュートリアルがあったので、やってみることにしました。
周りに iOS App を作っている人がいないので、アドバイスくれる人がいないのでこういうのがあるととても助かります。

github にコードを置いてあります。
https://github.com/takuyaohashi/FoodTracker

## 私について
* 普段は組み込みソフトウェア屋さんで、C/C++ をメインに使っている
* iOS/Android アプリを書いたことはない
* 6年くらい前に PHP でショッピングサイトを作っていたが、もう覚えていない
* 普段のエディタは Emacs 
* Swift の文法は [詳細 Swift](http://www.amazon.co.jp/dp/B00TO6KMBI/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1) で簡単に眺めた程度。

こんなバックグラウンドの人の視点でチュートリアルをやってみた感想を書きます。

## 動作確認環境
* OSX El Capitan 10.11.4
* Xcode 7.3

# チュートリアルに書いてあること
## Storyboard を使った開発
Object の配置、ソースコードとの紐付け、複数 Storyboard との連携、Navigation Controller の使用など Storyboard の基本的な使い方を広く書いてあります。
Apple は、Storyboard を使って欲しいっていう意思が伝わってきました。

個人的にはもっと AudoLayout などのデザインの配置とかをもっと詳しく書いて欲しかったなって思います。
たぶんプログラマだから、デザインについてピンと来ないって言うのもあるのかもしれませんが･･･


## Optional 型の説明
ソースコードに Optional 型が出てくる度になんでここはこうなるのかっていう説明がされるので、分かりやすかったです。
私の理解では、nil になる可能性があるところは、? をつけて、nil だと致命的な場合は ! をつけるっていう理解をしました。(ホントはもっと違うのかもしれないですけど･･･)

## Xcode の便利な使い方
ショートカットキーや、// MARK: つけることでそのマーカーに一発で飛べるようになる、とか Xcode の使い方もときどき説明してくれます。
キーバインドが emacs ライクなのはとてもありがたかったですね(OSX 全般的にそうですが)。もっと emacs に近づけたいところはあります。Ctrl-m とか。

## データの永続化について
NSObject/NSCoding を用いたデータの永続化を行っています。
ユーザが投稿したデータはどこかに保存しないと消えてしまうので、NSObject/NSCoding を使っていますが、実際のサービスだとサーバに情報をアップしたり、SQL に保存したりするのだろうなあと思って読んでました。

## 単体試験について
Meal.swift という食事を表すクラスがあって、チュートリアルでそのクラスのイニシャライザの単体試験を記述しています。
単体試験の枠組みが Xcode には入っているので、それの説明が簡単にしてあります。
CI とかでコミットされる度に自動的に単体試験を実行できるようにしたいですね。

TravisCI でビルドチェックだけは行っています。色々試したみたのですが、TravisCI で単体試験の実施方法が分かりませんでした･･･
https://github.com/takuyaohashi/FoodTracker/blob/master/.travis.yml

# チュートリアルに書いてないこと
## Storyboard を使わない開発
アプリを作ってみようと思ってネットで調べていると、Storyboard を使わないっていう人・記事がチラホラ見かけます。
[複数人開発がしにくい](http://qiita.com/gfx/items/dfd850749a1493e68513) とか色々理由はあるらしいです。
私は普段 C/C++ をメインに開発しているので、StoryBoard を使われるとソースコードのつながりが直感的に分からないなって感じました。
でも、Apple としては、Storyboard の使用を推奨しているみたいだし、個人で作る分には問題ないのかなって思って、まずは Storyboard を使って開発してみようと思っています。

## 外部のサービスとの連携
Apple のチュートリアルだから当然なのかもしれないけど、Twitter や Facebook などの外部サービスとの連携については一切書いてありません。
あと、Cocoa Pods についても書いていません。

## CoreData を使った開発
プロジェクトを最初に作るときに、「Use Core Data」のチェックボックスがあるけど、そこはチェックしないでアプリを作るので、CoreData を使用する方法などは書いてありません。
永続化する方法の1つだという認識です。どういう方法でデータを永続化させるかはアプリの特性によるんでしょうね。

# おわりに
このチュートリアルをやっただけで、何でもアプリを作れるぜ！とはならないけど、大まかな流れをつかむことができます。
「チュートリアルに書いてないこと」にも記述しましたが、外部サービスとかの使い方とかには一切触れてないので、手っ取り早くアプリを作りたいぜっていう人には歯痒いかもしれません。
随所に Apple 的にはこうしてほしいっていうのがあって、思想を垣間見ることができるので、時間がある人はざっとやってみることがいいかもしれません。

進めたとしては、チュートリアルやりながら、章とか節ごとに git で commit することをオススメします。
写経をミスって訳分からなくなった時に前の状態に戻れるし、ここのソースをこうやったらどういう挙動になるんだろうっていうのが気軽に試せます。

何かアプリを作ったらまたその感想も書こうと思っています。

# 追記
本格的にアプリを作る準備を始めました。
具体的には [iOS App 100本ノック](http://blog.takuyachallenge.me/entry/2017/07/08/150217)というのを始めて、自分が作りたいアプリで使う技術を使ってみるようにしました。github にもコードが上がってるので、ご指導していただけると助かります。また、最近 swift で iOS App を作り始めた人がいたら、教えあえたあら良いなと思っています。
+lua/dynなvimなのにhas("lua")が0を返す場合の対処

ubuntu 14.04でvim-gtkやvim-gnomeを入れた時に発生しました。
何故こうなっているのか等の原因はさっぱり分かりませんが、とりあえず直せたのでその手順だけ記録しておきます。

1. vimを起動します
2. `:lua print("Hello")`としてluaに何か実行させます。
3. `ライブラリ libluajit-5.1.so.2 をロードできませんでした`という様なメッセージが出ます。
4. `sudo apt-get install libluajit-5.1-2`でlibluajitをインストールします。
5. またvimを起動します。
6. `:lua print("Hello")`としてluaに何か実行させて、`Hello`と表示されたら完了です。

参考: https://bugzilla.redhat.com/show_bug.cgi?id=1203321
エビ中とLINEしてる気分になれるChatBotをPictRubyで作ってみた

おはようございます。中20の[チェレンコフ](https://twitter.com/cherenkov)です。
qiita初投稿です。よろしくお願いします。

最近ChatBotがアツいらしく、
先日LINEのBOT APIが公開されて、早速 @masuidriveさんが遊んでおられる。
[とりあえずLINE BOT APIでオウムを作ってみた - Qiita](http://qiita.com/masuidrive/items/1042d93740a7a72242a3)


総裁のブログなんてお昼から繋がらない。
[はてなブックマーク - 2016年後半はbotが来るわ。LINE-bot作ったけどマジでやばい。 | ふくゆきブログ](http://b.hatena.ne.jp/entry/fukuyuki.net/post-848/)


**乗るしかない このビッグウェーブに**

##エビ中とLINEがしたくて
PictRuby v0.5でLINE BLOGの記事を使ったChatBotを作りました。
※記事はRSSで取得します。
![pictruby_chatbot1](https://qiita-image-store.s3.amazonaws.com/0/3604/b0ce6241-51bb-0091-c599-f01c1854a034.png "pictruby_chatbot1.png")![pictruby_chatbot2](https://qiita-image-store.s3.amazonaws.com/0/3604/ad50ae83-e62d-b6f4-1297-5392248fe738.png "pictruby_chatbot2.png")


##遊び方
iosアプリの[PictRuby](http://pictruby.ongaeshi.me/)をインストールして下記のコードをコピペして実行。
最新10件のタイトルが表示されるので対応する数字をつぶやくと会話が始まります。
LINE固有？の絵文字は文字化けするようです😢
RSSのURLを変えればほかのアイドルさんのLINE BLOGもいけるはずです。

```ruby:line_like_chatbot.rb
#line_like_chatbot v0.1
class Chat
  def initialize
    feed = "http://lineblog.me/ebichu/index.rdf"
    count = 10
    url = "https://query.yahooapis.com/v1/public/yql?q=SELECT%20title%2Clink%2Cencoded%20FROM%20rss%20WHERE%20url%3D%22" + URI.encode_www_form_component(feed) + "%22%20%7C%20truncate(count%3D" + count.to_s + ")&format=json"
    data = Browser.json url
    @menu = []
    @text = []
    data['query']['results']['item'].each_with_index {|item,i|
      @menu.push "#{i+1}:#{item['title']}"
      @text.push item['encoded']
    }
    @menu = @menu.join("\n")
    @select_index = nil
    @stdout = nil
    @i = -1
  end
  
  def welcome
    @menu
  end
  
  def call(input)
    if @select_index == nil
      @select_index = input.to_i 
      src = @text[@select_index-1]
      url = "http://api.dan.co.jp/lleval.cgi?l=rb&s=" + URI.encode_www_form_component("p '#{src}'")+".gsub(%2F%5Cn%5Cs%2B%7C(%3Cbr%5Cs%5C%2F%3E)%2B%2F%2C%22%5Cn%22).gsub(%2F%3C(%22%5B%5E%22%5D*%22%7C'%5B%5E'%5D*'%7C%5B%5E'%22%3E%5D)*%3E%2F%2C'').gsub(%2F(%5CA%5Cn%2B%7C%5Cn%2B%5Cz)%2F%2C%22%22).split(%2F%5Cs*%5Cn%2B%5Cs*%2F)"
      json = Browser.json url
      @stdout = eval(json['stdout'])
      @i += 1
      @stdout[@i].strip
    else
      @i += 1
      @i < @stdout.size ? @stdout[@i].strip : "おわり🍤"
    end
  end
end
```

####感想
Rubyほとんど書いたことがなくていろいろハマって大変だった。夜なべすること5日。pとputsでマルチバイト文字列の見え方が変わって8進数表記の文字列どうしたらええねん！とか。
PictRubyはJSONを取ってこれるので[YQL](https://developer.yahoo.com/yql/console/)で記事をJSONに加工して取得した。
あとPictRuby0.5では正規表現に対応していないので @dankogai さんの[lleval](http://colabv6.dan.co.jp/lleval.html)でHTMLタグ除去に成功した。マジ感謝。
gsubの正規表現のダブルクォーテーションとかエスケープしてもllevalでエラーで返ってきたので、事前にエンコードしてくっつけたらうまくいった。
[PictRuby 0.5 リリース - チャットボット、eval、irb - ブログのおんがえし](http://ongaeshi.hatenablog.com/entry/pictruby-0.5)
※次期バージョンで正規表現対応するとのこと。期待！！

PictRubyはサンプルがよく出来ていて、学研 科学のふろくのようなワクワク感が味わえます！


こちらからのおんがえしは以上です！！！！！ @ongaeshi
spring Security　ログインフォームの項目とSecurytyConfig、値の受け渡し


#目的
画面のログインフォームから取得される
ユーザー名
パスワード
を、securityConfigから受けとる設定

#確認ポイント

```java:Java側　SecurityConfig.java
// フィルタの設定
	@Override
	protected void configure(HttpSecurity http)throws Exception{
		http.authorizeRequests().antMatchers("/loginForm").permitAll().anyRequest().authenticated();
		http.formLogin().loginProcessingUrl("/login").loginPage("/loginForm").failureUrl("/loginForm?error").defaultSuccessUrl("/testdb", true)
.usernameParameter("user_id")　＜＝この箇所
.passwordParameter("password")　＜＝で値を受け取っている。
.and();
		http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout**")).logoutSuccessUrl("/loginForm");
	}
```
値の受け取りは
configureメソッドないの

* usernameParameter
* passwordParameter
メソッドで行う

ここで指定する文字列は、画面上のhtmlのname属性の名前と一致させる

```html:画面側
<form class="form-sinin" method="post" th:action="@{/login}">
		<h2 class="form-signin-heading">ログインフォーム</h2>
		<div th:if="${param.error}" class="alert alert-danger">
			ユーザーidまたはパスワードが誤っています
		</div>
		<input type="text" class="form-control" name="user_id" placeholder="user id" required="required" autofocus="autofocus" />
		<input type="password" class="form-control" name="password" placeholder="password" required="required" />
		<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
	</form>
```
input項目のname属性

* name="user_id"
* name="password"

以上のようにして、フォームからSecurityConfigへログイン画面の入力を反映する
Visual Studio Codeでよく利用するショートカット


利用していく中でよく利用するショートカットキーの一覧を記載していきます。

|ショートカットキー | 概要|
|:--|:--|
|ctrl+p | ファイル クイックオープン|
|ctrl+shift+f | 検索ウィンドウ表示|
|ctrl+shift+e | エクスプローラーウィンドウ表示|
|ctrl+\ | ウィンドウ表示|
|ctrl+w| ウィンドウ閉じる|
|ctrl+b| サイドウィンドウのオープン・クローズ|
|ctrl+1 | 1番目のウィンドウをアクティブ|
|ctrl+2 | 2番目のウィンドウをアクティブ|
|ctrl+3 | 3番目のウィンドウをアクティブ|
|ctrl+alt+left | 左のウィンドウをアクティブ|
|ctrl+alt+right | 右のウィンドウをアクティブ|

 「左のウィンドウアクティブ」と「右のウィンドウアクティブ」がローカル環境と
 別のショートカットと被っていたため以下のように変更しました。
 
 File > Preference > Keybord Shortcutを選択

以下の内容をコピーしてkeybindings.jsonに記載

 ```text:DefaultKeyboardShortcuts
    { "key": "ctrl+alt+left",         "command": "workbench.action.focusLeftEditor" },
    { "key": "ctrl+alt+right",        "command": "workbench.action.focusRightEditor" },
```

 ```text:keybindings.json
[
    { "key": "ctrl+alt+shift+left",         "command": "workbench.action.focusLeftEditor" },
    { "key": "ctrl+alt+shift+right",        "command": "workbench.action.focusRightEditor" }
]
```
いままでウィンドウの切替をマウスでしてましたが、上記ショートカットにより
マウスなしでウィンドウをアクティブに出来るのでかなり楽になりました。

今はエディタとしか利用出来ていないので、他ツールとの連携も時間があれば調べて見たいと思います。
日本測地系と JGD2000 との変換について

こんにちは。
[日本測地系](https://ja.wikipedia.org/wiki/日本測地系)（Tokyo Datum）と 日本測地系2000 (JGD2000) との変換方法は下記があるようです。

1. 再測量して座標値を得る。
2. 国土地理院の TKY2JGD[^1] [^2] を使って近似的に変換する。概ね 0.2 m 以下の水平誤差の座標値を得られる。計算は TKY2JGD.par のパラメータに基づく bilinear 補間。
3. 楕円体パラメータに基づき、座標値（経緯度＋楕円体高）を測地系間で変換する（[Molodensky transformation](https://en.wikipedia.org/Molodensky_transformations)）。東京付近で当てはまる近似方法と考えられる。

各々に課題点が考えられます。

1. 再測量は容易ではない。
2. を自分で実装する人も多いが、TKY2JGD.par のサイズが大きい。簡略化する場合は精度評価が必要。一次式が一人歩きして使われている。
3. の方法も一人歩きして使われている。変換には楕円体高が必要。

[^1]: 飛田(2001)：[世界測地系移行のための座標変換ソフトウェア“TKY2JGD”](http://www.gsi.go.jp/common/000040231.pdf)，国土地理院時報
[^2]: 「[TKY2JGDに関するＱ＆Ａ](日本測地系と JGD2000)」、国土地理院
JSONの仕組みがよくわからないので調べてみた (JavaScript)

JSON:シンプルかつ軽量なテキストフォーマット。
あらゆるものを「文字列」として表現することができる。

例えば、null、数値、文字列、配列、そしてオブジェクト（JSでは連想配列のこと）など。
配列およびオブジェクトは、入れ子構造で表現。

JavaScriptの配列リテラル
//リテラル：変数の対義語。変更されないことが前提
var arr = [true, false, 0.5, 4, 'value1'];

JavaScriptのオブジェクトリテラル
var obj ={
a: 'value1',
b: 'value2',
c: 'value3',
d: 'value4'
};

//valueが文字列以外のときは、''不要

JSON形式では、JavaScriptのリテラル表記に近い形となる。
空白、タブ、改行などの整形用文字は自由に挿入可能。

JSON形式で文字列を表現する場合は、必ず""でくくる（‘’は不可）。
エスケープ文字も使用可能。


※以下が最重要
1. JSON形式でオブジェクトを表現する。
ポイント：オブジェクトのキーの部分は、文字列の表現と同じ。''は使用不可！
{"a": true, "b":1, "c": "Hello"}

2.オブジェクト中に配列を入れ込む
{
      "aaa":{
              "count": 123,
              "faut": "あいうえお"
             },
      "bbb":{
               "kount": 345,
               "eut": "かきくけこ"
            }
}

//////////////////////////////////////

JavaScriptのオブジェクト（仮想配列）⇒JSON文字列への変換
JSON.Stringfy()メソッドを使用する。


逆にJSON文字列⇒オブジェクトへの変換
JSON.parse()メソッドを使用する。
ガンチャート　スケジュール管理

#デスクトップアプリ
##[Microsoft Project](https://www.microsoft.com/ja-jp/project/)
本家　コストかけられるならこれ
![msproject.png](https://qiita-image-store.s3.amazonaws.com/0/54159/2136b820-62cf-25b1-694c-70eb0fbbb349.png)

##[projectlibre](http://www.projectlibre.org/)
MS-projectと似てる
![projectliber.png](https://qiita-image-store.s3.amazonaws.com/0/54159/97ddb5b7-4e14-2235-cab4-e02cfa00625d.png)

##[OpenProj](https://sourceforge.net/projects/openproj/)
開発とまってる？
![openprj.png](https://qiita-image-store.s3.amazonaws.com/0/54159/fb26396d-405d-f378-a37d-3c586504ce55.png)


##[GanttProject](http://www.ganttproject.biz/)
GanttProject.orgが開発している、オープンソースのJava製プロジェクト管理ツール
![ganttproject.png](https://qiita-image-store.s3.amazonaws.com/0/54159/677d6a4f-8ab8-e762-9156-c338a1114e13.png)


#Web サービス
取り合えずメモだけ
#[brabio](http://brabio.jp/)
5人までなら無料
![brabio.png](https://qiita-image-store.s3.amazonaws.com/0/54159/3f8cf51e-e61d-885d-7525-b1590ebe6a5d.png)

##[gantter](http://gantter.com/)
google driveやdropbox、skydriveにデータを保存できる
![gantter.png](https://qiita-image-store.s3.amazonaws.com/0/54159/6dff79d1-eb8e-f528-f00c-812c8e1ec957.png)
メニューのgannter editionsを選んで始める

##[みんなでガント](http://minna-de-gantt.com/)
ユーザー登録しなくても使えるらしい
![みんなでガント.png](https://qiita-image-store.s3.amazonaws.com/0/54159/848ed984-0405-feb5-17c7-e11f189e47fa.png)
Macでコマンドラインを使い始める際の入り口

# CUIを始めよう！

## GUI
Graphical User Interface
ウィンドウを開いたりマウスでクリックしたり、そういう操作をするやりかた

## CUI

Character User Interface
表示も操作も文字のみを使う。
GUIで出来ることはまずCUIで出来ると考えて問題ない。

逆にCUIで出来てGUIで操作する方法が用意されていないものは多い。

あと、マウスとキーボードで手を行き来させなくて良いので楽。

# iTerm2をインストール

Macに標準に入っているterminalに比べてモダンなデザイン。
かっこいいので入れたほうがモチベーションが上がる。（つまり必須）

https://www.iterm2.com/

こちらからダウンロードしてインストール

起動すると

![スクリーンショット 2016-06-08 21.53.39.png](https://qiita-image-store.s3.amazonaws.com/0/37649/f2b3c86c-0975-3893-066e-0829978172c6.png)

こんな画面が表示される

# 最初に試すコマンド

## ls

現在いるディレクトリに存在するファイル、ディレクトリを列挙するコマンド。
状況把握。大事。

![スクリーンショット 2016-07-04 14.15.31.png](https://qiita-image-store.s3.amazonaws.com/0/37649/0e7cc094-b5b9-388d-a590-f1edb0f99ec8.png)


> ディレクトリとはWindowsだとフォルダのことです。
> MacやLinuxでもGUI操作ではフォルダと呼びますがCUI操作ではまずディレクトリと呼ばれます。

iTerm2を起動後にユーザーがいるディレクトリ（ホームディレクトリ）で`ls`コマンドを実行すると、 *Desktop* や *Downloads* などの文字列が表示されているはずです。
他にもいろいろ、ホームディレクトリに存在するディレクトリが見れるはず。

## cd

*Change Directory* ディレクトリを移動できる。
```$ cd Desktop```
とすればDesktopディレクトリへ移動する。
$マークは入力する必要はない。

![スクリーンショット 2016-07-04 14.18.33.png](https://qiita-image-store.s3.amazonaws.com/0/37649/0644a10b-bb36-7b21-9af0-d2363e0f9ff2.png)


ここでlsコマンドを打てばデスクトップに存在するファイルやフォルダたちがコマンドライン上にリストアップされる。


コマンドのあとに渡してる *Desktop* はコマンドの引数と言い、cdコマンドはlsと違い操作する対象を指定する必要があります。

[..]を引数に渡すと、一つ上の親ディレクトリに移動できる。
[../..]とすると二つ上。

## vim

エディタです。「コマンドモード」と「編集モード」がある、少し使い勝手にクセはありますが、歴史も深く使い慣れるととても良いエディタ。
奥が深いので詳細は別途。とりあえずDesktopへ移動したところで

```$ vim test.txt```

と入力して実行。

![スクリーンショット 2016-06-08 21.57.31.png](https://qiita-image-store.s3.amazonaws.com/0/37649/b34f8bb6-d8a2-a4f9-38c1-2d5138feca58.png)


test.txtの作成と編集が始まる。
起動直後は「コマンドモード」。
キーボードのiを一回押すと「編集モード」に移行する。(insert modeのi)
キーボードを押して適当に文字列を入力後、エスケープキー[esc]を一回押す。
これでコマンドモードへ戻る。

そこで、 コロン[:]キーを押す。
画面下部にコロンが表示されるはず。
さらに、wq と入力してエンター。

![スクリーンショット 2016-06-08 21.58.07.png](https://qiita-image-store.s3.amazonaws.com/0/37649/f597c6eb-13da-baa4-c8b1-6414cf45e36e.png)


コマンドラインに戻る。

lsを実行すると、ディスクトップに先ほどのtest.txtが増えていることがわかる。

![スクリーンショット 2016-07-04 14.19.21.png](https://qiita-image-store.s3.amazonaws.com/0/37649/f416ca67-7f79-7af0-4a7f-182bde9e9bd9.png)


GUI上も、ちゃんと見える。

## catコマンド

ファイルの中身をコマンドライン上に表示するコマンド。
```$ cat test.txt```

![スクリーンショット 2016-06-08 22.05.51.png](https://qiita-image-store.s3.amazonaws.com/0/37649/cd416ca7-4937-96ac-9121-ec42ccbf5015.png)


を実行すると先ほどvimで入力した内容が見れる。

## おまけ　openコマンド

```$ open test.txt```

openコマンドは、拡張子などから、普段開くアプリでそのファイルを開いてくれるコマンド。
GUI上でダブルクリックした時と同じ動きになる。はず。
CUIに慣れるためにはなるべく使わないほうがいいが、cdでディレクトリを見て回るのを試す時には楽しめるかもしれないので一応載せておく。
qiita apiをつかって記事をとってくる！

Qiita apiを使って
記事のタイトルとその記事へのリンクを20件取得し
画面に表示させるものをつくりました。

次の20件を表示リンクを押すと追加で20件表示されます。

jqueryやajaxやJSONやapiを使った経験があまりなく
つまづいたところがたくさんあったのでメモします:pencil: 

JSONのデータをどう表示させるか、apiってどう使うのか、appendってどういう風にしてhtmlを加えていくのか、最初はイメージがつかなくて時間がかかりました…

```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Qiita api</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script>
$(function() {
    var no = 1
    // キャッシュを無効にする
    $.ajaxSetup({
        cache: false
    });
    // 記事をとってきて表示
    var getArticle = function(){
    	$.get('http://qiita.com/api/v2/items?',
        	    { page:no, per_page:"20" }
        	).done(function(data) {
            	$.each(data, function(i, v){
            		// aタグオブジェクトをつくってhrefにv.urlをセット
            		// v.titleをテキスト形式で表示
            		var a = $("<a>").attr("href", v.url).text(v.title);
            		// liタグオブジェクトをつくって先程作ったaをappend
            		// それを#js_append_areaに追加
            		$("#js_append_area").append($("<li>").append(a));
            	})
        	});
    }
    // 最初の20件を初期表示
    getArticle();
    // ボタンを押すごとに次の20件を表示
    $("#next").click(function () {
        ++no;
        getArticle();
    });
});
</script>
</head>
<body>
    <ul id="js_append_area">
    </ul>
    <a id="next" href="#">次の20件を表示</a>
</body>
</html>

```

つまづいたところを上から順番に :strawberry: 
###メソッド化
var メソッド名 = function(){メソッド化したい内容}

今回記事の表示は、初期表示時とボタン押下時の2回出てくるので
メソッド化しました。

###.done()
ajaxで取得してきたデータを受け取ります。

###jqueryのfor文
`.each(data, function(i, v)`で
dataをvごとに取り出せます。iはインデックス。

###.attr()
`.attr( name )` 指定した属性の値をとってきます。
`.attr( name, value )` 指定した属性にvalueの値をセットします。
参考　http://js.studio-kingdom.com/jquery/attributes/attr

####.append
指定した要素の一番後ろにHTMLやエレメントを挿入します。
すでにある要素に挿入の場合には、セレクタで指定。
新しく要素をつくってさらに挿入したい場合には`$("<a>")`みたいにオブジェクトをつくって
そこにappendします。

####.text()と.html()
その要素内にtextとして扱いたいものを書く場合にはtext()、
htmlとして扱いたいものを書く場合にはhtml()。

以上です！
参考メモ/JenkinsでGitにSSHでアクセスする参考URLメモ

JenkinsでGitHubのプライベートリポジトリをSSHプロトコルで取得するために、SSHの鍵ファイルをどうセッティングすればよいのか、数年前に調べた時のメモです。古いです。
多分、Jenkinsのバージョン 1.5xxx 時代の話です。

結論から言うと、当時は、Git Plugin + SSH Credential Plugin で、パスフレーズなしの鍵ペア登録でアクセスできました。

- Git Plugin - Jenkins - Jenkins Wiki
  - https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
- SSH Credentials Plugin - Jenkins - Jenkins Wiki
  - https://wiki.jenkins-ci.org/display/JENKINS/SSH+Credentials+Plugin
- 開発者（個人）のためのJenkins - Git Plugin編 - Qiita
  - http://qiita.com/yasuhiroki/items/61a2be613fc7dcfc8682
- JenkinsによるGit連携の自動化
  - http://changesworlds.com/2015/03/git-by-jenkins/

調査当時は、Jenkins起動ユーザでデフォルトのSSH鍵(id_rsa, id_rsa.pub)生成して使う～みたいなのがググってたらでてきたのですが、これは結局使わなかったです。
もしかしたら、まだ Git Plugin と SSH Credential Plugin の連携ができてなかった古いバージョンでの記事だったかもしれません。

- Jenkins+GitHubのプライベートリポジトリ - Qiita
  - http://qiita.com/yuch_i/items/44d224112382b5f1c8eb
- JenkinsでGithubのプライベートリポジトリのRailsをCI | ひげろぐ
  - http://higelog.brassworks.jp/?p=2279
- GitHubとJenkins連動　自動デプロイ　開発環境設定編 at ITエンジニアmegadreamsの開発日記
  - http://megadreams14.com/?p=27

他、SSH Agent Plugin というのも見つかりましたが、こちらも特に使わなかったです。

- SSH Agent Plugin - Jenkins - Jenkins Wiki
  - https://wiki.jenkins-ci.org/display/JENKINS/SSH+Agent+Plugin
参考メモ/ファーストパーティCookie, サードパーティCookie の参考URL

時々「あれ、そういえばサードパーティCookieってどういう意味だったっけ？」と思い出せなくなりますので、昔のメモを整理して、参考URLのメモを残しておきます。

malaさんのサードパーティCookieについての詳細と影響範囲の考察：

- サードパーティCookieの歴史と現状 Part1 前提知識の共有 - 最速転職研究会
  - http://d.hatena.ne.jp/mala/20111125/1322210819#
- サードパーティCookieの歴史と現状 Part2 Webアプリケーションにおける利用とその問題 - 最速転職研究会
  - http://d.hatena.ne.jp/mala/20111130/1322668652
- サードパーティCookieの歴史と現状 Part3 広告における利用、トラッキング、ターゲティング広告におけるプライバシーリスク - 最速転職研究会
  - http://d.hatena.ne.jp/mala/20111202/1322835191

Google アナリティクスはファーストパーティCookieを使っている：

- コラム - GoogleAnalyticsのCookieは、なぜサードパーティCookieではなく、ファーストパーティCookieなのか？ | Nexal
  - http://nexal.jp/blogs/2061.html
- Google アナリティクスによるウェブサイトでの Cookie の使用  |  ウェブ向けアナリティクス（analytics.js）  |  Google Developers
  - https://developers.google.com/analytics/devguides/collection/analyticsjs/cookie-usage?hl=ja#analyticsjs
- GA フォーラム | Googleアナリティクスの情報サイト | Google アナリティクスのCookieの特徴
  - http://gaforum.jp/basic/spec/323
- GA フォーラム | Googleアナリティクスの情報サイト | Q.Google アナリティクスは、サードパーティーCookieを使っていないんですか
  - http://gaforum.jp/qa/tech/2164

ブラウザごとのサードパーティCookieの扱い：

- サードパーティ Cookie を禁止する | Firefox ヘルプ
  - https://support.mozilla.org/ja/kb/disable-third-party-cookies
- Chrome で Cookie の消去、有効化、管理を行う - Chrome ヘルプ
  - https://support.google.com/chrome/answer/95647?hl=ja
- Privacy and security (Windows)
  - https://msdn.microsoft.com/en-us/library/dn265040(v=vs.85).aspx

その他：

- ASCII.jp：「サードパーティクッキー」が危険な理由を正しく知りましょう｜週刊セキュリティレポート
  - http://ascii.jp/elem/000/000/654/654929/
- HTTP cookie - Wikipedia, the free encyclopedia
  - https://en.wikipedia.org/wiki/HTTP_cookie#Privacy_and_third-party_cookies
- Zombie cookie - Wikipedia, the free encyclopedia
  - https://en.wikipedia.org/wiki/Zombie_cookie
zipアーカイブにUUIDのパスワードをかけるためのシェルスクリプト

サラリーマンがいつもやってる作業。

- パスワード付きzipを作り
- zipファイル名に日付をつけ
- メールで添付ファイルを送り
- 別メールでパスワードを送る

これがやってらんないので、ある程度の自動化をした。（OSX）

- カレントディレクトリでコマンドを貼り付ければ
- ディレクトリ名＋YYYYMMDD.zipというファイル名ができ
- UUIDでパスワードが設定され
- パスワードが標準出力にでる
- あとはパスワードをメールにコピペすればオッケー

シェルスクリプト単体にしちゃうと、どこに置いたか分かんなくなっちゃうので、以下のコマンドをどっかのクリップボードマネージャに入れておいて、それを圧縮したいディレクトリで実行すればオッケー。

```sh
PASS=`uuidgen` 
PWD=`pwd`
BASENAME=`basename $PWD`
NOWTIME=`date "+%Y%m%d"`
EXT=".zip"
cd ..
zip -reP $PASS $BASENAME$NOWTIME$EXT $BASENAME
echo $PASS
open .
```

最後の「open .」で、Finderを開いて、メールにzipをドロップできるように準備をしている。

そして使い始めて思ったのだが、MacでZipアーカイブを作ると、ファイル名がUTF8なので、Windowsでファイル名が文字化けする。これ回避するには、別の外部コマンドを用いなくちゃいけなくて面倒。さらに、上記のソースはMac専用なので、本丸のWindowsビジネスパーソンを幸せにできない。

宿題：Go言語などのクロスコンパイル可能な言語をつかって、上記の機能に加えて、ファイル名のSJIS化などを加えたい。
任意のキーを取る辞書のJSON Schema記法の覚書


# JSON Schema
任意のキーと、文字列か数値を値とする辞書型をvalidationするためのJSON schema記法例。

```json:JSON-schema
{
    "type": "object",
    "additionalProperties": {
        "anyOf": [
            {"type": "string"},
            {"type": "number"},
        ],
    },
}
```

# Example@python
前述のスキーマをPython上で[jsonschema](https://python-jsonschema.readthedocs.org/en/latest/)モジュールを使用して実行した例。

```python
import jsonschema

schema = {
    "type": "object",
    "additionalProperties": {
        "anyOf": [
            {"type": "string"},
            {"type": "number"},
        ],
    },
}

valid_obj = {
    "key_a" : "value",
    "key_b" : 1,
    "key_c" : 1.1,
}
invalid_obj = {
    "key_a" : "value",
    "key_b" : 1,
    "key_c" : None,
}

jsonschema.validate(valid_obj, schema)

try:
    jsonschema.validate(invalid_obj, schema)
except jsonschema.ValidationError as e:
    print(e)
```

```console
None is not valid under any of the given schemas

Failed validating 'anyOf' in schema['additionalProperties']:
    {'anyOf': [{'type': 'string'}, {'type': 'number'}]}

On instance['key_c']:
    None
```

# 参考
Dictionary-like JSON schema - Stack Overflow
http://stackoverflow.com/questions/27357861/dictionary-like-json-schema

python - JSON schema validation with arbitrary keys - Stack Overflow
http://stackoverflow.com/questions/16081118/json-schema-validation-with-arbitrary-keys
MELPA に howm が入りましたよ！

# 概要: MELPA に howm が入りました。

なので、`list-packages`からインストールできるようになりました。楽チン！


# howm とは？

http://howm.osdn.jp/index-j.html

一人お手軽 wiki もどきです。メモをサクサク作成して、それを一気に検索かけながら view することができます。


# おすすめの使い方: org と統合して使う

時間あがれば書きます。 org-mode の書式で howm を書くと、 org-mode の編集機能の恩恵を受けつつ wiki もどきができるようになります。
不具合報告の書き方参考リンク

[優れたバグ報告に必要なこと | 情シスハック](http://success.tracpath.com/blog/2013/06/27/%E5%84%AA%E3%82%8C%E3%81%9F%E3%83%90%E3%82%B0%E5%A0%B1%E5%91%8A%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8/)
[エンジニアに分かりやすくバグを報告するバグレポートの書き方 | 株式会社LIG](http://liginc.co.jp/178767)
[新社会人のためのバグレポートの基本 - mixi engineer blog](http://alpha.mixi.co.jp/entry/2012/10799/)
[Bug writing guidelines - Mozilla | MDN](https://developer.mozilla.org/en-US/docs/Mozilla/QA/Bug_writing_guidelines)
[Writing Better Bug Reports](http://martiancraft.com/blog/2014/07/good-bug-reports/)
[How to Write a Good Bug Report?](https://leantesting.com/resources/write-good-bug-report/)
要素の組み合わせをすべて列挙する。


# はじめに
+ パラメータの組み合わせなどを確認するときに条件の組み合わせをすべて列挙したくなるときありませんか？
+ p1は[1,2],p2は[A,B]の値を取る時に、
	1. p1=1&p2=A
	2. p1=1&p2=B
	3. p1=2&p2=A
	4. p1=2&p2=B
+ のような組み合わせを作りたいということです。

```
for (p1) {
	for (p2) {
		for (p3) {
			///
		}
	}
}
```
+ ってやれば出来るんですが、階層を全部入れ子にするのは面倒くさいですね。

# 作ってみました。

## プログラム

```javascript:enumerate.js
"use strict";

function enumerate(parameters) {
		var enumrate_array = []; //答え
		// 総件数を計算
		var total = parameters.reduce(function(p,c){ return p * c.values.length; },1);
		// 組み合わせを作成する
		var count = 1;
		for (var i = 0; i < parameters.length; i++) {
				var values = parameters[i].values;
				count = count * values.length;
				var div = total / count;
				var idx = 0;
				do {
						for (var m = 0; m < values.length; m++) {
								for (var k = 0; k < div; k++) {
										if (enumrate_array[idx] === undefined) {
												enumrate_array[idx] = [];
										}
										enumrate_array[idx].push({
												'key': parameters[i].key,
												'value': parameters[i].values[m]
										});
										++idx;
								}
						}
				} while (idx < total);
		}
		return enumrate_array;
}

var param = [
		{'key': 'p1','values': [1, 2, 3]}, //数字でも
		{'key': 'p2','values': ['A', 'B', 'C']}, //文字列でも
		{'key': 'p3','values': [{'name': 'john'}, {'name': 'kate'}, {'name': 'fox'}]} //オブジェクトでも
];

// 独立変数p1,p2,p3なので 3 × 3 × 3 ＝ 27通りの組み合わせができます。
//console.log(JSON.stringify(enumerate(param), undefined, 4));

var e = enumerate(param);
console.log('enumerate size : ' + e.length);
var no = 1;
e.forEach(function(p){
	var row = [];
	p.forEach(function(v){
		row.push(v.key + '=' + JSON.stringify(v.value));
	});
	console.log(no +"\t" + row.join("\t"));
	++no;
});
```

## 実行

+ node.jsで実行してみてください。

```shell:node.js
% node enumerate.js > enumerate.txt
```

## 結果

```
enumerate size : 27
1	p1=1	p2="A"	p3={"name":"john"}
2	p1=1	p2="A"	p3={"name":"kate"}
3	p1=1	p2="A"	p3={"name":"fox"}
4	p1=1	p2="B"	p3={"name":"john"}
5	p1=1	p2="B"	p3={"name":"kate"}
6	p1=1	p2="B"	p3={"name":"fox"}
7	p1=1	p2="C"	p3={"name":"john"}
8	p1=1	p2="C"	p3={"name":"kate"}
9	p1=1	p2="C"	p3={"name":"fox"}
10	p1=2	p2="A"	p3={"name":"john"}
11	p1=2	p2="A"	p3={"name":"kate"}
12	p1=2	p2="A"	p3={"name":"fox"}
13	p1=2	p2="B"	p3={"name":"john"}
14	p1=2	p2="B"	p3={"name":"kate"}
15	p1=2	p2="B"	p3={"name":"fox"}
16	p1=2	p2="C"	p3={"name":"john"}
17	p1=2	p2="C"	p3={"name":"kate"}
18	p1=2	p2="C"	p3={"name":"fox"}
19	p1=3	p2="A"	p3={"name":"john"}
20	p1=3	p2="A"	p3={"name":"kate"}
21	p1=3	p2="A"	p3={"name":"fox"}
22	p1=3	p2="B"	p3={"name":"john"}
23	p1=3	p2="B"	p3={"name":"kate"}
24	p1=3	p2="B"	p3={"name":"fox"}
25	p1=3	p2="C"	p3={"name":"john"}
26	p1=3	p2="C"	p3={"name":"kate"}
27	p1=3	p2="C"	p3={"name":"fox"}
```

# ツッコミ・コメント上等！

+ もっといい手があるよ！とか、ココちがくない？ということがあればコメントよろしくお願いします。
Ubuntu(15.04)にElasticSearchをインストールする

# リポジトリの登録
```bash
$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
```

# インストール
```bash
$ sudo apt-get update && sudo apt-get install elasticsearch
```

# 起動
```bash
$ sudo /etc/init.d/elasticsearch start
```

# 各種プラグインをインストール
```bash
$ sudo /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
$ sudo /usr/share/elasticsearch/bin/plugin install royrusso/elasticsearch-HQ
```

# ブラウザで確認
http://localhost:9200/_plugin/head/
http://localhost:9200/_plugin/hq/
API Blueprint周りの関連技術でAPI開発を高速化したい(願望)


API Blueprint というものがあります。

APIドキュメント記述用に用意された、Markdown拡張で、API Blueprint形式で記述されたドキュメントファイル(以下apibファイル)は、様々なツールを通じて、開発補助に役立てる事が出来ます。

API Blueprintの概要に関しては以下をご確認下さい。

チュートリアル
https://apiblueprint.org/documentation/tutorial.html

サンプルなど
https://github.com/apiaryio/api-blueprint

## APIドキュメント作成 

aglio と呼ばれるツールを用いてAPI Blueprint 形式のファイルをドキュメントに変換する事が可能です。

https://github.com/danielgtaylor/aglio

gulp-plugin もあります。

https://www.npmjs.com/package/gulp-aglio


## モックサーバ

api-mock はapibファイルを読み込んで、モックサーバを構築するためのツールです。

https://www.npmjs.com/package/api-mock

## テストツール

dredd は apibファイルを読み込んで、バックエンドのテストを実行します。

http://dredd.readthedocs.org/en/latest/quickstart/

## 所管、など

諸々検討中です。

気づいたことメモ

- api-mockなど 複数のapibファイルを読み込めないものが多い。記述するapibはconcatか何かで1つにまとめるのが良さそう。
- 単純にconcatした時のFOMAT記述の重複気持ち悪い。問題はなさそうだけど…
- API Blueprint形式と言っても微妙に解釈が異なったり。特にdreddは厳しい雰囲気。
- JSON Response表記が非常にシビア。dreddによるテスティングは、なんか単純に文字列比較っぽい
	- キーに`""`つけるか、`:`前後のスペースどうするかなど実APIの仕様としっかり合わせないと死ぬ。
	- この辺のJSONミスが、ドキュメント書いて、HTMLプレビューして本番コード書ききっていざテストってタイミングでようやく気付くと思うと辛い。自動チェックしたい…
	- dredd スキーマ書いてテストすることもできるけど、それやるとドキュメントの可読性が死ぬ。
- node製のパーサーを使って、自力でAPI Blueprint パースすることも出来る。
	- reqとresは、いい感じにペアが作られて、HttpTransというまとまりにパースされるっぽい。
	- req側に名前をつけてcontent定義することも出来る？
- api-mock は一番最初のHttpTransしか考慮しない(パラメータもヘッダも見てない。)


## 環境構築（暫定）

- markdown は単純結合
- dreddはは諦める。
	- Attribute使って柔軟なテスト記述もできるけど、ドキュメントの可読性落とすのは本質を見失ってる気がする。
	- hook使えばうまいことなんとかなる？(フックの書き方煩雑になりそうで…)
	- after がそれぞれmochaのit相当で働いてくれたらいいんだけど…
- 複数Markdownを単純結合。Fomat文字列の重複は無視(とりあえず今のところ問題ない)
- `.md`を`.apib`に結合して、aglioビルド(`gulp build`)。ココは直列にしないと。
- モックサーバは結構簡単

````
$ npm i gulp-aglio gulp-concat api-mock --save
````

````
var gulp = require('gulp');
var $ = require("gulp-load-plugins")();
var runSequence = require("run-sequence");
var browserSync = require("browser-sync")


var path = {
    md: "docs/apis/*.md",
    indexFile: "index.apib",
    indexPath: "docs/",
    sitePath: "site/"
}

gulp.task('build-md', function () {
    gulp.src(path.md)
        .pipe($.concat(path.indexFile))
        .pipe(gulp.dest(path.indexPath));
});

gulp.task('build-aglio', function () {
    gulp.src(path.indexPath+path.indexFile)
        .pipe($.aglio({
            template: 'default',
            themeTemplate: "triple"
        }))
        .pipe(gulp.dest(path.sitePath));
});

gulp.task("build",function(cb){
    runSequence("build-md","build-aglio",cb);
})

gulp.task("watch",function(){
    gulp.watch(path.md,["build-md"])
    gulp.watch(path.indexPath+path.indexFile,["build-aglio"])
})

gulp.task("server",function(){

    browserSync({
        server: {
            baseDir:"site"
        },
        open: "external"
    });
    gulp.watch([path.sitePath+"**/*"],function(){
        browserSync.reload();
    })

})

gulp.task("mock",function(){
    var mockServer;
    var ApiMock = require('api-mock')
    mockServer = new ApiMock({
        blueprintPath: path.indexPath+path.indexFile,
        options: {
            port: 3030
        }
    });
    return mockServer.run();
})
````
Azure VMのWindowsを、外部のNTPサーバーで時刻同期させる

# はじめに

Azure(Hyper-V) Virtual Machine上のWindowsは、デフォルトだと仮想マシン統合サービスによって、ホストの時刻と同期が取れています。
これだと、Azure上でActive Directoryのドメインコントローラ(DC)を設定する際などに差し支えがあるので、ホストの時計を参照せずに、外部のNTPサーバーと同期させる方法です。


# 手順

1. 外部のNTPサーバーを設定する
2. 仮想マシン統合サービスの時刻同期を止める
3. NTP同期を開始

## 1. 外部のNTPサーバーを設定する

    w32tm /config /update /manualpeerlist:"ntp.nict.jp,0x8 jp.pool.ntp.org,0x8" /syncfromflags:MANUAL /reliable:YES

* 参照するNTPサーバーは状況や時代によって変わりますので適宜ご確認ください。
* 0x8とかの意味はこちらを参照: [Active Directoryおよびワークグループ環境での時刻同期](http://www.atmarkit.co.jp/ait/articles/1205/17/news135_2.html)


## 2. 仮想マシン統合サービスの時刻同期を止める

    reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\VMICTimeProvider /v Enabled /t reg_dword /d 0

デフォルトの値は1(有効)です。これを0(無効)に設定すると、ゲストOS側からHyper-V統合サービスの時刻同期を無効にできます。

regedit等でも設定できます。

* キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\VMICTimeProvider
* 名前: Enabled
* 種類: REG_DWORD
* データ: 0



## 3. NTP同期を開始

    # w32tmを再起動
    net stop w32time
    net start w32time
    
    # NTP同期を開始
    w32tm /resync /force


# 関連するイベントログ

ソース: Time-Service
イベントID: 12
> タイム プロバイダー NtpClient: このコンピューターは、ドメイン階層を使ってタイムソースを決定するように構成されていますが、フォレストのルートにあるドメイン用の AD PDC エミュレーターであるため、ドメイン階層のその上にはタイム ソースとして使用するコンピューターがありません。ルート ドメインの信頼できるタイム サービスを構成するか、または手動で AD PDC を構成して外部のタイム ソースと同期させることをお勧めします。そうでない場合、このコンピューターはドメイン階層内の権限のあるタイム ソースとして機能します。外部のタイム ソースが構成できない場合、またこのコンピューターで使用できない場合は、NtpClient を無効にすることをお勧めします。

# 参考

* [Time Synchronization in Hyper-V](https://blogs.msdn.microsoft.com/virtual_pc_guy/2010/11/19/time-synchronization-in-hyper-v/)
* [Time Synchronization and Domain Controller VM’s](https://blogs.msdn.microsoft.com/robertvi/2011/05/11/time-synchronization-and-domain-controller-vms/)
* [Azure VMs – Active Directory members and getting time sync (ntp) right](https://blogs.msdn.microsoft.com/jrt/2017/10/28/azure-vms-active-directory-members-and-getting-time-sync-ntp-right/)
* [Windows Server 2016 Accurate Time](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/windows-time-service/accurate-time)
Qiita / Chrome / Mountain Lion > トップページ読込み(フィードとツイッター部分)が遅い問題 > El Captitanなら5秒

http://qiita.com/7of9/items/5a3f2c6a6473c2590e20
にて困っていたトップページの表示が遅い問題。10秒程度かかる。

外付けHDDにEl Capitanをインストールしてみて、Chromeをインストールして試した。

```txt:動作環境
OS X El Capitan v10.11.4
Chrome Version 49.0.2623.112 (64-bit)
Safari Version 9.1 (11601.5.17.1)
```

トップページの表示

およそ以下のような感じだった

- Safari: 3秒
- Chrome: 5秒

Mountain Lionの時よりはマシになった。
フィードとツイッター表示が遅い。これらのコンポーネントがあるページの閲覧性がここ数ヶ月で悪くなっている気がする。プロバイダも関係するのかもしれない。

Moutain LionからEl Capitanに完全移行するかは決めかねている。以下の点が気付いている問題

- Unityのバージョンを上げることになる
  - バージョンアップ時にまともに動かない部分が出てくる
  - まともに動くバージョンを探すために複数のバージョンを試用することになる
- IME が使いづらい
  - google日本語入力にすればいいのだろうか
- 外付けキーボード用の設定などのやり直し

ideone.comの不具合は見られなかった。
Raspberry Pi 3: NFSサーバーの自動起動ではまったので覚書（暫定対処）

# Raspbianにnfs-kernel-serverを入れてrebootしたらnfsが自動起動しない現象に出会う
* Operating System: Raspbian GNU/Linux 8 (jessie)
* Kernel: Linux 4.1.19-v7+

nfsサーバーのステータスを見たら 

```
「Not starting: portmapper is not running ... (warning).」
```

と出てて、スタート出来ていない。  
この状態で「sudo /etc/init.d/nfs-kernel-server restart」を実行すると普通に起動。  
どうも、ネットワークの準備が出来る前にnfs-kernel-serverが動いている模様。

# 暫定対処
/etc/rc.localに下を追加

```
sleep 3
/etc/init.d/nfs-kernel-server restart
```

これで、reboot時にちゃんとサービスが起動。・・・時間がある時に調べよう
WindowsのコマンドラインでZIPしてFTPSを実行する


ある案件で、WindowsでファイルをZIPした後、FTPSでアップロードする必要がでてきたのでメモしておきます。

UNIX(Linux)環境なら、3分で終わることがいろいろ大変でした。早くWindowsでもbashが使えるようになってほしいものです。

##やりたいこと

* ファイルをzipで圧縮
* FTPSでアップロード
* 上記をバッチ化し、1時間に一度、自動実行

##準備

###ZIP

まず、Windowsでは原則コマンドラインで使えるzipコマンドがありません。最近のPowerShell環境だと使えるコマンドもあるらしいのですが、環境依存を避けたいので、7zipを使うことにします。

ここから32bitの「7-Zip コマンドラインバージョン」というのダウンロードし、展開します。
とりあえず、

```bash
C:\7zip\7za.exe
```
でコマンドが使えるようにしました。

基本的な使い方として、

```bash
C:\7zip\7za.exe a 圧縮先.zip 圧縮元.txt
```
という感じのようです。

>aをお忘れなく。

###FTPS（WinSCP）

WindowsにはFTPコマンドがありますが、FTPSには対応していないようです。
なので、ツールとしてWinSCPを利用します。

とりあえず[ここ](https://winscp.net/eng/docs/lang:jp)からダウンロードし、インストールします。

対話的シェルで使うのが普通なようですが、ここではバッチ化するのでコマンドは外部ファイルに書いてみたいと思います。

基本的な使い方としては、

```bash
C:\Program Files (x86)\WinSCP\WinSCP.exe /script=test.ftps
```

という形式で、この例では、test.ftpsに実行したいFTPSコマンドを書きます。

```text
open ftps://account:password@servername -explicit
cd data
put test.txt
exit
```
ftpsのホスト名、ID,PWの記述が少々変わってますね。

###自動化

UNIXならcronで簡単処理ですが、Windowsだとタスクスケジューラを使います。慣れれば簡単ですが、下記のようなクセがあります。

* ウィザードで日単位以下のタスクを設定できない（一度作成後に設定可能）
* 開始（オプション）を指定しないと動かない

開始（オプション）で、バッチファイルのPATHを指定しないと行けないようです。

##一連の機能をバッチ化し実行してみる

ここではC:¥worksというフォルダを作成し、バッチファイルや必要なファイルをそこに置くことにします。

###バッチファイルの作成

zip_ftps.batというファイルを作成し、下記のように記述しました。

```bat
"C:¥7zip\7za.exe" a C:\works\foo.zip C:\works\foo.txt
"C:\Program Files (x86)\WinSCP\WinSCP" /script="C:\works\test.ftps"
del C:\works\foo.zip
```

C:\works\foo.txtというファイルをfoo.zipという名で圧縮し、FPTSでアップします。
いちおうdelで掃除しておきます。

test.ftpsファイルは、

```txt
open ftps://account:password@servername -explicit
cd files
put c:\works\foo.zip
exit
```

という感じで、生成したzipファイルをputするように指定しています。

>-explicitや移動するフォルダなどは各自の環境に合せます。

###バッチファイルの実行

事項は、

```bash
C:¥works¥zip_ftps.bat
```

とすることで実行できます。zipが生成され、FTPSされているか確認してください。

##自動化する

このバッチファイルをタスクスケジューラに登録して自動化します。

[管理ツール]の[タスクスケジューラ]を起動し、[基本タスクの作成]を選択します。
するとウィザードが起動します。

* タスク名の入力
* トリガー（タスク開始のタイミング）→適当に設定
* トリガー（間隔設定）→適当に設定
* タスクの操作→プログラムの開始
* 開始するプログラム/スクリプトの場所、オプション

を設定します。冒頭でも説明しましたが、ウィザードではトリガー（起動間隔）が日以下の単位で設定できません。そのため、一度ダミーで設定しておき、作成後に編集します。

###登録後のトリガーの編集

登録後、トリガーの編集を選択し、繰り返し間隔を編集します。

![ftps](http://www.bluecode.jp/qiita/ftps/002.png)

###プログラム/スクリプト等の設定

どうやら開始（オプション）に、バッチファイルが存在するPATHを指定しないと正しく実行されないようです。。。

![ftps](http://www.bluecode.jp/qiita/ftps/001.png)

###即時実行

プログラムが即時実行できるかを試したい場合は、タスクスケジューラの一覧から対象のタスクを右クリックし、実行を選択します。

![ftps](http://www.bluecode.jp/qiita/ftps/003.png)

簡単ながらとりあえず以上です。
API Meetup #13 企業間連携を加速させるAPI、そしてそこに必要な認可フレームワークOAuth


API＝シナプス
企業間の連携の口になるのがAPI
それぞれが連携することで色んな事ができるようになる


## スタートアップと大企業のAPI連携

トレタ CTO 増井氏
風呂グラマーの人
Apple Watch発売の時に取材受けた人
IT芸人

### トレタ

お店の人が予約管理できるツール
キャンセル率とか色々見れる

### API

創業時にAPIをかなり意識して作った
Web版、Android, iPadアプリは全てサーバーサイドAPIとやりとりして作ってる
色んな企業と連携している

### Web予約との連携

ユースケース
- 複数の予約サイトを利用
- あるサイトから予約が入る
- 他の予約サイトに予約を入力
- 店内の台帳に手で転記

同期処理を人間がやっている

これをAPI連携させて自動化してる

紙の台帳ではできなかったことができるようになる

「ヤフー 連携 トレタ」でググる

予約業務をWebで自動化

メディアが欲しがる情報とお客さんが欲しがる情報は異なる
見る視点で見えるものが違ってくる

### もう一つの形

APIは入力と出力がある

欲しいデータはレジが知っている
誰が何を食べた、いくら使ったか

トレタPOSコネクト

共通のインターフェースを作って連携できるようにした

手作業だとちょっと遅れる。
ハンディターミナル→POS→自動で取り込める

今までトレタは未来の情報を管理していたが、これで現在の情報を提供できるようになった

外部連携することを前提とする
オープンスタンダードを採用する

独自フォーマットとかは色々大変
稟議やらそういうのがツラい

認証についてはセキュリティがどうなのかという問題が出てくる

OAuth Providerを提供できるライブラリはあんまり出てない
薄いライブラリを使った

API連携は補完関係にあるもの

長いこと交渉して、技術的な連携についてを詰める
妥協せずに話すことがAPI設計の上位部分として大事なこと

## API提供におけるOAuthの役割

NRI 工藤氏
http://www.slideshare.net/tkudo/api-meetup-oauth

### なぜOAuthか

過去の話
よくあるのはWebサイトを作る→ID/Password入れてログイン、サービスを利用する

サードパーティに機能を提供するとなると若干話が変わってくる
サードパーティにID/Passwordを入れさせて良いのか？

サードパーティにパスワードを預ける→認証リスク
サードパーティ自体が信じられない場合
全権委任、使い勝手が悪い。
アクセス有効期間の制御ができない

IDパスワードだと、区別がつかなくなってしまう

トークンによる管理
ID/パスワードと権限委譲のみ

制限された機能の提供ができる

クレデンシャルを直接やりとりさせない

APIに関しては2005年くらいから標準化され始めた

OAuthの問題
クライアントIDとシークレットを持たざるを得ない

そこでインプリシットフロー

アクセストークンがそのまま流れるから、あまり重要な情報はやりとりさせないのが大事

Bearer Tokenを使ってリクエストする方法
アクセストークンをクエリパラメータに入れるのはオススメしない

どうOAuthを適用するかを考えることが重要

パスワード変更時にトークンをどうするかとか考えることはかなりある
リフレッシュトークンの執行ポリシー

Slackの例
ベストプラクティスというわけではないが、おもしろい
Bot用のアクセストークンがある

サービスによって知恵を絞るところ

### OAuth周辺の仕様

JSON Web Token
色んなところに使われているので注目すべし

PKCE ピクシー
Proof Key for Code Exchange
コードの横取りを防ぐ仕組み


### OAuthはユーザー認証に使えるのか？

単体ではムリ
独自の使い方をすればできる
OAuth2.0は使いやすい

標準化できるのでは？

できたのがOpenID Connect

認証結果をやりとりする仕組みにID Tokenを返している
JWTでセキュアにしてる

### ID Token

ユーザー認証イベントの情報を含む署名付きJWT

- この情報は誰に対して送ったのか

アクセストークン自体は形を制限してないが、ID Tokenは情報を決まった形で定義しているので
使いやすくしている

### OAuthの先

UMA User Managed Access
リソースの持ち主が別の人間に対して許可する仕組み
フォースパーティからのアクセス認可

ここら辺はこれから

### まとめ

かなり普及している仕様なので、使える
OAuthはフレームワークなので、サービスによって仕様を決める必要がある

APIインタラクションの軸としてアイデンティティを考えない人は終わってるわ - クレイグ・バートン
CloudTestLabやってみた

気がついたら正式リリースしてた。
[Cloud Test Lab  |  Google Developers](https://developers.google.com/cloud-test-lab/)
より多くの端末でのテストは要望が多いのでやってみよう。

### 料金
しばらく無料
[Pricing Details Coming Soon  |  Cloud Test Lab  |  Google Developers](https://developers.google.com/cloud-test-lab/pricing)
>Although it is temporarily available to use at no charge, a billing account is still required to use Cloud Test Lab.

## AndroidStudioからの実行
[Getting Started with Testing | Android Developers](http://developer.android.com/intl/ja/training/testing/start/index.html#run-ctl)
この通りにやれば動く。はず。でも、studio.vmoptionsに記述しても Cloud Test Lab Device Matrix. が選択できなかった。
以前AndroidStudioの動作を軽くしようと試みた時に、pluginを無効化してたのが問題だった。
![Screen Shot 2016-04-09 at 8.22.09.png](https://qiita-image-store.s3.amazonaws.com/0/16532/a3d340db-f279-203f-220c-4b6e68d2b639.png)
ココらへんのチェックも確認しよう。

実行ボタン押したら普通に動いた。すごいね。
![Screen Shot 2016-04-09 at 8.48.22.png](https://qiita-image-store.s3.amazonaws.com/0/16532/6d3f5634-061b-6346-6741-7add5dd3b530.png)

webにも結果が出た。便利。すごい便利。
<img width="952" alt="Screen_Shot_2016-04-09_at_8_49_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/16532/214efcd8-8683-806a-2aa9-29a3c34e69d4.png">

## Terminalからの実行
ここを見よう。
[gcloud components update beta](https://developers.google.com/cloud-test-lab/command-line#configure_your_local_google_cloud_sdk_environment)

### Roboでざっくりテストできる
gcloud beta test android run...
に --type robo を指定すると、なんか適当にテストしてくれるみたい。モンキーテストってやつかな。
テストコードが出来るまではコレを定期的に動かすと良さそう。便利。

## 特定のタイミングでスクリーンショットを撮る
[Take screenshots from instrumentation tests](https://developers.google.com/cloud-test-lab/test-screenshots#to_add_the_screenshot_library_to_your_project)
スクリーンショットしたいタイミングで以下みたいなコードを書く。
```
ScreenShotter.takeScreenshot("main_screen_2", mActivityRule.getActivity());
```

qiitaにまとめる程でもないけど、まぁこんな感じだった。
jenkinsと統合して定期的に呼べるようにしたい。
Swiftの再帰的enumとパターンマッチでズンドコ

再帰的enumを使ってみたかったので今更ながらズンドコキヨシを書いてみました。
[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)

```Swift
import Foundation

enum Zundoko: CustomStringConvertible {
    case Start
    indirect case Zun(Zundoko)
    indirect case Doko(Zundoko)
    indirect case Kiyoshi(Zundoko)
    var description: String {
        switch self {
        case Start: return "スタート！"
        case Zun(let zd): return "\(zd)\nズン"
        case Doko(let zd): return "\(zd)\nドコ"
        case Kiyoshi(let zd): return "\(zd)\nキ・ヨ・シ！"
        }
    }
    func zundoko() -> Zundoko {
        return (arc4random_uniform(2) > 0) ? Zun(self) : Doko(self)
    }
}

var zd: Zundoko = .Start
while true {
    if case .Doko(.Zun(.Zun(.Zun(.Zun)))) = zd {
        zd = .Kiyoshi(zd)
        break
    }
    zd = zd.zundoko()
}
print(zd)
```

`if case .Doko(.Zun(.Zun(.Zun(.Zun)))) = zd` 
だけでズンドコ判定が済んでしまうのが非常にいい感じです。

while caseでパターンの否定が使えればもう少しスッキリしそうなのですが、
調べた限りでは書き方がわかりませんでした。。

## 短めバージョン

whileを無くして再帰にしました

```Swift
import Foundation

enum Zundoko: CustomStringConvertible {
    case Start
    indirect case Zun(Zundoko), Doko(Zundoko), Kiyoshi(Zundoko)
    var description: String {
        switch self {
        case Start: return "スタート！"
        case Zun(let zd): return "\(zd)\nズン"
        case Doko(let zd): return "\(zd)\nドコ"
        case Kiyoshi(let zd): return "\(zd)\nキ・ヨ・シ！"
        }
    }
    func zundoko() -> Zundoko {
        if case .Doko(.Zun(.Zun(.Zun(.Zun)))) = self {
            return .Kiyoshi(self)
        }
        return (arc4random_uniform(2) > 0) ? Zun(self).zundoko() : Doko(self).zundoko()
    }
}
print(Zundoko.Start.zundoko())
```

再帰的enum、便利です！
iTerm2 の Color scheme インポートしたプリセットを一括削除する

## 大量のいらないプリセットを削除したい
iTerm2 のColor scheme にろいろなプリセットをインポートして試すと、不要なものを削除したくなります。
そのとき、iTermの設定からは１つづつしか削除できないため、単純作業を強いられることになります。

Preference > Profiles > Colors > Delete Preset... でプルダウンから一つづつ選んで削除。
※繰り返し

## XMLを編集して一括削除
/tmp ディレクトリにXMLの設定ファイルをコピーして編集して元の位置に戻します。

```bash
cd /tmp
cp ~/Library/Preferences/com.googlecode.iterm2.plist .
plutil -convert xml1 com.googlecode.iterm2.plist
vi com.googlecode.iterm2.plist
# quit iterm2
cp com.googlecode.iterm2.plist ~/Library/Preferences
# restart iterm2
```

参考: https://groups.google.com/forum/embed/#!topic/iterm2-discuss/Z78aefrZ6gY


vi で com.googlecode.iterm2.plist を編集する際、```:se nu``` で行番号を表示し、31行目付近の下記タグ内の削除したいプリセットの終わりの行が例えば10000行目だとすると、```:32,10000d```などと打って一気に削除するとよいかと思います。 

```xml
<key>Custom Color Presets</key>
```

## 残したプリセット

#### Thayer Bright
[t3chnoboy/thayer-bright-iTerm](https://github.com/t3chnoboy/thayer-bright-iTerm)