brew tapを用いてElasticsearch2.4とelasticsearch-headをMacにインストール

前提

  • OS
  • Homebrewのバージョン
    • 1.1.9

概要

Elasticsearchをbrewでインストールすると、デフォルトでバージョン5がインストールされたが、
https://github.com/mobz/elasticsearch-headを確認すると、

for Elasticsearch 5.x: site plugins are not supported. Run as a standalone server

とのことなので、
brew tapを用いて過去のバージョンの2.4とelasticsearch-headをインストールする。

手順

1. Elasticsearch2.4のインストール

brew tap homebrew/versions
brew search elasticsearch

elasticsearch                                  elasticsearch@1.7                              elasticsearch@2.4

過去のelasticsearchのパッケージが確認出来るので、

brew install elasticsearch@2.4

でElasticsearch2.4をインストールする。
次に、

ln -sfv /usr/local/opt/elasticsearch\@2.4/homebrew.mxcl.elasticsearch\@2.4.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch\@2.4.plist

自動起動の設定を行う。

2. PATHの設定

brew info elasticsearch@2.4

を実行すると

Data:    /usr/local/var/elasticsearch/elasticsearch_HirofumiYamamoto/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_HirofumiYamamoto.log
Plugins: /usr/local/opt/elasticsearch@2.4/libexec/plugins/
Config:  /usr/local/etc/elasticsearch/
plugin script: /usr/local/opt/elasticsearch@2.4/libexec/bin/plugin

と記述されている部分が見つかるのでこれを参考にPATHを通しておく。
今回はpluginコマンドでelasticsearch-headをインストールするので、

echo 'export PATH="/usr/local/opt/elasticsearch@2.4/libexec/bin:$PATH"' >> ~/.bash_profile

で.bash_profileを更新しPATHを通す。

source ~/.bash_profile

で.bash_profileを再度読み込みしておく。

3. elasticsearch-headのインストール

plugin install mobz/elasticsearch-head

でelasticsearch-headをインストールする。

4. ブラウザで確認

elasticsearch

でelasticsearchを起動し、
http://localhost:9200/_plugin/head/を開き、

f:id:poustel:20170204184016p:plain

が表示されていればOK。

参考リンク

qiita.com

Itamaeを用いてUbuntuにRails5をインストールする

前提

  • サーバ
  • クライアント
  • Mac側の各種バージョン
    • Ruby
      • 2.3.3
    • gem
      • 2.5.2
    • Itamae
      • 1.9.10
  • UbuntuにインストールするRailsのバージョン
    • 5.0.1

Itamaeをインストール

gem install itamae

Railsをインストールするレシピを作成

rbenvを使用しない場合

execute "ubuntu update" do
  command "sudo apt-get -y update"
end
package 'build-essential'
package 'libssl-dev'
package 'libreadline-dev'
package 'git'
package 'nginx'
package 'ruby-dev'
package 'libsqlite3-dev'
gem_package 'sqlite3'
gem_package 'rails'

rbenvを使用する場合

rbenvをパッケージからインストールすると上手くいかなかったのでgitからインストールする形にした。

REROAD_PROFILE = ". ~/.profile"
execute "ubuntu update" do
  command "apt-get -y update"
end

package 'build-essential'
package 'libssl-dev'
package 'libreadline-dev'
package 'git'
package 'nginx'
package 'libsqlite3-dev'

execute "rbenv install" do
  not_if "ls ~/.rbenv"
  command "git clone https://github.com/sstephenson/rbenv.git ~/.rbenv && git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build"
