myfinderの技術や周辺的活動のblog

2010年12月25日土曜日

MySQL Casual Talks Vol.1の資料

遅ればせながらupしました。

MySQL Casual Advent Calendar 2010 と MySQL Casual Talks Vol.1 をやりました。

12月は以前立ち上げたMySQL Casualに関する動きがいくつかありました。

一つがMySQL Casual Advent Calendar 2010で、ちょっと息抜きを挟みつつ、riywoさんyoozoosatoさんにも参加いただいて25日分書ききる事ができました。

思いつきで始めた割には完走できたので、初回の試みとしてはいいんじゃねと。
次回以降はもっとCasualに執筆者が参加できる体制を作ってやりたいと思います。

もう一つがMySQL Casual Talks Vol.1の開催です。
mysql-casual.orgドメインを取ってこれを始めたときから「Talksをやる、会場はOracleで」と心のうちに決めていたので、これが達成できたことは大変うれしい。
テーマが全くなかったので、次回以降やるとしたらテーマ決めてスピーカーは絞った方がよいかな、とは思いました。
内容や次回の開催時期など意見あればircとかtwitterでください。

どちらも継続的に取り組めればいいなと思っていますので、関わっていただいた方には感謝感謝 & 今後ともよろしくお願いします。

2010年10月18日月曜日

あなたがYAPC::Asiaでプレゼンテーションをするべき10の理由 (あるいは Re:@minto)

あなたがYAPC::Asiaでプレゼンテーションをするべき10の理由」という、2008年2月のエントリがあります。
改めて読み返して自分がどうだったか、というものを書いておきます。

1. YAPC::Asiaに行く目的が増える

YAPC::Asiaに来てただ座って話を聞くだけなら、gihyo.jpのまとめと、各スピーカーのupする資料に目を通す方が効率がいいです。
もしあなたが@lestrratさんのtweetを見てピンとくる事があるのであれば、talkに応募してみてはいかがでしょう。

2. 解決方法を一緒に考えてもらえる

昨年参加した際には人に質問して回ってこの項目についてはできていましたが、今回も何人かと議論をする事ができました。
我々が普段やっていることは問題解決なので、こういった場で共有できる問題があれば、積極的に人に聞いてみるのがよいと思います。

3. 友達ができる

スピーカー参加すると、人と話しやすくなると思います。
非コミュな人こそ何かアウトプットすると、それが交流のとっかかりになるんじゃないかと思います。

4. 仕事のスカウトがくるかもしれない

来るといいですね^^

5. 飲み会のお誘いがくるかもしれない。勉強会のお誘いもある。

継続的な関係ができると、きっとそういう事もあると思います。
YAPC本編中は、芝生カンファレンスや餃子カンファレンスなど、yet another YAPCが小規模に開催されているので、そちらに顔を出すと酒が飲めたり餃子が食べられるのでお得な面もあります。

6. 自慢できる

