2010年2月27日土曜日

とりあえずCentOS5.4でPuppetをインストール

スズキです。

調べてみると、"epel"と"rpmforge"で二種類存在していました。

# yum info puppet
--------
Available Packages
Name : puppet
Arch : noarch
Version : 0.24.8
Release : 4.el5
Size : 1.9 M
Repo : epel
Summary : A network tool for managing many disparate systems
URL : http://puppet.reductivelabs.com/
License : GPLv2+
Description
: Puppet lets you centrally manage every important aspect
of your system using a
: cross-platform specification language that manages all
the separate elements
: normally aggregated in different files, like users, cron
jobs, and hosts,
: along with obviously discrete elements like packages,
services, and files.
--------
Available Packages
Name : puppet
Arch : i386
Version : 0.22.4
Release : 1.el5.rf
Size : 382 k
Repo : rpmforge
Summary : Network tool for managing many disparate systems
URL : http://reductivelabs.com/projects/puppet/
License : GPL
Description
: Puppet lets you centrally manage every important aspect
of your system using a
: cross-platform specification language that manages all
the separate elements
: normally aggregated in different files, like users, cron
jobs, and hosts,
: along with obviously discrete elements like packages,
services, and files.
--------

なので以下のように、バージョンの新しい(0.24.8)"epel"のものをインストールすることにします。

# yum install puppet.noarch

ついでにサーバもインストールしておきます。

# yum install puppet-server.noarch

次は、下記など参考にしながら設定です。(今日中にいけるか?)
http://gihyo.jp/admin/serial/01/puppet

--------
http://www.suz-lab.com

2010年2月26日金曜日

"mod_auth_shadow"でOSアカウントでの認証(Apache)

スズキです。

最初は"mod_auth_pam"で試したけど、うまくいかなかったので、
今度は"mod_auth_shadow"で挑戦です。

インストールは、いつもの通りです。

# yum install mod_auth_shadow

"/etc/httpd/conf.d/"以下に、次のようなファイルが作成されます。

--------【mod_auth_shadow.conf】--------
LoadModule auth_shadow_module modules/mod_auth_shadow.so
...
--------

そして"httpd.conf"を、こんな感じにすると、
OSのアカウントで認証できるようになります。

--------【httpd.conf】--------
Alias /webdav "/var/www/webdav"
<Location /webdav>
DAV on
AuthShadow on
AuthType Basic
AuthName "WebDAV"
Require valid-user
</Location>
--------

でも、"davfs2"の書き込みがうまくいかず、WebDAV作戦自体が...

--------
http://www.suz-lab.com

CentOSのApacheでWebDAV

スズキです。

今まで、何度もやってきたはずなんですが、
なぜか本ブログの記事になっていなかったので、メモとして...

まず、"/etc/httpd/conf/httpd.conf"で下記の記述があることを確認です。
(yumでhttpdをインストールしたら、下記のようになってるはずです)

--------【httpd.conf】--------
...
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
...
<IfModule mod_dav_fs.c>
  # Location of the WebDAV lock database.
  DAVLockDB /var/lib/dav/lockdb
</IfModule>
...
--------

そして、WebDAV用のディレクトリを"/var/www/webdav"として、
次のように"httpd.conf"に追記します。

--------【httpd.conf】--------
Alias /webdav "/var/www/webdav"
<Location /webdav>
  DAV on
</Location>
--------

これで、"http://xxx.xxx.xxx/webdav/"にて、WebDAVが利用できるはずです。

--------
http://www.suz-lab.com

PerlでExif情報を取得

スズキです。

こんなCPANモジュールがあるので、簡単にできます。
http://search.cpan.org/~exiftool/Image-ExifTool-8.10/lib/Image/ExifTool.pod

とりあえず、インストールして、
yum install perl-Image-ExifTool

こんなコードで、

--------【Perl】--------
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;
use Image::ExifTool;

my $file = "input.jpg";
my $tool = new Image::ExifTool;
my $exif = $tool->ImageInfo($file);

print Dumper $exif;
--------

結果は、こんな感じです。

$VAR1 = {
  'ImageWidth' => 160,
  'Model' => 'DSC-HX5V',
  'FlashpixVersion' => '0100',
  'ExifImageHeight' => 120,
  'ResolutionUnit' => 'inches',
  'ColorComponents' => 3,
  'InteropVersion' => '0100',
  'BitsPerSample' => 8,
  'MIMEType' => 'image/jpeg',
  'FileType' => 'JPEG',
  'ExifToolVersion' => '8.00',
  'Directory' => 'bfp_100224/MP_ROOT/102ANV01',
  'ImageHeight' => 120,
  'FileName' => 'MAH00009.THM',
  'XResolution' => '72',
  'DateTimeOriginal' => '2010:02:24 15:30:15',
  'Make' => 'SONY',
  'InteropIndex' => 'THM - DCF thumbnail file',
  'CreateDate' => '2010:02:24 15:30:15',
  'ExifByteOrder' => 'Little-endian (Intel, II)',
  'YCbCrSubSampling' => 'YCbCr4:2:2 (2 1)',
  'FileModifyDate' => '2010:02:24 15:30:14+09:00',
  'ExifImageWidth' => 160,
  'ColorSpace' => 'sRGB',
  'EncodingProcess' => 'Baseline DCT, Huffman coding',
  'FileSize' => '11 kB',
  'YResolution' => '72',
  'ComponentsConfiguration' => 'Y, Cb, Cr, -',
  'ModifyDate' => '2010:02:24 15:30:15',
  'Orientation' => 'Horizontal (normal)',
  'YCbCrPositioning' => 'Co-sited',
  'ImageSize' => '160x120',
  'ExifVersion' => '0221'
};

Perlは何でもできるなー。

--------
http://www.suz-lab.com

Perlで動画(mp4)のメタデータを取得

スズキです。

こんなCPANモジュールがあるので、簡単にできます。
http://search.cpan.org/~JHAR/MP4-Info-1.12/Info.pm

とりあえず、インストールして、

# yum install perl-MP4-Info

こんなコードで、

--------【Perl】--------
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;
use MP4::Info;

my $file = "input.mp4";
my $mp4 = new MP4::Info $file;

print Dumper $mp4;
--------

結果は、こんな感じです。

$VAR1 = bless( {
  'FREQUENCY' => '44.1',
  'SIZE' => 663044,
  'TIME' => '00:13',
  'MS' => 247,
  'SECS' => 13,
  '_permitted' => {
    'DISK' => 1,
    'MS' => 1,
    'TMPO' => 1,
    'COMMENT' => 1,
    'CPIL' => 1,
    'COPYRIGHT' => 1,
    'MM' => 1,
    'TRKN' => 1,
    'NAM' => 1,
    'TRACKNUM' => 1,
    'SS' => 1,
    'WRT' => 1,
    'FREQUENCY' => 1,
    'GNRE' => 1,
    'TOO' => 1,
    'APID' => 1,
    'ALB' => 1,
    'GRP' => 1,
    'COVR' => 1,
    'RTNG' => 1,
    'TITLE' => 1,
    'ENCODING' => 1,
    'CMT' => 1,
    'SIZE' => 1,
    'YEAR' => 1,
    'ARTIST' => 1,
    'SECS' => 1,
    'GENRE' => 1,
    'DAY' => 1,
    'LAYER' => 1,
    'TIME' => 1,
    'ENCRYPTED' => 1,
    'ALBUM' => 1,
    'CPRT' => 1,
    'BITRATE' => 1,
    'ART' => 1,
    'VERSION' => 1
  },
  'CPIL' => 0,
  'ENCRYPTED' => 0,
  'COPYRIGHT' => 0,
  'MM' => 0,
  'ENCODING' => 'mp4a',
  'BITRATE' => 391,
  'VERSION' => 4,
  'SS' => 13,
  'LAYER' => 1
}, 'MP4::Info' );

でも、今回使ったサンプル動画では、たいした情報は入っていませんでした...

--------
http://www.suz-lab.com

Amazon VPC with CentOS (quagga)

スズキです。

以下の"Setup of BGP Routing"の部分で、"quagga"ってのが出てきたので、
http://openfoo.org/blog/amazon_vpc_with_linux.html
今度は、そのあたりのインストールです。

まずは、パッケージの調査です。

# yum search quagga
quagga.i386 : Routing daemon
quagga-contrib.i386 : contrib tools for quagga
quagga-devel.i386 : Header and object files for quagga development

まさに同名のものがあったので、そのままインストールです。
# yum install quagga
(インストールファイルは最後に記載)

記事中に出てくる下記の設定ファイルは確認できましたが、
/etc/quagga/bgpd.conf
/etc/quagga/zebra.conf

次の起動スクリプトはありません...
/etc/init.d/quagga
他にも"/etc/init.d/"にいろいろインストールされているので、
その辺で、代替でしょうか...

とにかく、それっぽいものはインストールできたので、
次は、そもそも"racoon"や"quagga"がなんなのか...、です。

最後に"quagga"のインストールされるファイルです。

# rpm -ql quagga
/etc/logrotate.d/quagga
/etc/pam.d/quagga
/etc/quagga
/etc/quagga/bgpd.conf.sample
/etc/quagga/bgpd.conf.sample2
/etc/quagga/ospf6d.conf.sample
/etc/quagga/ospfd.conf.sample
/etc/quagga/ripd.conf.sample
/etc/quagga/ripngd.conf.sample
/etc/quagga/vtysh.conf.sample
/etc/quagga/zebra.conf.sample
/etc/rc.d/init.d/bgpd
/etc/rc.d/init.d/ospf6d
/etc/rc.d/init.d/ospfd
/etc/rc.d/init.d/ripd
/etc/rc.d/init.d/ripngd
/etc/rc.d/init.d/zebra
/etc/sysconfig/quagga
/usr/bin/vtysh
/usr/lib/quagga
/usr/lib/quagga/libospf.so
/usr/lib/quagga/libospf.so.0
/usr/lib/quagga/libospf.so.0.0.0
/usr/lib/quagga/libospfapiclient.so
/usr/lib/quagga/libospfapiclient.so.0
/usr/lib/quagga/libospfapiclient.so.0.0.0
/usr/lib/quagga/libzebra.so
/usr/lib/quagga/libzebra.so.0
/usr/lib/quagga/libzebra.so.0.0.0
/usr/sbin/bgpd
/usr/sbin/ospf6d
/usr/sbin/ospfclient
/usr/sbin/ospfd
/usr/sbin/ripd
/usr/sbin/ripngd
/usr/sbin/watchquagga
/usr/sbin/zebra
/usr/share/doc/quagga-0.98.6
/usr/share/doc/quagga-0.98.6/AUTHORS
/usr/share/doc/quagga-0.98.6/COPYING
/usr/share/doc/quagga-0.98.6/ChangeLog
/usr/share/doc/quagga-0.98.6/INSTALL
/usr/share/doc/quagga-0.98.6/NEWS
/usr/share/doc/quagga-0.98.6/README
/usr/share/doc/quagga-0.98.6/REPORTING-BUGS
/usr/share/doc/quagga-0.98.6/SERVICES
/usr/share/doc/quagga-0.98.6/TODO
/usr/share/doc/quagga-0.98.6/bgpd.conf.sample
/usr/share/doc/quagga-0.98.6/bgpd.conf.sample2
/usr/share/doc/quagga-0.98.6/isisd.conf.sample
/usr/share/doc/quagga-0.98.6/mpls
/usr/share/doc/quagga-0.98.6/mpls/ChangeLog.opaque.txt
/usr/share/doc/quagga-0.98.6/mpls/cli_summary.txt
/usr/share/doc/quagga-0.98.6/mpls/opaque_lsa.txt
/usr/share/doc/quagga-0.98.6/mpls/ospfd.conf
/usr/share/doc/quagga-0.98.6/ospf6d.conf.sample
/usr/share/doc/quagga-0.98.6/ospfd.conf.sample
/usr/share/doc/quagga-0.98.6/quagga.html
/usr/share/doc/quagga-0.98.6/ripd.conf.sample
/usr/share/doc/quagga-0.98.6/ripngd.conf.sample
/usr/share/doc/quagga-0.98.6/vtysh.conf.sample
/usr/share/doc/quagga-0.98.6/zebra.conf.sample
/usr/share/info/quagga.info.gz
/usr/share/man/man1/vtysh.1.gz
/usr/share/man/man8/bgpd.8.gz
/usr/share/man/man8/isisd.8.gz
/usr/share/man/man8/ospf6d.8.gz
/usr/share/man/man8/ospfd.8.gz
/usr/share/man/man8/ripd.8.gz
/usr/share/man/man8/ripngd.8.gz
/usr/share/man/man8/zebra.8.gz
/var/log/quagga
/var/run/quagga