end
execute "update .profile for rbenv" do
  not_if %(#{REROAD_PROFILE} && rbenv --help)
  command %(echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile && echo 'eval "$(rbenv init -)"' >> ~/.profile)
end
execute "install ruby" do
  command "#{REROAD_PROFILE} && rbenv install -s 2.3.1"
end
execute "apply rbenv specific version" do
  command "#{REROAD_PROFILE} && rbenv global 2.3.1"
end
execute "install bundler" do
  command "#{REROAD_PROFILE} && rbenv exec gem install bundler"
end
execute "install sqlite3 for rails" do
  command "#{REROAD_PROFILE} && rbenv exec gem install sqlite3"
end
execute "install rails" do
  command "#{REROAD_PROFILE} && rbenv exec gem install rails"
end

Itamaeを実行

itamae ssh -h hostname -p 22 -u username recipi.rb -l debug

UbnutuにアクセスしてRailsがインストールされていることを確認する

$ rails -v
Rails 5.0.1

今回作成したレシピのGIthubのURL

github.com

Itamaeを使ってUbuntuサーバにNginxをインストール・起動する

前提

  • サーバ
  • クライアント
  • Macの各種バージョン
    • Ruby
      • 2.3.3
    • gem
      • 2.5.2
    • Itamae
      • 1.9.10

Itamaeをインストール

gem install itamae

Nginxをインストールし起動するレシピを作成

# nginx_recipi.rb
execute "install nginx" do
  command "sudo apt-get -y install nginx"
end
execute "nginx start" do
  command "sudo /etc/init.d/nginx start"
end

Itamaeを実行

itamae ssh -h hostname -p 22 -u username nginx_recipi.rb -l debug
INFO : Starting Itamae...
DEBUG : Executing `mkdir -p /tmp/itamae_tmp`...
DEBUG :   exited with 0
DEBUG : Executing `chmod 777 /tmp/itamae_tmp`...
DEBUG :   exited with 0
.
.
.
DEBUG :       (in set_current_attributes)
DEBUG :       (in show_differences)
 INFO :       execute[nginx start] executed will change from 'false' to 'true'
Executing `sudo /etc/init.d/nginx start`...

上記のようなコードが出ていたら成功。

サーバにアクセスしてNginxが起動していることを確認する。

ホスト名をexample.comと仮定した場合、ブラウザで http://example.com にアクセスして
f:id:poustel:20170121185647p:plain
が出ていたら成功。

【アルゴリズムの勉強】Rubyで力任せ探索で文字列探索を行うコードを書いてみる

力まかせ探索とは

力まかせ探索(ちからまかせたんさく、英: Brute-force search)またはしらみつぶし探索(英: Exhaustive search)は、単純だが非常に汎用的な計算機科学の問題解決法であり、全ての可能性のある解の候補を体系的に数えあげ、それぞれの解候補が問題の解となるかをチェックする方法である。

力まかせ探索 - Wikipedia

Rubyで実装

def brute_force_search(str, target)
  str_location, target_location = 0, 0
  while str_location != str.length && target_location != target.length
    if str[str_location] == target[target_location]
      str_location += 1
      target_location += 1
    else
      str_location = str_location - target_location + 1
      target_location = 0
    end
  end
  if target_location == target.length
    return true
  else
    return false
  end
end

p brute_force_search("today", "day")
# => true
p brute_force_search("yesterday", "tomorrow")
# => false

参考文献、参考リンク

【アルゴリズムの勉強】Rubyで8王妃(エイトクイーン)問題を解いてみる

8王妃(エイトクイーン)問題とは

チェスの盤上に、8個のクイーンを配置する。このとき、どの駒も他の駒に取られるような位置においてはいけない。
クイーンの動きは、上下左右斜めの8方向に、遮る物がない限り進める。将棋の飛車と角行を合わせた動きである。

エイト・クイーン - Wikipedia

Rubyで実装

QUEEN = 8
@is_set = Array.new(QUEEN){false}
@is_set_diagonal_right = Array.new(QUEEN * 2 - 1){false}
@is_set_diagonal_left = Array.new(QUEEN * 2 - 1){false}
@queen_position = []
@count = 0

def calc_pattern(column)
  QUEEN.times{|row|
    unless @is_set[row] || @is_set_diagonal_right[column + row] || @is_set_diagonal_left[column - row + (QUEEN - 1)]
      @queen_position[column] = row
      if column == (QUEEN - 1)
        @count += 1
      else
        @is_set[row] = @is_set_diagonal_right[column + row] = @is_set_diagonal_left[column - row + (QUEEN - 1)] = true
        calc_pattern(column + 1)
        @is_set[row] = @is_set_diagonal_right[column + row] = @is_set_diagonal_left[column - row + (QUEEN - 1)] = false
      end
    end
  }
end

calc_pattern(0)
p @count
# => 92

参考文献、参考リンク

【アルゴリズムの勉強】Rubyでユークリッドの互除法を書いてみる

ユークリッドの互除法によって2つの自然数の最大公約数を求める処理をRuby再帰を用いて実装する。

ユークリッドの互除法とは

ユークリッドの互除法ユークリッドのごじょほう、英: Euclidean Algorithm)は、2 つの自然数の最大公約数を求める手法の一つである。
2 つの自然数 a, b (a ≧ b) について、a の b による剰余を r とすると、 a と b との最大公約数は b と r との最大公約数に等しいという性質が成り立つ。この性質を利用して、 b を r で割った剰余、 除数 r をその剰余で割った剰余、と剰余を求める計算を逐次繰り返すと、剰余が 0 になった時の除数が a と b との最大公約数となる。
明示的に記述された最古のアルゴリズムとしても知られ、紀元前300年頃に記されたユークリッドの『原論』第 7 巻、命題 1 から 3 がそれである[注釈 1]。