「YAPCのスピーカーとして登壇しました(キリッ」というだけだと何とも。。。(応募して非採択にならなければ基本誰でも出れるので)
でもそれを通して自慢できるような出会いやアウトプットがあると素敵ですね。

7. 練習するには規模が最適

LTは相手にする人数が多いのと、場をわかせるエンターテイナー力が要求されます。
むしろテーマを絞って、「こういう人、こういう問題が対象」としたほうが、発表内容をまとめやすいし、いきなり大人数じゃないのでいいと思います。

8. これから3か月の生活が充実する。

YAPC::Asiaに登壇するまでの間、準備に追われて充実した生活を送れるでしょう。生きる理由ができますね。
上級者の中にはプレゼンテーションを前日の夜や発表当日に作る人も居るようです。[要出典]

9. やらないで後悔するよりは、やってみてから考えよう

そのとおりだと思います、よっぽどおかしい事を言わない限り誰も叩いたりしません。(つまらなければ相手にされないだけです><)
迷っているうちに、YAPC::Asiaの開催地が台湾とかになってしまうかもしれませんし、@941さんの気力がなくなってしまうかもしれません。

10. これであなたも有名人

発表すると、gihyo.jpやtwitterでidや本名が晒され、ブクマされたりRTされたり本人が思っている以上に広まるかもしれません。
それが嫌な人はmalaさんのように撮影禁止など宣言しておきましょう。

11. 参加費用が無料になる

「後で買えばいいかな〜」と思って忘れてしまうのはよくあることです。
スピーカーになれば特に何の手続きもせずにYAPCに参加できるようになるのは大きな利点でした。決済処理とか面倒くさいですしね。

2010年10月17日日曜日

YAPC::Asia 2010 でソーシャルアプリのシステム監視運用について Talk してきました

@941さん、はじめJPAの皆様、ボランティアスタッフの皆様、YAPC::Asiaの運営おつかれさまでした。

今年はスピーカーとして「ソーシャルアプリ向けシステム監視運用の勘所」と題したtalkをさせていただきましたので、資料を公開します。



内容をブレイクダウンしたり、補足などについてはエンジニアブログの方でやるんじゃないかと思っています。

YAPC::Asiaは去年が初参加でした、去年のYAPCではいろんな方に相談に乗っていただいたりするなど、コミュニティから受けた恩恵は大きいものでした。
なので、今年はtalkで少しでもお返しできていればよいなと思います。

2010年10月14日木曜日

Q4Mのデータファイルとcompactionの関係

Q4Mを運用していると、時折.Q4Mファイルがコンパクションされず肥大することがあります。
(コンパクションが実施されたかどうかはログに出るので、それを見て確認できます)
基本的にコンパクションは自動で実施されるので、通常の運用では.Q4Mファイルのサイズを気にする必要はないはずです。

コンパクションが自動で実施されなかった理由は今のところわかりませんが、バージョン 0.9.4 からは手動コンパクションが実装されており、割と Casual にコンパクションを実行する事ができるようになっています。
(0.9.2以前は concurrent compaction が実装されていないので、この話は 0.9.4 が対象です)

Q4M のコンパクションに関する設定は奥さんのBlogエントリにあるとおり、下記項目で設定します。


# enable / disable concurrent compaction (0: disabled (default), 1: enabled)
queue_use_concurrent_compaction=1

# handle INSERTs for every N bytes of data is compacted (default: 1048576)
queue_concurrent_compaction_interval=1048576


queue_concurrent_compaction_interval は、「指定された容量分コンパクションしたらその間の処理待ちINSERTを実行する」という動作のインターバルを指定するものです。(奥さんのエントリにもそう書いてあります)

Q4Mが必要になるシーンでは割と多くの接続&enqueueが実行されるものと思いますが、数万QPSとか行く環境だとINSERTのレイテンシがデフォルトの1MBだと問題になることがあるので、この値をデフォルトより小さくするのがよいようです。(数十KBとか)

そのようなレイテンシを許容できない環境であるならば、同じ設定のQ4Mを用意し、参照をそちらに向けてINSERTが走らない状態にしてからcompactionを実行するのが運用上は安全かなと思います。

2010年9月23日木曜日

さくらのVPSを借りたら真っ先にやるべきssh設定

遅ればせながらさくらのVPS借りてセットアップしてます。
インターネットに晒すサーバを立てるときはまずセキュリティ設定をしっかりやってからIPを振るべきですが、さくらのVPSではそういうわけにもいきません。

なので、借りて真っ先に設定するべきssh設定について、自分がやっていることをまとめておきます。
 CentOS(x86_64) でのやり方です。

1.ログインする

VPSを起動したらまずログインしてください。

2.ユーザ作成

作業用のユーザを作成します。

# useradd myfinder
# passwd myfinder
# usermod -G wheel myfinder


あとで root になれるユーザを制限するために wheel に所属させておきます。

3.ユーザの公開鍵を登録

作業用ユーザがリモートから入れるようにします。
ノーパスワードの設定はおすすめしません。

# su - myfinder
$ ssh-keygen -t rsa
$ vi ~/.ssh/authorized_keys


そのうち要ると思うので.sshを作っときます。
作成した authorized_keys に、作業するPCで作成した公開鍵を書いて、パーミッション設定を変えてください。

$ chmod 600 ~/.ssh/authorized_keys


4.sshdの設定変更

パスワードでの認証をやめ、公開鍵認証でのログインに限定します。

# vi /etc/ssh/sshd_config
// no に設定
PermitRootLogin no
PasswordAuthentication no
UsePAM no
# /etc/init.d/sshd restart


※umqさんの指摘でUsePAMの所を追加しました。ありがとうございます。
この時点でコンソール以外からのログインが不可能になります。

ここまでやったら作業用PCからログインして確認してください。

5.sudoの設定

作業用ユーザで sudo ができるよう設定を変更します。

# visudo
// コメント外す
%wheel  ALL=(ALL)       ALL


wheel に所属しているユーザが sudo できるようにします。
さきほど作業用ユーザは wheel に所属しているので、 sudo できるようになっている筈です。
下記のような感じで root になれるか確認するのがいいと思います。

$ sudo su -
#


6.rootパスワードの無効化

この時点で
・リモートからのパスワード認証不能
・公開鍵に対応する秘密鍵を持ったクライアントからのログイン以外不能
という状況になってます。

現実的にはこれでほぼほぼ問題ないと思いますが、rootのパスワードを管理したくないので、自分はよくこれを無効化しています。

# passwd -l root
// とやると、/etc/shadowの内容が
root:!!hogehogehogehogehoge:xxxxx:0:99999:x:::
// という感じに無効化される


こうしておけば
・リモートからのパスワード認証不能
・公開鍵に対応する秘密鍵を持ったクライアントからのログイン以外不能
・コンソールからの root ログイン不能
・作業用ユーザが sudo しない限りは root になることは不能
という感じになります。

ここまでの作業で、ログインして root になれるユーザを制限し、 root になるための手段を一本道にすることができました。

※h2ondaさんの指摘でrootのパスワードを無効化する所を変更しました。ありがとうございます。

7.sudoのログを取る

更に、 sudo した内容を syslog に記録する設定をします。
ここまでやっておけば、誰がいつ sudo したかが記録に残ります。

# visudo
// 追記
# syslog facility
Defaults syslog=local3

# vi /etc/syslog.conf
// 追記
# sudo log
local3.*                                                /var/log/sudo


※kamipoさんの指摘でvisudoの所を追加しました。ありがとうございます。

# touch /var/log/sudo
chmod 600 /var/log/sudo


facility を local3 にしているのは、後でbindを立てる予定だからです。
これで /var/log/sudo に sudo した結果が下記のように残ります。

# cat /var/log/sudo
Sep 23 20:01:41 hostname sudo: myfinder : TTY=pts/1 ; PWD=/home/myfinder ; USER=root ; COMMAND=/bin/su -


複数台の環境ならば、このログを外部のsyslogサーバに転送すれば更によいと思います。
このログはこのままだと太っていってしまうので、 /etc/logrotate.d/syslog のローテーションに加えておきましょう。

/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron /var/log/sudo {
   sharedscripts
   postrotate
   /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
   /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
   endscript
}


8.おわりに

ここまでやれば、割と安心してリモートから作業したり、運用できるかなと。
ただ、6と7については、やりたい人/必要な人がやればいいと思います。

作業用ユーザのパスワード忘れちゃったりした場合、コンソールから再起動してシングルユーザモードで入ればよいでしょう。

では。

2010年5月9日日曜日

最近VMをセットアップするときに使っているKickstartファイル vol.2

先日書いた記事からちょっと運用を変更したので、その件についてまとめます。

今までは各サーバごとに同じような内容のkickstartファイルを書いていたが、共通するようなセットアップファイルがたくさんできて大変気持ち悪かった。
それをどうにかするために、kickstartファイルから設定部分外だししてみた次第。


# myfinder's Kickstart file.

install
url --url http://{Local YUM Server}/centos/5/os/x86_64
lang ja_JP.UTF-8
keyboard jp106
network --device eth0 --bootproto static --ip {Local IP} --netmask {NETMASK} --gateway {GATEWAY} --nameserver {NAME SERVER} --hostname {HOSTNAME}
network --device eth1 --bootproto static --ip {GLOBAL IP} --netmask {NETMASK} --gateway {GATEWAY} --nameserver {NAME SERVER} --hostname {HOSTNAME}
rootpw --iscrypted {ENCRYPTED PASSWORD}
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone Asia/Tokyo
bootloader --location=mbr
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
clearpart --all
part /boot --fstype ext3 --size=100
part pv.2 --size=0 --growvolgroup VolGroup00 --pesize=32768 pv.2
logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --growlogvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=512 --grow --maxsize=1024
reboot

%packages
@base
@core
@development-libs
@development-tools
@editors
keyutils
trousers
fipscheck
device-mapper-multipath
imake
ntp

%post
# post setting
wget -P /tmp http://{SVN Server}/svn/server-settings/trunk/kickstart/setup.sh
bash /tmp/setup.sh
rm -f /tmp/setup.sh


と、言う風にしておいて、setup.shを下記のように書いておく。


# server settings

# SELinux off
setenforce 0
# ntp setting
curl -o /etc/ntp.conf -O http://{SVN Server}/svn/server-settings/trunk/etc/ntp.confchmod 644 /etc/ntp.conf
chkconfig ntpd on
service ntpd start

# ldap setting
authconfig --enableldap --enableldapauth --ldapserver={LDAP Server} --ldapbasedn=dc=example,dc=jp --updateall
curl -o /etc/ldap.conf -O http://{SVN Server}/svn/server-settings/trunk/etc/ldap.conf
chmod 644 /etc/ldap.conf
curl -o /etc/pam.d/system-auth-ac -O http://{SVN Server}/svn/server-settings/trunk/etc/pam.d/system-auth-ac
chmod 644 /etc/pam.d/system-auth-ac

# root pw delete
perl -pi.bak -e "s/(root:)[^:].*?(:.*?)$/\1\!\!\2/" /etc/shadow
# ssh setting
yum remove -y openssh openssh-server openssh-clientsrpm -ivh http://{Local YUM Server}/rpms/i386/openssh-4.3p2-26.lpk.i686.rpm
rpm -ivh http://{Local YUM Server}/rpms/i386/openssh-clients-4.3p2-26.lpk.i686.rpm
rpm -ivh http://{Local YUM Server}/rpms/i386/openssh-server-4.3p2-26.lpk.i686.rpm
curl -o /etc/ssh/sshd_config -O http://{SVN Server}/svn/server-settings/trunk/etc/ssh/sshd_config
chmod 600 /etc/ssh/sshd_config
service sshd restart

# local yum repo setting
curl -o /etc/yum.repos.d/myfinder.repo -O http://{SVN Server}/svn/server-settings/trunk/etc/yum.repos.d/myfinder.repo
chmod 644 /etc/yum.repos.d/myfinder.repo

# iptables setting
curl -o /etc/sysconfig/iptables -O http://{SVN Server}/svn/server-settings/trunk/etc/sysconfig/iptables
chmod 600 /etc/sysconfig/iptables
service iptables restart

# system service setting
chkconfig ntpd on
chkconfig bluetooth off
chkconfig cups off
chkconfig firstboot off
chkconfig gpm off
chkconfig haldaemon off
chkconfig hidd off
chkconfig ip6tables off
chkconfig kudzu off
chkconfig pcscd off
chkconfig xfs off
chkconfig yum-updatesd off

# SELinux on
setenforce 1

# report mail
echo "$HOSTNAME setup completed" | mail -s "$HOSTNAME setup report" medianetworks@gmail.com


こうやっておけば、kickstartファイルや、その先のセットアップスクリプトもバージョン管理できるし、サーバ特有にすべき内容を分割できる。
あと、セットアップ後でもスクリプトを実行すれば新しい設定ファイルを適用できる。

2010年5月5日水曜日

最近VMをセットアップするときに使っているKickstartファイル

Linuxインストールの時にはkickstartを使うというのはよくやる手ですが、自分はVMでいっぱいノードを作るので、インストール時点でこのくらいまで設定済ませるようにしていますよという例をば。


# myfinder's Kickstart file.

install
url --url http://{インストール対象のOSが置いてあるWebサーバのURL}
lang ja_JP.UTF-8
keyboard jp106
network --device eth0 --bootproto static --ip {LOCAL IP} --netmask {NETMASK} --gateway {GATEWAY IP} --nameserver {LOCAL NAME SERVER} --hostname {HOSTNAME}
network --device eth1 --bootproto static --ip {GLOBAL IP} --netmask {NETMASK} --gateway {GATEWAY IP} --nameserver {LOCAL NAME SERVER} --hostname {HOSTNAME}
rootpw --iscrypted {ENCRYPTED PASSWORD}
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone Asia/Tokyo
bootloader --location=mbr
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
clearpart --all
part /boot --fstype ext3 --size=100
part pv.2 --size=0 --grow
volgroup VolGroup00 --pesize=32768 pv.2
logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=512 --grow --maxsize=1024
reboot

%packages
@base
@core
@development-libs
@development-tools
@editors
keyutils
trousers
fipscheck
device-mapper-multipath
imake
ntp

%post
# ntp setting
echo 'server {NTP SERVER}' >> /etc/ntp.conf
chkconfig ntpd on
/etc/init.d/ntpd start

# ldap
authconfig --enableldap --enableldapauth --ldapserver={LDAP SERVER} --ldapbasedn=dc=example,dc=com --update
echo 'session required pam_mkhomedir.so skel=/etc/skel umask=0022' >> /etc/pam.d/system-auth
echo 'sudoers_base ou=SUDOers,dc=example,dc=com' >> /etc/ldap.conf

# ssh
yum remove -y openssh openssh-server openssh-clients
rpm -ivh http://{LOCAL YUM SERVER}/rpms/i386/openssh-4.3p2-26.lpk.i686.rpm
rpm -ivh http://{LOCAL YUM SERVER}/rpms/i386/openssh-clients-4.3p2-26.lpk.i686.rpm
rpm -ivh http://{LOCAL YUM SERVER}/rpms/i386/openssh-server-4.3p2-26.lpk.i686.rpm
echo 'UseLPK yes' >> /etc/ssh/sshd_config
echo 'LpkLdapConf /etc/ldap.conf' >> /etc/ssh/sshd_config
echo 'LpkServers ldap://{LDAP SERVER}' >> /etc/ssh/sshd_config
echo 'LpkUserDN ou=People,dc=example,dc=com' >> /etc/ssh/sshd_config
echo 'LpkGroupDN ou=Group,dc=example,dc=com' >> /etc/ssh/sshd_config
echo 'LpkForceTLS no' >> /etc/ssh/sshd_config
sed -i.bak "s/PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config
/etc/init.d/sshd restart

# local yum repo
cd /etc/yum.repos.d
wget http://{LOCAL YUM SERVER}/yum/myfinder.repo

# system service
chkconfig ntpd on
chkconfig bluetooth off
chkconfig cups off
chkconfig firstboot off
chkconfig gpm off
chkconfig haldaemon off
chkconfig hidd off
chkconfig ip6tables off
chkconfig kudzu off
chkconfig pcscd off
chkconfig xfs off
chkconfig yum-updatesd off

# iptables
sed -i.bak "s/-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT/-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -i eth0 --dport 22 -j ACCEPT/" /etc/sysconfig/iptables
/etc/init.d/iptables restart

# report mail
echo "Server setup completed" | mail -s 'server seetup report' medianetworks@gmail.com


肝心なのは「%post」セクションで、ここにインストール後に実施したいスクリプトを書いておく事ができる。
sedとかも使えるので便利。

2010年4月28日水曜日

「全部 わか子」スクリプトを書いてみる

某所でネタになっていたので、全部わか子的な変換を適当にするスクリプトを書いた。


package Acme::Zenbu::Waka::ko;

use strict;
use warnings;
use utf8;

use Data::Dumper;
use Encode;
use LWP::Simple;
use YAML;
use XML::Simple;

# request base
my $base_url = 'http://jlp.yahooapis.jp/MAService/V1/parse?';
# app key
my $app_id = 'your app id';
# sentence
my $sentence = $ARGV[0];

# encoding
$sentence =~ s/([^\w])/"%" . unpack("H2", $1)/eg;

# request url
my $request_url = $base_url . "appid=$app_id" . "&results=ma&sentence=" . $sentence;

# response
my $response = LWP::Simple::get($request_url) or die "Cannot get $request_url: $!";

# parse
my $parser = XML::Simple->new();
my $doc = $parser->XMLin($response);

my $words = $doc->{ma_result}->{word_list}->{word};

my $resentence = '';

while (my $word = shift(@{ $words })) {
if ($word->{pos} eq '形容詞') {
$resentence .= $word->{surface} . 'の';
}
elsif ($word->{pos} eq '名詞') {
$resentence .= $word->{surface} . ' ';
}
elsif ($word->{pos} eq '助詞') {
$resentence .= $word->{surface} . ' ';
}
else {
$resentence .= $word->{surface};
}
}

print Encode::encode('utf8', $resentence);


これの結果


「へやくるもOK」->「へ や くるも OK 」


とか


「台北一番安い店」->「台北 一番安いの店」


とか変換された。
形容詞の前に「の」を入れたり、名詞や助詞の後に空白を入れるだけで割と雰囲気でるもんですね。
ニーズはないだろうけどもうちょっと作り込むと、アジア各国で見かけるえせ日本語ジェネレータとかになるのかな〜と思う。


SEE ALSO : http://twitter.com/wakako_zenbu

2010年1月24日日曜日

SELinuxにソフトウェアの動作を阻まれた場合の対応

SELinuxは真っ先に切られがちなものですが、予期しない動作、挙動を防ぐ意味でも切らずに運用すべきです。
が、SELinuxに動作が阻まれたとき、どうやってそれを知るか、ということと、どうやって許可するのかということについてはあまり情報がないです。
ここでは自分がやっている方法についてまとめます。

SELinuxのアクセス制限に阻まれたものは、/var/log/audit/audit.logに出力されるので、このログからポリシーを作って許可するのが楽でいいです。
阻まれているかどうかは上記ファイルをtailしてソフトウェアを動かせばわかります。

以下手順


# setenforce 0
# cat /var/log/audit/audit.log | audit2allow -m local > local.te
# checkmodule -M -m -o local.mod local.te
checkmodule: loading policy configuration from local.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 6) to local.mod
# semodule_package -o local.pp -m local.mod
# semodule -i local.pp
# setenforce 1


