my coredump

自分用の公開メモです。主にプログラムのこととか書くはず。

Vagrant + CentOSで最新のRuby使うためにrpm作った

Vagrantで作って壊してって色々実験してるときに、Rubyを使う必要があった。
しかしCentOSの標準のリポジトリRubyはいまだに1.8系。
普段だったらrbenvとか使うけど今回の場合以下の理由で却下。

  • Vagrantで作って壊してのサイクルが遅くなる
  • Rubyのバージョン管理をする必要がない

そもそも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。

参考

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とターミナルを行ったり来たりする感じがあって慣れなかったけど、まあないより抜群に便利な気がする。
というかもはやこういうツールないと安心してコーディングできない気すらするので良いのか悪いのか。

参考

CocoaPodsGuides
CocoaPods ではじめる Objective-C ライブラリ管理 (1)

最近のWindowsでのコンソール環境

昔からCygwinだったりmsysだったりを使ってはいたが、いつもなんだかなーと思っていた。

最近比較的まともになってきたのでメモっておく。

結論から言うとCmder使う。
かなりお手軽に便利なコンソール環境が手に入る。

特徴

  • タブあり
  • 一部のLinuxコマンド使える(by msysgit)
  • bashっぽいショートカットが使える
  • 設定による拡張性が高い(っぽい)

ターミナルエミュレータ自体は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 -llオプションが何を表すのかよく分からなかった。
ドキュメントにも書いてない…

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アプリ作ってくれと言われたのでそれも準備中です。