読者です 読者をやめる 読者になる 読者になる

Foreverly

メモ帳

itamaeとvagrantでやるテスト駆動--その1-Apache,PHP編

serverspec itamae infracture as code サーバ

rake specを実行しつつItamaeで構築 hostとwebというサーバをたてて hostにserverspecItamaeをインストールし、 webを構築して、テストをしていきます。

mkdir serverspec_test
cd serverspec_test

Vagrantfileを作成します。

vagrant init bento/centos-6.7
vi Vagrantfile

以下のように編集

# config.vm.box = "bento/centos-6.7" #コメントアウトする

## 以下の設定を追記して hostとwebにIPアドレス割り振る

config.vm.define "host" do |node|  
  node.vm.box = "bento/centos-6.7"
  node.vm.hostname = "host"
  node.vm.network :private_network, ip: "192.168.33.10"
end
config.vm.define "web" do |node|
  node.vm.box = "bento/centos-6.7"
  node.vm.hostname = "web"
  node.vm.network :private_network, ip: "192.168.33.11"
end

vagrantを立ち上げてログインをします

$ vagrant up
$ vagrant status
$ vagrant ssh host

ホストからWEBへssh接続できるようにします。

[vagrant@host ~]$ ssh-keygen -N "" -f ~/.ssh/id_rsa
[vagrant@host ~]$ cat << FIN >> ~/.ssh/config
> Host web
>    HostName 192.168.33.11
> FIN
[vagrant@host ~]$ chmod 600 .ssh/config
[vagrant@host ~]$ ssh-copy-id web
[vagrant@host ~]$ ssh web
vagrant@192.168.33.11's password:
[vagrant@web ~]$ uname -n
web

環境構築をしていきます。 dotinstallのgitからミドル一式をインストールして、 gemでitamaeとserverspecをインストールします。

git clone https://github.com/dotinstallres/centos65.git
$ cd centos65
$ ./run.sh
$ exec $SHELL -l
$ gem list
$ gem install itamae serverspec
$ gem list

作業ディレクトリを任意の場所に作っておきます。 また、Itamaeで使用するファイルも予め作っておきます。

$ mkdir myproject
$ cd myproject/
$ mkdir cookbooks
$ cd cookbooks/
$ touch recipe.rb

serverspec-initでテスト対象への OSや接続方法、ホスト名などを入力します。

$ serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: web
 + spec/
 + spec/web/
 + spec/web/sample_spec.rb
 + spec/spec_helper.rb
 + Rakefile
 + .rspec

サンプルのテストファイルは削除し、 位置から空のテストファイルを作成していきましょう。

$ cd spec/
$ cd web/
$ rm sample_spec.rb
$ touch httpd_spec.rb

httpd_spec.rbApacheのテストを書きます。

$ vi httpd_spec.rb
require 'spec_helper'
describe package('httpd') do
    it { should be_installed }
end

ここでテストを実行してテストが正常に失敗することを確認します。

$ rake spec

テストが通るように、 recipe.rbApacheインストールの記述をします。

$ vi cookbooks/recipe.rb

package 'httpd'

itamaeを実行してテストが通ることを確認します。

$ itamae ssh -h web cookbooks/recipe.rb -n
$ itamae ssh -h web cookbooks/recipe.rb
$ rake spec

テストの際,Rspecの記法として ResourceとMatcherが出てきました。 これらの種類は公式サイトのRESOUCE TYPEから確認できます。

Resource - 何をテストするのか - httpdのpackage

Matcher - どういう状態 - be_installed

まずはhttpd自動起動していて、80番ポートでLISTENしているかテストを書きます。 be_enable自動起動の設定で、be_runningがスタートしているかです。

require 'spec_helper'
describe service('httpd') do
  it { should be_enabled }
  it { should be_running }
end

describe port(80) do
  it { should be_listening }
end

それではhttpd自動起動させます。 :enable :start自動起動させます。 デフォルトで80番ポートでLISTENします。

package 'httpd'

service 'httpd' do
  action [:enable, :start]
end

rake speckを実行してテストが成功することを確認

ファイルを転送して、中身のテストをしていきます。

index.htmlが存在して、中身がHello Worldという文字列が含まれているか テストを書きます。 オーナとグループがapacheであることも確認します。

describe file('/var/www/html/index.html') do
  it { should be_file }
  it { should be_owned_by 'apache' }
  it { should be_grouped_into 'apache' }
  its(:content) { should match /Hello World/ }
end

filesフォルダを作り、 そこに転送用のindex.htmlを書きます。

$ mkdir cookbooks/files
$ vi cookbooks/files/index.html
<html>
Hello World
</html>

Itamaeではオーナとグループがapacheのindex.html /var/www/html/配下に転送させます。

remote_file '/var/www/html/index.html' do
  owner 'apache'
  group 'apache'
