Vagrant + CentOSで最新のRuby使うためにrpm作った
Vagrantで作って壊してって色々実験してるときに、Rubyを使う必要があった。
しかしCentOSの標準のリポジトリのRubyはいまだに1.8系。
普段だったらrbenvとか使うけど今回の場合以下の理由で却下。
そもそもVagrantでプロビジョニング書いて環境を作るなら、Rubyのバージョン変えたかったら環境毎作り直せば良いのでrbenvを使う必要性ない。複数のバージョンを同時に使う必要でもあれば別だけど。
となるとソースからビルドでも良さそうだが、これはビルドに時間がかかりすぎるのでつらい。
というわけでrpm作った。先人のおかげで意外に簡単だった。
ちなみに以下の作業で色々ツールなどを入れてちょっと汚れるのでrpmビルド用に環境があった方が良い。今回のようなケースならrpm使いたい環境をvagrant upして、rpmを作り終えたらvagrant destroyするとよい。
※できあがったrpmはホストOSに保存してからdestroyしましょう。
依存ライブラリなどの追加
EPELリポジトリ追加。
$ curl -O http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm $ sudo rpm -ivh epel-release-6-8.noarch.rpm
以下をインストールする。
$ sudo yum -y groupinstall "Development Tools" $ sudo yum --enablerepo=epel -y install libyaml libyaml-devel readline-devel ncurses-devel gdbm-devel tcl-devel openssl-devel db4-devel libffi-devel
ソースなどの取得
rpmはホームディレクトリ以下でつくるそうだ。
$ mkdir -p $HOME/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} # ソースを取得 $ (cd rpmbuild/SOURCES/; curl -O http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz) # SPECファイルを取得 $ (cd rpmbuild/SPECS; curl -O https://raw.githubusercontent.com/hansode/ruby-2.1.x-rpm/master/ruby21x.spec)
rpmをビルドして動作確認
# ビルド $ rpmbuild -bb rpmbuild/SPECS/ruby21x.spec # 自分にインストールしてみる $ sudo rpm -Uvh rpmbuild/RPMS/x86_64/ruby-2.1.2-2.el6.x86_64.rpm # インストールできたか確認 $ ruby -v $ gem -v
/vagrantに置いてまっさらな環境にインストール
Vagrantの共有ディレクトリにあるファイルはvagrant destroy
しても残るのでそこに置いて試す。
Vagrantでは、ホスト側のVagrantfileのあるディレクトリがゲスト側の/vagrantディレクトリにマウントされているのでとりあえずそこに作ったrpmを置く。
$ vagrant destroy
して
$ vagrant up $ vagrant ssh
インストールの際にもRubyの依存ライブラリをインストールする。EPELも必要。 たぶん"Development Tools"はいらないと思うけど試してない。
rpmをインストールして動作確認。
$ sudo rpm -Uvh /vagrant/ruby-2.1.2-2.el6.x86_64.rpm $ ruby -v $ gem -v
ちゃんとバージョンが出ればOK。
参考
Ruby 2.0 のインストール
ほとんどこれのまま。ありがとうございます。
変えたのはwgetをcurlにしたくらい(素のCentOSに入ってなかったので)。CentOSにEPELリポジトリを追加する
EPELのURLどこだっけ?と毎回のようにググってる。今回はここに行き着いた。http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/
その結果たどり着いた場所。hansode/ruby-2.1.x-rpm
rpmのspec。頭を垂れる他ない。
CentOS6入れて最初にやること
当然用途によって違いますが。
大抵のケースで共通の部分だけ書いておきます。
結構少ない方だと思うし普通ですが毎回ググりながらも効率悪いのでメモ書き。
iptablesの設定
外から来るものは一旦全部拒否して必要なものだけ許可するホワイトリスト方式。
もっと良い書き方はあるのかもしれない。
一応現状の確認
# iptables -L
一応バックアップ
# cp -pi /etc/sysconfig/iptables /etc/sysconfig/iptables.original
ホワイトリスト形式の設定にする
# cat <<EOF > /etc/sysconfig/iptables *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT # SSH (SSHのポートは必要に応じて変更するケースが多い) -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT # HTTP/HTTPS -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT COMMIT EOF
再起動
# service iptables condrestart
一般ユーザー追加
# useradd akiyoshi # passwd akiyoshi # usermod -G wheel akiyoshi # visudo wheelグループでsudoを許可するため以下の行のコメントアウトを解除する。 %wheel ALL=(ALL) ALL
sshd
よく変更するのはポートとrootログイン禁止とパスワードログイン禁止くらい。
rootログイン禁止は必ずやってる。
# ポート(必要に応じて変更。変更する場合はiptableも変更すること。) Port 22 # rootログインを許可するか PermitRootLogin no # パスワード認証を許可するか(鍵認証のみにするかどうか) PasswordAuthentication yes
再起動。
# service sshd condrestart
この時点でもうひとつターミナル開いて、ちゃんと接続できるか確認した方が良い。
設定に失敗したまま今繋いでるターミナルを閉じてしまうと詰む。
システムのアップデート
とりあえず最新にしてOS再起動。
# yum update # reboot
システムの自動更新はするべきか?
やった方が良いとは思うけど微妙なところ。
# yum install yum-cron # vim /etc/sysconfig/yum-cron # chkconfig yum-cron on # /etc/init.d/yum-cron start
CHECK_ONLY=yesにだけ変更してチェックだけ行ってメールしたりするのが落としどころかも。
その他よく入れるもの
仕事の開発サーバーとかだとこんな感じ。
開発言語は案件による。
# yum install vim-enhanced tree git expect bind-utils httpd-devel openssl-devel # yum groupinstall "Development tools"
あとはお好きに。
参考
今回書いたこととは結構違ったりするけど詳しいので自身ないとき見たりする。ありがたや。
CentOS 6.4 インストール~設定手順の目次
yum updateの自動化についてはこちらを参考にした。
yum を使って システムアップデートを行う (自動化も)
CocoaPods使ってみた
CocoaPodsはObjectiv-Cのパッケージ管理ツール。
RubyでいうGem、node.jsでいうnpmにあたると思う。
簡単な導入手順と感想を書く。
疑問に思ったこととかも書くので誰かの参考になれば。
インストール
$ sudo gem install cocoapods
$ pod --version 0.31.1
$ pod --help CocoaPods, the Objective-C library package manager. Commands: * help Show help for the given command. * init Generate a Podfile for the current directory. - install Install project dependencies * ipc Inter-process communication * lib Develop pods * list List pods * outdated Show outdated project dependencies * push Push new specifications to a spec-repo * repo Manage spec-repositories * search Searches for pods * setup Setup the CocoaPods environment * spec Manage pod specs * try Try a Pod! * update Update outdated project dependencies Options: --silent Show nothing --version Show the version of CocoaPods --no-ansi Show output without ANSI codes --verbose Show more debugging information --help Show help banner of specified command
なんか最初にリポジトリ情報(?)初期化するらしい。
$ pod setup Setting up CocoaPods master repo Already up-to-date. Setup completed (read-only access)
使う
Xcodeのプロジェクトディレクトリに移動してpod init
するとPodfileのひな形ができる。
RubyでいうGemfile。node.jsでいうpackage.json。
npmみたいに--saveオプションとかあればいいのに。
# プロジェクトディレクトリに移動 $ cd XcodeSampleDir # Podfileのひな形作成 $ pod init # 中身を確認 $ cat Podfile # Uncomment this line to define a global platform for your project # platform :ios, "6.0" target "XcodeSampleDir" do end
platform
はコメントアウト外してよと書かれている。
今回はiosじゃなくてmacアプリ作りたかったのでosxにする。
またバージョンはよく分からないのが今の自分のOSのバージョンを書いておく。
実際のところどのバージョン書くのが適切なんですかね?
ちなみに省略時には結構古いバージョンを指定したことになるみたい。
http://guides.cocoapods.org/syntax/podfile.html#platform
あとはPodfileに使いたいライブラリを書いていくわけだが、実際何をどう書くべきか悩む、というか面倒くさい。
pod search
すれば書くべき内容を教えてくれた。
$ pod search SSZipArchive -> SSZipArchive (0.3.1) Utility class for zipping and unzipping files on iOS and Mac. pod 'SSZipArchive', '~> 0.3.1' - Homepage: https://github.com/soffes/ssziparchive - Source: https://github.com/soffes/ssziparchive.git - Versions: 0.3.1, 0.3.0, 0.2.5, 0.2.4, 0.2.3, 0.2.2, 0.2.1, 0.2.0, 0.1.2, 0.1.1, 0.1.0 [master repo]
以下のようになった。
platform :osx, '10.9.2' target "XcodeSampleDir" do pod 'SSZipArchive', '~> 0.3.1' end
ライブラリのバージョン番号も必須ではなく、省略すると最新が入る。
詳しくはここ。
ライブラリのインストール元にはGithubリポジトリやローカルパスも指定できるみたい。
あとはpod install
する。
$ pod install Analyzing dependencies Downloading dependencies Installing SSZipArchive (0.3.1) Generating Pods project Integrating client project
実行後、ディレクトリを見るとPodfile.lockというファイルとPodsというディレクトリができている。
またプロジェクトにワークスペースがなければワークスペース(*.xcworkspace)もできている。
今回プロジェクトしか作ってなかったのでXcodeを開き直す。
これでライブラリを自作コードの中からimport出来るようになる。
#import <Foundation/Foundation.h> #import "SSZipArchive.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } return 0; }
なんかXcodeとターミナルを行ったり来たりする感じがあって慣れなかったけど、まあないより抜群に便利な気がする。
というかもはやこういうツールないと安心してコーディングできない気すらするので良いのか悪いのか。
参考
最近のWindowsでのコンソール環境
昔からCygwinだったりmsysだったりを使ってはいたが、いつもなんだかなーと思っていた。
最近比較的まともになってきたのでメモっておく。
結論から言うとCmder使う。
かなりお手軽に便利なコンソール環境が手に入る。
特徴
ターミナルエミュレータ自体はConEmuを使ってるらしい。
色々設定済みのConEmu + msysgitって感じ。
シェルはmsysとかPowerShellとか選べるので好きなのを使えばよいが、とりあえずコマンドプロンプトでもLinuxコマンドが使えたりbashライクなショートカットが使えたりする。
PowerShellは学習する動機がそこまでないし、msysやCygwinはホームディレクトリとかパス区切りとかの違いでなんだかんだ気持ち悪さが残る。
なのでコマンドプロンプトが便利になるととても嬉しい。
導入
以下から「Download full」でダウンロードして展開するだけ。
fullじゃないとLinuxコマンドなどが使えない。
http://bliker.github.io/cmder/
Chocolateyでも入れられるけど、試した当初Chocolateyで入れたものの実態がどこにあるのか分からず、既に入れていたgitとかとの優先度が分からなくなったので直接展開する方式にした。
最低限の設定
CmderというよりはConEmuの設定になるみたいだけど。
デフォルトでわりと良い感じに設定しているものの、以下の点は調整したほうが良かった。
日本語
Main -> Monospace => check off
これをしないと日本語の表示が崩れる。
参考: cmderの日本語フォントの幅を治す
http://qiita.com/tukiyo/items/8e477e48d3bebf9a04d1
カーソル
Features -> Text cursor -> Active console Text Cursor => Rectangle
カーソルが「|」なのは好みじゃなくて分かりづらかった。
ステータスバー
Features -> Status bar -> Show status bar => check on
キーバインドなど
シェル上でよく使うキーバインドと競合しているものだけ変える。
Keys & Macro から変更する。
新しいコンソールを開く
Ctrl + t => Alt + t
tmuxで使ってるバインドと被るため。
アクティブなコンソールを閉じる
Ctrl + w => Alt + w
シェルで単語削除に使うため。
コピー&ペースト
Ctrl + c => Alt + c Ctrl + v => Alt + v
略。
感想
またGitやSSHが最初から使えるので自分の用途ではかなり充分。
普通のmsysgitのbash使っても良いんだけど、Windowsのコマンドとかアプリケーションと切り離されてしまうのでたまに困ってしまう。
あと自分は普段Poderosaとかで複数台のLinuxサーバーにログインして作業しているのでタブが使えるのは便利。
SSHの設定をちゃんとすればPoderosaから完全に乗り換えられそう。
docker on CoreOS さわった
いろんなところで騒がれているようだけどようやく手を動かしてみた。
チュートリアルやり始めただけだけど。
VirtualBoxでCoreOS動かしてその上でdockerを動かす方法。
環境汚さないし、なにより素早く試せるのでお勧めできる組み合わせ。
CoreOS(とdocker)の導入
CoreOSの導入は公式を参照した。
https://coreos.com/docs/running-coreos/platforms/vagrant/
git clone https://github.com/coreos/coreos-vagrant.git cd coreos-vagrant\ vagrant up vagrant ssh
これでCoreOSが立ち上がった。
何より感動したのは速さ。
CentOSでは初回のvagrant up
は結構時間かかったし起動もそれなりだったけど、CoreOSはほんの数秒から十数秒くらい(体感)。
cygwin warning: MS-DOS style path detected: C:/Users/xxx/.vagrant.d/insecure_private_key Preferred POSIX equivalent is: /cygdrive/c/Users/xxx/.vagrant.d/insecure_private_key CYGWIN environment variable option "nodosfilewarning" turns off this warning. Consult the user's guide for more details about POSIX paths: http://cygwin.com/cygwin-ug-net/using.html#using-pathnames Last login: Tue Mar 25 09:25:37 UTC 2014 from 10.0.2.2 on ssh ______ ____ _____ / ____/___ ________ / __ \/ ___/ / / / __ \/ ___/ _ \/ / / /\__ \ / /___/ /_/ / / / __/ /_/ /___/ / \____/\____/_/ \___/\____//____/
起動時にcygwin warningが出たけどまあとりあえず気にしない。
パス関連のことを言っているらしい。
既にdocker入ってる。
core@localhost ~ $ docker -v Docker version 0.9.0, build 2b3fdf2
Interactive commandline tutorial
https://www.docker.io/gettingstarted/#
大変わかりやすい。
dockerの基本的なコマンドが分かる。
一応概念的に把握した範囲で書くと以下の様な感じ。
間違っている可能性はあるし適当なのはその通り。
dockerはOSのイメージ持ってきて、コンテナ起動して、コマンド実行する。
コマンドが終了するとコンテナも終了する。
コンテナはとりあえず仮想マシンと読み替えても良い。
コマンドの実行結果やインストールしたものとかは消えるわけじゃないけど、そのままじゃ使いまわせない。
使いまわすためにはコミットする。
Gitとかだとコミット+タグ付けみたいな印象を持った(個人的感想)。
以下はチュートリアルで使ったコマンド。
一応ざっくりしたコメント付けたけどチュートリアルやったほうが良い。
# バージョン docker version # イメージ探す docker search tutorial # イメージダウンロード docker pull learn/tutorial # コマンド実行 docker run learn/tutorial echo "hello world" # コマンド実行 docker run learn/tutorial apt-get install -y ping # 起動中のコンテナ一覧 docker ps -l # IDで指定したコンテナの保存 docker commit {ID} learn/ping # 保存したイメージから実行 docker run learn/ping ping google.com # 起動中のコンテナ一覧 docker ps # IDで指定したコンテナの情報を見る docker inspect {ID} # 手元のイメージ一覧 docker images # アップロード docker push learn/ping
docker ps -l
のl
オプションが何を表すのかよく分からなかった。
ドキュメントにも書いてない…
Dockerfile Tutorial
https://www.docker.io/learn/dockerfile/
次はこれを読む。
さっき手動でコマンド打ってたのが自動化できると思えば良い(はず)。
環境構築とかできる。
さっきのチュートリアルよりは長文だけど平易な英語で書かれているので多分大丈夫。
インストラクションて呼ばれる命令を書いていくらしい。
まだFROMとRUNってやつしか知らない。
FROMはイメージを指定する。
docker search centos
とかして探したものを指定する。
RUNは実行したいコマンドを書く。
1つRUNするごとにdocker commit
もされる。
インストラクションを書いたDockerfileを以下のような方法で実行すると良い。
# カレントディレクトリにDockerfileがある場合 docker build . # 標準入力から流し込む場合 docker build - < Dockerfile # Githubリポジトリから利用する場合 docker build github.com/creack/docker-firefox
引き続き読んでく。
その他
利用可能なイメージは以下から探せる。
https://index.docker.io/
はじめた
仕事でプログラミングとかやってます。
趣味もプログラミングになので休日に妻に怪訝な顔で見られます。
エンジニアの友達が欲しいんですが、人見知りだし特に深く喋れることもないので何か書いて糧にしたい。
普段やってること
Web系ともSIerともつかないようなことをやってます。
ミドルウェア的なものを作って売ったりそれを使ってSIとかサポートとか。
言語としてはC++, JavaScriptがメインで、プラットフォームはLinux中心でたまにWindows。
社内ツールとかでPerl, Rubyを嗜む程度にって状況です。
※C++もう1年位離れてるけど
今後やりたいこと
業務に直接は関係ないけど機械学習に興味があるので数学やり直したい。
あと友人にAndroidアプリ作ってくれと言われたのでそれも準備中です。