--------
http://www.suz-lab.com

Amazon VPC with CentOS (ipsec-tools)

スズキです。

こんな記事、見つけたので...
http://openfoo.org/blog/amazon_vpc_with_linux.html

Linux側では、"ipsec-tools"や"racoon"などのキーワードがあったので、
まずは、yumでそれっぽいパッケージがあるか確認です。

調べてみると、以下のようなパッケージがあったので、
ipsec-tools.i386 : Tools for configuring and using IPSEC
早速インストールです。
# yum install ipsec-tools

インストールされるファイルは以下のような感じです。
# rpm -ql ipsec-tools
/etc/racoon
/etc/racoon/certs
/etc/racoon/psk.txt
/etc/racoon/racoon.conf
/sbin/setkey
/usr/sbin/plainrsa-gen
/usr/sbin/racoon
/usr/sbin/racoonctl
/usr/share/doc/ipsec-tools-0.6.5
/usr/share/doc/ipsec-tools-0.6.5/ChangeLog
/usr/share/doc/ipsec-tools-0.6.5/FAQ
/usr/share/doc/ipsec-tools-0.6.5/NEWS
/usr/share/doc/ipsec-tools-0.6.5/README
/usr/share/doc/ipsec-tools-0.6.5/psk.txt
/usr/share/doc/ipsec-tools-0.6.5/racoon.conf
/usr/share/man/man5/racoon.conf.5.gz
/usr/share/man/man8/plainrsa-gen.8.gz
/usr/share/man/man8/racoon.8.gz
/usr/share/man/man8/racoonctl.8.gz
/usr/share/man/man8/setkey.8.gz
/var/racoon

上記の記事に出てくる、
/etc/racoon/psk.txt
/etc/racoon/racoon.conf
は確認できますが、
"/etc/ipsec-tools.conf"は、無いようです。

また、次の初期起動スクリプトも登場するのですが、
/etc/init.d/racoon
/etc/init.d/setkey
それは、
/sbin/setkey
/usr/sbin/racoon
/usr/sbin/racoonctl
で代替可能なんでしょうか...といった感じです。

全然、先が見えていませんが、最初の一歩ということで...

--------
http://www.suz-lab.com

Google bookmarks (Google chrome extension)

スズキです。

せっかくの4.0系だから、
http://blog.suz-lab.com/2010/02/google-chrome-4024989.html

何か拡張機能(extension)入れてみようと思い、

最初の拡張機能として、"Google bookmarks"を導入してみました。
https://chrome.google.com/extensions/d4.0etail/fhaicgmeeafgboeobjagfmlcdhbkijhf
(インストールは直感的にできます)

これで、ようやく、Firefox、IE、Chromeでブックマークの共有が可能になりました。
(当面は、FirefoxとChromeの二刀流かな?)

--------
http://www.suz-lab.com

OpenOffice.org Portable 3.2.0 リリース

スズキです。

3.2系がリリースしました。
http://portableapps.com/news/2010-02-25_-_openoffice.org_portable_3.2

日本語版はこちらからのダウンロードとなります。
http://portableapps.com/apps/office/openoffice_portable/localization

新機能系は、下記でまとめられています。
http://wiki.services.openoffice.org/wiki/User:Foral/Plan3.2

BaseでMySQLと接続、などは試しておきたいなー(いつも言ってるなー...)

--------
http://www.suz-lab.com

Google Chrome Portable 4.0.249.89 リリース

スズキです。

ようやく、PortableApps.comから"Google Chrome"の4系がリリースしました。
http://portableapps.com/news/2010-02-24_-_google_chrome_portable_4.0.249.89

これれから、4系、いろいろ試していこう。

ブログ、さぼりすぎ...

--------
http://www.suz-lab.com

2010年2月24日水曜日

LTフォローアップ(JAWS-UG)

スズキです。

かなり、かけ足で、申し訳なかったのですが、
聞いていただいた方、ありがとうございました。

LTで使用した資料(オリジナルAMIの作成)はこちらになります。
http://docs.google.com/present/view?id=dc6m99bz_398wctzxwdq

ちなみに、上記資料は、下記の本ブログの過去記事をもとに作成しています。
▼CentOS(5.3)のAMIを作成
http://blog.suz-lab.com/2009/04/centos53ami.html
▼CentOS(5.3) のAMIを登録
http://blog.suz-lab.com/2009/04/centos53ami_19.html

フォローアップとして、AMI関係の記事もピックアップしておきます。

▼AMIは「chroot」して確認!
http://blog.suz-lab.com/2009/04/amichroot.html
作成したイメージの中身を確認する手段の一つです。

▼CentOS(5.3) のAMIを公開
http://blog.suz-lab.com/2009/04/centos53ami_20.html
LTで紹介したAMIは、まだprivateですが、それをpublicにする方法です。

▼AMI を"us-east-1"から"us-west-1"そして公開(public)まで
http://blog.suz-lab.com/2010/01/amius-east-1us-west-1public.html
"us-east-1"で作成したAMIが"us-west-1"で使えないことに気づいてしまったので...

▼Migrating a CentOS S3 Based AMI to an EBS Based AMI
http://blog.suz-lab.com/2010/01/migrating-centos-s3-based-ami-to-ebs.html
既存のS3ベースのAMIからEBSベースのAMIを作成します。

最後に、こんな感じで作成してるAMIを、調子にのって公開もしています。
http://blog.suz-lab.com/2010/02/suz-lab-centos-ami-545_22.html

自分のメモ的なものなので、読みにくいと思いますが、
何かしらの手助けになれば幸いです。

皆さん、お疲れ様でした。

--------
http://www.suz-lab.com

2010年2月22日月曜日

SUZ- LAB謹製 CentOS AMI アップデート (5.4.5) 続き

スズキです。

一応、5.4.5は下記でリリースしたのですが、
http://blog.suz-lab.com/2010/02/suz-lab-centos-ami-545.html
"us-east-1 & EBS"限定だったので、同じものを、
"us-east-1 & us-west-1 / S3 & EBS"で作成しました。

例のごとく、AMIを"suz-lab"をキーワードに検索すれば、見つかると思います。

"us-west-1"でEBSベースの作成は、初作業だったのですが、
S3ベースのAMIがすでにあるので、下記の通りで、すぐに作成できてます。
http://blog.suz-lab.com/2010/01/migrating-centos-s3-based-ami-to-ebs.html

ただ、以下のように、AMIイメージの登録は、
"--region us-west-1"でRegionを指定する必要がありました。

# ./ec2reg \
-K /mnt/pk.pem \
-C /mnt/cert.pem \
-s snap-a2c77eca \
-a i386 \
-d suz-lab_ebs_centos-core-5.4.5 \
-n suz-lab_ebs_centos-core-5.4.5 \
--region us-west-1

"eu-west-1"でS3とEBS作ったら、コンプリートだ。

--------
http://www.suz-lab.com

"haresources2cib.py"使うと"cidr_netmask"と"nic"が反対に

スズキです。

下記で、"/usr/lib/heartbeat/haresources2cib.py"を見はじめてしまったので、
http://blog.suz-lab.com/2010/02/heartbeat-mysql3.html
ずっと面倒だと思っていた、"cidr_netmask"と"nic"が反対になってしまう問題に
メスを入れていこうと思います。

問題は、次のような"haresources"を"haresources2cib.py"で変換すると、

--------【haresources】--------
ha-back-01 \
  IPaddr2::172.21.10.153/24/eth1
--------

以下のような、"cidr_netmask"と"nic"が入れ替わった"cib.xml"が作成されてしまいます。

--------【cib.xml】--------
<instance_attributes id="IPaddr2_5_inst_attr">
  <attributes>
    <nvpair id="IPaddr2_5_attr_0" name="ip" value="172.21.10.153"/>
    <nvpair id="IPaddr2_5_attr_1" name="nic" value="24"/>
    <nvpair id="IPaddr2_5_attr_2" name="cidr_netmask" value="eth1"/>
  </attributes>
</instance_attributes>
--------

今までは、それを手動で変更していたのですが、
これからは、下記のように"haresources2cib.py"を修正して対応です。

具体的には配列の
..., "nic", "cidr_netmask", ...
と並んでいる順番を、
..., "cidr_netmask", "nic", ...
と反対にするだけでOKです。

修正後のスクリプトは、こんな感じです。

--------【haresources2cib.py】--------
...
"IPaddr": {"params": [
  "ip",
  "cidr_netmask",
  "nic",
  "broadcast",
  "iflabel",
  "lvs_support",
  "local_stop_script",
  "local_start_script",
  "ARP_INTERVAL_MS",
  "ARP_REPEAT",
  "ARP_BACKGROUND",
  "ARP_NETMASK"
], "time": ["5s", "5s"]},
  "IPaddr2": {"params": [
  "ip",
  "cidr_netmask",
  "nic",
  "broadcast",
  "iflabel",
  "lvs_support",
  "mac",
  "clusterip_hash",
  "arp_interval",
  "arp_count",
  "arp_bg",
  "arp_mac"
], "time": ["5s","5s"]},
...
--------

