OmniAICreator/Qiita-1.07M huggingface dataset:
AnsibleでIPアドレスを変更した後も処理を継続する

# 一見これで良さそうだが

Ansibleで対象ホストのIPアドレスを変更して、さらに処理が継続されるようなplaybookを考えてみる。
Ansible v2で操作対象がCentOS 7だと以下のような感じになる。

```yaml
- hosts: all
  tasks:
  - (前処理)
  - command: nmcli connection modify {{ nic }} ipv4.method manual ipv4.addresses {{ new_addr }}/{{ prefix }} ipv4.gateway {{ gateway }} ipv4.dns {{ dns }}
  - shell: sleep 1; ifdown {{ nic }} && ifup {{ nic }}
    async: -1
    poll: 0
  - block:
    - lineinfile: dest=/etc/hosts backrefs=yes regexp='^\S+( .*{{ inventory_hostname | regex_escape }}.*)$' line='{{ new_addr }}\1'
    - wait_for: host={{ new_addr }} port=22 delay=1 timeout=50
    delegate_to: localhost
  - (後続処理)
```

ここではAnsible実行側の/etc/hostsを使っている。処理対象のIPアドレス変更後に/etc/hostsも変更して、継続して処理ができるようしたわけだ。
.ssh/configなどを使っても同様のことができるだろう。

# 実際には

しかし一見上手く行きそうなこの方法だが、実際には大抵の環境で上手く行かない。

それは何故か。
AnsibleはSSH接続を行う時、標準設定だとControlMasterを使用している。ControlPersist=60sなので1分の間は接続先を覚えている。
従って如何に/etc/hostsなどを変更したとしても接続しに行く先はなお変更前のまま、というわけだ。

それではどうすれば良いか。
一例として接続元の残っているSSHプロセスをkillしてやるのが良い。
Ansibleの使っているControlPathは`$HOME/.ansible/cp/ansible-ssh-%h-%p-%r`（%h,%p,%rはそれぞれ対象ホスト、対象ポート、対象ユーザ）なので以下のようにすれば良いだろう。
このやり方だとAnsible実行側で同じユーザが2つ以上Ansibleを実行していると良くないことが起こりそうだが、それはないこととしておく。

```yaml
- hosts: all
  tasks:
  - (前処理)
  - command: nmcli connection modify {{ nic }} ipv4.method manual ipv4.addresses {{ new_addr }}/{{ prefix }} ipv4.gateway {{ gateway }} ipv4.dns {{ dns }}
  - shell: sleep 1; ifdown {{ nic }} && ifup {{ nic }}
    async: -1
    poll: 0
  - block:
    - command: pkill -f {{ lookup('pipe', 'echo $HOME') }}/.ansible/cp/ansible-ssh-
      ignore_errors: yes
      run_once: yes
    - lineinfile: dest=/etc/hosts backrefs=yes regexp='^\S+( .*{{ inventory_hostname | regex_escape }}.*)$' line='{{ new_addr }}\1'
    - wait_for: host={{ new_addr }} port=22 delay=1 timeout=50
    delegate_to: localhost
  - (後続処理)
```

なお、pkillのところは実害はあまりないがshellモジュールではエラーになったのでcommandモジュールを使っている。（理由を調べてはいない）

# おまけ：nmcliモジュールなどここまで辿り着くまでの色々

この文章を書くのにnmcliモジュールを使おうとしたらipv4.methodを変更する方法がなくdhcpからautoにできなかったので没。

nmcliモジュールが使えるようになるまでも一苦労だったし。試行錯誤の結果、操作される側でyumで（インストールされていなければ）NetworkManager-glib, dbus-python, pygobject2をインストールし、pipでpython-nmcliをインストールするのが一番楽っぽい。

最初Fedora 23でやろうとしたらPython 3が標準になったせいでdnfモジュールすら動かないし。python2-dnfをインストールする必要があるのだが、dnfモジュールが使えないのでrawモジュールを使わなければならない。
なお、Fedora 23だと上記のnmcliモジュールに必要なpygobject2はpython-gobjectという名前に変わっている。
scriptなどでログを取るときに変な文字(制御文字)のない状態で読めるようにする

# Linuxクライアントでログを取ると辛い

TeraTerm使ってますか？私は使ってません。仕事では使わされますが（）
Windowsアプリでやるのが嫌なので脱TeraTermするためにLinuxでなんとかしてるんですが、
作業ログをきれいにとるという点においてはTeraTermのほうが上なので苦しんでます。

一応scriptコマンド使ったりtmuxでログを取る方法などがあるんですが
どうしても制御文字が入ってしまう…

```
スクリプトは 2016年04月17日 22時52分01秒
 に開始しました^[]0;user@host: ~^Guser@host:~$ fish
^[]0;fish  /home/user^G^[[30m^[(B^[[mWelcome to fish, the friendly interactive shell
Type ^[[32mhelp^[[30m^[(B^[[m for instructions on how to use fish
^[]0;fish  /home/user^G^[[30m^[(B^[[m^[[38;5;245m⏎^[[0m                                                                               $
^[[30m^[(B^[[m^[]0;ping  /home/user^G^[[30m^[(B^[[mPING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=116 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=70.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=90.0 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=44 time=230 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 70.970/126.856/230.065/61.728 ms
^[]0;fish  /home/user^G^[[30m^[(B^[[m^[[38;5;245m⏎^[[0m                                                                               $
^[[30m^[(B^[[m^[]0;exit  /home/user^G^[[30m^[(B^[[m
^[[30m^[(B^[[m^[]0;user@host: ~^Guser@host:~$ exit
exit

スクリプトは 2016年04月17日 22時52分24秒
 に終了しました
```

* * *
# 置換しない
catして綺麗に読めることもあるのですが、リダイレクトして別ファイルにするとやっぱり制御文字が残っていたりするので
ここはsedしたほうがいいとはおもうのですがいろんな文字などがあって想定するのは厄介だなぁと思いまして。
表示するときだけ気をつければいいのではということで以下の方法でやりすごせるそうです。