end

rake specを実行し、テストが成功することを確認

パッケージをまとめてインストールさせて、テストを実施する

phpのテストを書いてみます。 新しくテストファイルを書きます。 eachメソッドを使いパッケージをインストールします。 php、php-devel、php-mbstring、php-gdが入っていることを確認します。

require 'spec_helper'

%w(php php-devel php-mbstring php-gd).each do |pkg|
  describe package(pkg) do
    it { should be_installed }
  end
end

Itamaeのレシピには以下を追加してパッケージをインストールさせます。

%w(php php-devel php-mbstring php-gd).each do |pkg|
  package pkg
end

rake speqを実行して、 PHPがインストールしたことを確認します。

PHPがインストールされたことを確認したら、 設定ファイルの中身を確認します。

php_configというリソースを使っていきます。 タイムゾーンAsia/Tokyoであることを確認してみる 設定項目はdata.timezode 値を確認するにはits(:value)を使います。 shouldで文字列が同じでないといけないと書きます。

describe php_config('date.timezone') do
  its(:value) { should eq 'Asia/Tokyo' }
end

Itamaeではレシピに以下を追記 /etc/php.iniaction :editで編集 blockを使い|content|で破壊的メソッドで置換をします。 コメントアウトになっているdate.timezoneを 'date.timezone = Asia/Tokyo'に置換

file '/etc/php.ini' do
  action :edit
  block do |content|
    content.gsub!(';date.timezone =', 'date.timezone = Asia/Tokyo')
  end
end

rake specを実行し、 ファイルが編集されていることを確認します。

次に、ディレクトリが存在するかテストしてみます。

ファイルやディレクトリを確認するテストファイルを作成します。 file()リソースを使い、Matcherでbe_directoryを使えばテストできますが、 commandリソースでコマンドを実行させて確認することもできる 今回ならlsコマンドを実行して、その結果をテストする its(:stdout)で標準出力をテストできます。 今回は空白とディレクトリ名と行末の正規表現でテストします。

require 'spec_helper'

# describe file('/home/vagrant/myapp') do
#   it { should be_directory }
# end

describe command('ls -la /home/vagrant') do
  its(:stdout) { should match /\smyapp$/ }
end

Itamaeのレシピではディレクトリを作成するレシピを追記します

directory '/home/vagrant/myapp'

vagrantとvirtualboxで作るローカル開発環境

サーバ

VirtualBoxをインストール

https://www.virtualbox.org

Vagrantをインストール

https://www.vagrantup.com

CentOSインストール

作業ディレクトリを作成して移動します

$ mkdir MyVagrant
$ cd MyVagrant
$ mkdir mycentos
$ cd mycentos

CentOS 6.7のboxを探す

初期化コマンドを実行し、Vagrantfileという設定ファイルが作成されるのを確認します。 また、boxが追加されていることも確認できます。 Vagrantfileを編集してローカルIP(192.168.〜)のコメントアウトを外します。 そしたらVMを起動し、sshで接続します。

$ vagrant init bento/centos-6.7
$ ll
$ vagrant box list
bento/centos-6.7 (virtualbox, 2.2.7)
$ vim Vagrantfile
 config.vm.network "private_network", ip: "192.168.xxx.xxx"
$ vagrant up
$ vagrant ssh

vagrant sshの時に以下のエラーメッセージが出力されました。 ssh接続の認証が失敗しているようです。 $ vagrant sshで接続をして、パスワードがきかれてきます。 vagrantを入力すればログインできました。

default: Warning: Remote connection disconnect. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...

dotinstallのGithubにcentos6.5のansible一式があったので それを利用しましょう。

$ sudo yum -y install git
$ git clone https://github.com/dotinstallres/centos65.git
$ cd centos65/
$ ./run.sh
$ ruby -v
-bash: ruby: コマンドが見つかりません
$ exec $SHELL -l
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

他にインストールされたものを確認

$ php -v
PHP 5.6.24 (cli) (built: Jul 21 2016 07:42:08)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.51, for Linux (x86_64) using readline 5.1
$ python --version
Python 2.6.6
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
$ sudo service httpd status
httpd (pid  26838) を実行中...

ApachePHPが起動しているので、 試しにWEBページをブラウザ上に表示させてみましょう。 以下のindex.php/var/www/html配下において ブラウザ上で確認しましょう。 ブラウザのURLにサーバのIPアドレス/index.phpを打ち込んで Hello Worldの文字が表示されることを確認します。

$ vim index.php
<?php

echo "Hello World";

IPアドレスではなくて、ホスト名を入力して確かめたい人は hostsファイルを修正すればできます。 IPアドレスに対してホスト名を記入すればできます。

$ vi /etc/hosts
IPアドレス  ホスト名

再度、URLにホスト名/index.phpで表示できることを確認

