2014年を振り返ってみて良かったこと&もの

みなさま、お疲れさまです。ささたつです。
あっという間に年末を迎え、今年もあと少しですね。みなさまいかがお過ごしでしょうか。

今年は、、いろいろありましたが、一言でいうと新しいことにチャレンジできた一年でした。新しいことをやると上手くいかないことも多いですが、日々わからないながらも頑張っています。

そうそう、今年は頑張って早起きを続けて、早起きする習慣を付けることが出来ました!来年も続けたいことは少しずつ習慣化していきたいなと思います。毎日ちょっとずつでも、365日続けたらすごいことになりますからね。ブログ書くのも習慣にせねば。(すごい間が空いてしまった)

さて、今年はいろいろと買ったりいただいたりしたんですが、その中でも特にルンバとミキサーは良かったのでちょっと紹介してみたいと思います。

まずはルンバ!

使ってみるまでは「そんなに便利なのかなぁ・・?」程度だったのですが、家にいない間に動作させるようにしてみたらとても便利。帰ってきたときにはキレイになっています。動作中はちょっと五月蝿いので、家にいないときに動作させるくらいが良いかな〜と思いますが><

あと、ときどき溝とかにはまって動けなくなってたりするのドジっ子ぽくてかわいいです。


もうひとつはミキサー!

これでグリーンスムージーを作ってもらって飲んでいるのですがすごく良いです。健康にも良いし、何より美味しい。やはり朝はフルーツを食べるに限りますね〜。いつも作ってもらっているので奥様に感謝です :)

最近は生姜湯も好きでよく飲んでいたりして、どんどんOL化しているw


どちらもとっても役に立ってます。

という感じですが(謎)、2015年もどうぞよろしくお願いします。

requireとrequire_relativeの違いとは?

先日、require_relativeっていうのを見かけて、これなんだろうと思って調べました!どうもRuby1.9.2から導入されたモジュールみたいですね。

そもそも、Ruby1.9.2以降とそれより前のバージョンとでは、$LOAD_PATHの扱いに違いがあります。例えば、Ruby1.8.7では$LOAD_PATHにはカレントディレクトリも含まれます。

$ rbenv shell 1.8.7-p375
$ ruby -e 'puts $LOAD_PATH'
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby/1.8/i686-darwin13.4.0
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby/1.8/i686-darwin13.4.0
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/1.8/i686-darwin13.4.0
.

一方、Ruby2.1.2では、カレントディレクトリが含まれません。

$ rbenv shell 2.1.2
$ ruby -e 'puts $LOAD_PATH'
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-darwin13.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin13.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/2.1.0/x86_64-darwin13.0

そのため、Ruby2.1.2で、カレントディレクトリにあるファイルを単純にはrequireすることが出来なくなっています。カレントディレクトリにあるファイルをrequireするためには、$LOAD_PATHにカレントディレクトリ (.) を追加するか、もしくは以下のように相対パスで指定します。

require "./foobar"

ただこれも万能というわけでは無いので注意です。違うディレクトリから実行しようとすると当たり前ですがうまく動作しません。。

これに対する解決策が、require_relativeです。require_relativeを使うことで、そのファイルからの相対パスで指定することが出来ます。違うディレクトリから実行しても動作します。

require_relative "foobar"

ということで、Ruby1.9.2以上で$LOAD_PATHに含まれないファイルを読み込む必要があるときにはrequire_relativeを使いましょう :)

ヒトメディアに入社しています

だいぶ今更感はあるのですが、、

7月から「教育で世界をよくする」をビジョンに掲げているヒトメディアという会社に入社して、とある新規事業に関わっています。頑張っています。

ささたつの欲しいもの

BASE技術勉強会で話してきました

こんにちは。ささたつです。

先日、BASEさんの第1回?社内勉強会にお呼びいただいてお話してきました。そのときの資料です。前半はVagrantやDockerなどの仮想化周りの話を、後半は最近思っていることについてつらつらと話してきました〜。



このときのことについてはBASEのCTOであるえふしんさんがブログにまとめてくださったんですが、おにぎりやからあげ(!)も大量に用意してあり、ビールもプレモルで素晴らしい環境でした :D

BASE技術勉強会〜ささたつさん勉強会を開催しました | F's Garage@fshin2000

最近は社内勉強会のようなクローズドな集まりに呼んでいただけることもちょくちょく出てきました。えふしんさんも書かれていますが、なんで僕だったのか聞いてみたら「直感」だったということで大変嬉しく思っておりますw

社内勉強会に呼んでいただけるのはとても嬉しいです。これからも、「この人なら…!」と声を掛けていただけるように頑張っていかねば。。

ありがとうございました!

最後にえふしんさんのブログ記事より引用です。そう思います。

勉強会の意義って、新しいことを学んだり、検索キーワードを仕入れる場ってのもあるんだけど、自分たちが普段思っていることや、少し当たり前になりつつある部分とかが被るとすごくラッキーな話で、そこで得た共感を元に、自説を強化したり、間違ってないんだ!と自信を持ったり、そうか!みんな同じことを考えてるんだ!と改めて考えなおす機会になることって、すごく大切なんですよね。

Ansibleを使って誰でも簡単安全にサーバ構築できる仕組みを作る

 
Ansible って何なの?


サーバに対してミドルウェアのインストールや設定等の環境構築を行うことをプロビジョニングと言いますが、その作業を自動化させるためのツールです。プロビジョニングを手動で行うと、手間も掛かるし、どうしてもミスが起こりえます。

