Hatena::ブログ(Diary)

Webプログラマの覚書 このページをアンテナに追加 RSSフィード

2013-05-18

[] Ruby2.0.0 を CentOS6.4, OS X に 入れてみる

仕事ではここ数年ずっとPHPなので, プライベートではRubyにしようと.

PHPは別に嫌いじゃないですが, Rubyは書いてて気持ちがいいですね.

ということで, そろそろ2.0に移行しようと思って, 久々に環境構築をしたのでその備忘録です.

1. 前提条件

  • OSのメジャーなパッケージ管理ソフトを使用する(CentOSyum, machomebrew)
  • rbenv + ruby-build で バージョンの切り替えができるように
  • gem は プロジェクト毎にインストールしたいので, Bundler を利用する

2. rbenv + ruby-build + rubyインストール

OS X (Mountain Lion) の場合

(1) rbenv + ruby-build

$ brew update
$ brew upgrade
$ brew install rbenv ruby-build
$ cat << EOF >> ~/.zshrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
EOF
$ source ~/.zshrc

(2) ruby を入れるのに必要なパッケージをインストール

$ brew install openssl
$ brew link openssl --force

$ brew install readline
$ brew link readline --force

$ brew install libyaml
$ brew link libyaml --force
  • --force を付けないと warning が出たのでつけています

(3) ruby 2.0 を インストール

$ ruby-build --definitions

   :     :
1.9.3-rc1
2.0.0-p195
2.1.0-dev
   :     :

$ CONFIGURE_OPTS="--with-opt-dir=/usr/local/" rbenv install 2.0.0-p195
$ rbenv rehash
$ rbenv versions

* system (set by /Users/kopug/.rbenv/version)
   2.0.0-p195

$ rbenv global 2.0.0-p195
$ ruby -v

ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.3.0]
CentOS 6.4 の場合

(1) yum で 依存パッケージをインストール

$ sudo yum -y install git zlib zlib-devel readline readline-devel openssl openssl-devel curl curl-devel

(2) rbenv + ruby-build

# cd /usr/local
# git clone git://github.com/sstephenson/rbenv.git rbenv
# git clone https://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build
# cat << EOF >> /etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"
EOF
# source /etc/profile.d/rbenv.sh

(3) ruby 2.0 を インストール

# rbenv install --list

   :     :
1.9.3-rc1
2.0.0-p353
2.1.0-dev
   :     :

# rbenv install 2.0.0-p353
# rbenv rehash
# rbenv versions

* 2.0.0-p353 (set by /usr/local/rbenv/version)

$ rbenv global 2.0.0-p353
$ ruby -v

ruby 2.0.0-p353 (2013-05-14 revision 40734) [x86_64-linux]

3. Bundler の インストール

※ ~/.gemrc にある "custom_shebang directive" を削除してから以下を実行すること(途中でエラーになるため)

$ rbenv exec gem update --system
$ rbenv exec gem install bundler
$ rbenv exec gem install rbenv-rehash
$ rbenv exec gem list
*** LOCAL GEMS ***