これで環境構築の設定は以上。

CentOS7のAnsibleはないようなので、 作成しておこう。

boxの削除

Macintosh:mycentos shuhei$ vagrant box list
bento/centos-6.7 (virtualbox, 2.2.7)
Macintosh:mycentos shuhei$ vagrant box remove bento/centos-6.7
Box 'bento/centos-6.7' (v2.2.7) with provider 'virtualbox' appears
to still be in use by at least one Vagrant environment. Removing
the box could corrupt the environment. We recommend destroying
these environments first:

default (ID: 113a639075cb4f1c8e398bf1a5bf5340)
host (ID: 44374733ca5644bfb8a902c6cd73cf5c)
web (ID: c5c7135a72c44ef682ed38fe8c5ed156)

Are you sure you want to remove this box? [y/N] y
Removing box 'bento/centos-6.7' (v2.2.7) with provider 'virtualbox'...
Macintosh:mycentos shuhei$ vagrant box list
There are no installed boxes! Use `vagrant box add` to add some.

Vagrantfileは残っているのでrmコマンドで削除

Macintosh:mycentos shuhei$ ll
total 8
-rw-r--r--  1 shuhei  staff  3005  8 12 06:15 Vagrantfile

7月のテックの祭典

勉強会

前日にPokemonGoMapに消耗して徹夜で行きました。 終日立っていたのでところどころ聞けていなかったです。 ユニークなのが会場がPokemonGOのポケステーションで イベント中はずっとルアーモジュールが使用されていました。 おかげでミニリュウカモネギを捕まえることができましたので、 運営には感謝。

  • 基調講演
  • 現実が正解だ! やってみんとわからんことだらけ。 さくらのIoT企画・開発365日の軌跡。そして、次の365日へ。

さくらのIoT Platformの立ち上げに奔走したこの1年を、 チームビルディングという観点で紹介されていました。

あとブースでさくらクラウド2万円クーポンありがとうございました。

  • Wantedly の文化を支えるインフラとビジネスの変化に強いインフラ

ブースに座ったまま聞けたので、最高でした。 このセッション聞けて満足して午前が終わりました。 Wantedlyのインフラチームはコードを書いて問題解決をしている。 憧れていた仕事はこういうものだったと気づいたセッションでした。 会社のポジションを気にしていたけど、どういう仕事をしたかったのかを 気づかせてくれたし、今後の生存戦略の方針が決まってきた感じがありました。 今年一年でコードをかけるインフラエンジニアになって、そういう仕事ができる 場所にいけるようやっていきが高まったセッションでした。 帰宅してから、Wantedly Tech Bookは買って読んでいます。

具体的なセッション内容は、 やぱちーでも聞いたCode Wins Argumentsの紹介から、 WantedlyでのUser Firstのお話と、Simple is Not Easyであることのおはなし。 Wantedlyの社員数と売上のグラフをみましたが、伸びかたがすごかったです。 これがグロースというものなのかと思いました。 XaaSとAWSの両方を使い、利用できるものはどんどん利用する。 HerokuやRedisやFirebaseとAWSの組み合わせなどもやっている。 これらはスピード感とコスト感などで選択しているとのこと。 規模が大きくなるに連れて、 Developerからインフラへのタスク依頼が増えてインフラ側がボトルネックになっていく。 これをどう解決するか、既存、新規アプリ関係なく、 すぐにデプロイできる環境を提供できるようにするのが、変化に強いインフラ。 自動化とTool(API)の作成して、 DeveloperがそのToolを使うようにさせて、 インフラにタスク依頼がこないようにした。 Developerに使ってもらえるように気をつけている。 herokuからAWSへの移行のような大きな変化は コマンドが変わることでDeveloperに影響がでるので、 これまでの運用の変化差異を減らせるように、 ヒアリングをして同じ結果になるようにコマンドを作成した。 Docker imageの中にChefを使ってインスタンス作成たり、 PackerでAWSのinstanceのAMIを作成などをした。 ただ、これではアプリケーションの構築部分がCode化できたが、 インフラがコードをメンテするので、インフラがボトルネックになってしまう。 TerraformeはAWS(S3/RDS/ELB etc)dnsimpleを操作させている。 WantedlyではCoreOSを使用しているが、 CoreOSを使うきっかけはDockerやRegistryのversion upが大変だから、 Officialにamiが用意されているのでCoreOSを試験運用してきた。 サーバが一台停止されたら、勝手にインスタンスが立ち上がって欲しいので、 golangでツールを作成。AWS TAGを元にsystemdにサービスを提供させるもの。

ただ、これはAutoScaleでよいのでないかしらとおもいました。