必要に応じてlocal.teの内容は書き換えています。

2010年1月23日土曜日

アカウントに閉じたPerl5の環境を作る(またはぐちょぐちょなPerl環境をなかったことにする話)

Perlは大抵の環境にはじめから入っているので大変便利なんだけども、Perlのバージョン含めていろいろとコントロールしたいニーズもあったりすると思います。

例えばRedHat系のLinuxだとyumとかで何かのパッケージを入れるときに、CPANモジュールもrpmで入ってしまったりなどして、システムのPerlべったりにものを作るとあとあと面倒なことになったりすることもあるかもしれません。
そんなときには、アカウントに閉じたPerlの環境を作ってしまうのがよいでしょう。

今回はCentOS5.3(x86_64)でのやり方。(CentOS5.3のPerlって5.8.8と古いので丁度いいかなと思う)
hogeというユーザでやる事を想定します。

1.とりあえずperlをビルドしたりする場所を作る

今回は「~/local/perl」とかにしときます。
まず、Perlのソースコードを落としてくるディレクトリを作っときます。
~/local/srcとかでいいでしょう。


$ mkdir -p ~/local/src


2.Perlのダウンロードとインストール


$ cd ~/local/src
$ wget http://www.cpan.org/src/perl-5.10.1.tar.gz
$ tar zxvf perl-5.10.1.tar.gz
$ cd perl-5.10.1
$ sh Configure -Dprefix=$HOME/local/perl-5.10.1 -Dusethreads -Dusemultiplicity -Duse64bitall
$ make
$ make test
$ make install
$ ln -s ~/local/perl-5.10.1 ~/local/perl


これで~/local/perl/bin/perlとか打てば呼べるようになります。

3.PATHに追加

インストールできたとはいえ、いちいち~/local/perl/bin/perlとか呼ぶのはめんどくさいです。
そういうときは環境変数PATHに~/local/perl/binを追加しときましょう。
下記行を~/.bashrcとかに入れとけばOKです。


export PATH="$HOME/local/perl/bin:$PATH"


とりあえずログアウトしてログインするか、sourceコマンドで環境変数に反映させときましょう。

4.おわりに

ここまでやっとくと、hogeユーザにおけるperl関係のコマンドは全部~/local/perl/binの方が優先して使われるようになります。
なので、cpanコマンドとかも/usr/bin/cpanとか明示しない限りは~/local/perl/bin/cpanが使われ、hogeユーザでインストールしたcpanモジュールは~/local/perl/libに入るようになります。

また、この辺は重要なポイントの一つですが、コマンドラインから使うPerlスクリプトを書くときにはshebang行に「#!/usr/bin/perl」とか書くと思いますが、今回のように独自にインストールした場合には「#!/usr/bin/env perl」と書いておくようにしましょう。
(#!/home/hoge/local/perl/bin/perlでもいいです)