vagrant-hostmanagerを使ったVagrantfile

Vagrant.configure("2") do |config|
  config.hostmanager.ip_resolver = proc do |machine|
    result = ""
    machine.communicate.execute("ifconfig enp0s8") do |type, data|
      result << data if type == :stdout
    end
    (ip = /inet (\d+\.\d+\.\d+\.\d+)/.match(result)) && ip[1]
  end

  config.hostmanager.enabled = true
  config.hostmanager.manage_host = true
  config.hostmanager.ignore_private_ip = false
  config.hostmanager.include_offline = false

  config.vm.box = "centos7"

  config.vm.define "moge" do |node|
    node.vm.hostname = "moge.localhost"
    node.vm.network "private_network", type: "dhcp"
  end

  config.vm.define "hoge" do |node|
    node.vm.hostname = "hoge.localhost"
    node.vm.network "private_network", type: "dhcp"
  end

  config.vm.provider "virtualbox"
end
  • vagrantのバージョンは1.9.4、virtualboxはのバージョンは5.1.2r108956、OSはUbuntu 16.04で動作確認を行った。
  • このVagrantfileを使用してvagrant upを行うと、mogehogeという名前が付けられた仮想マシンが起動する。
  • どちらの仮想マシンもプライベートIPアドレスDHCPにより割り当てられる。
  • vagrant-hostmanagerにより、割り当てられたIPアドレスとそれに対応するホスト名の組み合わせがホストOSの/etc/hostsに自動的に書き込まれる。
  • 利用者はホスト名を知っていれば、どのIPアドレスが割り当てられたかを意識する必要がなくなる。
  • 自分のマシン内に開発環境を作る場合にIPアドレスの管理の手間が省ける。(DHCPで起動した場合は、仮想マシンが起動するまでどのIPアドレスが割り当てられるか分からないため、起動した仮想マシンにログインしてIPアドレスを確認する必要がある。固定IPアドレスで起動した場合でも、予め他の仮想マシンが使用していないIPアドレスをVagrantfileに書かなければならない。)

独立したステージング環境をワンクリックまたはワンコマンドで用意したい

イデアのメモです。

  • ローカル環境だと言語やミドルウェアのバージョンの差異により正常に動作しない場合がある。複数のプロジェクトを開発しているとその状況に陥る可能性が高くなる。
  • VagrantやDockerにより独立したステージング環境を用意する。
  • すぐにステージング環境にアクセスできるよう、テスト環境を起動した段階でIPアドレスやポート番号、バーチャルドメインが自動的に割り当てられるようにする。
  • ステージング環境を破棄したらIPアドレスやポート番号、バーチャルドメインは開放される。
  • リポジトリにVagrantfileやDockerfileをチェックインしておくと良い?

Ubuntu 16.04 でマウスの速度を永続的に変更する

  • /usr/share/X11/xorg.conf.d/50-mouse.conf というファイル名で下記の内容を記述する。
Section "InputClass"
    Identifier "My Mouse"
    MatchIsPointer "yes"

    # Default value of mouse acceleration: 2/1 4
    # Set AccelerationNumerator to zero to disable
    Option "AccelerationNumerator" "4"
    Option "AccelerationDenominator" "1"
    Option "AccelerationThreshold" "0"
EndSection
  • PCを再起動する。

self と self.class の違い

  • self.class は自身のクラスを返す。
  • self は自身のクラスまたはインスタンスを返す。
class Hoge
  def moge
    puts self.class.methods
  end

  def noge
    puts self.methods
  end
end

h = Hoge.new
h.moge
puts "-----"
h.noge

出力結果は下記となる。

new
allocate
superclass
<=>
module_exec
class_exec
<=
>=
==
===
include?
included_modules
ancestors
name
public_instance_methods
instance_methods
private_instance_methods
protected_instance_methods
const_get
constants
const_defined?
const_set
class_variables
class_variable_get
remove_class_variable
class_variable_defined?
class_variable_set
private_constant
public_constant
singleton_class?
deprecate_constant
freeze
inspect
module_eval
const_missing
prepend
method_defined?
class_eval
public_method_defined?
private_method_defined?
<
public_class_method
>
protected_method_defined?
private_class_method
to_s
autoload
autoload?
instance_method
public_instance_method
include
instance_of?
public_send
instance_variable_get
instance_variable_set
instance_variable_defined?
remove_instance_variable
private_methods
kind_of?
instance_variables
tap
public_method
singleton_method
is_a?
extend
define_singleton_method
method
to_enum
enum_for
=~
!~
eql?
respond_to?
display
object_id
send
nil?
hash
class
singleton_class
clone
dup
itself
taint
tainted?
untaint
untrust
trust
untrusted?
methods
protected_methods
frozen?
public_methods
singleton_methods
!
!=
__send__
equal?
instance_eval
instance_exec
__id__
-----
moge
noge
instance_of?
public_send
instance_variable_get
instance_variable_set
instance_variable_defined?
remove_instance_variable
private_methods
kind_of?
instance_variables
tap
public_method
singleton_method
is_a?
extend
define_singleton_method
method
to_enum
enum_for
<=>
===
=~
!~
eql?
respond_to?
freeze
inspect
display
object_id
send
to_s
nil?
hash
class
singleton_class
clone
dup
itself
taint
tainted?
untaint
untrust
trust
untrusted?
methods
protected_methods
frozen?
public_methods
singleton_methods
!
==
!=
__send__
equal?
instance_eval
instance_exec
__id__
  • self.methodsインスタンスのメソッド一覧を返すので、インスタンスメソッドであるhogemogeが含まれている。
  • self.class.methods はクラスHogeのメソッド一覧を返すので、インスタンスメソッドであるhogemogeが含まれていない。

手段が目的となっても良い

概要

「手段と目的を混同してはいけない」「手段の目的化はダメ」のようなセリフはこれまで生きてきて何度も聞いていて、その意味や伝えたいことはなんとなく理解していたつもりでしたが、具体的に考えてみると違和感が出てきました。結論として、手段が目的化することは必然的であり、むしろ「手段が目的になるように手段を設定しなければならない」という考えに至りましたので、下記に整理しておきます。

目的の定義

目的は達成するべき事柄です。目的と手段は木構造となっており、最上部に位置する目的をここでは「根本の目的」と呼びます。

手段の定義

手段は目的を達成するために、実行しなければならない行動や達成しなければならない事柄です。

目的と手段の関係

目的を達成するためには、1つ以上の手段を実行しなければなりません。実行しなければならない手段は、そもそも達成するべき事柄として設定したはずなので、目的とも言い換えることができます。つまり手段が発生した段階でそれは同時に目的でもあるということです。

逆に達成する必要のない手段を設定してしまった場合は、それは意味がありません。目的の達成条件として過不足のない手段を設定することが理想です。

目的化できるような手段を設定する

この構造を破綻させないようにするには、目的化しても良い手段を設定する必要があります。目的化してはいけない手段が設定されていたとしたら、それは手段そのものや手段の達成条件の設定に誤りがあります。

「目的と手段を混同してはいけない」と表現される理由

人により何を根本の目的とするのかは異なります。複数人が協調して動く場合、達成するべき事柄は同じでも、ある人にとっては根本の目的であり、またある人にとっては手段である場合があり、この認識のズレのことを「目的と手段を混同してはいけない」という表現されているのではないかと考えました。

ではどう表現するのか

複数人で協調する場合は、重要なことは「目的と手段を混同してはいけない」のではなく、「根本の目的を一致させること」または「ある人にとっての根本の目的と、ある人にとっての手段を一致させること」がより正確な表現となると考えます。