クラスタリングはすぐアプリを動かせるインフラをすぐに作れるので、 何台分でもよくて、一回限りでもよい。 Kong Archirtecture:各サービスのAPI作成するとき、 Kongに対してdeployすればよい。これはAPI Gatewayの働きをする。 API GenerateはAPIを作成してくれる。 Wantedlyのインフラチームはコードを書いて問題解決をしているとのことでした。

動画はないみたいなので、公開されているプレゼン資料を読むのが良さそうです!

このセッションを聞こうと思って、もともと参加してたのですが、 他の人に譲らないといけないみたいな感じになりソウルジェムが濁ったのですが、 途中から聞けるようになったのでよかった。

いい話でよかったです。そしてやっているからスキル高いんだなあとも思いました。 もし、来年も同じセッションを聞いていい話と思っちゃいけないとも思いました。 今年一年で、来年このセッションを聞く必要がないようにならないといけない。 手を動かしてやっていかないといけないと思いました。

途中からだったんのですが、内容としてはプログラミング初めて写経の次はどうするのか問題。 写経の次は車輪の再発明のすすめ。 ただプログラミングのやり方がわかってきてからやったほうがよくて、 自分でプロトコルアルゴリズムを実装するのがよい。 たとえばHTTPプロトコルのサーバやクライアントをつくるとか、 自分が普段使っているプロダクトに似ているものを作ってみる。 Apachekeepalivedなどなど。 これをやることでボトルネックの想像がつきやすくなってくる。 HTTPサーバの実装だったら、HTTPのRFCを読んで、知らないヘッダを読む。 keepaliveや、cache-controlについてどういうものなのかを漠然としたものから 理解することができるようになる。 HTTPサーバの自作はおすすめらしい。 ヘッダを無視して、メソッド、パス、受けたら返すようにするのを目指す。 これをやるとc10k問題がどういうものなのかが、わかってくる。 ファイルディスクリプタをセレクトでみてるからc10k問題になる。 epollでみてるのがnginx. ほかにはCGIはどのようにして動作しているのかわかる。 こういうのをやって、どれだけ役に立っているかというと毎日役立ってると思うくらい役に立っているとのこと。 自作したHTTPサーバに対して、curlやブラウザが返ってくるのは感動。 セッション中ではJavaで自作する本が出ているのをおすすめしていました。 他にはLinuxコンテナエンジンの自作をしてみる。 Dockerは巨大なので、実装することで中でどのような動きになっているか理解できる。 cgroupやchroot,vethのような技術も理解できる。 先駆者がいるので、コードを読んで参考にするのがよい。 Denaのjaillingのperlは200行ぐらいで書かれていたりする。 あとはdrootやhaconiwaなど 他に車輪の再発明としておすすめなのは、 言語処理系、LispのNosql系、プロビジョニングツール、Itamaem、ldapが大変なので、ログイン認証サーバを作ってみる。 他には監視サーバをつくてみるとかもよい。 分散システムのアルゴリズムを実装してみたりもおすすめ。 車輪の再発明プロトコルや低レイヤなどの普遍的で長く使える技術を効率よく学べる。 似たものを作るので元のソースコードを必然的に読むことが増える。 RFCを読み解く練習にもなる。新しい実装の公開にも読み解ける。 車輪の再発明の次はなにか、それは代表的プロダクトを作ってみる。 代表的プロダクトとはあの人といえばこのプロダクトと呼ばれるもの。 車輪の再発明+アイデア=代表的プロダクトになる可能性があるのでは? 既存のソフトウェアの不満点を解決、デプロイや運用が既存のソフトウェアより簡単になっている。 抽象化しすぎると特定の規模に絞れないので、ドメインを対象に特化してみる。 書き直すならどの言語で書き直すのか?UIの考え方も重要。 ここのUIは運用する人目線のインターフェースをとらえる。 既存の言語をGOで書き直す流行りがあった。 ワンバイナリで動くので導入障壁が低い。 対話型インターフェースにしないでyをきいてこないようにすれば、 自動化の妨げにならないとか運用目線で考える。 設定ファイルや自動化が難しいツールをCruby/mrubyなどで作り直す。 気をつけよう!! 発明アンチパターン(嫌われる車輪の再発明)はやめて! 既存の劣化品を作ってプロダクションにいれてしまうことなど。 既存のモノの修正で十分済むのに新しい物をつくって導入してしまうことなど。 自分の発明にするには作ろうとしている対象の領域の深い知見が必要。 実装すればわかるのは、たいてい勝てない。 作りなおすのはアーキテクチャとしてダメなとき。 やってみた側になるには手を動かすのが大事なので手を動かそう! 車輪の再発明をするときどこまで実装するのかは、 どこまで調べるのかは最初からきめる。 最初にゴールを決める。 プライベードと仕事の線引きはどうするのか、 社内と合意をとる。合意をとるためにも見せられるものが必要。 そのためにも手を動かす。

  • 機械学習を用いたAWS CloudTrailログの積極的活用 機械学習興味あるならやってみようよというお話だったと思います。 ベストスピーカー賞ももらっていました。 ここでも疲れが出てきて、ちゃんと聞けていなかったです。 数学とかちゃんとやらないとだよなあ。

  • 自動化のための運用監視設計を皆で考えてみなイカ(仮)