で、この状態で"cib.xml"を作成すると、今度は、
"cidr_netmask"も"nic"も正しい状態で作成されています。

--------【cib.xml】--------
<instance_attributes id="IPaddr2_5_inst_attr">
  <attributes>
    <nvpair id="IPaddr2_5_attr_0" name="ip" value="172.21.10.153"/>
    <nvpair id="IPaddr2_5_attr_1" name="cidr_netmask" value="24"/>
    <nvpair id="IPaddr2_5_attr_2" name="nic" value="eth1"/>
  </attributes>
</instance_attributes>
--------

最終的には、この辺の設定は、Puppetでできたら... と思ってます。

--------
http://www.suz-lab.com

2010年2月20日土曜日

Heartbeat でMySQL止めたらフェイルオーバー(その3)

スズキです。

その2で完結と思いきや...
http://blog.suz-lab.com/2010/02/heartbeat-mysql2.html

内容は、OCF(Open Cluster Framework)形式のRA(リソース・エージェント)
を用いた方法となります。

その1で"/etc/init.d/mysqld"を利用したやり方を紹介しましたが、
http://blog.suz-lab.com/2010/02/heartbeatmysql1.html
mysqldに手を入れるのは、いやだなーと思いながら、たまたま、
"haresources"から"cib.xml"を作成する"/usr/lib/heartbeat/haresources2cib.py"
を覗いてみたら、以下のような記述があり、

--------【haresources2cib.py】--------
...
"mysql": {"params": [
  "binary",
  "config",
  "datadir",
  "user",
  "group",
  "log",
  "pid",
  "socket",
  "test_table",
  "test_user",
  "test_passwd",
  "enable_creation",
  "additional_parameters"
], "time": ["120s", "60s"]},
...
--------

実際、"/usr/share/ocf/resource.d/heartbeat/mysql"も存在しってことで、試してみました。

具体的な"haresources"は以下のようにしています。

--------【haresources-for-cib】--------
ha-back-0x \
  drbddisk::r0 \
  Filesystem::/dev/drbd0::/mnt/drbd \
  drbdlinks \
  mysql::/usr/bin/mysqld_safe \
  IPaddr2::172.21.10.153/24/eth1
--------
※上記の通り、mysqlの設定項目はいろいろありますが、最低限"binary"を指定しておけばOKです。

あとは、いつもの通り、Heartbeatが停止している状態で、

# rm -f /var/lib/heartbeat/crm/*
# /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources-for-cib
# /etc/init.d/heartbeat start

です。

でも、drbdはうまくいかなかった...

--------
http://www.suz-lab.com

"/usr/sbin/drbdlinks"のシンボリックリンク

スズキです。

こちらの記事の"drbdlinks"を導入する部分で、
http://blog.suz-lab.com/2010/02/drbdlinks.html
"/usr/sbin/drbdlinks"のシンボリックリンクとして、"/etc/ha.d/rc.d/drbdlinks"を作成したのですが、
よくみたら、すでに"/etc/ha.d/resource.d/drbdlinks"のシンボリックリンクが作成されてました。

ですので、そもそも、"/etc/ha.d/rc.d/drbdlinks"は必要無いということになります。

こういうところは、こだわっていこう。

--------
http://www.suz-lab.com

2010年2月19日金曜日

iPhoneでHTML5のvideoタグをクリックしたら?

スズキです。

下記をiPhoneのブラウザで表示させたら、一目瞭然です。
http://jilion.com/sublime/video

本来なら、ブラウザ内で動画が再生するはずですが、
iPhoneの場合、外部のプレーヤーが立ち上がり、そこで再生されます。

初HTML5系エントリです。

--------
http://www.suz-lab.com

SUZ-LAB謹製 CentOS AMI アップデート (5.4.5)

スズキです。

とりあえず、us-east-1のEBS版のみのリリースです。

Manifestは下記となります。
811118151095/suz-lab_ebs_centos-core-5.4.5
("suz"で検索したら、見つかると思います)

変更は、" yum update"による更新と、下記のSUZ-LABリポジトリ(yum)の追加です。
http://blog.suz-lab.com/2010/02/suz-labyumrpm.html

S3/EBS、us-east-1/us-west-1/eu-west-1、同時にリリースしていきたい...

--------
http://www.suz-lab.com

2010年2月18日木曜日

NFSサーバの起動は"portmap"→"nfslock"→"nfs"の順番で

スズキです。

停止は当然、その逆です。すぐ忘れてしまうので...

【起動】

# /etc/init.d/portmap start
portmap を起動中: [ OK ]

# /etc/init.d/nfslock start
NFS statd を起動中: [ OK ]

# /etc/init.d/nfs start
NFS サービスを起動中: [ OK ]
NFS クォータを起動中: [ OK ]
NFS デーモンを起動中: [ OK ]
NFS mountd を起動中: [ OK ]
RPC idmapd を起動中: [ OK ]

【停止】

# /etc/init.d/nfs stop
NFS mountd を終了中: [ OK ]
NFS デーモンを終了中: [ OK ]
NFS quotas を終了中: [ OK ]
NFS サービスを終了中: [ OK ]

# /etc/init.d/nfslock stop
NFS statd を停止中: [ OK ]

# /etc/init.d/portmap stop
portmap を停止中: [ OK ]

この順番で、Heartbeatにも設定すればいいのか?

--------
http://www.suz-lab.com

HeartbeatでMySQL止めたらフェイルオーバー(その2)

スズキです。

下記でフェイルオーバーすると思いきや、同じマシンで再度起動してしまったので、
http://blog.suz-lab.com/2010/02/heartbeatmysql1.html
今回は、もう一方のマシンへのフェイルオーバーを実現してみます。

以前、自動フェイルバックを抑止するエントリを書いたのですが、
http://blog.suz-lab.com/2009/07/heartbeat_30.html
やり方は、それに非常に似ています。

自動フェイルバックの抑止は、以下のように"/var/lib/heartbeat/crm/cib.xml"の、
"default-resource-stickiness"の値を"INFINITY"にすることで実現できました。

--------【cib.xml】--------
...
<nvpair id="cib-bootstrap-options-default-resource-stickiness"
   name="default-resource-stickiness"
  value="INFINITY"/>
<nvpair id="cib-bootstrap-options-default-resource-failure-stickiness"
  name="default-resource-failure-stickiness"
  value="-INFINITY"/>
...
--------

同様に、MySQLを止めたときの他のマシンへのフェイルオーバーは、上記のように
"default-resource-failure-stickiness"の値を"-INFINITY"にすることで実現できます。

この設定で、次のように"ha-back-02"で稼動しているMySQLを

# crm_mon
--------
Resource Group: group_1
drbddisk_1 (heartbeat:drbddisk): Started ha-back-02
Filesystem_2 (ocf::heartbeat:Filesystem): Started ha-back-02
drbdlinks_3 (heartbeat:drbdlinks): Started ha-back-02
mysqld_4 (lsb:mysqld): Started ha-back-02
IPaddr2_5 (ocf::heartbeat:IPaddr2): Started ha-back-02
--------

"ha-back-02"で"/etc/init.d/mysqld stop"を使って止めると、

# crm_mon
--------
Resource Group: group_1
drbddisk_1 (heartbeat:drbddisk): Started ha-back-01
Filesystem_2 (ocf::heartbeat:Filesystem): Started ha-back-01
drbdlinks_3 (heartbeat:drbdlinks): Started ha-back-01
mysqld_4 (lsb:mysqld): Started ha-back-01
IPaddr2_5 (ocf::heartbeat:IPaddr2): Started ha-back-01
Failed actions:
mysqld_4_monitor_120000 (node=ha-back-02, call=14, rc=7): complete
--------

上記のように、もう一方の"ha-back-01"に、
フェイルオーバーしていることを確認することが出来ます。

ようやく、最後のNFSだ。

--------
http://www.suz-lab.com

HeartbeatでMySQL止めたらフェイルオーバー(その1)

スズキです。

以下で、Heartbeat&DRBD&MySQLまで実現して、
http://blog.suz-lab.com/2010/02/drbdlinks.html
試しにMySQLが稼動しているマシンで"/etc/init.d/mysqld stop"してみたら、
MySQLがフェールオーバーなどをせず、
Heartbeatが固まったような感じになってしまいました。

で、いろいろ調べたところ、以下のように、
mysqldスクリプトがLSBのルールに違反していたのが原因のようです。
http://blog.suz-lab.com/2010/02/lsb.html

具体的には、MySQLが停止している状態で、
"/etc/init.d/mysqld stop"したら、本来は終了ステータスが"0"でないといけないのが
"1"になってしまっていたということです。

なので、以下のようにstop関数の、最後の"ret=1"と代入している部分を、
"ret=0"と修正することで、対応してみました。

--------【mysqld】--------
...
stop(){
  MYSQLPID=`cat "$mypidfile" 2>/dev/null `
  if [ -n "$MYSQLPID" ]; then
    /bin/kill "$MYSQLPID" >/dev/null 2>&1
    ret=$?
    if [ $ret -eq 0 ]; then
      STOPTIMEOUT=60
      while [ $STOPTIMEOUT -gt 0 ]; do
        /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
        sleep 1
        let STOPTIMEOUT=${STOPTIMEOUT}-1
      done
      if [ $STOPTIMEOUT -eq 0 ]; then
        echo "Timeout error occurred trying to stop MySQL Daemon."
        ret=1
        action $"Stopping $prog: " /bin/false
      else
        rm -f /var/lock/subsys/mysqld
        rm -f "$socketfile"
        action $"Stopping $prog: " /bin/true
      fi
    else
      action $"Stopping $prog: " /bin/false
    fi
  else
    ret=0
    action $"Stopping $prog: " /bin/false
  fi
  return $ret
}
...
--------

この状態で、再度、Heartbeatが起動している状態で、稼動しているMySQLを停止させると、
「無事、フェイルオーバー!」と思いきや、
そうではなく、同じマシンでMySQLが再度起動してしまいました。
(本当はもう一方のマシンにフェイルオーバーしたいのですが...)

ということで、もう一方のマシンへのフェイルオーバーは、「その2」です。

--------
http://www.suz-lab.com

"/home"以下のディレクトリをシンボリックリンクでApacheから利用するときの注意点

スズキです。

Apacheのドキュメントルートになっている、"/var/www/html"を
"/home/suzlab/var/www/html"(suzlabユーザーのホームディレクトリ)に
シンボリックリンクして、ブラウザで閲覧してみると、403のエラーになってしまいました。

FollowSymLinksは、きいてるはずなんだけどなー、と調べていくと、
原因は、"/home/suzlab"のパーミッションが下記のようになっているからでした。
# ll /home
drw------- 4 suzlab suzlab 4096 2月 18 14:40 suzlab

つまり、Apacheの起動ユーザー(apache)から、おおもとがアクセスできないってことでした。

サーバの設定、なかなか、瞬殺とはいかないなー...

--------
http://www.suz-lab.com

2010年2月17日水曜日