その点、Ansible のようなツールを使えば、コマンド一発でプロビジョニングが走り、さらに冪等性(何度実行しても同じ結果になる)も確保されるため、誰でも簡単安全にサーバ構築が出来るのです。


ansible


同様のことを行うツールとして、Chef や Puppet がありますが、Ansible はそれらの中でもシンプルなことが特徴です。Chef は以前使ってみようと思い触ってみたのですが、覚えることが多かったりして挫折してしまった。。Ansible はそういう点で、使い始めるまでの敷居が低い のがとても魅力です。大規模な環境であれば Chef や Puppet の方が良いのかもしれませんが、少数のサーバを管理する程度だったら Ansible は気軽で良いのではないでしょうか。

例として、Vagrant で起動した仮想マシン (CentOS) に対して、MySQL をインストールして起動するという簡単なプロビジョニングをやってみましょう。


仮想マシンに ssh ログイン出来るように


前回の Vagrantの使い方 〜仮想マシンを簡単に作成しよう。 で Vagrantfile というのがあったと思いますが、これを以下のように修正してください。

- # config.vm.box = "centos65"

+ config.vm.define :node1 do |node|
+   node.vm.box = "centos65"
+   node.vm.network :private_network, ip: "192.168.33.11"
+ end
+
+ config.vm.define :node2 do |node|
+   node.vm.box = "centos65"
+   node.vm.network :private_network, ip: "192.168.33.12"
+ end

この状態で vagrant up することで、node1 と node2 という2つの仮想マシンが起動します。まずはこれらの仮想マシンに ssh でログインできるように設定します。

# ~/.ssh/config
# vagrant ssh-config node[12] の結果を利用

Host node*
    HostName 127.0.0.1
    User vagrant
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentityFile /Users/sasata299/.vagrant.d/insecure_private_key
    IdentitiesOnly yes
    LogLevel FATAL
Host node1
    Port 2222
Host node2
    Port 2200

これで、ssh node[12] でログイン出来るようになりました。ここまではさくっと。


Ansible を使ってみる


では、Ansible をインストールしてみましょう。Mac の場合、インストールは homebrew で一発です。

$ brew install ansible

さて、なにはさておき、まずはインベントリ (inventory) ファイルというものを準備します。Ansible を使い始めるのに最低限必要なのはこのファイルのみ!これはプロビジョニング先のサーバを登録しておくファイルなのですが、Ansible ではこのファイルに書かれたサーバに対してしか処理を実行してくれないのです。

今回、hosts という名前でインベントリファイルを作りました。node1, node2 両方含むグループを servers、node1 だけを含むグループを test-servers と命名しています(適当です)。

# hosts
[servers]
node1
node2

[test-servers]
node1

では、早速 Ansible を使ってみましょう。まずは、node1 に対して ping を実行してみます。

$ ansible -i hosts node1 -m ping                                                                                  [~/work/vagrant/audit]

node1 | success >> {
    "changed": false,
    "ping": "pong"
}

ping の結果が返ってきました!node1 だけじゃなく node2 に向けても ping を実行するには、インベントリファイルに指定した servers か、もしくは all というキーワードを指定します。

$ ansible -i hosts servers -m ping

node2 | success >> {
    "changed": false,
    "ping": "pong"
}

node1 | success >> {
    "changed": false,
    "ping": "pong"
}

単純なコマンドを実行するだけであればとても簡単ですね。


playbook を使って複雑な処理を実行する


ただ、実際にはこんな単純なコマンドを各サーバで実行したい場合ばかりでは無いでしょう。もっと複雑なことを実行するためには、ansible-playbook というコマンドが便利です。

以下のような MySQL をインストールして起動する設定ファイルを用意してみます(このようなファイルを playbook と呼びます)。hosts のところに対象のサーバを指定し、tasks のところに実行したいタスクを記述します。以下の例だと、node1, node2 両方に対して MySQL をインストールして、その後 MySQL を起動させるという指定になります。

# mysql-playbook.yml
---
- hosts: servers # 対象のサーバを指定
  sudo: yes
  tasks:
    - name: install mysql
      yum: name=mysql-server state=installed # インストール
    - name: start mysql
      service: name=mysqld state=running enabled=yes # 起動の指定

さぁ、あとは実行するだけ!すると、、

$ ansible-playbook -i hosts mysql-playbook.yml

PLAY [servers] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [node1]
ok: [node2]

TASK: [install mysql] *********************************************************
changed: [node1]
changed: [node2]

TASK: [start mysql] ***********************************************************
changed: [node2]
changed: [node1]

PLAY RECAP ********************************************************************
node1                      : ok=1    changed=2    unreachable=0    failed=0
node2                      : ok=1    changed=2    unreachable=0    failed=0

いかがでしょうか。changed となっており、実行されたことがわかります。ちなみに、再度実行しても既にインストールと設定は行われているため、何も起こりません(冪等性の確保)。

ということで、playbook の準備等で少し面倒かもしれないですが、一度作ってしまえば誰でも簡単安全にサーバ構築出来るようになるのはすばらしいと思います。便利ですぞ。

[参考URL]
構成管理ツール Ansible について - apatheia.info
Ansible チュートリアル | Ansible Tutorial in Japanese
karaage299 at gmail.com




寄稿した記事

Ruby Freaks Lounge (28,30)
NoSQLを試してみる

作ったもの

カープ戦速報ボット
まとめったー
YouTube Oricon Ranking
NicoNicoブックマーク
ねたばれ見る?


ブックマーク数



購読者数



 
RSS登録
Subscribe with livedoor Reader