このセッションでもああ、こういう監視設計とかやりたくて SIerから移ったはずなんだよなあということを思い返しました。 やりたかったことを思い出して、やっていこうと思ったセッションです。

内容としてはこれからの運用監視設計の話をしようで、 ゼロから監視設計ができるか、運用目的を明確化した監視と 非機能要件を満たしたシステム監視を行う。 意外と非機能要件の部分の監視が漏れていたりするので、 テストも必ず行いましょう! そして、人は失敗するので手作業を減らして自動化をしようというお話。 テストもserverspecやinfratesterでテストの自動化ができますね。 そして、自動化をすればいいというのではなく、 個人の経験や組織のナレッジを自動化で更に活かすようにしていく。

タイトルがかなり釣り感があるセッションでした。 インドに一ヶ月修行に行って、 世界のためになにができるかを考えた結果、 ソフトウェアエンジニアとして 人に役立つものを作ろうと思ったらしいです。 そしてOSSに貢献した結果、娘から見直されたといういい話が聞けました。 代表的プロダクトを作るには娘が必要で絶望なんて思ったものです。 VulsはツイッターのTLでみたなあと思ったぐらいで、 どんなものかは知らなかったのですが、 かなり良さそうだったので、ちょっといじってみようかなと思いました。 格闘家かしらと思ったけど、いい人そうだったなという感想。

  • 今エンジニアに最も必要なものは「戦略」である!孫子に学ぶ本質のつかみ方

この時疲れがピークに達していて寝てしまっていた。 戦術と戦略の違いから説明していてよかったです。 中国で出版されている戦略の本をおすすめしていてマニアックだなと思いまいした。 戦術と戦略ってビジネスワードとして使われているので、 ITイベントでもこの手の話を聞けるとは思いませんでした。 最近ではSOFT SKILLSという本が売れていたりするので、 個人的には良いと思います。 結果どういう話に結びついたのかは、あまり覚えてないです。。

  • 懇親会

やぱちーとも微妙にエンジニア層が被ってなさそうだなあという印象。 懇親会ではkoudaiiiさんと話してええと様子を伺っていましたが、 どうやら運営側らしく忙しそうだった。 rrreeeyyyさんにsongmuさんが話しかけにきていて これができるエンジニアかと思いました。 懇親会で話しかけて貰えるように顔を広くなるには アウトプット必要だよなあと最近思っていることなので、 やっていかないとだ。 個人的にsongmuさんがナデシコをみていて(劇場版も)、 ナデシコ観てるんだあ思っていました。 隙をみてkoudaiiiさんに話しかけるチャンスをみつけて、 wantedlyに入社したのが一年ぐらいとおっしゃっていて、 その成長速度に感服しました。 コードがかけるインフラエンジニアになれるように背中を追っていきたい。 k8sとマイクロサービスについてお話してくれたWantedlyの方と名刺交換したら dtan4さんじゃんと!名刺を見返して気付きました。 酔っててもちゃんとその場で、名刺をよくみよう。。。 今回はコード書いてるインフラの人と話せたのが本当に良かった。 最近の目指す方向が社内でのポジションを目指すことになってたけど、 本来やりたかったことをやっていくべきなんだと気付きました。 やっていくからやってみたになっていこうと思います。

CentOSにPythonの環境構築

Python プログラミング

Pythonの環境構築についてです。 pyenv,virtualenv,pyvenvとややこしくて困惑しました。 私と同じような人は(ここを読むといいかも)http://qiita.com/nobolis/items/12a464557f2ae007e9a1

githubからpyenvをチェックアウトします。

# git clone https://github.com/yyuu/pyenv.git ~/.pyenv

PyenvのPathを通します。

# echo 'export PYENV_ROOT=$HOME/.pyenv' >> ~/.bash_profile
# echo 'export PATH=$PYENV_ROOT/bin:$PATH' >> ~/.bash_profile
# echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
# echo $PYENV_ROOT

設定を保存します。

# source ~/.bash_profile
# echo $PYENV_ROOT
/root/.pyenv
# echo $HOME
/root

zshを使用している人はsource ~/.zshenvなどに変更します。

インストールできるバージョンを確認します。

# pyenv install -l

2.7.12をインストールします。

# pyenv install 2.7.12
Downloading Python-2.7.12.tar.xz...
-> https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz
Installing Python-2.7.12...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
Installed Python-2.7.12 to /root/.pyenv/versions/2.7.12