bigdecimal (1.2.0)
bundler (1.3.5)
io-console (0.4.2)
json (1.7.7)
minitest (4.3.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
test-unit (2.0.0.0)

$ rbenv exec gem which bundler
     /Users/kopug/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/bundler-1.3.5/lib/bundler.rb

4. Railsのローカルインストール及びプロジェクト作成

$ cd ~/Work/projects
$ cat << EOF > Gemfile
source "http://rubygems.org"
gem "rails", "バージョン(省略可能. その場合は最新版)"
EOF
一時的にrailsプロジェクトを作成するために --path で指定した箇所に railsで必要なgemインストール
$ bundle install --path vendor/bundle
$ bundle list
プロジェクト名は example(適当), --skip-bundle を指定しておかないと, project作成時に勝手に bundle install が走って, global 環境にgemインストールされてしまう
$ bundle exec rails new example --skip-bundle
プロジェクトが作成できたら, 以下は不要なので削除
$ rm -rf Gemfile Gemfile.lock .bundle vendor
ここでプロジェクトに必要なgem をプロジェクト配下にインストールをする
$ cd example/
$ bundle install --path vendor/bundle
git の管理からgemを外す
$ echo '/vendor/bundle' >> .gitignore 
Rails Server 起動
$ bundle exec rails server

2012-11-11

[] Ruby on Rails(RoR) 開発環境を構築する

久々の更新です。(毎回言っているが…^_^;)

Railsの開発環境を急遽構築したという事もあり, 備忘録がてらに残します.

1. 最新のパッケージに更新をする

$ sudo yum -y update

2. 必要なパッケージをインストールしておきます

$ sudo yum -y install gcc kernel-devel zlib-devel openssl-devel readline-devel curl-devel libyaml-devel sqlite-devel

3. Rubyのインストールをする

普段ならrpmインストールをしようとするのですが, ebenvを使ってrubyのバージョン(環境)管理をします.

$ sudo git clone git://github.com/sstephenson/rbenv.git /usr/local/share/rbenv
$ vi /etc/profile.d/rbenv.sh
export PATH="/usr/local/share/rbenv/bin:$PATH"
export RBENV_VERSION="1.9.3-p327"
export RBENV_DIR=/usr/local/share/rbenv
export RBENV_ROOT=/usr/local/share/rbenv
eval "$(rbenv init -)"
$ source /etc/profile.d/rbenv.sh

zsh を使っていると /etc/profile.d 配下を読み込まないので,以下を /etc/zprofileに追加

    for i in /etc/profile.d/*.sh ; do
      [ -r $i ] && source $i
    done

ruby-build をインストールして, rubyをいれる

$ sudo git clone git://github.com/sstephenson/ruby-build.git /usr/local/src/ruby-build
$ cd /usr/local/src/ruby-build
$ sudo ./install.sh

rubyインストール

$ sudo rbenv install 1.9.3-p327
$ sudo rbenv rehash
$ sudo rbenv global 1.9.3-p327
$ sudo gem install bundler

rails, unicornインストール

$ sudo gem install rails unicorn

2012-03-18

[][] 1. さくらVPS CentOS6.2で基本設定をする

久々の更新です。

最近サーバ構築するのもスクリプトを流して終了…というのが多かったですが、久々に手動で構築したので備忘録として残します。

1. CentOS 6.2を再インストール

最近のさくらVPSCentOS 6.2が標準なんですね。

これはコントロールパネル(Web)でやったので省略…

2. etckeeper を入れて /etc配下をgitで管理

epel リポジトリが初めから入っていたのですんなり入った。

# yum -y install etckeeper
# etckeeper init

3. 作業用ユーザの作成

rootで毎回作業するのは怖いので、作業用のユーザを作成して sudo権限を付けておく

# adduser kopug
# passwd kopug
# usermod -G wheel kopug
# visudo
# 以下のコメントを外す
## Allows people in group wheel to run all commands
%wheel        ALL=(ALL)       ALL

作業用ユーザのSSH公開鍵を置いておく

※ ここからは作業用ユーザで繋ぎ直してから作業を行う

4. SSHの設定

4-1) デフォルトのポート番号を変更

$ sudo sed -i 's/^#Port 22/Port 10022/' /etc/ssh/sshd_config

4-2) rootでの接続をNG

$ sudo sh -c 'echo "PermitRootLogin no" >> /etc/ssh/sshd_config'

4-3) パスワードなしでのログインNG

$ sudo sh -c 'echo "PermitEmptyPasswords no" >> /etc/ssh/sshd_config'

4-4) 鍵認証必須

$ sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

4-5) 設定反映

$ sudo /sbin/service sshd restart

※ ~/.ssh/authorized_keys に公開鍵を設定しておくこと

5. iptablesの設定

管理用のポートと, sshとweb以外は閉じておく

# /etc/sysconfig/iptables

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022  -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80        -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

あとはiptablesを再起動させ、デフォルト起動するようにしておく。

$ sudo /sbin/service iptables restart
$ sudo /sbin/chkconfig iptables on

6. root宛のメールを受け取るようにする

メールアドレスの部分は置き換えてください(^_^;

$ sudo sudo sed -i '/^root:/d' /etc/aliases
$ sudo sh -c "echo 'root: user@example.com' >> /etc/aliases"
$ sudo newaliases

6. パッケージを最新版にする

$ sudo yum upgrade -y

7. etckeeper でcommitをしてサーバ再起動

$ sudo etckeeper commit
$ sudo reboot

2011-04-23

[] いつも忘れるので覚書 - svnで外部リポジトリを含めたい場合 -

例えば、symfonyのとあるplugin(ここではsfHogePlugin)がsvnで管理されている場合、

$ cd sf_project_root
$ export EDITOR=vim
$ svn pe svn:externals plugins

sfHogePlugin http://<リポジトリURL>/branches/1.0.0

$ svn up

こうする事で、svn up をすると上記で追加されたリポジトリから取得してきます。

もちろんコミット権限があれば、コミットすることもできます。

2011-01-23

[][] さくらVPSのカスタムOSインストールUbuntuを入れてみる #1

今までCentOSを使っていたけど、2011年からはUbuntuを使うことにする。


Mac OS X(10.6.6)のChrome(8.0.552.237)を使ってインストールをしようとしたところ、

VNCコンソールが正常に起動しなかったため、Firefox(3.6.13)を使用しました。(´・ω・`)


さくらインターネットVPSのコントロールパネルより、

OSインストール > カスタムOSインストールへ のリンクを押下する。


1. この画面でOSの選択が可能になるので、ここでは"Ubuntu 10.04 amd64"を選択し、確認ボタンを押下

2. IPアドレス等の情報がでてくるので閉じないようにし、VNCコンソールを起動する

3. 以下のマニュアルを参考にしながらインストールを行う

カスタムOSインストールガイド : Ubuntu 10.04

4. インストールが完了したら、コントロールパネルよりサーバを起動させ、Ubuntuのバージョンを10.10にアップグレードする

$ sudo sed -i 's/^Prompt=lts/Prompt=normal/g' /etc/update-manager/release-upgrades
$ sudo do-release-upgrade
$ sudo reboot
$  lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 10.10
Release:        10.10
Codename:       maverick

5. バージョンが10.10 になっているのを確認したら、パッケージのフルアップデートをします。

$ sudo aptitude full-upgrade
$ sudo aptitude install build-essential

6. ロケールを ja_JP.UTF-8 にする

$ sudo locale-gen ja_JP.UTF-8
$ sudo /usr/sbin/update-locale LANG=ja_JP.UTF-8

7. sshの設定

$ mkdir ~/.ssh
$ vi ~/.ssh/authorized_keys
"自分の公開鍵を貼り付ける"

$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ sudo vi /etc/ssh/sshd_config
Port 22**
PermitRootLogin no
PasswordAuthentication no
$ sudo /etc/init.d/ssh restart

8. 適当に見繕ってパッケージをインストールする

$ sudo aptitude install zsh git-core git-svn subversion vim screen

9. iptables の設定

$ sudo ufw allow 22**   <- ssh port
$ sudo ufw allow 80
$ sudo ufw default deny
$ sudo ufw enable
$ sudo iptables -L      <- ポリシーの確認

10. shellの変更

$ chsh -s /usr/bin/zsh

後は自分の好みで、.screenrc .vimrc .zshrc を配備する感じ。


参考

https://wiki.ubuntulinux.jp/UbuntuTips/DedicatedServer/Ufw

2010-12-18

[] symfony で普段使っているpluginをまとめてみた

この記事はSymfonyアドベントカレンダー2010の19日目です


1. sfWebBrowserPlugin - RESTful APIを利用するならお手の物。HTTP通信なら完全お任せ!

READMEを見ると利用方法が事細かに書かれているので非常に分かりやすいですね。

このpluginでは 3種類のインターフェイスをアダプターという形で用意しています。

  • sfCurlAdapter
  • sfFopenAdapter
  • sfSocketsAdapter

どれを利用しても良いのですが、Forward Proxy経由でHTTPリクエストを送りたい事があるため、sfCurlAdapterを利用しています。

(例)

<?php

$b = new sfWebBrowser(array(), 
      'sfCurlAdapter',
      array('httpproxytunnel' => 1,
            'proxy' => 'http://proxy.example.com:8080',
            'proxyport' => '8080',
           )
      ); 

クラウド環境を利用していて、webサーバがオートスケールで増えてくれるのはいいけれども、振られるグローバルIPが何になるのか分からない場合などに使えますね!

※1. IPアドレスでの通信制限が無い場合は、気にする必要はないです。

※2. ロードバランサーNATしてくれている場合は、気にしなくてもOK

2. sfDoctrineMasterSlavePlugin - DBのReplicationをするならまずこれでしょう!

Symfonyアドベントカレンダー2010の12日目vectorxenonさんがsfDoctrineMasterSlavePluginの事を書かれております。

このpluginで何が1番嬉しかったかというと、マスターの分散が出来ることです。

   # databases.yml 
   all:
      # db1 connections
      db1_master:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db1;host:db1-master.example.com
          username: root
          password: ~
          group:    db1
      db1_slave:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db1;host:db1-slave.example.com
          username: root
          password: ~
          group:    db1

      # db2 connections
      db2_master:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db2;host:db2-master.example.com
          username: root
          password: ~
          group:    db2
      db2_slave:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db2;host:db2-slave.example.com
          username: root
          password: ~
          group:    db2

selectの負荷はSlaveサーバを増やすことによって解決できますが、

更新系処理が多くなってくる場合、それでは対応できません。

上記のようにMaster and Slaveサーバのグループを用意し、schema.ymlで対応するconnectionを指定すればOKです。

# schema.yml
User:
  connection:db1
  columns:
    name: { type: string(255), notnull: true }
LegacyUser:
  connection:db2
  columns:
    name: { type: string(255), notnull: true }

3. sfAdminDashPlugin - 手軽にシャレオツ管理画面を提供したい場合に!

README に設定方法が書かれていますが、id:ken39argさんがsfAdminDashPluginがかなりいい件についてという記事で、ハマりどころも合わせて書かれています。

WEBサービスを作る上で管理画面って結構後回しにされがちですが、このpluginで手軽にシャレオツな管理画面が作れるので重宝しています。


4. sfTaskExtraPlugin - pluginを簡単に作るためのplugin

symfonyで幾つかProjectの開発をしていくと、必ずProject間で共通で利用したいコードが出てくると思います。

その時にplugin化をしたくなるのですが、pluginを開発する上で簡単で手軽にテストコードも準備できる枠組みを提供してくれるのがsfTaskExtraPluginです!

まずインストール
$ symfony plugin:install sfTaskExtraPlugin

これでREADMEに書かれているタスクを利用する事ができるようになりますが、特によく使うのは以下です。

symfony の pluginはPEARパッケージで管理しているので、これを使うといちいちpaclage.xmlを作成する必要がなくなります。

まぁそれも便利なのですが、一番素晴らしいのがTDDでの開発がすごくしやすくなることです。

実際にmyPluginを作成してみます。

$ symfony generate:plugin myPlugin

これだけで以下のスケルトンができます。

plugins/myPlugin
|-- LICENSE
|-- README
|-- config
|   `-- myPluginConfiguration.class.php
|-- lib
|-- package.xml.tmpl
`-- test
    |-- bin
    |   `-- prove.php
    |-- bootstrap
    |   |-- functional.php
    |   `-- unit.php
    |-- fixtures
    |   `-- project
    |       |-- apps
    |       |   `-- frontend
    |       |       |-- config
    |       |       |   |-- app.yml
    |       |       |   |-- cache.yml
    |       |       |   |-- factories.yml
    |       |       |   |-- filters.yml
    |       |       |   |-- frontendConfiguration.class.php
    |       |       |   |-- routing.yml
    |       |       |   |-- security.yml
    |       |       |   |-- settings.yml
    |       |       |   `-- view.yml
    |       |       |-- i18n
    |       |       |-- lib
    |       |       |   `-- myUser.class.php
    |       |       |-- modules
    |       |       `-- templates
    |       |           `-- layout.php
    |       |-- cache
    |       |-- config
    |       |   |-- ProjectConfiguration.class.php
    |       |   |-- properties.ini
    |       |   `-- rsync_exclude.txt
    |       |-- data
    |       |   `-- fixtures
    |       |       `-- fixtures.yml
    |       |-- lib
    |       |   `-- form
    |       |       `-- BaseForm.class.php
    |       |-- log
    |       |-- plugins
    |       |-- symfony
    |       |-- test
    |       |   |-- bootstrap
    |       |   |   |-- functional.php
    |       |   |   `-- unit.php
    |       |   |-- functional
    |       |   `-- unit
    |       `-- web
    |           |-- css
    |           |   `-- main.css
    |           |-- images
    |           |-- js
    |           |-- robots.txt
    |           `-- uploads
    |               `-- assets
    |-- functional
    `-- unit

上記を見てわかるとおり、殆どがテストのためのディレクトリ、ファイルになります。

※ plugin:packageをすると上記のテストディレクトリは除外されてパッケージされます。

テストコードの書き方は以下のドキュメントに詳しく書かれていますので、これでいつでもplugin開発ができますね!


5. sfMobileJPlugin - ガラケー対応サイトを作るのなら・・

手前味噌で恐縮ですが、仕事柄ガラケーのサイトを開発することがあるので、ガラケーに特化したpluginを公開しております。

使い方はREADMEにも書いていますが、簡単にご紹介すると、現在公開しているバージョンで出来ることは以下の2つです。

はい。それだけです。(ぉぃ)

一応それ以外にも細かなUtil classもあったりしますが、backendではNet_UserAgent_Mobileを使用しているので、端末の情報取得系はそちらが使えます。

現在公開準備中ではありますが、絵文字処理、携帯メール処理も上記pluginに含めれるようにコツコツと開発をしております。(^_^;

最後に

ここ一年くらいはサーバエンジニア系の仕事ばかりしていたので、中々コードを書く時間が無かったのですが、2011年はSymfony2ともっと一緒に遊びたいと思ってます!

それではまたよろしくお願い致します。



Symfony Advent 2010では12月1日から12月24日までを使って日替わりでsymfonyでイイなと思った小さなtipsから内部構造まで迫った解説などをブログ記事にして公開していくイベントです。

2010-09-18

[][] CentOS5.5 x86_64 で 最新のnginx を rpmbuildする

EPELで実はnginxのrpmがあるんだけども、versionが0.6で止まっている。

なので、EPELからsrc.rpmを落としてきてそいつに最新のnginxをつっこんでbuildした。

EPELからnginxのsrc.rpmダウンロードし、インストールする

# wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/SRPMS/nginx-0.6.39-5.el5.src.rpm
# rpm -i nginx-0.6.39-5.el5.src.rpm

最新のnginxをDLし、SPECファイルを編集する

# cd /usr/src/redhat/SOURCES
# wget http://nginx.org/download/nginx-0.8.50.tar.gz
# cd ../SPECS/
# vi nginx.spec

versionを変更する

Version:        0.8.50

patchを当てないようにする

#Patch0:     nginx-auto-cc-gcc.patch
#Patch1:     nginx-cve-2009-3555.patch

#%patch0 -p0
#%patch1 -p0

LANG=C だとmakeでこけてしまうので、LANGを上書きする

%build
# nginx does not utilize a standard configure script.  It has its own
# and the standard configure options cause the nginx configure script
# to error out.  This is is also the reason for the DESTDIR environment
# variable.  The configure script(s) have been patched (Patch1 and
# Patch2) in order to support installing into a build environment.
export LANG='ja_JP.UTF-8'                                      <- 追加
export DESTDIR=%{buildroot}

TODO: rpmの仕様なのか、configureする前にLANG=Cにするみたいなので、上書きしているけど対応方法が強引すぎるため要調査

エラー内容は以下

make -f objs/Makefile
make[1]: Entering directory `/usr/src/redhat/BUILD/nginx-0.8.50'
gcc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
                -o objs/src/core/nginx.o \
                src/core/nginx.c
cc1: warnings being treated as errors
src/core/nginx.c: In function 'ngx_set_user':
src/core/nginx.c:1101: warning: unused parameter 'cmd'
src/core/nginx.c: In function 'ngx_set_env':
src/core/nginx.c:1164: warning: unused parameter 'cmd'
src/core/nginx.c: In function 'ngx_set_priority':
src/core/nginx.c:1194: warning: unused parameter 'cmd'
src/core/nginx.c: In function 'ngx_set_cpu_affinity':
src/core/nginx.c:1234: warning: unused parameter 'cmd'
make[1]: *** [objs/src/core/nginx.o] Error 1
make[1]: Leaving directory `/usr/src/redhat/BUILD/nginx-0.8.50'
make: *** [build] Error 2
+ mv nginx-upstream-fair/README nginx-upstream-fair/README.nginx-upstream-fair
mv: cannot stat `nginx-upstream-fair/README': No such file or directory
+ exit 0

パッケージにファイルが含まれてないといわれるので、無視するようにする

%define _unpackaged_files_terminate_build 0

※ %filesに含めたほうがいいかも。

buildする。src.rpmも作成しておく

# rpmbuild -ba nginx.spec

これで無事rpmが完成するのでインストール

# rpm -i /usr/src/redhat/RPMS/x86_64/nginx-0.8.50-5.x86_64.rpm

[] よく使うyumリポジトリ

言わずと知れたRPMforge

# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
# rpm -i rpmforge-release-0.5.1-1.el5.rf.*.rpm

CentOS(RHEL)でもFedoraのパッケージが使いたいときはEPEL

# rpm --import http://ftp.iij.ad.jp/pub/linux/fedora/epel/RPM-GPG-KEY-EPEL
# rpm -i epel-release-5-3.noarch.rpm

PHPMySQLの最新版を使いたい。どこよりも早く、最新のバージョンをパッケージングしてくれるremi

# wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
# rpm -i remi-release-5.rpm
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[] CentOS 5.5 x86_64 に checkinstall を入れてみる

以前はrpmforgeにパッケージがあったと思ったけど、どうやら無くなっている?

仕方が無いので、ソースからインストールし、その後checkinstallを使ってrpmにする。

# cd /usr/local/src
# wget http://www.asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.2.tar.gz
# tar zxf checkinstall-1.6.2.tar.gz
# cd checkinstall-1.6.2
# make
# make install

x86_64なので、本来installwatch.so は lib64に入ってほしいんだけど、libに入っている。

makefileを書き直してもいいけど、今回はシンボリックリンクで対応。

# ln -s /usr/local/lib/installwatch.so /usr/local/lib64/installwatch.so
# checkinstall

適当に質問に答えていき、rpmができたらそいつをインストールしておく

# rpm -i /usr/src/redhat/RPMS/x86_64/checkinstall-1.6.2-1.x86_64.rpm
# rpm -qi checkinstall
Name        : checkinstall                 Relocations: (not relocatable)
Version     : 1.6.2                             Vendor: (none)
Release     : 1                             Build Date: 2010年09月18日 18時18分48秒
Install Date: 2010年09月18日 18時19分01秒      Build Host: rpmbuilder
Group       : Applications/System           Source RPM: checkinstall-1.6.2-1.src.rpm
Size        : 457305                           License: GPL
Signature   : (none)
Packager    : checkinstall-1.6.2
Summary     : CheckInstall installations tracker, version 1.6.2
Description :
CheckInstall installations tracker, version 1.6.2

CheckInstall  keeps  track of all the files created  or
modified  by your installation  script  ("make install"
"make install_modules",  "setup",   etc),   builds    a
standard   binary   package and  installs  it  in  your
system giving you the ability to uninstall it with your
distribution's  standard package management  utilities.

これで完成。

[] VirtualBox で イメージの複製

vboxmanage clonehd D:\vm\centos5\Base.vdi D:\vm\centos5\NewHardDisk02.vdi 

絶対パスでファイルを指定しないとERRORになった。

ERROR: Cannot register the hard disk 'D:\vm\centos5\Base.vdi' with UUID
 {*******-****-****-****-************} because a hard disk 'D:\vm\centos5\Base.vdi'
 with UUID {*******-****-****-****-************} already exists in
 the media registry ('C:\Users\kopug/.VirtualBox\VirtualBox.xml')
Details: code E_INVALIDARG (0x80070057), component VirtualBox, interface IVirtua
lBox, callee IUnknown
Context: "OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, false, Bstr(""
), false, Bstr(""), srcDisk.asOutParam())" at line 633 of file VBoxManageDisk.cp
p

VBoxManage コマンドは デフォルトインストールだとこちらに。

C:\Program Files\Oracle\VirtualBox\

2010-09-17

[] xenが重くなったときに試してみる事

xenに限った事じゃないけど、イメージファイルをSparseにしている場合、

I/O負荷が馬鹿にならない。

そんな時には思い切ってSparseをやめてみる。

cp --sparse=never 元イメージファイル 新イメージファイル

ファイルサイズによっては結構時間がかかるけど。

終わったら ls -s で見ると実ファイルと同じサイズになっているのが分かる。

[] Xenのディスクイメージファイルサイズを増やす

開発環境はxenで構築しているんだけど(kvmに移行を考え中)、そこのディスク容量が少ないから何とかしてーと言われたので何とかした時のメモ

前提条件

※ イメージファイルはSparseじゃない

※ ゲストOSで LVMを利用している

DomainU(ゲストOS)を停止

# xm shutdown <name>

イメージファイルをバックアップ

# cd /var/lib/xen/images/
# mv <name>.img <name>.img.bak

空の20Gのイメージを作成し、結合(ここが重いけど我慢)

# dd if=/dev/zero bs=1M count=0 seek=20480 of=./20G.img
# cat <name>.img.bak 20G.img > <name>.img
# chmod 755 <name>.img

ループバックデバイスを設定

# losetup -f
/dev/loop0

# losetup /dev/loop0 ./<name>.img
# losetup -a
/dev/loop0: [fd00]:61014051 (<name>.img)

マウントしたイメージファイルのoffsetを確認

# fdisk -lu /dev/loop0

Disk /dev/loop0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *          63      208844      104391   83  Linux
/dev/loop0p2          208845    20964824    10377990   8e  Linux LVM

fdiskで対象のスライスを削除し、シリンダサイズを再設定

# fdisk  /dev/loop0

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): d
領域番号 (1-4): 2

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 2
最初 シリンダ (14-6527, default 14):
Using default value 14
終点 シリンダ または +サイズ または +サイズM または +サイズK (14-1305, default 1305):
Using default value 1305

コマンド (m でヘルプ): t
領域番号 (1-4): 2
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 2 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: 領域テーブルの再読込みがエラー 22 で失敗しました: 無効な引数です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

ループバックデバイスを削除

# losetup -d /dev/loop0

DomainU(ゲストOS)を起動

# xm create <name>

以下ゲストOS内で

# pvscan
# pvresize /dev/xvda2
# pvscan
# lvscan
# lvresize -L +20G /dev/VolGroup00/LogVol00
# resize2fs /dev/VolGroup00/LogVol00
# df -h

2010-09-02

[] ServersManとsakura-vpsベンチマークとってみた

phpspeed ってのを見つけたので、これを使ってみた。

# ベンチマークの詳細は上記を参考に

で、結果。

ServersMan@VPS - Standardプランの結果

f:id:kopug:20100902232515p:image

さくらのVPS の結果

f:id:kopug:20100902232516p:image

体感速度も結構いいですよ、さくら

もう自宅サーバとはさようならだなぁ。。

2010-05-27

[] twitter連携テスト

テスト投稿。

2010-01-24

[] viewでエスケーピングしたくない場合。

// in action
<?php
$this->hoge = array('<a>foo</a>');
// in template
<?php
echo $hoge->getRaw(0);

2010-01-18

[] genURL()でQueryStringをパス形式にしたくない場合

id:bucci-r に教えてもらった。

symfonyってデフォルトだと以下のようなクエリストリングをつける場合

?a=A&b=B

/a/A/b/B

ってしちゃうんだよね。これを普通にクエリストリングで渡すことができるっぽい!

extra_parameters_as_query_string in factories.yml

ただハマリどころが一点あって、ここにも書いているように

ルート生成に使われていないパラメーターをクエリ文字列に変換することが可能です。

とあります。これって以下が該当するんだよね。

routings.yml

default:
  url:   /:module/:action/*

これがデフォルトだと必ず書いてあるので、上のアスタリスクのせいで、必ずルート生成に利用されちゃう。

"*" を取ってあげると希望する動きになるっぽい!

thx!! id:bucci-r

2009-12-07

[] ControllerのURI PATHのPrefixにごにょごにょしたい場合

Reverse Proxy経由で複数のapplicationを動かしたいってことは良くあると思うんだが、

その時に http://example.com/application -> http://application.backend.local/ みたいな事をすると、

PATHがfrontendとbackendで異なるのでめんどくさい事がある。よね?

そんな時はこれ。http://www.symfony-project.org/reference/1_4/ja/05-Factories#chapter_05_sub_relative_url_root:relative_url_root


thx!! id:bucci-r

2009-10-14

[] ファイルを圧縮してメール(添付)する

$ tar zcf - /var/log/httpd/access_log | uuencode access_log.tgz | mail <emailaddres> -s "Accesslog mail"

uuencode が無い場合は

# yum -y install sharutils

とすればいいよ。redhat系だったら。

2009-10-12

[] PostGISを使う

http://d.hatena.ne.jp/kopug/20091011/1255240821

上記のエントリでPostGISのインストールについて書いたが、今度は実際に使ってみる

やりたい事としては以下のとおり

  1. 携帯のGPSから緯度、経度を取得し、近隣(半径200m以内)の店舗を検索する
  2. 近い順にソートをして一覧を出す

1. DBの作成

$ createdb -U postgres -T template_postgis geomanse

2. テーブルの作成 (※1)

$ psql -U postgres geomanse
CREATE TABLE SAMPLE (id serial);
SELECT AddGeometryColumn('sample', 'point', 4326, 'POINT', 2);
※1 4326って何さ?

# 世界測地系(WGS84)での格納を意味

# 実際には SELECT * FROM spatial_ref_sys WHERE srid=4326 を参照している事を意味するようです

3. データを突っ込む

東京都港区芝公園4丁目2−8の緯度、経度を突っ込む場合(WGS84)
GeomFromText('POINT(35.658671 139.7454)', 4326)
INSERT INTO SAMPLE (point) VALUES (GeomFromText('POINT(35.658671 139.7454)', 4326));

4. 任意の緯度、経度からの距離を求める

SELECT ST_Distance(point, GeomFromText('POINT(35.681382 139.766084)', 4326)) FROM SAMPLE;

ただこの単位だと度になっていると思われるので、メートルにする場合はまた次回で。