ページ

2016年3月17日木曜日

VagrantでVMの紐付きがおかしくなった場合


現象としては、Vagrantファイルがあるディレクトリで
vagrant upすると違ったVMが立ち上がってしまうというもの・・・
元に戻すのが面倒だったので備忘録を兼ねての投稿です。

確認


おかしいと思ってVirtualBoxを起動すると同じものが2つある!?
そこで現在のVM一覧を見るコマンドVBoxManage list vmsを叩いて確認してみると
$ VBoxManage list vms
・・・
"hogehoge_default_1457750943558_68266" {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
"hogehoge_default_1457837316012_51675" {YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY}
やっぱし同じものが2つある(↑hogehogeが2つ)
※XXXXやYYYY~には実際は英数字が入ります

対策


紐付きがおかしくなっている事は間違いないので、Vagrantファイルがある
場所の直下にある.vagrantディレクトリを調べて見る
  • 階層
.vagrant
└── machines
    └── default
        └── virtualbox
            ├── action_provision
            ├── action_set_name
            ├── id ★
            ├── index_uuid
            ├── private_key
            └── synced_folders
★が付いているidが怪しいので中を見てみると・・
$ cat .vagrant/machines/default/virtualbox/id
YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
ん〜恐らく、ここがXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXじゃないかと・・
修正してvagrant upしてみると、
望んていたものが起動しました!!
これで一件落着かと思っていると、
起動や停止する度にパスワードを聞かれる羽目に!?

原因


vagrant upやvagrant haltするとVMとssh接続を行っており、 認証がうまくいってないのが原因でした。
↑の.vagrantの階層でprivate_keyというのが秘密鍵で、
別のVM(YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY)の秘密鍵が残っちゃっていた模様。

対策


解決策としては、
  • 全く新規に公開鍵、秘密鍵を作成
  • 残ってる秘密鍵を元に公開鍵を作成
の2つがあります。
今回は残ってる秘密鍵を元に公開鍵を作成したいと思います。
秘密鍵から公開鍵を作成
$ ssh-keygen -y -f .vagrant/machines/default/virtualbox/private_key > authorized_keys
VMを起動し、/home/vagrant/.sshのauthorized_keysを上書きます
$ mv /vagrant/authorized_keys /home/vagrant/.ssh/.
これで認証が失敗せず、パスワード聞かれることもなくなります。

その他


↑の問題とは関係ないですが、色々試している中で見つけて便利だと思ったのでメモ
Vagrantを起動する際はVagrantファイルがあるディレクトリに移動して
vagrant upをしていましたが、vagrant up {id}とする事で
どの場所からでも起動できます
。
{id}を確認するには
$ vagrant global-status
{id}  default virtualbox poweroff hoge
{id}  default virtualbox poweroff fuga
で確認できます。
また、vagrant upに限らずその他のコマンドでも使用できます。
vagrant halt {id}、vagrant destroy {id}・・・

shellなんかを書く時に使えそうです^^

2016年3月12日土曜日

Elasticsearchを学ぶ 5 - Kibana -


今回はElastic社のKibanaを使ってみたいと思います。

Kibanaとは?
ログデータなどの可視化ツール。フィルタや集計などを高速に便利に行う。
  • 環境
引き続き前回の環境を前提に進めていきたいと思います。
また今回使うデータは以前こちらで使用したデータを使います。

インストール


インストールの方法としては、公式ページからダウンロードしてインストールします。
$ cd
$ wget https://download.elastic.co/kibana/kibana/kibana-4.4.1-linux-x64.tar.gz -O kibana.tar.gz
$ tar -zxf kibana.tar.gz
$ sudo mv kibana-4.4.1-linux-x64 /usr/local/share/kibana
$ sudo chmod -R 755 /usr/local/share/kibana
$ sudo chown -R vagrant:vagrant /usr/local/share/kibana
  • 設定の変更
kibanaの設定ファイルを修正
$ cd /usr/local/share/kibana
$ vi config/kibana.yml
elasticsearch.urlのコメントを外し、以下に設定。
elasticsearch.url: "http://192.168.33.180:9200"
kibana用のポート5601をVagrantファイルに設定し再起動します
# 以下設定をVagrantファイルに追加
config.vm.network "forwarded_port", guest: 5601, host: 5601
  • 再起動
$ vagrant reload
  • ElasticsearchとKibanaを起動
$ /usr/local/share/elasticsearch/bin/elasticsearch -d -p pid
$ /usr/local/share/kibana/bin/kibana
ブラウザからhttp://192.168.33.180:5601/ にアクセス
↑のような画面が出ればOK

デフォルトのIndexマッチパターンを作成しないと次に進めないので、
とりあえず以下に設定しCreate
以下の画面のようにIndexパターンが作成される


可視化


今回はとりあえず何かグラフを表示させてみます
Visualizeタブを開き、Line Chartを選択
From a new searchを選択
左側の設定(グラフの表示に関する設定)を以下のように変更

▶︎ボタンを押すとグラフが表示される


・・と、まあグラフは表示できましたが、
これだけだとよく分からないので^-^;、
次回は大量にデータを登録して使ってみたいと思います。


2016年3月9日水曜日

道の駅を巡ってみる 10 - 福岡 -


最近道の駅に行けてなかったんで機会を待っていたんですが、
やっとゆっくりできそうだったので、久しぶりに行ってきました。
今回は福岡の道の駅「うきは」です。


1. 道の駅「うきは」




道の駅「うきは」ですが、見晴らしが良く景色が良かったので
外であまおうソフトをいただきました^^

あまおう自体美味しいですが、加工せず、そのまんまのあまおうを
ソフトクリームにしてる感じで本当美味しかったです。





少し中に入ると囲炉裏を囲んでくつろげるスペースもありました。
ソフトクリーム食べながらあったまるのも贅沢な感じがします。


室内の様子です↓



そして一番びっくりしたのが、うきは市の観光コンシェルジュとして
なんとペッパーがいましたw



なんか溶け込んでる・・・



ホームページ




2016年3月5日土曜日

Heroku Buttonを設置してみる


Paas環境のサービスHerokuにはHeroku Buttonがあります
ボタン一つでアプリケーションを自分のHeroku環境にデプロイできてしまう
便利なボタンです。
今回はMichiEkiのHeroku Buttonを作成してみたいと思います
※ ちなみにMichiEkiは道の駅好きな筆者が勢い余って作ったAPIです^^;
   まだまだ作成途中なのでおかしな所があったら教えて頂けると助かります。

とりあえずできたものを動かしてみる


作成の手順の前に・・まずは作成したボタンを以下に貼ってます。
このボタンを押すと自分のHeroku環境にデプロイできます。
※ 事前にアカウントの作成が必要です

Heroku Deploy

押してログインすると、こんな画面になるので

そのままDeploy to Freeを押すとデプロイが開始されます。

デプロイが完了するとViewボタンが表示されるのでそのまま押します

以下の画面が表示されれば成功です。


Heroku Button作成



作成はとっても簡単です。
自分のGithubプロジェクトの直下にapp.jsonを作成し、ボタンのリンクを貼るだけです。とは言えプロジェクトはデプロイできる形式にしとかないといけません。
  • app.json
{
  "name": "MichiEki",
  "description": "API for provides information Road Station",
  "success_url": "/api/info",
  "env": {
    "BUILDPACK_URL": "https://github.com/heroku/heroku-buildpack-ruby"
  }
}
今回はnameとdescription、success_url、envを指定しています。
  • name ・・・ アプリ名
  • description ・・・アプリの詳細
  • success_url ・・・ デプロイ成功時に叩かれるURL
  • env ・・・ 今回はbuildpackを指定しています

buildpackは実行環境をまるっとパックしたもので、デプロイするアプリが動作するのに必要な環境をurlで指定します。
今回はGithubで公開されているHerokuのruby環境を指定しています。
自分で環境を作成しGithubに上げたurlを指定することも可能です
その他のスキーマに関してはこちらを参照

次にHeroku Buttonのリンクを貼ります。
Github上のREADME.mdに貼る場合は
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
その他のサイトの場合は(上で貼ったリンクも↓になります)
<!-- template=[デプロイさせたいGithubのレポジトリのURL] -->
<a href="https://heroku.com/deploy?template=https://github.com/Slowhand0309/MichiEki">
<img src="https://www.herokucdn.com/deploy/button.png" alt="Heroku Deploy">
</a>
になります。
いや〜便利ですw

2016年3月3日木曜日

Elasticsearchを学ぶ 4 - Analyzer -


今回はMappingする際に設定できるAnalyzerというものを触ってみたいと思います。
その前に・・・
前回作成したmapping.jsonの補足です
"user_id":  {
  "type":   "string",
  "index":  "not_analyzed"
},
user_idのフィールドに対してtypeがstringでindexがnot_analyzedとなっています。
このnot_analyzedですが構文解析せず完全一致で検索します。
例えば・・
user_idにABCD-1234というデータが入ってる場合にnot_analyzedを指定せずにABCDや1234で検索した場合
ABCD-5678でもEFGH-1234でもヒットしてしまいます。
ユニークなフィールドにはつけたほうがいいやつです。
次に・・
"created":  {
  "type":   "date",
  "format": "strict_date_optional_time||epoch_millis"
}
ですが、JSONは日時のデータ型を持ってないので、以下の3つの方法で表現します。
  1. 文字列 ('2016-01-01'や'2016/01/01 10:10:50'など)
  2. 数値 (1970/01/01 00:00:00からの経過ミリ秒(UTC))
  3. 数値 (1970/01/01 00:00:00からの経過秒(UTC))
↑のstrict_date_optional_time||epoch_millisは2になります

Analyzer


一つのanalyzerは一つのTokenizerと0個以上のTokenFiltersで構成されます。
サンプルとして以下のMappingをanalyzer_testというIndexに作成します。
※このサンプルではTokenFiltersは使用してません。
{
  "settings": {
      "analysis": {
          "analyzer": {
              "my_analyzer": {
                  "tokenizer": "my_tokenizer"
              }
          },
          "tokenizer": {
              "my_tokenizer": {
                  "type": "nGram",
                  "min_gram": "2",
                  "max_gram": "2",
                  "token_chars": [
                      "letter",
                      "digit"
                  ]
              }
          }
      }
  },
  "mappings": {
    "sample": {
      "properties": {
        "text": {
          "type": "string",
          "analyzer": "my_analyzer"
        },
        "subtext": {
          "type": "string",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}
my_tokenizerとして設定している箇所で、nGramとありますが、
これはN個文字を区切って検索するものです。ここではmin_gramとmax_gramに
2と設定しているので2文字毎区切って検索を行います。
早速analyzer_test_mapping.jsonとして保存しインポート
$ curl -X POST 192.168.33.180:9200/analyzer_test -d @analyzer_test_mapping.json
ちゃんと設定できているか確認してみます。
$ curl -X GET '192.168.33.180:9200/analyzer_test/_mapping/sample/?pretty'
{
  "analyzer_test" : {
    "mappings" : {
      "sample" : {
        "properties" : {
          "subtext" : {
            "type" : "string",
            "analyzer" : "my_analyzer"
          },
          "text" : {
            "type" : "string",
            "analyzer" : "my_analyzer"
          }
        }
      }
    }
  }
}
ちゃんと設定できているので、データ登録して動作を確認してみます。
$ curl -X PUT 192.168.33.180:9200/analyzer_test/sample/1 -d '{
   "text" : "abcdefg", "subtext" : "123456789"
 }'
まずは、分割された2文字に対して検索。
$ curl -XPOST '192.168.33.180:9200/analyzer_test/_search?pretty' -d
'{ "query": { "match": { "text": "cd" } } }'
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.11506981,
    "hits" : [ {
      "_index" : "analyzer_test",
      "_type" : "sample",
      "_id" : "1",
      "_score" : 0.11506981,
      "_source" : {
        "text" : "abcdefg",
        "subtext" : "123456789"
      }
    } ]
  }
}
これはヒットしますが、1文字で検索してみると、
$ curl -XPOST '192.168.33.180:9200/analyzer_test/_search?pretty' -d
'{ "query": { "match": { "text": "c" } } }'
{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}
最低2文字で単語を分割してる為こちらはヒットしません。
結構細かくAnalyzerを調整できるので、チューニング次第でヒット率が上がったり下がったりしそうですね。