ユークリッドの互除法 - Wikipedia

Rubyで実装

def euclid_gcd(x, y)
  return x if y == 0
  euclid_gcd(y, x % y)
end

p euclid_gcd(8, 20)
# => 4
p euclid_gcd(100, 200)
# => 100
p euclid_gcd(1, 12)
# => 1

参考文献、参考リンク

【アルゴリズムの勉強】Rubyでデータ構造のキューを書いてみる

アルゴリズムの勉強としてリングバッファによるキューをRubyで実装する。

キューとは

キュー(英: queue)、あるいは待ち行列はコンピュータの基本的なデータ構造の一つ。データを先入れ先出し[1]のリスト構造で保持するものである。キューからデータを取り出すときには、先に入れられたデータから順に取り出される。キューにデータを入れることをエンキュー[2]、取り出すことをデキュー[3]という。

キュー (コンピュータ) - Wikipedia

Rubyで実装

class Queue
  def initialize(capacity)
    @number = @front = @rear = 0
    @max = capacity
    @que = Array.new(capacity)
    p @que
  end

  def enque(value)
    if @number >= @max
      puts "キューは満杯です"
    else
      @que[@rear] = value
      @number += 1
      if (@rear + 1) == @max
        @rear = 0
      else
        @rear += 1
      end
      p @que
    end
  end

  def deque
    if @number <= 0
      puts "キューは空です"
    else
      result = @que[@front]
      @number += -1
      if (@front + 1) == @max
        @front = 0
      else
        @front += 1
      end
      puts "#{result}を取り出しました"
    end
  end

  def next_value
    if @number <= 0
      puts "キューは空です"
    else
      result = @que[@front]
      puts "次に取り出される値は#{result}です"
    end
  end

  def search(value)
    for i in 0..(@number - 1)
      index = (i + @front) % @max
      if @que[index] == value
        puts "#{value}はキュー内に存在します"
        return
      end
    end
    puts "#{value}はキュー内に存在しません"
  end

  def clear
    @number = @front = @rear = 0
    puts "キューを空にしました。"
  end

  def capacity
    puts "キューの容量は#{@max}です"
  end

  def number_of_data
    puts "キューには#{@number}つのデータが格納されています"
  end

  def empty?
    if @number <= 0
      puts "キューは空です"
    else
      puts "キューは空ではありません"
    end
  end

  def full?
    if @number >= @max
      puts "キューは満杯です"
    else
      puts "キューはまだ空き領域が存在します"
    end
  end

  def dump
    if @number <= 0
      puts "スタックは空です"
    else
      for index in 0..(@number - 1)
        puts @que[index]
      end
    end
  end
end

queue = Queue.new(5)
# => [nil, nil, nil, nil, nil]
queue.enque(5)
# => [5, nil, nil, nil, nil]
queue.enque(12)
# => [5, 12, nil, nil, nil]
queue.deque
# => 5を取り出しました
queue.enque(2)
# => [5, 12, 2, nil, nil]
queue.enque(52)
# => [5, 12, 2, 52, nil]
queue.deque
# => 12を取り出しました
queue.next_value
# => 次に取り出される値は2です
queue.search(2)
# => 2はキュー内に存在します
queue.capacity
# => キューの容量は5です
queue.number_of_data
# => キューには2つのデータが格納されています
queue.empty?
# => スタックはまだ空き領域が存在します
queue.enque(87)
# => [5, 12, 2, 52, 87]
queue.enque(32)
# => [32, 12, 2, 52, 87]
queue.enque(412)
# => [32, 412, 2, 52, 87]
queue.enque(999)
# => キューは満杯です
queue.clear
# => キューを空にしました。
queue.empty?
# => キューは空です

参考文献、参考リンク