Windows(Vista SP2)で経路をルーティングテーブルに追加(route add)

スズキです。

VPN張ったときなど、たまに(効率化のため)手動で設定する必要があるので...

まあ、コマンドプロンプトで下記のように打ち込みます。

> route add 10.102.1.0 mask 255.255.255.0 192.168.3.1

IPアドレスが三つ並んでますが、左から下記のようになっています。

1番目: 宛先のIPアドレス
2番目: そのネットマスク
3番目: 1番目、2番目に該当するIPアドレスで利用するゲートウェイ

これで、踏み台経由しなくてよくなるぞ。

--------
http://www.suz-lab.com

LSBスクリプトのルール

スズキです。

LSBスクリプトとは、CentOSなどで、httpdなどのサービスを起動するための、
"/etc/init.d/"以下にあるスクリプト群のことです。

そして、そのスクリプトには、以下のようなルールがあります。
http://www.clusterlabs.org/doc/en-US/Pacemaker/1.0/html/Pacemaker_Explained/ap-lsb.html

実際に、"/etc/init.d/mysqld"がそのルールにしたがっているかどうか、確認してみました。

> Start (stopped)
> /etc/init.d/some_service start ; echo "result: $?"
> Did the service start?
> Did the command print result: 0 (in addition to the regular output)?

サービスが停止しているときにスクリプト(start)を実行すると、終了コードは0。

【"/etc/init.d/mysqld"の場合】
# /etc/init.d/mysqld start ; echo "result: $?"
MySQL を起動中: [ OK ]
result: 0

問題ありません。

> Status (running)
> /etc/init.d/some_service status ; echo "result: $?"
> Did the script accept the command?
> Did the script indicate the service was running?
> Did the command print result: 0 (in addition to the regular output)?

サービスが実行しているときにスクリプト(status)を実行すると、終了コードは0。

【"/etc/init.d/mysqld"の場合】
# /etc/init.d/mysqld status ; echo "result: $?"
mysqld (pid 10399) を実行中...
result: 0

問題ありません。

> Start (running)
> /etc/init.d/some_service start ; echo "result: $?"
> Is the service still running?
> Did the command print result: 0 (in addition to the regular output)?

サービスが実行しているときにスクリプト(start)を実行すると、終了コードは0。

【"/etc/init.d/mysqld"の場合】
# /etc/init.d/mysqld start ; echo "result: $?"
MySQL を起動中: [ OK ]
result: 0

問題ありません。

> Stop (running)
> /etc/init.d/some_service stop ; echo "result: $?"
> Was the service stopped?
> Did the command print result: 0 (in addition to the regular output)?

サービスが実行しているときにスクリプト(stop)を実行すると、終了コードは0。

【"/etc/init.d/mysqld"の場合】
# /etc/init.d/mysqld stop ; echo "result: $?"
MySQL を停止中: [ OK ]
result: 0

問題ありません。

> Status (stopped)
> /etc/init.d/some_service status ; echo "result: $?"
> Did the script accept the command?
> Did the script indicate the service was not running?
> Did the command print result: 3 (in addition to the regular output)?

サービスが停止しているときにスクリプト(status)を実行すると、終了コードは3。

【"/etc/init.d/mysqld"の場合】
# /etc/init.d/mysqld status ; echo "result: $?"
mysqld は停止しています
result: 3

問題ありません。

> Stop (stopped)
> /etc/init.d/some_service stop ; echo "result: $?"
> Is the service still stopped?
> Did the command print result: 0 (in addition to the regular output)?

サービスが停止しているときにスクリプト(stop)を実行すると、終了コードは0。

【"/etc/init.d/mysqld"の場合】
# /etc/init.d/mysqld stop ; echo "result: $?"
MySQL を停止中: [失敗]
result: 1

☆ ルール違反です! ☆

ということで、このルール違反が、HeatbeatでMySQLでのフェイルオーバーで問題になってしまいます。

明日、サーバの冗長構成関係は、片付けてしまおう。

--------
http://www.suz-lab.com

UIImagePickerControllerで動画の選択

スズキです。

"iPhone 3GS"も手に入り、早速、よくある手法で、
アプリから、"Photo Albums"の動画を選択しようとしたら、
選択肢に動画が現れず、静止画のみって状態になってしまいました。

で、いろいろ検索したところ、下記にやり方がありました。
http://sol3.typepad.com/tagalong_developer_journa/2009/07/recorded-video-from-iphone-3gs-.html

ポイントを簡単にまとめると、

(1) 以下のようにUIImagePickerControllerのmediaTypesをセットする。
self.imagePicker.mediaTypes = [UIImagePickerController
 availableMediaTypesForSourceType:self.imagePicker.sourceType];

(2) 画像を選択した時の処理は下記メソッドの実装で行う。
-(void)imagePickerController:(UIImagePickerController*)imagePicker
didFinishPickingMediaWithInfo:(NSDictionary*)info {}

といった感じでしょうか?

また、実行時の上記メソッドのinfo(NSDictionary)の中身は次のようになっていました。

【静止画を選択した場合】
UIImagePickerControllerMediaType = "public.image";
UIImagePickerControllerOriginalImage = <UIImage: 0x16ca30>;

【動画を選択した場合】
UIImagePickerControllerMediaType = "public.movie";
UIImagePickerControllerMediaURL =
file://localhost/private/var/mobile/Applications/7D25D208-A9C4-477F-A83E-28880EFCB4F5/tmp//trim.VP1OPQ.MOV;

つまり、動画/静止画の区別はUIImagePickerControllerMediaTypeででき、
動画の情報はURLで提供されるってことになります。

最後に関係ソースの全体です。("Google Code"にコミットするか...)

--------【Test01ViewController.h】--------

#import <UIKit/UIKit.h>

@interface Test01ViewController : UIViewController
<UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
 IBOutlet UIButton *button;
 UIImagePickerController *imagePicker;
}

@property (nonatomic, retain) UIImagePickerController *imagePicker;

- (IBAction)choose;

@end

--------【Test01ViewController.m】--------

#import "Test01ViewController.h"

@implementation Test01ViewController

@synthesize imagePicker;

// 画面表示時の処理
- (void)viewDidLoad
{
 [super viewDidLoad];
 NSLog(@"viewDidLoad");
 self.imagePicker = [[UIImagePickerController alloc] init];
 self.imagePicker.allowsEditing = NO;
 self.imagePicker.delegate = self;
 self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
 self.imagePicker.mediaTypes = [UIImagePickerController
  availableMediaTypesForSourceType:self.imagePicker.sourceType];
}

// 「Choose!」を押した時の処理
- (IBAction)choose
{
 NSLog(@"choose");
 [self presentModalViewController:self.imagePicker animated:YES];
}

// 画像を選択した時の処理
-(void)imagePickerController:(UIImagePickerController*)imagePicker
didFinishPickingMediaWithInfo:(NSDictionary*)info
{
 NSLog(@"imagePickerController");
 NSLog(@"info %@", [info description]);
 [self dismissModalViewControllerAnimated:YES];
}