[Screen のログ機能とログファイルの閲覧](http://d.hatena.ne.jp/hkobayash/20110912/1315845060)
[Man page of LESS](https://linuxjm.osdn.jp/html/GNU_less/man1/less.1.html)
>-r または --raw-control-chars
「そのままの」制御文字を表示させるようにする。 デフォルトでは、制御文字をキャレット表記を使って表示する。 例えば、control-A (8 進数 001) は "^A" と表示される。 警告: -r オプションが指定されると、 less は (制御文字のタイプにどのように画面が反応するかに依存しているために) 画面の実際の状況の経過を追うことができない。 よって多くの場合、長い行が誤った位置で分割されてしまうといった問題が生じる。
-R または --RAW-CONTROL-CHARS
-r と似ているが、可能な場合には画面表示を正しく維持しようとする。 このオプションが有効なのは、入力が通常のテキストの場合である。 入力には ANSI の「カラー」エスケープシーケンスが含まれていてもよい。 このシーケンスは
       ESC [ ... m
のような形式で、"..." は "m" 以外の 0 個以上の文字である。 画面の状況を保つため、 全ての制御文字と ANSI カラーシーケンスは カーソルを移動させないと仮定している。 less に "m" 以外の文字を ANSI カラーエスケープシーケンスの終了文字として認識させることもできる。 そのためには、認識させたい終了文字のリストを 環境変数 LESSANSIENDCHARS に設定すればよい。


なのでこれからはscriptコマンドで記録したログは__lessの-rや-Rオプションで開く__ようにしましょう。

* * *
# 補足的な
Unix環境オンリーなら上記のようにやり過ごせるのですが、仕事柄どうしてもWindowsを強制されるので
なにかいい方法があればなぁと思ってはいるのですが、bashとかが前提なのでfishに落としこむ方法がわからないままです...
GentooInstallBattleなんかした日にはコピペでひとつずつ移すよりもきついことに...

* * *
## 他の参考
[tmuxを使いながらログを取る](http://qiita.com/docokano/items/8418cc1b2561df03e8d9)
[続・ラフなラボ – tmux 内で SSH した時のロギングを自動でやる](https://memo.laughk.org/2014/12/09/tmux-ssh-logging.html)

そもそもまともにログが取れなかったのですが、Save complete historyで取る方法もあるそうです
[tmux-plugins/tmux-logging: Easy logging and screen capturing for Tmux.]
(https://github.com/tmux-plugins/tmux-logging)
Scalaエンジニアになりたい [No.1]

#Scalaを使うワケ


##【Scalaの特徴】
・Javaをベースとしたオブジェクト指向言語の上に、関数型の機能を表現することで実現しています。

##【関数型プログラミング】
Scalaの関数型プログラミングは高性能!!(関数型は初めてですが...)
※以下の高性能な理由は集めて来たもので、わかり次第更新します
・case classによる代数的データ型
・静的に網羅性がチェックされるパターンマッチ
・implicit parameterによる型クラス
・forによるモナド構文
・モナドの型クラスの定義などに不可欠な高カインド型
・Scalaはオブジェクトの不変性（immutability）を意識している言語
・コレクションライブラリもmutableとimmutableでパッケージがわかれています
→  case classもデフォルトではimmutable
※不変性・参照透過性・純粋性は関数型プログラミングにおいて最も重要な概念

##【オブジェクト指向プログラミング】
関数型だけでなくオブジェクト指向においても様々な進化を遂げている
・traitによるmixin
・構造的部分型
・型パラメータの変位指定
・self type annotationによる静的な依存性の注入
・implicit class (conversion)による既存クラスの拡張
・private[this]などの、より細かなアクセス制限
・Javaのプリミティブ型がラップされて、全ての値がオブジェクトとして扱える
※Scalaのプログラミングでは特にtraitを使ったmixinによって、プログラムに高いモジュール性と、新しい設計の視点が得られる

##【Javaとの互換性】
・Javaのライブラリは普通にScalaから使うことができます。
Block　Designer Pro や画像スライダーのリピートアイテムをランダム表示する。


concrete5 でオリジナルのリピート要素なブロックを作れる Block Designer Pro.

時々、スライドショーなどで、順番通りじゃなくて、ランダムに表示させたい時があるので、その時の技。

view.php にリピートアイテム (例では $slideshow_items )の情報が格納されている array をシャッフルするコードを書きます。ただ、単に shuffle() を使うと、キーがめちゃくちゃになるので、キーだけを取り出して、その順番だけをシャッフルして、他の情報は追従するようにします。

注) $slideshow_items の「$slideshow」の部分は、自分が決めた repeatable のハンドルが使われるので、適宜変更してください。

```
$slideshow_item_keys = array_keys($slideshow_items);
shuffle($slideshow_item_keys);
foreach($slideshow_item_keys as $key){
    $slideshow_random_items[$key] = $slideshow_items[$key];
}
```

あとは view.php の foreach を $slideshow_items から $slideshow_random_items に変更すれば OK

というか、Ramon に機能追加要望を出したので、将来の Block Designer Pro にはオプションで登場するかも。


参考
http://www.programming-magic.com/20070905162631/
NiFi　JSONファイルのリクエストを受け付ける

RESTクライアントが送信したJSONファイルをNiFiで受ける方法です。
この例では、受け取った後JSONをパースして、それによって条件分岐もさせています。

#HTTPコンテキストを用意する
画面右上のController Settingsをクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/c57f39a5-77b0-6c63-ce94-146d37f53950.png)


右上の＋ボタンをクリックし、StandardHttpContextMapを選択して追加する。

![image](https://qiita-image-store.s3.amazonaws.com/0/119191/5e4004eb-2530-58a4-b4dd-ba78165dde8f.png)


これだけです :frowning: Webサーバ立てたりとか一切不要。

#HTTPリクエストのリスナーを作る
ProcessorアイコンをCanvasにドラッグ＆ドロップしてHandleHttpRequestを選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/bcb99cd4-3b91-aa63-62a0-aba7b5cdfb6f.png)

Propertyは以下のように設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/d9d065db-7784-4748-ce16-fe6f84c3df8b.png)
Listening Port: クライアントがアクセスしてくるポートを決めて入力
HTTP Context Map: さきほど作成したHTTPコンテキストを選択
Allowed Paths: クライアントがアクセスできるURLはhttp://<NiFiホスト名>:<さっき指定したポート番号>/<ここに指定したパス> になる。|で区切って複数指定できる。
Allow GET,PPOST... : AcceptするHTTPメソッドをtrueにする
Client Authentication : （あとで追記します）

#JSONパーサを作る

受け付けたJSONをパースしてNiFiのattributeに格納します。
さきほどと同様ProcessorをCanvasにドラッグ＆ドロップして、EvaluateJsonPathを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/657c0ae2-5bed-85e9-f5a6-fba7c79419d1.png)
Destination : flowfile-attributeでJSONの値がNiFiのAttributeに格納されます。Attributeを追加してやる必要があります（後述）
太字のは画像のように設定して、右上の+(New Property)をクリック
図ではattribute1, attribute2がAttribute名、\$.json_name1, \$.json_name2（$.以降）がJSONのNameになります。
たとえばJSONで
{
"json_name1":"json_value1",
"json_name2":"json_value2"
}
こういうのが来たら、attribute1にjson_value1が、attribute2にjson_value2が格納されます。

#格納したattributeで分岐させる
さきほどと同様ProcessorをCanvasにドラッグ＆ドロップして、RouteOnAttributeを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/16246b74-57ac-c78a-13ca-44e6af2aca2d.png)
Attributeを追加する。Propertyにattribute名、valueに条件文を書きます。条件文はNiFi Expression記法に従って書きます。例ではfilenameが文字列oneを含む場合、case1にtrueが返ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/2cf22893-af84-8217-1567-29cb23372596.png)
さて、case1がtrueのときはPutFileにつなげたいとします。RouteOnAttributeからPutFileにドラッグします。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/88c18880-b3e0-e8c5-7396-507e15f21071.png)
RouteOnAttributeとPutFileの間にconnectionが生成され、設定画面が表示されます。
For relationshipsにてcase1にチェックを入れます。
これでcase1がtrueのときはこのconnectionを通るようになります。
同様に、case2がtrueのときはちがうプロセッサにつなげたいのであれば、RouteOnAttributeとそのプロセッサ間をドラッグし、connectionでcase2にチェックを入れます。