WARNINGがでました。

こちらを参考にbuildします。Common build problems

# yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel

今回はbzip2-develがないことがWARNINGの原因でした。

再インストールしてWARNINGが出ないことを確認しました。

# pyenv install 2.7.12
pyenv: /root/.pyenv/versions/2.7.12 already exists
continue with installation? (y/N) y
Downloading Python-2.7.12.tar.xz...
-> https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz
Installing Python-2.7.12...
Installed Python-2.7.12 to /root/.pyenv/versions/2.7.12

次に3.5.2をインストールします。

# pyenv install 3.5.2
pyenv: /root/.pyenv/versions/3.5.2 already exists
continue with installation? (y/N) y
Downloading Python-3.5.2.tar.xz...
-> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz
Installing Python-3.5.2...
Installed Python-3.5.2 to /root/.pyenv/versions/3.5.2

デフォルトのPythonのversionは2.6.6でした。 早速2.7.12に変えてみます。

# python --version
Python 2.6.6
# pyenv
--version           exec                hooks               local               root                uninstall           version-file-read   version-origin      which
commands            global              init                prefix              shell               version             version-file-write  versions
completions         help                install             rehash              shims               version-file        version-name        whence
# pyenv global 2.7.12
# python --version
Python 2.7.12

pipを最新のものにしましょう。

[root@shuhei src]# pip install --upgrade pip
Collecting pip
  Downloading pip-8.1.2-py2.py3-none-any.whl (1.2MB)
    100% |████████████████████████████████| 1.2MB 617kB/s
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Uninstalling pip-8.1.1:
      Successfully uninstalled pip-8.1.1
Successfully installed pip-8.1.2

virtualenvは、同じ(python)バージョンで違う環境を作成するためのものです。

インストールして設定を.bash_profileに書き込みます。

# git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
# echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
# source ~/.bash_profile

新しいpython環境の作成は、pyenv virtualenv [version] <virtualenv-name>で作成できます。 ここでは3.5.2の環境のnew_3.5.2を作成してみます。

# pyenv virtualenv 3.5.2 new_3.5.2
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /root/.pyenv/versions/3.5.2/envs/new_3.5.2/lib/python3.5/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /root/.pyenv/versions/3.5.2/envs/new_3.5.2/lib/python3.5/site-packages

pyvenvは2.7系ではインストールされていませんでした。3.3以降を使用している人向けですね。

# python --version
Python 2.7.12
# pyvenv tutorial-env
pyenv: pyvenv: command not found