// 画像の選択をキャンセルした時の処理
-(void)imagePickerControllerDidCancel:(UIImagePickerController*)imagePicker
{
 NSLog(@"imagePickerControllerDidCancel");
 [self dismissModalViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning
{
 [super didReceiveMemoryWarning];
}

- (void)viewDidUnload
{
 NSLog(@"viewDidUnLoad");
}

- (void)dealloc
{
 [super dealloc];
}

@end

--------
http://www.suz-lab.com

2010年2月16日火曜日

NSDictionaryの中身をロギング(Objective-C)

スズキです。

iPhone開発で、Objective-Cにも慣れてきたので、
そろそろ、ブログにも書いていこうと思ってます。

状況としては、イメージピッカーで、画像を選択したときの、
選択した画像のeditingInfo(NSDictionary)に何が入っているか確認していってところです。

ソースはこんな感じです。

--------【Objective-C】--------
// 画像が選択されたら実行される
-(void)imagePickerController:(UIImagePickerController*)imagePicker
  didFinishPickingImage:(UIImage*)pickingImage
  editingInfo:(NSDictionary*)editingInfo
{
  NSLog(@"imagePickerController");
  NSLog(@"editingInfo %@", [editingInfo description]);
  [self dismissModalViewControllerAnimated:YES];
}
...
--------

NSDictionaryには、情報を文字列で表示するための、descriptionというメソッドがあります。
なので、こんな感じでロギングできます。

NSLog(@"editingInfo %@", [editingInfo description]);

上記の出力ログは、以下のようになります。

2010-02-16 16:33:49.621 Test01[54855:207] imagePickerController
2010-02-16 16:33:49.622 Test01[54855:207] editingInfo {
UIImagePickerControllerCropRect = NSRect: {{0, 301}, {765, 768}};
UIImagePickerControllerOriginalImage = <UIImage: 0x3b37c00>;
}

動画を選択したときは、どうなるんだろう?

--------
http://www.suz-lab.com

"appengine ja night #6"参加予定(2010/03/19)

スズキです。

http://atnd.org/events/3228
とのことです。

次回で3回目ですが、前回は参加レポート書かなかったので、
次回は必ず書くようにしよう。

最近、ブログも全然書いてないし…

--------
http://www.suz-lab.com

2010年2月15日月曜日

ポータブルiPod/iPhone動画変換(iPodME)

スズキです。

いいツール、見つけました。

▼iPodME
http://nodadev.wordpress.com/pc-projects/ipodme/

これで、iPhoneアプリ開発用テスト動画、簡単に作れます…

--------
http://www.suz-lab.com

2010年2月14日日曜日

ついでに"drbdlinks"も仕込んでみた

スズキです。

DRBDネタも、最後のNFS系を残すのみになりましたが、
その前に、"yum"で"drbd"を検索したときに気になった、"drbdlinks"を試してみました。
# yum search drbd
...
drbdlinks.noarch : A program for managing links into a DRBD shared partition
...

本家の情報は、こちらになりますが、
http://www.tummy.com/Community/software/drbdlinks/
実際の設定に関しては、こちらが参考になります。
http://people.equars.com/2007/3/16/postgresql-drbdlinks-heartbeat-on-debian

簡単に言ってしまえば、"drbdlinks"はシンボリックリンクを管理するプログラムで、
設定ファイルに書かれたルールでシンボリックリンクを作成したり、削除したりしてくれます。

まずは、インストールです。
# yum install drbdlinks

インストールすると、"/etc/init.d/drbdlinksclean"が作成されるので、
以下のように、起動時に実行されるようにします。
# chkconfig drbdlinksclean on

"drbdlinksclean"は一旦、設定ファイルに定義されたシンボリックリンクを
すべて削除するもので、シンボリックの作成(drbdlinks start)のタイミングは
Heartbeatに任せるため、起動時に呼び出すようにしています。

設定ファイルである、"/etc/drbdlinks.conf"は以下のようにしています。

--------【drbdlinks.conf】--------
mountpoint('/mnt/drbd')
cleanthisconfig(1)
link('/var/lib/mysql')
--------

この状態で、"drbdlinks start"すると、DRBDをマウントした"/mnt/drbd"の"var/lib/mysql"が
"/var/lib/mysql"にシンボリックリンクされます。
また、もとの"/var/lib/mysql"は"/var/lib/mysql.drbdlinks"にリネームされます。

つまり、
# mv /var/lib/mysql /var/lib/mysql.drbdlinks
# ln -s /mnt/drbd/var/lib/mysql /var/lib/mysql
といった感じです。

当然、"drbdlinks stop"は、この逆で、要は"/etc/init.d/drbdlinksclean"も、
これが呼ばれていることになります。

次は、Heartbeatの設定です。

まず、以下のように"/etc/ha.d/rc.d"以下に"drbdlinks"のシンボリックリンクを作成します。
# cd /etc/ha.d/rc.d
# ln -s /usr/sbin/drbdlinks drbdlinks

そして、Heartbeatが、この"drbdlinks"を利用するように
"/etc/ha.d/haresources-for-cib"を以下のようにします。

--------【suz-lab-ha1】--------
suz-lab-ha1 \
drbddisk::r0 \
Filesystem::/dev/drbd0::/mnt/drbd \
drbdlinks \
mysqld
--------【suz-lab-ha2】--------
suz-lab-ha2 \
drbddisk::r0 \
Filesystem::/dev/drbd0::/mnt/drbd \
drbdlinks \
mysqld
--------

そして例のごとく、
# rm -f /var/lib/heartbeat/crm/*
# /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources-for-cib
# /etc/init.d/heartbeat start
です。

すると、DRBDがプライマリなサーバは、以下のようになり、
# ls /var/lib
...
mysql -> /mnt/drbd/var/lib/mysql
mysql.drbdlinks
...
セカンダリなサーバや、プライマリなサーバのHeartbeatを落としたりすると、
次のようにもとの状態に戻ります。
# ls /var/lib
...
mysql
...

今のところ、いろんな意味でバランスがいい、HAになってる気がするなー。

--------
http://www.suz-lab.com

2010年2月13日土曜日

そろそろDRBDに挑戦 (MySQL連携編)

スズキです。

よくある、Heartbeat、DRBD、MySQL、の構成です。

とりあえず、両マシン(suz-lab-ha1/suz-lab-ha2)でMySQLのインストールです。
# yum install mysql-server

MySQLを起動して、データディレクトリ(/var/lib/mysql)も作成しておきます。
# /etc/init.d/mysqld start
# /etc/init.d/mysqld stop


次は、Heartbeatが動いてなくて、DRBD動いてる状態での、
データディレクトリをDRBDに移す作業です。

一方のマシン(suz-lab-ha1)でDRBDをプライマリ&マウントして、
そこデータディレクトリを移します。
# drbdadm primary all
# mount /dev/drbd0 /mnt/drbd
# mkdir -p /mnt/drbd/var/lib
# mv /var/lib/mysql /mnt/drbd/var/lib/
# chown -R mysql.mysql /mnt/drbd/var/lib/mysql
# ln -s /mnt/drbd/var/lib/mysql /var/lib/mysql

もう一方のマシン(suz-lab-ha1)にも、切り替わった時のために、
"/var/lib/mysql"にシンボリックリンクを作成しておきます。
# rm -rf /var/lib/mysql
# ln -s /mnt/drbd/var/lib/mysql /var/lib/mysql

そして、両マシンで以下のようにcib.xmlを作成して、Heartbeatを起動します。
# cat /etc/ha.d/haresources-for-cib
--------【suz-lab-ha1】--------
suz-lab-ha1 \
  drbddisk::r0 \
  Filesystem::/dev/drbd0::/mnt/drbd \
  mysqld
--------【suz-lab-ha2】--------
suz-lab-ha2 \
  drbddisk::r0 \
  Filesystem::/dev/drbd0::/mnt/drbd \
  mysqld
--------
# rm -f /var/lib/heartbeat/crm/*
# /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources-for-cib
# /etc/init.d/heartbeat start

すると、こんな感じでMySQLも管理されていることがわかります。
# crm_mon
============
Last updated: Sun Feb 14 08:16:49 2010
Current DC: suz-lab-ha2 (4b65eb6f-2943-4ce0-8c42-1b47da86dbea)
2 Nodes configured.
1 Resources configured.
============

Node: suz-lab-ha2 (4b65eb6f-2943-4ce0-8c42-1b47da86dbea): online
Node: suz-lab-ha1 (3f126784-f608-4d06-ad8b-b40ac27ef3be): online

Resource Group: group_1
drbddisk_1 (heartbeat:drbddisk): Started suz-lab-ha2
Filesystem_2 (ocf::heartbeat:Filesystem): Started suz-lab-ha2
mysqld_3 (lsb:mysqld): Started suz-lab-ha2
--------

"suz-lab-ha2"のHeartbeatを落とすと、"suz-lab-ha1"のDRBDがプライマリになり、
データディレクトリがマウントされ、MySQLが切り替わってることが確認できます。
# crm_mon
============
Last updated: Sun Feb 14 08:18:37 2010
Current DC: suz-lab-ha1 (3f126784-f608-4d06-ad8b-b40ac27ef3be)
2 Nodes configured.
1 Resources configured.
============

Node: suz-lab-ha2 (4b65eb6f-2943-4ce0-8c42-1b47da86dbea): OFFLINE
Node: suz-lab-ha1 (3f126784-f608-4d06-ad8b-b40ac27ef3be): online

Resource Group: group_1
drbddisk_1 (heartbeat:drbddisk): Started suz-lab-ha1
Filesystem_2 (ocf::heartbeat:Filesystem): Started suz-lab-ha1
mysqld_3 (lsb:mysqld): Started suz-lab-ha1
--------

Heartbeat&DRBDネタ、まだまだ続きます…

--------
http://www.suz-lab.com

そろそろDRBDに挑戦(Heartbeat連携編)

スズキです。

ちょっと時間が空きましたが、DRBDが稼働している前提での作業です。
http://blog.suz-lab.com/2010/02/drbd_07.html

Heartbeatはこんな感じでインストールしておきます。
http://blog.suz-lab.com/2009/07/heartbeat.html

ちなみに今回の"/etc/ha.d/ha.cf"は、こんな感じです。

--------【ha.cf】--------
debugfile /var/log/ha-debug
logfile /var/log/ha-log
keepalive 2
deadtime 30
initdead 120
udpport 694
bcast eth0
node suz-lab-ha1
node suz-lab-ha2
crm yes
--------

ここからDRBDとの連携に関する設定になります。
(二つのマシン"suz-lab-ha1/suz-lab-ha2"で同じ操作をします)

まず、Heartbeatが起動していたら停止します。
# /etc/init.d/heartbeat stop

次に、cib.xmlまわりのファイルを削除します。
# rm -f /var/lib/heartbeat/crm/*

そして、以下のような"/etc/ha.d/haresources-for-cib"を作成します。

--------【suz-lab-ha1】--------
suz-lab-ha1 \
  drbddisk::r0 \
  Filesystem::/dev/drbd0::/mnt/drbd
--------【suz-lab-ha2】--------
suz-lab-ha2 \
  drbddisk::r0 \
  Filesystem::/dev/drbd0::/mnt/drbd
--------
※"drbddisk"で指定されている"r0"は"/etc/drbd.conf"のリソース名です。

最後に、以下のコマンドで"/var/lib/heartbeat/crm/"に"cib.xml"を作成し、Heartbeatを起動します。
# /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources-for-cib
# /etc/init.d/heartbeat start

ある程度時間がたつと、"crm_mon"の出力が以下のようになり、
片方のDRBDがプライマリになり、マウントされていることがわかります。
# crm_mon
...
Resource Group: group_1
drbddisk_1 (heartbeat:drbddisk): Started suz-lab-ha2
Filesystem_2 (ocf::heartbeat:Filesystem): Started suz-lab-ha2

"suz-lab-ha2"のHeartbeatを落とすと、
"suz-lab-ha1"のDRBDがプライマリになりマウントされることもわかります。
# crm_mon
...
Resource Group: group_1
drbddisk_1 (heartbeat:drbddisk): Started suz-lab-ha1
Filesystem_2 (ocf::heartbeat:Filesystem): Started suz-lab-ha1

次は、さらに、MySQLとの連携です。
--------
http://www.suz-lab.com

2010年2月12日金曜日

"SUZ-LAB YUM"からWorkerManagerをインストール&起動

スズキです。

いろいろ難航しましたが、最終的には、こんな感じです。

まずは、SUZ-LABリポジトリの登録とWorkerManagerのインストールです。
# curl -OL http://yum.suz-lab.com/5/i386/suzlab-release-5-1.noarch.rpm
# rpm -Uvh suzlab-release-5-1.noarch.rpm
# yum install perl-Worker-Manager

次は、設定ファイルですが、デフォルトのものは、こんな感じです。
# cat /etc/worker.conf.yml
--------
workers:
- Sandbox::Worker::A
- Sandbox::Worker::B
worker_options:
prioritize: 1
databases:
dsn: dbi:mysql:theschwartz
user: theschwartz
pass: password
inc_path:
- /usr/share/doc/perl-Worker-Manager-0.01/examples/lib
pidfile: /var/run/workermanager.pid
logfile: /var/log/workermanager.log
errorlogfile: /var/log/workermanager_error.log
--------

最後に、サービスの起動ですが、いつもの通りです。
# /etc/init.d/workermanager start
/usr/bin/workermanager.pl を起動中: [ OK ]

DRBDに戻るか。

--------
http://www.suz-lab.com

WorkerManagerのSPECファイル(最終版)

スズキです。

こちらのSPECファイルの依存関係が甘かったので、
http://blog.suz-lab.com/2010/02/workermanagerrpm_12.html
下記が、依存関係も調整した最終版となります。

> Requires: perl(Proc::Daemon)
> Requires: perl(File::Pid)
> Requires: perl(YAML::Syck)

--------【perl-Worker-Manager】--------
Summary: Worker Manager
Name: perl-Worker-Manager
Version: 0.01
Release: 1.el5.suzlab
License: GPL
Group: Development/Libraries
URL: http://www.suz-lab.com/
#Source0: %{name}-%{version}.tar.gz
Source0: Worker-Manager-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildArch: noarch
Requires: perl(Proc::Daemon)
Requires: perl(File::Pid)
Requires: perl(YAML::Syck)
%description
%prep
%setup -q -n Worker-Manager-%{version}
%build
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/etc/sysconfig
mkdir -p $RPM_BUILD_ROOT/etc/init.d
mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d
mkdir -p $RPM_BUILD_ROOT/usr/lib/perl5/vendor_perl/5.8.8
cp bin/workermanager.pl $RPM_BUILD_ROOT/usr/bin/
cp config/workermanager $RPM_BUILD_ROOT/etc/sysconfig/
cp config/workermanager.logrotate $RPM_BUILD_ROOT/etc/logrotate.d/workermanager
cp config/worker.conf.yml $RPM_BUILD_ROOT/etc/worker.conf.yml
cp script/workermanager.init $RPM_BUILD_ROOT/etc/init.d/workermanager
cp -r lib/* $RPM_BUILD_ROOT/usr/lib/perl5/vendor_perl/5.8.8/
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
/etc/sysconfig/workermanager
/etc/logrotate.d/workermanager
/etc/worker.conf.yml
/usr/lib/perl5/vendor_perl/5.8.8/*
%attr(755,root,root) /usr/bin/workermanager.pl
%attr(755,root,root) /etc/init.d/workermanager
%doc examples
%changelog
--------

自動で解決してくれる依存関係と、手動で記載しないといけない依存関係がある...

--------
http://www.suz-lab.com

SUZ-LABリポジトリ(yum)追加用RPMも用意してみた

スズキです。

例のごとく、RPM&リポジトリ化です。

まずは、いつものディレクトリへ。
# cd /usr/src/redhat

"/etc/yum.repos.d/"に追加するファイルは下記の通りです。
# cat SOURCES/suz-lab.repo
--------
[suz-lab]
name=SUZ-LAB Packages for Enterprise Linux $releasever - $basearch
baseurl=http://yum.suz-lab.com/5/$basearch
enabled=1
gpgcheck=0
--------

SPECファイルは、こんな感じです。
# cat SPECS/suzlab-release.spec
--------
Name: suzlab-release
Version: 5
Release: 1
Summary: YUM configuration for SUZ-LAB repository
Group: System Environment/Base
License: GPL
URL: http://www.suz-lab.com/
Source0: suz-lab.repo
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
Requires: redhat-release >= %{version}
%description
%prep
%setup -q -c -T
install -pm 644 %{SOURCE0} .
%build
%install
rm -rf $RPM_BUILD_ROOT
install -dm 755 $RPM_BUILD_ROOT%{_sysconfdir}/yum.repos.d
install -pm 644 %{SOURCE0} $RPM_BUILD_ROOT%{_sysconfdir}/yum.repos.d
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
%config(noreplace) /etc/yum.repos.d/*
%changelog
* Fri Feb 12 2010 Hiroyasu Suzuki <suzuki@suz-lab.com> - 5-1
- Initial Package for RHEL 5
--------

そして、(S)RPMの作成です。
# rpmbuild -ba SPECS/suzlab-release.spec

そのRPMをリポジトリに追加します。
# cd /var/www/html/yum/5/i386
# cp /usr/src/redhat/RPMS/noarch/suzlab-release-5-1.noarch.rpm ./
# createrepo ./

SRPMもリポジトリに追加します。
# cd /var/www/html/yum/5/src
# cp /usr/src/redhat/SRPMS/suzlab-release-5-1.src.rpm ./
# createrepo ./

最後にS3のリポジトリと同期です。

すると、以下のようにRPMを利用してSUZ-LABリポジトリ(yum)を追加することができます。
# curl -OL http://yum.suz-lab.com/5/i386/suzlab-release-5-1.noarch.rpm
# rpm -Uvh suzlab-release-5-1.noarch.rpm
# yum repolist
...
suz-lab SUZ-LAB Packages for Enterprise Linux 5 - i386 enabled: 4
...

Enjoy!
--------
http://www.suz-lab.com

WorkerManagerのRPM&yumリポジトリ化

スズキです。

忘れかけてましたが、これが、今までのyumリポジトリネタの最終的な目的でした。

WorkerManagerはこちらで作成/公開されているもので、
http://d.hatena.ne.jp/stanaka/20091023/1256252946
TheSchwartz/Gearmanのワーカープロセスを管理プロダクトです。
実際のソースはこちらになります。
http://github.com/stanaka/WorkerManager

ソース内にはSPECファイルも用意されているので、
http://github.com/stanaka/WorkerManager/blob/master/script/workermanager.spec
このSPECファイルをSUZ-LAB的に調整して(末尾に掲載)、実際の(S)RPMを作成しています。

まずは、ソースを置きます。(実はソースも多少、調整しています)

# cd /usr/src/redhat
# ls SOURCES/Worker-Manager-0.01.tar.gz
SOURCES/Worker-Manager-0.01.tar.gz

次にSPECファイルも置き、そこから(S)RPMを作成します。

# rpmbuild -ba SPECS/perl-Worker-Manager.spec

そして、RPMをリポジトリに追加します。

# cd /var/www/html/yum/5/i386
# cp /usr/src/redhat/RPMS/noarch/perl-Worker-Manager-0.01-1.el5.suzlab.noarch.rpm
./
# createrepo ./

同様に、SRPMをリポジトリに追加します。

# cd /var/www/html/yum/5/src
# cp /usr/src/redhat/SRPMS/perl-Worker-Manager-0.01-1.el5.suzlab.src.rpm ./
# createrepo ./

最後にS3のリポジトリと同期すれば、以下で、インストールできます。

# yum install perl-Worker-Manager

Enjoy!

--------【perl-Worker-Manager.spec】--------
Summary: Worker Manager
Name: perl-Worker-Manager
Version: 0.01
Release: 1.el5.suzlab
License: GPL
Group: Development/Libraries
URL: http://www.suz-lab.com/
#Source0: %{name}-%{version}.tar.gz
Source0: Worker-Manager-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildArch: noarch

%description

%prep
%setup -q -n Worker-Manager-%{version}

%build

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/etc/sysconfig
mkdir -p $RPM_BUILD_ROOT/etc/init.d
mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d
mkdir -p $RPM_BUILD_ROOT/usr/lib/perl5/vendor_perl/5.8.8
cp bin/workermanager.pl $RPM_BUILD_ROOT/usr/bin/
cp config/workermanager $RPM_BUILD_ROOT/etc/sysconfig/
cp config/workermanager.logrotate $RPM_BUILD_ROOT/etc/logrotate.d/workermanager
cp config/worker.conf.yml $RPM_BUILD_ROOT/etc/worker.conf.yml
cp script/workermanager.init $RPM_BUILD_ROOT/etc/init.d/workermanager
cp -r lib/* $RPM_BUILD_ROOT/usr/lib/perl5/vendor_perl/5.8.8/

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
/etc/sysconfig/workermanager
/etc/logrotate.d/workermanager
/etc/worker.conf.yml
/usr/lib/perl5/vendor_perl/5.8.8/*
%attr(755,root,root) /usr/bin/workermanager.pl
%attr(755,root,root) /etc/init.d/workermanager

%doc examples

%changelog
--------
http://www.suz-lab.com

2010年2月11日木曜日

フットサル・エクササイズ グアラナ

スズキです。

久しぶりのフットサルネタです。(まだ続けてます)

フットサル初めて1年半くらい(週二ペース)たつのですが、
そろそろ、足技も意識していきたいと思い、買ってしまいました。
http://www.amazon.co.jp/gp/product/B0012E00OY?tag=iretsuzusblog-22

紹介されている技は下記の通りです。

【ドリブル】
Ginga(ジンガ) / Tesoura(チゾーラ) / Elastico(エラスチコ) / Cruzado(クルザード)

【パス】
Dobro(ドブロ) / L(エリ) / Engano(エンガーノ) / Salto(サウト)

【シュート】
Lagostim(ラゴスチン) / Pontape(ポンタペー) / Tufao(トゥフォン) / Guarana(グアラナ)

今日から一個づつ覚えていこうと思いつつ、今日から、もう挫折...

--------
http://www.suz-lab.com

TheSchwartz::SimpleのRPM&yumリポジトリ化

スズキです。

WorkerManagerのRPM化に伴ない、
依存関係的に、先にTheSchwartz::SimpleをRPM(yumリポジトリ)化する必要があったので、
してみました。

まずはダウンロードからSPECファイルの作成まで。

# cd /usr/src/redhat/SOURCES
# curl -OL http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/TheSchwartz-Simple-0.05.tar.gz
# cpanflute2 TheSchwartz-Simple-0.05.tar.gz
# rpm -Uvh perl-TheSchwartz-Simple-0.05-8.src.rpm
# rm perl-TheSchwartz-Simple-0.05-8.src.rpm

これで、"/usr/src/redhat/SPECS"以下に
"perl-TheSchwartz-Simple.spec"としてSPECファイルが作成されます。

そして、このSPECファイルを以下のように修正します。

--------【修正前】--------
...
Release: 8
...
Requires: perl(perl) >= 5.8.1
...
--------【修正後】--------
...
Release: 1.el5.suzlab
...
(削除)
...
--------
※ "Requires: perl(perl) >= 5.8.1"を削除しないと、何故か依存関係で引っかかります...

ここまで準備ができたら、いよいよRPMの作成です。

# cd /usr/src/redhat/SPECS
# rpmbuild -ba perl-TheSchwartz-Simple.spec
※"-ba"オプションでRPMとSRPMの両方が作成されます。

最後に、これらの(S)RPMを以下のように(S3)リポジトリにコピーすると、
"yum install perl-TheSchwartz-Simple"でインストールできるようになります。

# cd /var/www/html/yum/5/i386
# cp /usr/src/redhat/RPMS/noarch/perl-TheSchwartz-Simple-0.05-1.el5.suzlab.noarch.rpm
./
# createrepo ./
(そしてS3のリポジトリと同期)

※ 利用には当然、以下のようにSUZ-LABリポジトリを登録する必要があります。
http://blog.suz-lab.com/2010/02/cpanfilepidrpm.html

Enjoy!

--------
http://www.suz-lab.com

2010年2月10日水曜日

「SUZ-LAB」と「suz-lab」

スズキです。

特に「ルール」は無かったのですが、

「suz-lab」は僕、個人を指すとき、

「SUZ-LAB」は組織とかサービス的なものを指すときに使うようになっていました。

ってことで、これからは、このルールで。

--------
http://www.suz-lab.com

「第0回 AWS User Group - Japan 勉強会」でLT希望しちゃいました

スズキです。

「飛び込みLT(ライトニングトーク)大歓迎!」 ってことなので、
"SUZ-LAB謹製 CentOS AMI"のノウハウ的なものをLTしてみようかな、
と希望してしまいました。

こんな感じです。(http://atnd.org/events/3102)

> オリジナルAMIの作成(仮)
> --------
> 簡単なAMIのお話と、オリジナルAMIの作成方法についてです。
> S3ベースのもの、EBSベースのもの、そして各Regionでの作成など、
> 5分程度でコンパクトにできたら、と思います。

5分で、どこまで盛り込めるかなー?

--------
http://www.suz-lab.com

2010年2月9日火曜日

iPhone SDK 3.1.3 with Xcode 3.2.1

スズキです。

ようやく、iPhoneアプリ開発の重い腰が上がりました。

ということで、最新の環境を確認してみたら、
"iPhone SDK 3.1.3 with Xcode 3.2.1"とのことでした。
http://developer.apple.com/iphone/
(2010/02/02にリリースされていたようです)

ということで、早速アップデートです。

まずは、Safariまわり、やっとくか...

--------
http://www.suz-lab.com

CPANモジュール(File::Pid)をRPM化

スズキです。

こちらでWorkerManagerを導入したときに、
http://blog.suz-lab.com/2010/02/centosworkermanagertheschwartz.html
CPANモジュールの"File::Pid"がRPMとして提供されてなくて...
ってことでいろいろ小細工しましたが、yumリポジトリも作成したので、
http://blog.suz-lab.com/2010/02/s3yum.html
自分でRPM化することにしました。

と言うことで、開発ツールを導入です。
# yum install make
# yum install rpm-build
# yum install perl-RPM-Specfile

次に、下記よりソースをダウンロードします。
http://search.cpan.org/~cwest/File-Pid-1.01/

で、ソースに対して下記コマンドでSRPMを作成します。
# cpanflute2 File-Pid-1.01.tar.gz
警告: ホスト名を正式なものにできません: suz-lab-work
書き込み完了: ./perl-File-Pid-1.01-8.src.rpm
実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.58386
+ umask 022
+ cd /tmp/64ljY2A9Yb
+ rm -rf File-Pid-1.01
+ exit 0

そして、作成したSRPMからRPMを作成します。
# rpmbuild --rebuild perl-File-Pid-1.01-8.src.rpm

ここまで実行すると、下記に実際にRPMが配置されます。
/usr/src/redhat/RPMS/noarch/perl-File-Pid-1.01-8.noarch.rpm

このRPMをリポジトリ(/var/www/html/yum/5/i386)に置いて、
下記コマンドでリポジトリ情報(repodata)を更新します。
# cd /var/www/html/yum/5/i386
# createrepo ./

最後に、これらをS3にアップロードすれば、yumでインストールできるようになります。
ちなみに、"yum info"の結果は下記のようになりました。
# yum info perl-File-Pid
Available Packages
Name : perl-File-Pid
Arch : noarch
Version : 1.01
Release : 8
Size : 8.2 k
Repo : suz-lab
Summary : File-Pid Perl module
URL : http://search.cpan.org/dist/File-Pid/
License : GPL or Artistic
Description: File-Pid Perl module.

実際にインストールする際、"/etc/yum.repos.d/suz-lab.repo"に
下記のように"gpgcheck=0"を入れておかないと、
Package perl-File-Pid-1.01-8.noarch.rpm is not signed
といったエラーでインストールできません。

--------【suz-lab.repo】--------
[suz-lab]
name=SUZ-LAB Packages for Enterprise Linux $releasever - $basearch
baseurl=http://yum.suz-lab.com/5/$basearch
enabled=1
gpgcheck=0
--------

次は、WorkerManagerのRPMを作成しよう。

--------
http://www.suz-lab.com

yumリポジトリのディレクトリ構成

スズキです。

こちらで、とりあえずyumリポジトリをつくってみたのですが、
http://blog.suz-lab.com/2010/02/s3yum.html
ディレクトリ構成をちゃんと整理してみました。

まず、下記をCentOS5系のリポジトリにしています。
http://yum.suz-lab.com/5/

その下に、以下のように環境ごとのディレクトリを作成しています。
i386/ : 32bit環境のRPM
x86_64/ : 64bit環境のRPM
src/ : SRPM

環境ごとのディレクトリの下は以下のように、リポジトリ情報のフォルダと、
(S)RPMファイルを置くようにしています。
repodata/ : リポジトリ情報
*.rpm : 実際のRPM

本格的に、SUZ-LABリポジトリを使っていくようにしよう。

--------
http://www.suz-lab.com

S3上にyumリポジトリを作成(とりあえず)

スズキです。

【S3にフォルダを作成】

S3上に、"yum.suz-lab.com"というBucketを作成します。

そして、その中に、CentOS5のi386アーキテクチャのRPM置き場と言う意味合いで、
"5/i386/RPMS"というフォルダを作成しておきます。

【リポジトリデータの作成】

"createrepo"をインストールします。

# yum install createrepo

そして適当なフォルダ(/var/www/html/yum/5/i386)を作成し、下記を実行します。

# createrepo /var/www/html/yum/5/i386

すると、以下のようなフォルダとファイルが作成されます。

# ls repodata/
filelists.xml.gz other.xml.gz primary.xml.gz repomd.xml

最後に上記を、S3上の"yum.suz-lab.com/5/i386"以下に、
"yum.suz-lab.com/5/i386/repodata/*"といった形になるように配置します。

【リポジトリデータの公開】

まず、S3の"yum.suz-lab.com"以下を誰でも読取できるようにします。

そして、DNSにて"yum.suz-lab.com"のCNAMEとして、
S3のアクセス先である下記を登録しておきます。
yum.suz-lab.com.s3.amazonaws.com

これで、http://yum.suz-lab.com/...と言った感じでリポジトリにアクセス出来るようになります。

【リポジトリデータの設定と確認】

ここからは、使う側のお話です。

下記のような"/etc/yum.repos.d/suz-lab.repo"を用意します。

--------【suz-lab.repo】--------
[suz-lab]
name=SUZ-LAB Packages for Enterprise Linux $releasever - $basearch
baseurl=http://yum.suz-lab.com/5/$basearch
enabled=1
--------

ここまでできたら、下記のように、
上記で作成したリポジトリが利用出来ることが確認できるはずです。

# yum repolist
...
suz-lab SUZ-LAB Packages for Enterprise Linux 5 - i386
...

RPM作ってみよう。

--------
http://www.suz-lab.com

2010年2月8日月曜日

CentOSでWorkerManager(TheSchwartz)

スズキです。

以前、Macで動作環境作ったのですが、
http://blog.suz-lab.com/2010/01/macworkermanagerfor-theschwartz.html
そろそろ本番環境も意識したいので、今回はCentOSでの構築です。

まず、以下のようにyumで必要なものをインストールします。

# yum install mysql-server
# yum install perl-TheSchwartz
# yum install perl-Proc-Daemon
# yum install perl-YAML-Syck
# yum install perl-Parallel-ForkManager
# yum install perl-UNIVERSAL-require
# yum install perl-Time-Piece

ただし、perlモジュールの"File::Pid"がyumのリポジトリに存在してないようなので、
yumでインストールとCPANでのインストールを混在させるのも嫌だったので、
下記のように、直接、該当ファイルをダウンロードして、
WorkerManagerのlibフォルダに置く形で対応することにしました。

と言うことで、ダウンロード先はこちらになります。
http://search.cpan.org/~cwest/File-Pid-1.01/

そして、ダウンロード&展開したディレクトリの"File/Pid.pm"を
WorkerManagerを展開したディレクトリのlib以下に置きます。

ただ、これだけだと、まだWorkerManager実行時に利用することができないので、
下記のように、 "bin/workermanager.pl"の"use File::Pid"するタイミングを調整します。

--------【Before】--------
...
use strict;
use warnings;

use Getopt::Std;
use Proc::Daemon;
use File::Pid;
use YAML::Syck;

#use Data::Dumper qw(Dumper);

use FindBin;
use lib File::Spec->catdir($FindBin::Bin, '..', 'lib');
use WorkerManager;
...
--------【After】--------
...
use strict;
use warnings;

use Getopt::Std;
use Proc::Daemon;
use YAML::Syck;

#use Data::Dumper qw(Dumper);

use FindBin;
use lib File::Spec->catdir($FindBin::Bin, '..', 'lib');
use File::Pid;
use WorkerManager;
...
--------

次は、ImageMagickの環境です。

--------
http://www.suz-lab.com

2010年2月7日日曜日

そろそろDRBDに挑戦(設定&稼働編)

スズキです。

こちらのインストール編の続きです。
http://blog.suz-lab.com/2010/02/drbd.html

まずは二つのマシン(suz-lab-ha1/suz-lab-ha2)で、"/etc/drbd.conf"を
下記のように設定します。利用するDRBDのデバイスは"/dev/drbd0"、
ディスクのデバイスは"/dev/sdb"としています。

--------【drbd.conf】--------
global {
  usage-count yes;
}
common {
  protocol C;
}
resource r0 {
  on suz-lab-ha1 {
    device /dev/drbd0;
    disk /dev/sdb;
    address 192.168.11.11:7789;
    meta-disk internal;
  }
  on suz-lab-ha2 {
    device /dev/drbd0;
    disk /dev/sdb;
    address 192.168.11.12:7789;
    meta-disk internal;
  }
}
--------

そして二つのマシンに対し下記のコマンドでメタデータを作成し、
DRBDのサービスを起動します。
# drbdadm create-md r0
# /etc/init.d/drbd start

これで、DRBDが稼働している状態になります。

次に、DRBDのデバイス(/dev/drbd0)にファイルシステム(ext3)を作成し、マウントします。

まずは"suz-lab-ha1"のデバイスを下記コマンドでプライマリにします。
# drbdsetup /dev/drbd0 primary -o
※ 当然、"suz-lab-ha1"上での実行です。

そして、次のように、ファイルシステムを作成し、マウントします。
# mkfs.ext3 /dev/drbd0
# mkdir /mnt/drbd
# mount /dev/drbd0 /mnt/drbd

これで、DRBDのデバイスをファイルシステムとして利用できるようになります。

最後に、実際にミラーリングされているかの確認です。

以下のコマンドで、適当にファイルを作成し、アンマウントして、
DRBDデバイスをセカンダリにします。
# touch /mnt/drbd/test1.txt
# umount /mnt/drbd
# drbdsetup /dev/drbd0 secondary

そして同様に、"suz-lab-ha2"をプライマリにしてDRBDデバイスをマウントします。
# drbdsetup /dev/drbd0 primary
# mkdir /mnt/drbd
# mount /dev/drbd0 /mnt/drbd

この状態でマウントしたディレクトリの中身をみると、下記のように、
"suz-lab-ha1"で作成したファイルが存在しているのを確認できます。
# ls /mnt/drbd/
lost+found test1.txt

また同様に、適当なファイルを作成し、アンマウント&セカンダリー化をします。
# touch /mnt/drbd/test2.txt
# umount /mnt/drbd
# drbdsetup /dev/drbd0 secondary

"suz-lab-ha1"に戻り、上記と同様の処理でマウントしたディレクトリの中身をみると、
"suz-lab-ha2"で作成したファイルが存在しているのを確認できます。
# drbdsetup /dev/drbd0 primary
# mount /dev/drbd0 /mnt/drbd
# ls /mnt/drbd/
lost+found test1.txt test2.txt

ということで、こんなことは手動ではやってられないので、次は「Heartbeat連動編」です。

--------
http://www.suz-lab.com

2010年2月6日土曜日

"第0回 AWS User Group - Japan 勉強会"参加予定

スズキです。

下記に参加予定です。
http://atnd.org/events/3102

SUZ-LABも、AWSに関しては、オリジナルAMI作ってたりとか、
いろいろやっているので、非常に楽しみです。

当日までに、HA関係とかも、こなれてたらいいなー。
(今、四苦八苦中...)

--------
http://www.suz-lab.com

2010年2月5日金曜日

そろそろDRBDに挑戦(インストール編)

スズキです。

HAなサーバを構築する必要性がありそうなので、
以前からやらなきゃなー、と思っていたDRBDの予習です。

まずは、yumで検索です。
--------
# yum search drbd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: ftp.iij.ad.jp
* base: ftp.iij.ad.jp
* centosplus: ftp.iij.ad.jp
* contrib: ftp.iij.ad.jp
* epel: ftp.kddilabs.jp
* extras: ftp.iij.ad.jp
* remi: rpms.famillecollet.com
* rpmforge: apt.sw.be
* updates: ftp.iij.ad.jp
======== Matched: drbd ========
drbd.i386 : Distributed Redundant Block Device driver for Linux
drbd82.i386 : Distributed Redundant Block Device driver for Linux
drbd83.i386 : Distributed Redundant Block Device driver for Linux
drbdlinks.noarch : A program for managing links into a DRBD shared partition
kmod-drbd.i686 : drbd kernel module(s)
kmod-drbd-PAE.i686 : drbd kernel module(s)
kmod-drbd-xen.i686 : drbd kernel module(s)
kmod-drbd82.i686 : drbd82 kernel module(s)
kmod-drbd82-PAE.i686 : drbd82 kernel module(s)
kmod-drbd82-xen.i686 : drbd82 kernel module(s)
kmod-drbd83.i686 : drbd83 kernel module(s)
kmod-drbd83-PAE.i686 : drbd83 kernel module(s)
kmod-drbd83-xen.i686 : drbd83 kernel module(s)

一番新しそうな、drbd83を新ストールすればよさそうです。

ということで、下記でインストールです。

# yum install kmod-drbd83

"drbd83"と"kmod-drbd83"がインストールされます。

次は、設定編です。(今日中にやりたいけど、時間あるかなー?)

--------
http://www.suz-lab.com

2010年2月4日木曜日

T2サンプルのコミッタにしていただきました

スズキです。

T2コミッタの一人であるyone098さんから、下記ブログで、
「やりませんかー」と誘っていただいたので、
http://d.hatena.ne.jp/yone098/20100204/1265261068
「よろこんでー」ってことで、コミッタにしていただきました。

とりあえず、このブログでもチマチマ書いている、
"GAE/J & Velocity"系でもコミットできるといいなー、と思ってます。

まずは、コミッタの方に、いろいろ相談しよう。

--------
http://www.suz-lab.com

2010年2月3日水曜日

"Xenon File Manager Portable"でファイルの関連付け

スズキです。

ファイルの関連付けができる、ポータブルファイラーです。
http://portableapps.com/apps/utilities/xenon_portable

早速、ポータブルアプリに関連付けして、
ダブルクリックで、ポータブルアプリが立ち上がるようにしようと思います。

ブックマーク機能も、上手に使えれば、さらなる作業の効率化がはかれそうです。

久しぶりの、SUZ-LABポータブル環境のニューフェイスです。

--------
http://www.suz-lab.com

KompoZer Portable 0.7.10 Revision 3 リリース

スズキです。

以下のように、FirefoxでHTMLソース見るときに利用していた
http://blog.suz-lab.com/2007/12/viewsourcewithfirefoxkompozergimpportab.html

"KompoZer Portable"がアップデートされています。
http://portableapps.com/news/2010-02-02_-_kompozer_portable_0.7.10_revision_3

でも、ほとんど使ってなかったんだよなー…
これを機に使いこなそう!

2010年2月2日火曜日

FlashDevelopで"Native Installer"の作成

スズキです。

ちょっと時間が空きましたが、再度"AIR 2 beta"ネタです。
http://blog.suz-lab.com/2010/01/flashdevelopair-2-beta.html

"Native Process"を利用したかったわけですが、それには、
"Native Installer"(hoge.airではなくhoge.exe)を作成する必要があるようなので、
FlashDevelopで作成できるようにしてみました。

といっても、"PackageApplication.bat"を改造しただけですが...
※ "PackageApplication.bat"はAIRプロジェクト作成時に生成される、
インストーラー作成バッチファイルです。

と言うわけで、"PackageApplication.bat"を以下のように修正です。

まず、"AIR 2 beta"のSDKにパスを通します。
--------
:: Path to Flex SDK binaries
set PATH=%PATH%;S:\common\sbin\air\bin

次に、出力ファイルを"*.exe"にします。
--------
:: Output
if not exist air md air
set AIR_FILE=air/hoge.exe

最後に、"-target native"オプションをつけてパッケージを作成します。
--------
echo Signing AIR setup using certificate %CERTIFICATE%.
call adt -package %SIGNING_OPTIONS% -target native %AIR_FILE%
%APP_XML% %FILE_OR_DIR%
if errorlevel 1 goto failed

全体のスクリプトは、こんな感じです。

--------【PackageApplicationNative.bat】--------
@echo off

:: AIR application packaging
:: More information:
:: http://livedocs.adobe.com/flex/3/html/help.html?content=CommandLineTools_5.html#1035959

:: Path to Flex SDK binaries
set PATH=%PATH%;S:\common\sbin\air\bin

:: Signature (see 'CreateCertificate.bat')
set CERTIFICATE=SelfSigned.pfx
set SIGNING_OPTIONS=-storetype pkcs12 -keystore %CERTIFICATE%
if not exist %CERTIFICATE% goto certificate

:: Output
if not exist air md air
set AIR_FILE=air/hoge.exe

:: Input
set APP_XML=application.xml
set FILE_OR_DIR=-C bin .

echo Signing AIR setup using certificate %CERTIFICATE%.
call adt -package %SIGNING_OPTIONS% -target native %AIR_FILE%
%APP_XML% %FILE_OR_DIR%
if errorlevel 1 goto failed

echo.
echo AIR setup created: %AIR_FILE%
echo.
goto end

:certificate
echo Certificate not found: %CERTIFICATE%
echo.
echo Troubleshotting:
echo A certificate is required, generate one using 'CreateCertificate.bat'
echo.
goto end

:failed
echo AIR setup creation FAILED.
echo.
echo Troubleshotting:
echo did you configure the Flex SDK path in this Batch file?
echo.

:end
pause
--------

これで、"Native Process"が実験できると思ったのもつかの間、
いろいろあって、試す必要がなくなってしまった...

--------
http://www.suz-lab.com

GAE/Jでフィードをカテゴリでフィルタできるサービスを作ってみた

スズキです。

GEA/Jの習作として作ったものですが、名づけて、「SUZ-LAB FEED」です。

このブログで、いろいろ独り言してた、"jQuery + T2 + OVal + Rome"を使って実装しています。
※全ソースは下記です
http://code.google.com/p/suz-lab-gae/source/browse/#svn/trunk/suz-lab-feed

現状の機能は非常に簡単なもので、
複数のカテゴリ(タグ)でフィルタされたフィードを結合したフィードを作成する程度です。

例えば、本ブログのフィードを"GAE"カテゴリでフィルタし、
http://feeds.feedburner.com/suz-lab-blog
そして、Deliciousのブックマークのフィードも"GAE"カテゴリでフィルタしたものを結合し、
http://feeds.delicious.com/v2/rss/suz_lab
下記のような、SUZ-LABのGAEに関する専用フィードを作成しています。
http://feed.suz-lab.com/feed.xml/suz-lab_gae

例えば、このフィードは、下記の"Google Code (suz-lab-gae)"のような、
特定のテーマのサイトニュースとして利用することができます。
http://code.google.com/p/suz-lab-gae/

本来なら、フィード(フィルタ)作成UIも公開して、って感じでやりたいのですが、
まだまだ、そのレベルに達していないので、
上記のフィード(suz-lab_gae)のみ利用出来るようにしています。

今週、まだ実装が甘いところを詰めて、来週、フィード(フィルタ)作成UIを完成させたいところです。

--------
http://www.suz-lab.com

今入れているFirefoxのアドオン

スズキです。

Firefoxを3.6にして、
http://blog.suz-lab.com/2010/01/firefox-portable-36.html
一週間くらい、必要なアドオンを、つど入れながら様子見していたのですが、
下記のように落ち着いた感じです。

▼ Google ツールバー
http://www.google.com/intl/ja/toolbar/ff/index.html

▼ Better Gmail
https://addons.mozilla.org/ja/firefox/addon/6076

▼ Better GReader
https://addons.mozilla.org/ja/firefox/addon/6424

▼ Delicious Bookmarks
https://addons.mozilla.org/ja/firefox/addon/3615

▼ Echofon for Twitter
https://addons.mozilla.org/ja/firefox/addon/5081

▼ Firebug
https://addons.mozilla.org/ja/firefox/addon/1843

▼ FireMobileSimulator
http://firemobilesimulator.org/?%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9

▼ ViewSourceWith
https://addons.mozilla.org/ja/firefox/addon/394

▼ User Agent Switcher
https://addons.mozilla.org/ja/firefox/addon/59

▼ Web Developer
https://addons.mozilla.org/ja/firefox/addon/60

▼ Elasticfox
http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609&categoryID=88

▼ S3 Organizer
https://addons.mozilla.org/ja/firefox/addon/3247

▼ Download Statusbar
https://addons.mozilla.org/ja/firefox/addon/26

▼ Chaika
http://chaika.xrea.jp/

▼ FoxAge2ch
http://www.xuldev.org/foxage2ch/

▼ Flagfox
https://addons.mozilla.org/ja/firefox/addon/5791

▼ SwitchHosts
https://addons.mozilla.org/ja/firefox/addon/14258

▼ External IP
http://www.ermodev.se/visa_firefoxExtensions.htm

▼ All-in-One Sidebar
https://addons.mozilla.org/ja/firefox/addon/1027

▼ FireShot
https://addons.mozilla.org/ja/firefox/addon/5648

一言くらい、説明書きたかったけど... いいか…

--------
http://www.suz-lab.com

2010年2月1日月曜日

Mac(Linux)でMP3の合成(SoX)

スズキです。

SoXを利用することで可能です。
http://sox.sourceforge.net/Main/HomePage

"input1.mp3"と"input2.mp3"を合成して、"output.mp3"を作成してみます。

まず、インストールです。

$ sudo port install sox

WAVファイルにしないと合成できなかったので、FFmpegでWAVファイルにします。

$ ffmpeg -i input1.mp3 input1.wav
$ ffmpeg -i input2.mp3 input2.wav

そして合成です。

$ sox -m input1.wav input2.wav output.wav

最後に、WAVファイルをMP3ファイルに戻します。

$ ffmpeg -i output.wav output.mp3

"FFmpeg::Command"みたいなCPANモジュール("SoX::Command"!?)ないかなー?

--------
http://www.suz-lab.com