#テストする
ツールはいろいろあるようですが、[RestClient](https://addons.mozilla.org/ja/firefox/addon/restclient/)というFireFoxのアドオンが便利です。
![image](https://qiita-image-store.s3.amazonaws.com/0/119191/601f52ef-3597-dc9b-0b07-9d36eb6c4950.png)
ローカルのプロジェクトをGitHubへアップロードする方法


恥ずかしながらGit, GitHub共にまだまだ不慣れです。
GitHubでリポジトリを作成した後に表示される手順通りですが、自分の言葉で書かかないと覚えないのでメモしておきます。

## 開発環境 
- MacOS X Yosemite
- gitはインストールしてあること。
- GitHubのアカウントは作成済みであること。

## 手順

GitHubのマイページにある`Repositories`タブを開き、`New`ボタンを押下します。
リポジトリ名（プロジェクト名）を入力して、空っぽの新規レポジトリを作成しておきます。


次に、ローカルで以下を実行します。

```
# GitHubへアップロードしたいプロジェクトディレクトリへ移動
$ cd /path/to/your/project
$ git init

# 必要であれば.gitignoreを作成し、バージョン管理しないファイルやディレクトリを記載（例：*.log）
$ vim .gitignore

# プロジェクトディレクトリ内にあるファイルやディレクトリを全てコミット 
$ git add .
$ git commit -m "Initial Commit"

# 先ほど作成したGitHubリポジトリのURLをコピー&ペーストして、リモートブランチとして設定
git remote add origin https://github.com/your-name/project-name.git

# ローカルのファイルをアップロード
git push -u origin master

```

ユーザ名とパスワードと聞かれたら、GitHubのアカウントものを入力します。
成功すると、ファイルがアップロードされた旨のログが表示されます。
GitHubのプロジェクトページをリロードすると、Pushしたファイル達がいるはずです。
Sweet!!

### Special Thanks

参考にさせて頂きました。ありがとうございました！

- [既存のディレクトリをGit管理化して、それを基にリモートリポジトリを作る](http://d.hatena.ne.jp/naokibtn/20130217/1361120970)
左右対象、上下対象の図形を描く時はtranslateとscaleを使う

左右対称、上下対象、鏡面の図形を描くことが多いのでメモ。
Canvasに書いてるけど他の描画ライブラリ(cairoとかPDFlibとか)でも使える。

## 例題:100px x 100pxのキャンバスの四隅から(10px, 10px)の場所に20pxの正方形を描く

こんな図形を描く場合。

![スクリーンショット 2016-04-17 21.32.35.png](https://qiita-image-store.s3.amazonaws.com/0/773/8dfdce05-65f0-f88b-5aa6-40218b4c95a2.png)

### A: 足し算引き算で描く

足し算引き算での座標の計算を行う。大変。

```js
var draw1 = function(canvas) {
  var ctx = canvas.getContext('2d');
  var canvasWidth = canvas.getAttribute('width');
  var canvasHeight = canvas.getAttribute('height');

  var rectWidth = 20;
  var rectHeight = 20;

  var offsetX = 10;
  var offsetY = 10;

  ctx.beginPath();
  ctx.strokeRect(0, 0, canvasWidth, canvasHeight);

  [
    [offsetX,                           offsetY],
    [offsetX,                           canvasHeight - offsetY - rectHeight],
    [canvasWidth - offsetX - rectWidth, offsetY],
    [canvasWidth - offsetX - rectWidth, canvasHeight - offsetY - rectHeight]
  ].forEach(function(a) {
    var x = a[0];
    var y = a[1];
    ctx.beginPath();
    ctx.strokeRect(x, y, rectWidth, rectHeight);
  });
};
```

### B: translateとscaleを使う

原点の位置を変更するtranslateと座標の変化量を変更するscaleを使う。strokeRectの引数を変更しなくてよい。

```js
var draw2 = function(canvas) {
  var ctx = canvas.getContext('2d');
  var canvasWidth = canvas.getAttribute('width');
  var canvasHeight = canvas.getAttribute('height');

  var rectWidth = 20;
  var rectHeight = 20;

  var offsetX = 10;
  var offsetY = 10;

  ctx.beginPath();
  ctx.strokeRect(0, 0, canvasWidth, canvasHeight);

  [
    [0,           0,             1,  1], // 左上
    [canvasWidth, 0,            -1,  1], // 右上
    [0,           canvasHeight,  1, -1], // 左下
    [canvasWidth, canvasHeight, -1, -1]  // 右下
  ].forEach(function(a) {
    var translateX = a[0];
    var translateY = a[1];
    var scaleX = a[2];
    var scaleY = a[3];
    ctx.save();
    ctx.translate(translateX, translateY);
    ctx.scale(scaleX, scaleY);
    ctx.strokeRect(offsetX, offsetY, rectWidth, rectHeight);
    ctx.restore();
  });
};
```

## 図形を描くメソッドの中でもtranslateをつかう。

あるx, yに図形を描くメソッドを定義するとき、translateを使うと便利。
ついつい足し算引き算の方法で定義してしまいがちだけど、

```js
function myRect1(ctx, x, y, width, height) {
  ctx.beginPath();
  ctx.moveTo(x, y);
  ctx.lineTo(x + width, y);
  ctx.lineTo(x + width, y + height);
  ctx.lineTo(x, y + height);
  ctx.lineTo(x, y);
  ctx.stroke();
}
```

このようにtranslateを使ったほうが足し算引き算が消えて読みやすくなる。

```js
function myRect2(ctx, x, y, width, height) {
  ctx.save();
  ctx.translate(x, y);
  ctx.beginPath();
  ctx.moveTo(0, 0);
  ctx.lineTo(width, 0);
  ctx.lineTo(width, height);
  ctx.lineTo(0, height);
  ctx.lineTo(0, 0);
  ctx.stroke();
  ctx.restore();
}
```

複雑な図形を描く場合、この足し算しの有無が読みやすさに影響してくる。

## コード

- https://bitbucket.org/snippets/troter/b6RAe
rm -rf /は実行されないのが正しい？

いくつかのUnixプラットフォームではrm -rf /はエラーになり実行されない。これは余計なおせっかいで実行されるべきだと言う人もいるが、最新のPOSIXに従うのなら「実行されない」のが正しい。[POSIX.1-2008](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/rm.html)ではrmについて、「引数がルートディレクトリを指しているなら、標準エラーに診断メッセージを出力して、それ以上何もしてはならない」と定めている。
>if an operand resolves to the root directory, rm shall write a diagnostic message to standard error and do nothing more with such operands.

[POSIX.1-2004](http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html)にはこの記述はないので、最新の規格に従ってないrmではrm -rf /が普通に実行される可能性がある。

実装を調べてみると、2003年12月にリリースされたcoreutils 5.1.0以降のrmでは、--no-preserve-rootオプションを付けない限りrm -rf /は実行されない。すべての現役のLinuxディストリビューションではrm -rf /は実行されないと言っていいだろう。FreeBSD 5.5以降やSolaris 10以降でもrm -rf /は実行されない。しかし、それ以外のプラットフォームでは実行されてしまうようだ。

最新の規格としてはrm -rf /は実行されないことになっているけれども、実行されるプラットフォームも多いので当てにしないほうがいいということになる。
Githubを使いやすくする：issueのテンプレート作成

# 1. テンプレートファイルの新規作成

新規ファイルの作成は以下の `New file` から行う。  
![image](https://qiita-image-store.s3.amazonaws.com/0/71613/f884c272-134b-cf9a-da5a-349331c97581.png)


# 2. issue テンプレート設定
![image](https://qiita-image-store.s3.amazonaws.com/0/71613/310d28e8-ded6-fe13-e870-2f8c6d883eac.png)


## テンプレートの作成

* 隠しフォルダにテンプレートを格納したい場合は、①のように `.github/` とディレクトリを切ってその配下に `ISSUE_TEMPLATE.md` を作成
* ルートディレクトリの見えるところに配置したい場合は、そのまま `ISSUE_TEMPLATE.md

※②のファイル名は大文字小文字の区別がされません。

## テンプレート内容記入

③のようにMarkdownで記入できます。  


# テンプレート機能を導入してみて
チームで作業をする際、記入内容が明確になってissue内容の把握がしやすくなりました。
ぜひ使ってみてほしい機能です！
Githubを使いやすくする：pull requestのテンプレート作成

# 1. テンプレートファイルの新規作成

新規ファイルの作成は以下の `New file` から行う。  
![image](https://qiita-image-store.s3.amazonaws.com/0/71613/1052f5d2-0932-8659-d519-d77394384b79.png)


# 2. pull request テンプレート設定
![image](https://qiita-image-store.s3.amazonaws.com/0/71613/8f4506cd-665f-7f75-81d6-3234a10ce2f4.png)

## テンプレートの作成
* 隠しフォルダにテンプレートを格納したい場合は、①のように `.github/` とディレクトリを切ってその配下に `PULL_REQUEST_TEMPLATE.md` を作成
* ルートディレクトリの見えるところに配置したい場合は、そのまま `PULL_REQUEST_TEMPLATE.md`

※②のファイル名は大文字小文字の区別がされません。

## テンプレート内容記入

③のようにMarkdownで記入できます。  
<b>`Fixes # .` のように記入しておくと、issueの閉じ忘れを防げます！</b>

# テンプレート機能を導入してみて
とにかくプルリクエストと紐付けて issue を閉じたいのに、閉じ忘れることが多すぎて・・・。  
それが解消できただけでも使ってよかったと思う機能です。
Active Record　※モデルへのクエリ　[ 自分用メモ ]

参考サイト
Rails4まとめ - Modelのクエリ -
http://qiita.com/merrill/items/8ec158953cb4c2715c7b

Railsのモデルの作成、検索、更新、削除のよく使うメソッドのまとめ
http://ruby-rails.hatenadiary.com/entry/20140724/1406142120
linuxの開発環境をDockerを用いてmacに構築する流れメモ

--------------------------

### 1. Virtual boxなど仮想化ツールをインストール

### 2. dockerをホストPC(ここではmac)にインストール。
ここからインストール: [Installation on Mac OS X - Docker Docs](https://docs.docker.com/engine/installation/mac/)

### 3. Daemonを走らせる

docker quick start terminalでdaemonを走らせる。daemonが走っていないとdocker daemonに接続できず、containerの状況などを確認できない
### 4. イメージをインストール

最初のイメージをインストール。この際、OSを選択する。tagをつけなければそのイメージの最新版が選ばれる。

```
docker pull ubuntu:latest
```

### 5. イメージからコンテナを作成し起動させる

イメージからコンテナを起動させる

```
docker run -i -t <name of image>
```

この時、オプションをつけないで起動してしまうと、後々コンテナからイメージを作成しようとするときになんかうまくいかなかった。

### 6. コンテナ内で作業して、exitする

### 7. イメージ一覧を確認する
```
docker images
```

### 8. コンテナ一覧を確認する
現在動いているコンテナ:

```
docker ps
```

全てのコンテナ

```
docker ps -a
```

### 9. 再度コンテナの中に入る
exitするとコンテナがストップするので、再度起動する

```
docker start <container_id>
```
コンテナに接続する

```
docker attach <container_id>
```

### 10. コンテナからイメージを作成する

```
docker commit <container_id> <name_of_new_image>
```

### 11. (作成したイメージからコンテナを起動させる)

続く。
CakePHP3のメール送信はMailerクラスにすっきりまとめよう

CakePHP3.1からMailerクラスが導入されており、メール送信機能をまとめることが出来るようになっています。

## 使い方

### Mailerクラスの作成

**src/Mailer/UserMailer.php** を作成します。

```php
<?php
namespace App\Mailer;

use Cake\Mailer\Mailer;

class UserMailer extends Mailer
{
    public function welcome($user)
    {
        // $thisからEmailクラスにアクセス可能
        $this
            ->profile('default')
            ->to($user->mail)
            ->subject('タイトル')
            ->template('welcome_mail')
            ->layout('default');
    }

    public function resetPassword($user)
    {
        // パスワードリセットメール送信等々、User関連のメール送信機能を作成
    }
}


```

### Mailerクラスへアクセス(コントローラーからアクセス)

```php
<?php
namespace App\Controller;

// MailerAwareTrait追加
use Cake\Mailer\MailerAwareTrait;

class UsersController extends AppController
{
    // MailerAwareTrait追加(getMailer()が実装されてる)
    use MailerAwareTrait;

    public function register()
    {
        $user = $this->Users->newEntity();
        if ($this->request->is('post')) {
            $user = $this->Users->patchEntity($user, $this->request->data())
            if ($this->Users->save($user)) {

                // UserMailerを取得して、welcome でメール送信する
                $this->getMailer('User')->send('welcome', [$user]);

            }
        }
        $this->set('user', $user);
    }
}
```
GitBucketで利用しているh2 databaseにターミナルから接続する

プロジェクトで利用しているGitBucketが3.8なので、h2は1.4系を利用。(GitBucket2.2で1.4系になった模様)

1.3と1.4ではファイルDBの名前や、jdbcのurlの指定方法などが若干異なっているので注意が必要。

* [h2 database 1.3.176 -> 1.4.177 の非互換 - Qiita](http://qiita.com/seratch@github/items/fe2e9b7666389c431283)

また、異なるバージョンのドライバを利用すると、DBファイル名が合わずDBが参照できない。

[GitBucketのissue](https://github.com/gitbucket/gitbucket/issues/533) を参考にして、思考停止でh2をダウンロードしてきたらハマったので、注意(完全に自分の不注意)。

1.4系は以下から取得する。

* [h2 donwloads](http://www.h2database.com/html/download.html)

Linuxで利用したいので、Platform-Independent Zipを取得。

```bash
$ unzip h2-2016-01-21.zip
```

解凍したh2/bin/h2.shを実行するとh2コンソールがブラウザで立ち上がるので、

```bash:h2/bin/h2.sh                                                                                                                   
#!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-1.4.191.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"
```

![thumb_H2コンソール_1024.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/0f5db913-d376-3c31-c925-719ff4e153c1.jpeg)

このファイルをコピーしてターミナルで立ち上がるように編集する。
`org.h2.tools.Console` を `org.h2.tools.Shell`に変更するだけ。

```bash:h2/bin/h2_terminal.sh
!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-1.4.191.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Shell "$@"
```

こんな感じで繋がる。

```
$ sudo sh h2/bin/h2_terminal.sh                                                                                                     

Welcome to H2 Shell 1.4.191 (2016-01-21)
Exit with Ctrl+C
[Enter]   jdbc:h2:~/.gitbucket/data
URL
[Enter]   org.h2.Driver
Driver
[Enter]   sa
User
[Enter]   Hide
Password  sa
Connected
Commands are case insensitive; SQL statements end with ';'
help or ?      Display this help
list           Toggle result list / stack trace mode
maxwidth       Set maximum column width (default is 100)
autocommit     Enable or disable autocommit
history        Show the last 20 statements
quit or exit   Close the connection and exit

sql> select * from account;
USER_NAME | MAIL_ADDRESS   | PASSWORD                                 | ADMINISTRATOR | URL                                    | REGISTERED_DATE         | UPDATED_DATE            | LAST_LOGIN_DATE         | IMAGE | GROUP_ACCOUNT | FULL_NAME | REMOVED
root      | root@localhost | dc76e9f0c0006e8f919e0c515c66dbba3982f785 | TRUE          | https://github.com/gitbucket/gitbucket | 2016-04-13 01:45:44.093 | 2016-04-13 01:45:44.093 | 2016-04-13 01:46:05.268 | null  | FALSE         | root      | FALSE
test      | test@devnull   |                                          | FALSE         | null                                   | 2016-04-13 01:46:27.259 | 2016-04-13 01:46:27.259 | null                    | null  | TRUE          | test      | FALSE
(2 rows, 8 ms)
sql>
```

なお、h2がserver modeで起動していなくてGitBucketが立ち上がっていると以下のようなエラーが出る。とりあえずGitBucketを止めれば繋がるはず。

```bash
Password  sa
SQL Exception: Database may be already in use: "/private/var/root/.gitbucket/data.h2.db". Possible solutions: close all other connection(s); use the server mode [90020-191]
```
RealmとGsonで10分くらいハマった話。あと解決方法。

Realmを導入したら通信時にこんなログがで続けてハングアップした。

```
concurrent mark sweep GC freed 76220(1711KB) AllocSpace objects, 77(2MB) LOS objects, 29% free, 8MB/12MB, paused 5.798ms total 50.613ms
```

RealmObjectの内容をGsonがJSON文字列にしようとしてるいるのが原因でした。

不便ですがJson化したいオブジェクトはRealmObjectにできない。。。
かとおもいきや。

```java
    public static Gson gson() {
        return new GsonBuilder()
                .setExclusionStrategies(new ExclusionStrategy() {
                    @Override
                    public boolean shouldSkipField(FieldAttributes f) {
                        return f.getDeclaringClass().equals(RealmObject.class);
                    }

                    @Override
                    public boolean shouldSkipClass(Class<?> clazz) {
                        return false;
                    }
                })
                .create();
    }
```

解決できました。

##参考
Merging Realm object & Gson object
- http://stackoverflow.com/questions/26275143/merging-realm-object-gson-object
Azure Function App で Rocket.Chat Bot を作る

あえてね。
ただの遊びです。

## Function App を作成する

Azureポータルから、新規 -> Web + モバイル -> Function App を選択。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/c3650002-ad52-a213-657a-422f89561b09.png)

アプリ名やらプランやらを好きに設定して、作成。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/b372aab6-985a-f4f5-d11c-c8da11265b62.png)

Function を作成。
テンプレートがたくさん表示されるのでやりたい事に応じて。
今回は Generic WebHook を使う。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/df91d673-dee1-be7b-8856-b9f1f29674e5.png)

単純なメッセージを返すようにコードを変更。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/33cf8275-4151-bd24-9c86-4801efeddaa5.png)



Integrate タブでアウトプットを設定できるが、今回は変更の必要なし。
Function URL をコピーしておく。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/73e9b9e6-821c-fb9e-6ea6-ff2d62ab9c27.png)



## Rocket.Chat に WebHook を登録
RocketChatへの投稿をトリガーにしたいので、Outgoing WebHook を登録。

トリガーになる言葉とURLを設定する。URLは Azure Function のURL。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/b2911080-957a-f8ed-ef9f-0835b68c0b96.png)

チャンネルや投稿ユーザーは適宜作成しておく事。
保存して完成。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/a39af4d7-805a-d717-e524-26cce8a7a74e.png)
Docker で Ruby 開発環境

# Dockerfile 作成

```bash
$ mkdir test
$ cd test
$ vim Dockerfile
```

```:Dockerfile
FROM polleverywhere/rbenv

ENV RUBY_VERSION 2.1.3

RUN apt-get update -q \
  && apt-get -q -y install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libmysqlclient-dev mysql-client \
  && rbenv install $RUBY_VERSION \
  && rbenv global $RUBY_VERSION \
  && apt-get purge -y -q autoconf bison build-essential libssl-dev zlib1g-dev \
  && apt-get autoremove -y \
  && rm -rf /var/lib/apt/lists

RUN gem install --no-ri --no-rdoc bundler
RUN rbenv rehash
```

# イメージのビルド

```bash
$ docker build -t y-okubo/rails-server:latest .
```

# コンテナの作成と実行

```bash
$ docker run --name mywebapp  -v /Users/y-okubo:/y-okubo --link mydb:mysql -p 8080:80 -it y-okubo/rails-server
```
x86でbus errorを起こす

# はじめに

x86システムでは、あまりbus errorは見かけない。どういう場合にbus error (SIGBUS)が発生するか調べた。タイトルにはx86と書いたが、一応SPARCも調べた。

# Bus errorについて

Bus error (SIGBUS)は、その名の通りバスで発生したエラー。CPUが物理メモリにアクセス要求を出した時にエラーが起きると発生する(ということになっている)。普通、ユーザプログラムから見えているのは論理アドレスであり、物理アドレスを直接触ることは無いことから、ユーザプログラムからBus errorを起こすことは難しい。また、アラインメントエラーなどでも起きることが知られているが、x86ではアライメントのチェックが通常はオフになっているため、これは起きない。とりあえず調べた限りにおいては、「SIGBUSを発生させるシステムコールを呼ぶ」「アラインメントチェックを有効にした上でアラインメントエラーを起こす」の二通りでBus errorを起こせることがわかった。

# mmapを使う

[StackOverflow](http://stackoverflow.com/questions/2069450/how-to-get-a-bus-error)にあった例。mmapで確保した領域外を触るとSIGBUSが出る。

```c:bus.c
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
int main() {
    FILE *f = tmpfile();
    int *m = (int*)mmap(0, 4, PROT_WRITE, MAP_PRIVATE, fileno(f), 0);
    *m = 0;
    return 0;
}
```
```shell-session
$ gcc bus.c
$ ./a.out
[1]    16871 bus error  ./bus
```
man mmapにもその旨の記述がある。

>The system shall always zero-fill any partial page at the end of an object. Further, the system shall never write out any modified portions of the last page of an object which are beyond its end. References within the address range starting at pa and continuing for len bytes to whole pages following the end of an object shall result in delivery of a SIGBUS signal.

また、mmapの[ソース](http://lxr.free-electrons.com/source/mm/mmap.c#L3063)でも明示的にVM_FAULT_SIGBUSを返している。

# アラインメント不整合の例

[ここ](http://orchistro.tistory.com/206)で見つけた、charで確保しておいてintでアクセスする例。

```c:bus2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *p = (char*)malloc(sizeof(int) + 1);
    memset(p, 0, sizeof(int) + 1);
    p++;
    printf("%d\n", *(int *)p);
    return 0;
}
```

これはアラインメント不整合があるにもかかわらず、正常終了する。これはx86のEFLAGSのAlignment Check (AC)フラグがオフになっているから。これをオンにするとBus errorが発生する。

```c:bus2p.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    asm( "pushf\n\torl $0x40000,(%rsp)\n\tpopf");
    char *p = (char*)malloc(sizeof(int) + 1);
    memset(p, 0, sizeof(int) + 1);
    p++;
    printf("%d\n", *(int *)p);
    return 0;
}
```

なお、ACフラグをオンにしていても、Mac OS Xではbus errorは起きず、正常終了する。

# 文字列領域への不正アクセス

文字列領域にアクセスしてみる。

```c:bus3.c
#include <stdio.h>
#include <stdlib.h>

int
main(void){
  char *s = "test";
  s[0] = '0';
  printf("%s\n",s);
}
```

これは、LinuxではSegmentation Fault (SIGSEGV)になるが、MacではBus errorを出す。

```shell-session

$ clang bus3.c
$ ./a.out
Bus error: 10
```

# まとめ

まとめるとこんな感じ。Cygwinの結果も入れてみた。あとSPARCのLinuxシステムがあったので、そこでも調べてみた(インラインアセンブリ使ってるbus2p.cは除く)。

|       | bus.c    | bus2.c   | bus2p.c| bus3.c|
|:------|:---------|:------|:---------|:--------|
| Linux | SIGBUS   | 正常終了 | SIGBUS | SIGSEGV|
| Mac OS X | SIGBUS   | 正常終了 | 正常終了 | SIGBUS|
| Cygwin | SIGBUS   | 正常終了 | 正常終了 | SIGSEGV|
| SPARC | SIGSEGV   | SIGBUS | ---- | SIGSEGV|


今時のx86システムにおいて、明示的にアラインメントチェックを有効にしてアラインメント不整合アクセスをするか、SIGBUSを出すシステムコールを使わない限り、Bus errorはユーザプログラムからは出てこない感じ。例外はMacで、[SIGBUSとSIGSEGVの区別が曖昧](http://togetter.com/li/253717)という指摘もあり、文字列にアクセスするだけでbus errorが出る。同じLinuxでもSPARCだと、動作がかなり異なる。アラインメント不正でSIGBUSを出すのはそうだと思うけど、mmapの不正でSIGSEGVを出すのはなぜかよくわからない(POSIXで決まってることじゃないのかな？)。

っていうか調べたシステム全てで動作が全部違うって嫌だなぁ。
Ruby技術者認定試験Silver 2.1 学習用の個人的なメモ　その８

##Ruby技術者試験合格教本Silver 模擬試験
| 番号 |解答 | 正解 | 番号 |解答 | 正解 | 番号 |解答 | 正解 |
|-----|-----|-----|------|----|-----|-----|-----|-----|
| 1   |1,4  | ○   | 11   |4   |  ○  | 21  |2    | ○
| 2   |3    | ○   | 12   |3   |  ○  | 22  |3    | ○
| 3   |1,4  | ○   | 13   |2   |  ○  | 23  |3    | ○
| 4   |4    | ○   | 14   |3   |  ○  | 24  |1    | ○
| 5   |2    | ○   | 15   |4   |  ○  | 25  |1    | 4
| 6   |4    | ○   | 16   |2   |  ○  | 26  |1    | ○
| 7   |1    | ○   | 17   |1   |  ○  | 27  |1,4  | ○
| 8   |4    | ○   | 18   |3   |  ○  | 28  |1    | ○
| 9   |2    | 1   | 19   |1   |  ○  | 29  |1,2  | 1,2,4
| 10  |1    | ○   | 20   |2   |  ○  | 30  |3    | ○
-3

```9.rb
p ?A # --> "A"
```

```25.rb
a = [:a, :a, :b, :c]
a[5] = :e
p a.concat([:a, :b, :c]) # 破壊的
p "1----------"
p a.compact              # 破壊的ではない
p "2----------"
p a.uniq                 # 破壊的ではない
p "3----------"
p a                      # [:a, :a, :b, :c, nil, :e, :a, :b, :c]

[:a, :a, :b, :c, nil, :e, :a, :b, :c]
"1----------"
[:a, :a, :b, :c, :e, :a, :b, :c]
"2----------"
[:a, :b, :c, nil, :e]
"3----------"
[:a, :a, :b, :c, nil, :e, :a, :b, :c]
```


```29.rb
a = ["a", "b", "c"]
b = [1, 2, 3]
p [a, b] # [["a", "b", "c"], [1, 2, 3]]
[a, b].transpose.each{|x, y| p [x, y]} # transpose は ２次元配列の行と列を入れ替える

[["a", "b", "c"], [1, 2, 3]]
["a", 1]
["b", 2]
["c", 3]
```



| 番号 |解答 | 正解 | 番号 |解答 | 正解 | 番号 |解答 | 正解 |
|-----|-----|-----|------|----|-----|-----|-----|-----|
| 31  |3    | ○   | 41   |1   |  2  |  |    | 
| 32  |1    | ○   | 42   |2   |  3  |  |    | 
| 33  |3    | ○   | 43   |4   |  ○  |  |    | 
| 34  |2    | 4   | 44   |2   |  ○  |  |    | 
| 35  |1    | ○   | 45   |3   |  1  |  |    | 
| 36  |2    | ○   | 46   |2   |  ○  |  |    | 
| 37  |4    | 3   | 47   |5   |  ○  |   |  | 
| 38  |4    | 3   | 48   |1   |  4  |   |    | 
| 39  |3    | ○   | 49   |3   |  4  |   |    | 
| 40  |4    | 3   | 50   |4   |  ○  |   |    | 
-12


```34.rb
x = "Hello, World.\n"
x.chop # 破壊的でない
x.chop # 破壊的でない
x.chomp # 破壊的でない
p x # 結果変わらない
```

```37.rb
puts "0123456789-".delete("^13-56-") # ^が指定されているので以外という意味になる
puts "0123456789-".delete("13-56-")

13456-
02789
```

```38.rb
/^[0-9].$/       # 2文字目以降が数字でなくてもヒットする
/^[0-9]*$/       # 空行でもヒットする
/^[0-9][0-9]*$/  # 数字のみでヒットする
/^[0-9][0-9].*$/ # 3文字目以降が数字でなくてもヒットする
```

```40.rb
p 65.chr  # --> "A"
p "A".ord # --> "65"
```

```41.rb
p "HogeHOGEhoge"[/[A-Z][^A-Z]+/] # --> "Hoge"
```

```42.rb
syntax error, unexpected ':', expecting =>
h = {"a":1, "b":2}

# 2.2 以降はエラーにならない
```

```45.rb
a = {"Hoge"=>"Huga", "Bar"=>"Foo"}
b = {"Hoge"=>"huga", "Bar"=>"foo"}

p a.update(b).sort{ |a,b| a[1] <=> b[1]} # updateしてから値の昇順にするsortは配列を返すのみ

[["Bar", "foo"], ["Hoge", "huga"]]
```

```48.rb
puts File.join("/","user","test") # --> /user/test
```

```49.rb
t = Time.local(2000,1,1)
print (t.strftime("%Y/%m/%d\n"))

2000/01/01
```
SORACOMリレーブログ2016年4月27日分「RaspberryPiでセンサーデータをfluentdを使ってDynamoDBに送って可視化してみよう」

##**概要**
###これは[ソラコム](https://soracom.jp/)の[Software Design誌 巻頭特集記念リレーブログ](https://blog.soracom.jp/relay-blog/2016-04/)4月27日分です。###
4月26日の[「Raspberry Pi でSORACOM 接続＋MQTTをしてみよう」](http://qiita.com/dietposter/items/831e78393bb9b0c4ff8e)との連続企画となっており、当該記事で構築した環境をそのまま利用します。
なお、本記事は4月9日に**JAWS-UG 関西IoT専門支部**が開催した[「[1-2]春のIoTリレーハンズオン@関西＜AWS連携 + 可視化編＞」](https://jawsugosaka.doorkeeper.jp/events/39735)のハンズオン用コンテンツが元になっています。春のIoTリレーハンズオン@関西の開催経緯については[こちら](http://qiita.com/dietposter/items/831e78393bb9b0c4ff8e#春のiotリレーハンズオン関西プロジェクトについて)をご覧ください。
本記事では、下図の通りIoTデバイス(RaspberryPi)でセンシングしたデータを[リアルタイムで可視化](http://iot.kyoto)します。通信にはSORACOM AirやWi-Fiなどが利用できます。
![スクリーンショット 2016-04-21 14.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/80392/989c03b4-4479-373a-b785-2b08c5b35bc1.png)
最後までやり切れば、RaspberryPi単体で稼働させることができるようになります。実際に勤務先の私のデスク上で常時稼働させて照度データを取り続けています。(徹夜してる人がいると丸わかりですww)
![Rpi.jpg](https://qiita-image-store.s3.amazonaws.com/0/80392/ce51ff85-91c1-58cd-8d4c-d7c2149ab9e6.jpeg)

##**前提条件**
* [パーツリスト](https://docs.google.com/document/d/11PIw4fH0CcS7tIbD4NR5wP0c3uY0BVRRfQghx0nIu_I)に記載のパーツが揃っていること
* 4月26日の[「Raspberry Pi でSORACOM 接続＋MQTTをしてみよう」](http://qiita.com/dietposter/items/831e78393bb9b0c4ff8e)で構築した環境で、照度センサーの値が取得できていること
* SORACOM AirまたはWi-Fiでインターネットに接続できること
* 当記事はRASPBIAN JESSIE 2016-03-18版がインストールされた環境を元に作成しています

##**記事へのリンク**
コンテンツは＜完全編＞と＜上級編＞の2パターンがあり、扱う内容は全く同じでスキルレベルに合わせて選択できるようになっています。慣れている方で所要時間2～3時間程度です。
###[RaspberryPiでセンサーデータをfluentdを使ってDynamoDBに送って可視化してみよう<BR>**＜完全編＞**](http://qiita.com/Ichiro_Tsuji/items/fce61bdd5974a2c9cf14)
全ての内容が記されています。基本的にコピペで最後までいけます。

###[RaspberryPiでセンサーデータをfluentdを使ってDynamoDBに送って可視化してみよう<BR>**＜上級編＞**](http://qiita.com/Ichiro_Tsuji/items/05a3f84b1d6c8d6e21d7)
LinuxやAWSの基礎的なスキルを有している方向けに＜完全編＞の記述内容を簡略化することで、試行錯誤やデバッグを行いながら学習できるように配慮されています。行き詰まった場合は、各章の先頭に＜完全編＞へのリンクを配置していますので、適宜参照して下さい。

##**ハンズオンの様子**##
2016年4月9日[The DECK](http://thedeck.jp)にて[「[1-2]春のIoTリレーハンズオン@関西＜AWS連携 + 可視化編＞」](https://jawsugosaka.doorkeeper.jp/events/39735)を開催しました。約15名の参加者全員が可視化に成功、8割の方が完走されています。
![IMG_1589.jpg](https://qiita-image-store.s3.amazonaws.com/0/80392/7486f15b-e3f4-7833-b4e7-632f4ff972a5.jpeg)
###参加いただいた方の感想
* PC無しに単独でセンサー情報を収集できるところまでいけて満足感がありました
* 上級編でやってみて、分からなかったら答えがあるというやり方はいいなと思いました
* デバイス＋クラウド同時に学べる事が出来、非常に有意義な勉強会でした
* fluentdは全く知らなかったので知るいい機会でした
実機でスプラッシュ画像が表示されない時の対処法

# 概要
iOSアプリ開発で実機のiPhone6を使ってスプラッシュ画面の確認をしていたのですが、画像を変更した際にどうもうまく反映されない事があり、、多少はまったので解消法をまとめておきます。

# スプラッシュ画像が反映されないと思ってまず確認すること
まずはこの辺りを試してみます。

* cleanしてbuildする
* LaunchScreen.stroryboardに設定したImageViewを消して新しく作り直してみる
* 一度画像を消して新しく画像を設定する
* 画像が.pngになっているか確認する
 * [実機で画像が表示されない](http://qiita.com/nagatasci/items/625c598f1ac6b6019e71)
 * [LauchScreen上の画像がシミュレータだと表示されるのに、実機だと真っ黒になる問題](http://qiita.com/Ma-tsu-ne/items/fd57f06d7897dd659ba4)


# シュミレーターの場合
上記でダメな場合シュミレーターであればこちらを試してみます。

* シュミレーターのキャッシュを消す

<img width="248" alt="スクリーンショット 2016-04-17 19.46.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/bfd902c7-8571-1596-5493-78c7f4ad3551.png">

シュミレーターであればだいたいこれで解決すると思います。


# 実機の場合
実機の場合はこちらを試してみます。

* アプリを削除して入れ直す
* **1日ほど待ってみてた後にもう一度確認する**

自分の場合は上記で色々と試してみたのですが、実機ではアプリを消して入れ直しても前のキャッシュが残ったままでなかなか修正したものを反映してくれず、、
結果的に1日経った後にもう一度実機でビルドしたら反映してくれました。。


# 終わりに
1日経ったら問題が解決される、、エンジニアあるあるだなぁと思った出来事でした。笑
Docker イメージ削除

# コンテナ一覧

```bash
$ docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                       PORTS               NAMES
51bd4812607d        fc3d6eb83e94           "/bin/sh -c 'apt-get "   6 minutes ago       Up 6 minutes                                     adoring_goldberg
94affe498e2d        polleverywhere/rbenv   "/bin/bash"              9 minutes ago       Exited (127) 9 minutes ago                       berserk_galileo
1c1a1cda521f        polleverywhere/rbenv   "/bin/bash"              9 minutes ago       Exited (0) 9 minutes ago                         insane_stallman
9ded76785ea0        polleverywhere/rbenv   "/bin/bash"              9 minutes ago       Exited (0) 9 minutes ago                         pedantic_ride
1b6edaf9695d        hello-world            "/hello"                 23 minutes ago      Exited (0) 23 minutes ago                        furious_elion
```

# コンテナ削除

```bash
$ docker rm 1b6edaf9695d
1b6edaf9695d
$ docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                       PORTS               NAMES
51bd4812607d        fc3d6eb83e94           "/bin/sh -c 'apt-get "   7 minutes ago       Up 7 minutes                                     adoring_goldberg
94affe498e2d        polleverywhere/rbenv   "/bin/bash"              9 minutes ago       Exited (127) 9 minutes ago                       berserk_galileo
1c1a1cda521f        polleverywhere/rbenv   "/bin/bash"              9 minutes ago       Exited (0) 9 minutes ago                         insane_stallman
9ded76785ea0        polleverywhere/rbenv   "/bin/bash"              9 minutes ago       Exited (0) 9 minutes ago                         pedantic_ride
```

地道に消していく

# イメージ削除

```bash
$ docker rmi polleverywhere/rbenv
Untagged: polleverywhere/rbenv:latest
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              fc3d6eb83e94        7 minutes ago       95.94 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
```

ようやく削除できた

# 参考
* http://blog.n-z.jp/blog/2013-12-24-docker-rm.html
視認性を犠牲にせずに,Windows10を速攻軽量化。

AndroidStudioをWindows10で日常使いする必要になってから,しばしば"重い体験"をするようになったので,windows10のお気軽な軽量化に挑戦(内容は初歩的なもの)。作業時間は,フォントの選定時間を5分程度と見込んで10分くらい。
=> 前提:RAMはそこそこ積んでいるPC(RAM:8GB)

# 少し推奨 :　Cortanaの"文字入力経由"でwindows機能を呼び出し
現時点のWindows10では,**Windowsキー+S** で呼び出せるCortana"文字入力画面"にキーワードを入れることで各種機能にアクセスできる(Cortanaの情報はwebに散在。例えば,[これ](http://www.lifehacker.jp/2015/08/windows_10cortana.html)とか[これ](http://tonkeia.hateblo.jp/entry/surfacepro4-cortana)とか...)。
操作方法がバラつきがちなwindowsでは,普段使わない(すなわちショートカットキーを覚えていない)各種機能の呼び出しは多くの場合,これが速いと思う [^1]。

例,Cortana文字入力に"環境変数"を入れてみたところ:

![0-win+S.png](https://qiita-image-store.s3.amazonaws.com/0/16455/850b69be-fc98-ffaa-37a9-da72edbaaec4.png)

[^1]: ただし,Cortanaはたまに動きがとてつもなく遅ったり...。Cortana自体が重い場合は,ググってみて軽くしておいてほしい...。("位置情報を使わない設定"にするまで自分もCortana重たかった気が)

#① 「パフォーマンスオプション」を"パフォーマンスを優先"に
パフォーマンスオプションには,システムの詳細設定からたどれる。
Cortana(**Windowsキー+S**)=>「システムの詳細設定」=>「パフォーマンスオプション」 を"パフォーマンスを優先"に（以下）。

*追記　新規ユーザーの時には、Cortana(**Windowsキー+S**)=>「Windows のデザインとパフォーマンスの調整」でパフォーマンスオプションに入るほうが簡易だった。。*

![1-システムの詳細設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/e5cb8cb8-1927-a360-b5c4-f401dce7d4be.png)

これにより,windows10を重くしている,今風(?)な各種視覚効果をオフにできる。

##強く推奨 : システムフォントをコーダー向けのフォントに変更。
日本語版windows10の人向けの話。windows10では,なぜかシステムフォントその他が,日本語の漢字・カタカナの視認性が悪い遊ゴシックUIフォントに変更されてしまっている。そのためか,視覚効果がオフになると表示の視認性がガタ落ちする。そこで,システムフォントを読みやすいフォントに変更することをお勧めする。

幸い,windows10では,コーダー向けの等幅フォントを用いても表示は横に広がりすぎない模様。そのため,[日本語が読みやすいプログラミング用フォント4選](http://www.firstlogic.co.jp/blog/lab/yagi/2159)などを参考に,小さめのサイズでも日本語の視認性が落ちないフォントを用意し,windows10のシステムフォントとする。
私の場合,エディタでも使っている**"Myrica"(＝Inconsolata＋源ノ角ゴシック)**を使用している。

windows10のシステムフォントその他を一括でお好みのフォントに設定するにはフリーソフトの[Meiryo UIも大っきらい!!](http://tatsu.life.coocan.jp/MySoft/WinCust/index.html)を用いるのがお手軽。

#②　フォルダーオプションの"詳細設定"を速度優先に
こちらは,windows７以前と同様の話。
Cortana(**Windowsキー+S**)=>「エクスプローラーのオプション」=>表示タブから辿れる。
あるいは,windows7等と同様にエクスプローラーの表示(ショートカット : **Windowsキー+E**)->表示->オプションでも辿れる。
以下(この画面は,"Myrica"フォント適用後),

![2-フォルダーオプション.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/0a646def-a5cd-17ce-388d-8a0831cc16ef.png)

各種オプションの設定は,[Windows10でフォルダーオプションの不要な機能を無効化](http://windows.blogo.jp/windows10/folder_option_off)あたりを参考に。

#③その他
これでダメな場合にも,いろいろな手があるが,時間もかかるのでcase by caseで取り組むのが吉。
cf.[低速CPUでwindows10環境構築](http://qiita.com/kmry2045/items/b23a7e093f2fbd3a3ebc) =>より遅いPCでの作業録。もし,この遅いPCを使わなければならない事態になったときには,さらなる手を考えるかも。。
go言語でのマイクロサービスフレームワークの雑な比較メモ

## golangとマイクロサービス
最近ではGo言語がWebサーバで利用される機会もだいぶ増えてきたと思います。
利用例の中にMicroServicesやそれを指向したアーキテクチャで使用されている方の話を聞く機会がちょいちょい有りまして、その界隈のツールセットが幾つか登場しつつありますので紹介してみたいなと思う次第でした。
マイクロサービスの運用となると、モノリシックなサーバの時は考えなかった問題に出会うことが多く、そうしたハマリポイントを各ツールについて学ぶことで避けることも出来ると思いますので、ツールを利用しないまでもチェックしてみるのは参考になるのではないでしょうか。

## ツール間の比較

|項目| [go-kit/kit](https://github.com/go-kit/kit) | [NYTimes/gizmo](https://github.com/NYTimes/gizmo) | [micro/micro](https://github.com/micro/micro) |
|:--|:--|:--|:--|
| star数（2016/04/17時点） | 3821 | 1341 | 1719 + 704(go-micro) + 78(go-platform) |
| サポートするプロトコル | JSON over HTTP, その他独自追加可能 | gRPC, JSON over HTTPなど | Proto-RPC, JSON-RPC |
| サービスディスカバリ | 独自のloadbalancerパッケージが担う、DNSやconsulなど様々なプラグインを追加可能 |  Configにて指定、HealthCheckに幾つかのタイプを持っている | go-microからConsulを利用可能、各サービスをRegistryパッケージ経由でconsul登録し、利用する形式 |
| ログ | 独自、拡張可能、全HTTPリクエストにtransaction_idが振られている | logrusをベースにWrapしている | 特に用意はなし、exampleでは標準のlogを利用していた |
| 監視 | パラメタをstatsdやprometheusに送信するパッケージが用意されている | rcrowley/go-metricsを利用、graphiteやその他ツールに送信は簡単 | go-platformにあるmetricsから標準では`influxdata/telegraf`に対してメトリクスを送出 |
| Load Balancing | loadbalancerパッケージが登録されたサービスディスカバリ方式とバランシング戦略に応じてノードを選択 | gizmo自体にこうした機能は無い？ | Selectorパッケージが要求に応じてノードを選択 |
| context | net/context | [gorilla/context](http://www.gorillatoolkit.org/pkg/context) | net/context |
| 特記事項 | APIリクエストのtracing機能あり | 3つのツールの中では薄いFWな印象 | micro/micro自体は複数の言語に対するツールセットの提供、golangではmicro/go-microを利用する。高度な運用に向けてはmicro/go-platformを組み合わせる。 |

## 各ツールセットを眺めての感想
サービス間のやり取りについてはどのツールセットにおいても、JSON over HTTPだけでなくgRPCや、様々なメッセージキューも使えるようになっており、同期・非同期にかかわらずサービスを連携させるための上手い仕組みが用意されています。どのツールも比較的Pluggableに作られており、自前のシステムであっても組み込みは容易かもしれません。

## go-kit/kit
`go-kit/kit`は個人的にマイクロサービスでの開発において今回3つのツールセットの中では最も程よいサイズで利用しやすいツールかと感じました。
実運用においては障害やパフォーマンス課題が発生した際にどこで発生したものか、そのトレーシングの難しさが課題に上がることがしばしばですが、go-kit/kitではこのケースに対して`tracing`パッケージを用いて、どの経由のリクエストで出力されたログなのか追いやすく、運用について考慮がよりなされているように見えます。
また、contextを前提にしたフレームワークは今回調査のツールセットだけでなく多くのWebFWでも増えていますが、contextの利用においては、`net/context`ベースのツールが増えている印象があり、その点でも`go-kit/kit`は利用しやすいと感じています。

## NYTimes/gizmo
`NYTimes/gizmo`は3つのツールセットの中では最もシンプルな作りかなと思いました。
serverとpubsubの２つの形式を選択しつつ各サービスを構築するような形式になっています。
serverはいわゆる通常のHTTPサーバ、pubsubは間にメッセージキューを挟み、リクエストをキューイング、subscriberがそれを読み取り非同期に処理という形です。
利用する側からすると、理解しやすいツールかなと思いまして、全体を踏まえてもそれほどシステムが大きくないのであればgizmoは良い選択肢になりうるのではないでしょうか。

思想についてはこちらを読むのがより良いかと思います。
http://open.blogs.nytimes.com/2015/12/17/introducing-gizmo/?_r=0

## micro/micro
`micro/micro`については、サービス開発のための`micro/go-micro`パッケージと、より高度なサービス運用に向けた開発のための`micro/go-platform`の２つを包含しており、ツール規模が3ツールの中では最も大きいものとなっています。
Go以外からの利用も踏まえたもので、InfluxDBや多くのミドルウェアを用意しての協調・監視・スケーリングを構築可能で、Web側で設定値などを管理することもでき、全てをmicro/microに載せるのであれば、スケーラビリティ含め多くの恩恵を受けられるます。
ただしパッケージは`go-micro`と`go-platform`に分かれおり、本気で運用するのであれば依存ツールが多くなることなども踏まえて、場合によっては大きすぎるツールのようにも見えました。

思想についてはこちらを読むのがより良いかと思います。
Micro - a microservices toolkit https://blog.micro.mu/2016/03/20/micro.html

## 最後に
今回紹介した3ツールにおいて、見た限りではどれも非常に有用ですので、そのツールごとのクセなどを踏まえつつ利用してみる、もしくは一部のツールだけ利用するなどしてみてはいかがでしょうか。
ETSのテーブルタイプ毎の書き込み時の違い

「Elixir in Action」で[ETS](http://erlang.org/doc/man/ets.html)について読んだので、各テーブルタイプ(set, ordered_set, bag, duplicate_bag)毎の挙動の違いを調べた。言語はErlang/Elixirのどちらでもよいが、今回はElixirで書く。環境は以下。

```
Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.2.3) - press Ctrl+C to exit (type h() ENTER for help)
```

## setとbagの違い

書き込み時に、同じキーの行がすでに存在するときの挙動が異なる。setは上書きを行い、bagは両方保持する。

```ex
set_table = :ets.new(:set_table, [:set])

:ets.insert(set_table, {:foo, 1})
:ets.insert(set_table, {:foo, 2})
:ets.lookup(set_table, :foo) #=> [foo: 2]


bag_table = :ets.new(:bag_table, [:bag])

:ets.insert(bag_table, {:foo, 1})
:ets.insert(bag_table, {:foo, 2})
:ets.lookup(bag_table, :foo) #=> [foo:1, foo: 2]
```

## setとordered_setの違い

`:ets.first/1`, `:ets.next/2`, `:ets.prev/2`などで返ってくるキーの順番が異なる。setは内部で保持している順に返ってくるが、ordered_setはキーでソートしてある。

```ex
set_table = :ets.new(:set_table, [:set])

:ets.insert(set_table, {:foo, 1})
:ets.insert(set_table, {:bar, 2})
:ets.insert(set_table, {:baz, 3})
:ets.insert(set_table, {:hoge, 4})
:ets.insert(set_table, {:fuga, 5})

k = :ets.first(set_table)   #=> :bar
k = :ets.next(set_table, k) #=> :baz
k = :ets.next(set_table, k) #=> :fuga
k = :ets.next(set_table, k) #=> :hoge
k = :ets.next(set_table, k) #=> :foo
k = :ets.next(set_table, k) #=> :"$end_of_table"


ordered_set_table = :ets.new(:ordered_set_table, [:ordered_set])

:ets.insert(ordered_set_table, {:foo, 1})
:ets.insert(ordered_set_table, {:bar, 2})
:ets.insert(ordered_set_table, {:baz, 3})
:ets.insert(ordered_set_table, {:hoge, 4})
:ets.insert(ordered_set_table, {:fuga, 5})

k = :ets.first(ordered_set_table)   #=> :bar
k = :ets.next(ordered_set_table, k) #=> :baz
k = :ets.next(ordered_set_table, k) #=> :foo
k = :ets.next(ordered_set_table, k) #=> :fuga
k = :ets.next(ordered_set_table, k) #=> :hoge
k = :ets.next(ordered_set_table, k) #=> :"$end_of_table"
```

## bagとduplicate_bagの違い

全く同じタプルを挿入したときの挙動が異なる。bagでは同じものとして扱われ1つしか残らないが、duplicate_bagでは別物として保持される。

```ex
bag_table = :ets.new(:bag_table, [:bag])

:ets.insert(bag_table, {:foo, 1})
:ets.insert(bag_table, {:foo, 1})
:ets.insert(bag_table, {:foo, 2})
:ets.lookup(bag_table, :foo) #=> [foo: 1, foo: 2]


duplicate_bag_table = :ets.new(:duplicate_bag_table, [:duplicate_bag])

:ets.insert(duplicate_bag_table, {:foo, 1})
:ets.insert(duplicate_bag_table, {:foo, 1})
:ets.insert(duplicate_bag_table, {:foo, 2})
:ets.lookup(duplicate_bag_table, :foo) #=> [foo: 1, foo: 1, foo: 2]
```

---

他にも読み出し(`lookup`, `select`, `match`)の速度や、`:ets.safe_fixtable/2`を使ったときの挙動に違いがある模様。結構深そう。
ksnctf : #3 Crawling Chaos 

ksnctf の #3 Crawling Chaos
解き方はいろいろなサイトで公開されているので、回答に使った Python コードだけメモ。

```
# -*- coding: utf-8 -*-

ans = [70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449]
t = []

for i in range(len(ans)):
    t.append(chr(int(ans[i]) / (i+1)))

print(t)
```
jHako APIを動かしてみる

# jHako APIを動かしてみる(備忘録)

## 初めに

jHako開発者の小松さんにjHakoはブラウザの表示やブラウザからの動作を全てAPIで行っていると聞いたので、jHakoのjobnet編集画面にあるjobnetのテストで使う「実行」もAPIで実行できる筈。
これができれば、Zabbixで障害検知してアクションでjHakoの障害復旧jobnetが実行できる！
と言う訳で、実際に試してみました。

## Advanced REST Clientで動かす

実はこの備忘録を作る前に試しているので鼻歌交じりで試したのですが…
jobnetの実行が404 NOT FOUND、<font color="red"><b>Advanced REST Clientが新しくなったら動かない！</b></font>
で、調査してみました。



URLは合っているのに404 NOT FOUND…
『URLあってるよなー』とか『ブラウザから動くよなー』とか独り言呟き１時間…

『HEAD足りてないかな？』と<font color="red"><b>cookie</b></font>を渡したら動きました。(笑)

下記、実行が上手く行った画面のキャプチャ
![2016-04-17_182948.png](https://qiita-image-store.s3.amazonaws.com/0/103473/a5be26f9-8143-2415-e111-22154f110ae9.png)


ログイン時に帰ってくるcookieの値を渡す必要があると様です。(笑)

## まとめ

下記でZabbixからjHakoの連携ができる筈

1)Python等でjHako APIでログイン、jobnet実行を行うスクリプト組む
2)Zabbixが障害検知したらアクションでスクリプト実行する

尚、jHakoのアカウントで障害対応用のアカウント作った方が良いかと。
ブラウザでログインしているアカウントで、Advanced REST Clientからログインしたら怒られました。(笑)
![2016-04-17_184131.png](https://qiita-image-store.s3.amazonaws.com/0/103473/11f7ff2f-4668-3947-c585-55345716d01c.png)


以下、jHako APIのログインとjobnet実行に関する情報

---

### ログイン

+ URL：http://{jHakoサーバのIPアドレス}/jhako/sessions.json

+ HEAD：Content-Type:application/json

+ Body

```json
{
  "session": {
    "name": "admin",
    "fullname": "",
    "kind": 0,
    "password": "jhako",
    "password_confirmation": "",
    "language": "en",
    "email": "",
    "created_at": null,
    "updated_at": null
  }
}
```

### jobnetの実行

+ URL
http://{jHakoサーバのIPアドレス}/jhako/proc_topjobnets.json

+ HEAD：
Content-Type:application/json
Cookie: remember_token=xxxxxxxxxxxxxxxxxxxxxx;

+ Body

```json
{
  "proc_topjobnet": {
    "name": "test",
    "description": "",
    "kind": 10,
    "hold": false,
    "skip": false,
    "timeout": 0,
    "created_at": null,
    "updated_at": null,
    "jobunit_id": 13,
    "status": 0,
    "start_time": null,
    "end_time": null,
    "timeout_occur": false,
    "force_start": false,
    "force_stop": false,
    "proc_jobunit_id": 0,
    "proc_alarm_id": 0,
    "mode": 1,
    "schedule_time": null,
    "run_type": 0,
    "delay_limit": 1,
    "path": ""
  }
}
```

上記はtestと言うjobnetが実行します。
cookieはログイン時のレスポンスヘッダのSet-Cookie:にあるremember_tokenの値を設定します。
基板にピンヘッダを真っ直ぐ取り付ける小技


以下のような基板とピンヘッダが別になっているモジュールは、秋月やSWITCH SCIENCEに多くあります。
![K-06894.JPG](https://qiita-image-store.s3.amazonaws.com/0/74551/1b077952-66b2-be53-7c53-913c35fb3e4e.jpeg "K-06894.JPG")

このピンヘッダを半田付けするときに基板に対して斜めになってしまうことがよくあります。
斜めになってしまうと、見た目が不恰好なだけでなく、ブレッドボードやICソケットに差し込みづらくなってしまいます。

ブレッドボードなどに固定してから半田付けすると基板に対して垂直に取り付けることができます。
下の例ではブレッドボードを使用しましたが、ユニバーサル基板やICソケットでも大丈夫です。

![IMG_1453.JPG](https://qiita-image-store.s3.amazonaws.com/0/74551/65353af0-8409-472a-91c4-b83e9bee93d6.jpeg "IMG_1453.JPG")


注) 手早く半田付けしないとブレッドボードが熱で溶けます
エクセルで新しいウィンドウを開く

#エクセルを2つ表示して作業する

##レジストリを弄ってOKな場合
以下のURLで設定可能です。
http://plaza.rakuten.co.jp/mscrtf/diary/201212300000/

##レジストリを弄らない方法

- ショートカットを作成します
    - リンク先 "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" /e
    - ショートカットはスタートメニューのどこか適当なところに配置します
- ショートカットへのホットキーを設定します
    - 例ではCtrl+Shift+Eで起動
- 2つ目のエクセルを開く前に↑で作成したショートカットを起動し、ファイルをD&Dすれば別々のウィンドウで表示できます。

(参考画像)
![2016-04-15_10-40-04_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/80238/31d24caa-1ebf-b2d1-6bb6-e5aef92f1185.png)
caret: Model Training and Tuning - Models By Similarity

訳注：
http://topepo.github.io/caret/similarity.html の和訳です。
---
このページでは caret の train 関数で使用できるすべてのモデルをネットワーク図で示しています。この図がどのように出来ているか（そして、 networkD3 パッケージをどう使っているか）は [the Revolutions blog](http://blog.revolutionanalytics.com/2014/01/predictive-models-in-r-clustered-by-tag-similarity-1.html)  を参照のこと。要約すると、タグ（例えば「バギング」、「L1正則化」等）の集合により、それぞれのモデルに注釈付をしています。この情報を用いて、互いに類似したものをクラスタリングしています。
緑色の丸は回帰のモデルであり、青い丸は分類のみ、オレンジの丸は回帰と分類の両方のモデルです。モデルの丸の上にマウスを置くと、モデル名と caret でのモデルコードが表示されます。名前のすべてを見たい時にはノードを左に移動させます（訳注？）。13モデルはこのグラフには表示していません。
（図略）

このグラフを作成するためのデータは[ここ](http://topepo.github.io/caret/tag_data.csv)にあります。モデルのダイバースセットを見つけるために、maximum dissimilarity サンプリングを用います。回帰データに放射基底関数を用いた SVM モデルを使いたいと仮定しましょう。タグに基づけば、ダイバースセットから4つのモデルを探すと何になるか？

```{r}
tag <- read.csv("tag_data.csv", row.names = 1)
tag <- as.matrix(tag)

## Select only models for regression
regModels <- tag[tag[,"Regression"] == 1,]

all <- 1:nrow(regModels)
## Seed the analysis with the SVM model
start <- grep("(svmRadial)", rownames(regModels), fixed = TRUE)
pool <- all[all != start]

## Select 4 model models by maximizing the Jaccard
## dissimilarity between sets of models
nextMods <- maxDissim(regModels[start,,drop = FALSE],
                      regModels[pool, ],
                      method = "Jaccard",
                      n = 4)

rownames(regModels)[c(start, nextMods)]

[1] "Support Vector Machines with Radial Basis Function Kernel (svmRadial)"
[2] "Cubist (cubist)"                                                      
[3] "Bayesian Regularized Neural Networks (brnn)"                          
[4] "Generalized Linear Model with Stepwise Feature Selection (glmStepAIC)"
[5] "Ridge Regression with Variable Selection (foba)"                      
```