The `pyvenv' command exists in these Python versions:
  3.5.2

pyenvの他の環境作成の方法として、pyvenvについて Pythonチュートリアルに説明が記載されていました。

仮想環境を置きたいディレクトリに移動して、 pyvenvに仮想環境のディレクトリ名をつけて実行すればよいです。 ここでの仮想環境とはアプリケーションが依存するソフトウェアを格納したディレクトリのことです。 仮想環境は環境変数を利用して切り替えを行います。virtualenvではPythonの パッケージをシステムディレクトリやユーザーディレクトリに配置するのではなく、 アプリケーション専用の分離されたディレクトリに配置します。 これにより、プロジェクト毎に利用するPythonバイナリや依存ライブラリを 簡単に切り替えることができるようになります。

utorial-envというディレクトリを作り、Pythonインタープリタ、標準ライブラリなどの サポートファイルをディレクトリツリーを生成します。 また、生成し仮想環境はアクティベートする必要があります。 virtualencをアクティベートすると、シェルのプロンプトが使っているvirtualenvを示すものに変わり、 またpythonを入力した時に、特定バージョンの指定のインストール実体が実行されるように環境が変わります。

# pyenv global 3.5.2
# pyvenv tutorial-env
# source tutorial-env/bin/activate
(tutorial-env) # python
Python 3.5.2 (default, Jul 18 2016, 05:05:01)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/root/.pyenv/versions/3.5.2/lib/python35.zip', '/root/.pyenv/versions/3.5.2/lib/python3.5', '/root/.pyenv/versions/3.5.2/lib/python3.5/plat-linux', '/root/.pyenv/versions/3.5.2/lib/python3.5/lib-dynload', '/root/.pyenv/tutorial-env/lib/python3.5/site-packages']

MacにOcamlインストール

プログラミング OCaml

プログラミングの基礎を読みすすめるにあたって、 Ocamlの環境構築でやったことのメモです。

Install

brew install opam

インタプリタ起動

ocaml

インタプリタ終了

#quit;;

日本語の文字化けを解消する

プログラミングの基礎でコードを写経すると日本語がインタプリタで文字化けします。 EUCを使用するように書いてあるのですが、iTermの文字コードを変えてもうまくいかなかったです。 インタプリタ側で日本語文字列がエスケープされているそうです。 (ここを参照)http://d.hatena.ne.jp/camlspotter/20100106/1262745517

# let printer ppf = Format.fprintf ppf "\"%s\"";;
val printer : Format.formatter -> string -> unit = <fun>
# #install_printer printer;;

これで文字化けが解消されているはずです。 それではプログラミングの基礎頑張っていきましょ〜👍 

CentOSにRuby2系をインストールした

プログラミング Ruby

ServerSpecを始めようとして、 ServerSpecにはRubyが必要なので、 Rubyのインストールからはじめました。

CentOS6系ではRuby2系でないとエラーが出てしまうので 今回はRuby2系のインストールをします。

まずはRubyがインストールをしているか確認します。

# ruby -v
-bash: ruby: コマンドが見つかりません

rbenvを使用してRubyをインストールします。 今回は/usr/local/src/配下にRubyをインストールします。

# cd /usr/local/src/

rbenvはGithubから提供されているのでgitをインストールします。

# yum install git

gitでGithubからrbenvをチェックアウトします。

# git clone git://github.com/sstephenson/rbenv.git

次にruby-buildプラグインをrbenv/plugins/配下にインストールします。

# mkdir rbenv/plugins
# cd rbenv/plugins/
# git clone git://github.com/sstephenson/ruby-build.git

/etc/profile に以下の3行を追加して、rbenv を初期化&実行するための環境設定を行います

~/.rbenv/binにrbenvコマンドが入っているので、そこにパスを通します。 ※zsh使ってる場合は~/.bash_profileの代わりに~/.zshenvにして下さい。

rbenv initコマンドを呼び出すようにします。実際は~/.rbenv/libexec/rbenv-initのシェルを呼び出しているようです。

# echo 'export RBENV_ROOT="/usr/local/src/rbenv"' >> ~/.bash_profile
# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> ~/.bash_profile
# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# test -r ~/.bashrc && . ~/.bashrc

test -r ~/.bashrc && . ~/.bashrcはbashrcが読み込まれなくなったら入れてみて下さい。

シェルを再起動して設定を反映させましょう。

# source ~/.bash_profile

パスが通ってることを確認します。

# echo $RBENV_ROOT
/usr/local/src/rbenv
# rbenv root
/usr/local/src/rbenv

必要になるモジュールをyum でインストールします

# yum install gcc make openssl-devel libffi-devel

rbenv でインストールできる Ruby のバージョン一覧を確認します。

# rbenv install -l

お好きなバージョンをインストールしてください。

# rbenv install 2.3.1

OSによっては以下のような実行結果(エラー)が出ました。

BUILD FAILED (CentOS release 6.x (Final) using ruby-build xxxxxxxxxxx)

以下のコマンドを実行して解決できました。

yum install -y readline-devel

Rubyのインストールを確認

# rbenv global 2.3.1
# ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

他のバージョンをインストールしても以下のコマンドでデフォルトバージョンを変更できます。

# rbenv global バージョン名

VRとは体験のイノベーションだった

勉強会

Game Tools Middleware Forum 2016 Osakaの感想です!

記事も出ていましたが、自分のブースについては書かれていませんでした。 当たり前ですね。写真とか写り込みたかった! GTMF 2016 Osaka ブースレポート

ブース体験

今回初めてブース出展という体験をさせてもらった。 ゲームのミドルウェアのカンファレンスだったので、 サーバインフラとしてはアウェイ感しかありませんでした。 周りのゲーム開発のミドルウェアを販売しているブースは とにかくインパクトがあり派手でした。 自社の垂れ幕のようなものや、パネルがあったり、 ディスプレイをおいてデモムービーを流していたり、 他にはVR体験ができるようにしていたりと 周りの本気度が伝わってきました。 今回はとりあえず出してみたという立場でブース出展している身としては 立つ瀬がないなあと思いました。 特に真正面にUnityがVRの体験をしていたので、 来場者の人はみんなUnityの方をみて、自分たちのブースには背中を向けて 通り去っていくので、かなり辛い戦いになるなと思いました。 この時から、自分もこのカンファレンスを楽しむ方向で頑張ろうと意識を切り替えています。 ブース出展の裏で、セッションが行われていたのですが、 前夜祭で何度も出展している方から、セッション中は人はそっちにいくから ブースは暇になるよ。その時に、出展者同士で話たりするといいよと教えていただきましたが、 本当に人がいなくなりUnityやUnreal Engineのブースでも人がいなくなりました。 みんなセッションを聞いて勉強しに来ているんですね。 ブースにUnreal Engineの本を執筆して鉄拳などの開発をしている湊さんが きてくれて、その場で著者の本を買いに行き、サインを頂けました。 かなり感動しました! Live2Dではイラストキャラが動いてVR世界で一緒の空間にいることができるので、 みんな嫁を持つことができる世界だと思いました。 触覚デバイスがさらに発達すれば、漫画「ルサンチマン」のような世界がくるのだと思います。

PSVR

PSVR体験できました! とにかくすごかったです!感動しました! 今回の一番の目的だったのですが体験できて感動しました! VR体験は今までに体験できない感動を与えてくれました! 本来であれば抽選であたった人でしか体験ができなかったのですが、 カンファレンス主催者の方の懇意でブース出展者の方も人がいない時に体験ができるようにしてくれました。 PSVRで体験したのがデモムービーでしたが、迫力がすごかったです。 内容としては檻に入って深海に潜り込んで、クラゲや魚など綺麗な描写に心を奪われている時に、 突然檻に衝撃がはしりました。サメが襲ってくるんですね。 360度をサメが縦横無尽に泳ぎまわり、檻を壊してきます。 サメの質感などが安いポリゴンなどではなく、質感がみてとってわかるように リアリティがあるものでした。 サメに食べられるという恐怖と、檻が揺れて下をみると海の底が続いているので 身体的には衝撃はないのですが、脳が錯覚して妙な浮遊感を体験しました。 正直早く終わってくれと何度も思うほど、恐怖体験でした。 PSVRは人が死ぬゲームを生み出すと思います。レーティングとかあると思いますが、 それが今までの基準では扱えないと思います。PSでバイオハザードをやって恐怖に打ち震えた経験がある人なら、 それがPSVRでバイオハザード7をやったらどうなるかわかると思います。 そしてサマーレッスンへの期待も高まりました。 絶対にサマーレッスンで英語力向上というプログが書かれてはてぶ300ぐらい集める未来が想像に難くないです。 PSVRは体験するゲームという意味がわかりました。 未来はきています。

懇親会

名刺交換の場として懇親会が機能していたので、 知っている人としか話さないなんてことがないのはいいなあと思いました。 事前に出展している会社の名前と事業内容を把握しておけば、 名刺をもらった瞬間に反応ができて会話を繋げることができるので、 相手のことを知るより、知っておくことが大事だと思いました。 ウェブ系の懇親会で知らない人と会話ってなかなかできないですよね。 ゲームのハードを売り出している大会社の人と、 「スマホゲームではなく、コンシューマゲームを作りたい人!世界を変えたいと思っている人!一緒に働きませんか!」 とゲーム会社の社長が言っていたのが印象的でした。 エンジニアが社長になったいい例だと思いました。 一方で、夜の帝王コースを体験しに行こうとか言っている人が大企業の人だったりすると なんだか哀しくなってきました。 世界を牽引している大企業の座を夢を追っているベンチャー企業のような小さい会社が とって変わってくる日がくるようになって欲しいです。 じゃんけん大会の景品でPS4があったのですが、もらうことができませんでしたが、 Unityちゃんのモバイルバッテリーをいただくことができました。 その時に、マイクで自社のアピールをする指令が出ました。 そういうのが大事なんですね〜〜 あとUnityちゃんのモバイルバッテリーをいただけたので、 そのあとにUnityの方が名刺交換しに来ていただけたので、 どんな景品を選ぶのかも重要だと思いました。 懇親会では自社で3Dプリンタをやっている人がUnityちゃんの人形を持って説明していたり、 大阪の気質なのか物を売る人たちの気質なのかビジネスの話をする人や物を売り込む人たちの姿勢は参考になりました。

二次会

夜の帝王コースには行きたくなかったので、 ゲーム会社さんのエンジニアの方々の二次会に参加しました。 何度もMGTFに参加しているゲーム会社のエンジニアの方々と同じ席に座ったので 全く話についていけなかったんですが、ここでも名刺交換だったりして、 何をしているのかとか話すことができたので、だんだん会話に入ることができました。 業界が違うと有名なエンジニアさんが違ったり、気質も違ったりしますが、 勉強方法などは共通していたり、すごいエンジニアの逸話の話をしていて楽しかったです。 UEの本を書いた鉄拳の開発をしていた湊さんにサインもらいましたと言ったら、 あの人はすごい人なんだよ〜〜湊伝説をおしえてあげようと、2つほどおしえてもらえました。 業界は違えど、エンジニアの情熱というかやっていく力を聞けて参考になりましたし、 かなり感動しました。 ゲームフリーランスとして活躍している方とは映画の話ができて楽しかったです。 やっぱりコンテンツを作っている人は詳しい人が多いですね。 また任天堂日本国籍を持っているデベロッパーにしたことなど、業界事情は聞いていて新鮮でした。 Unityのおすすめの本や、勉強会を教えて頂いたのがありがたかったです。 会社でVR研究会なるものが発足したので、これからゲームも作ってみようと思います。 インフラであるサーバサイドと、ミドルウェアと、クライアントを一通りできるように目指します。