PostgreSQLメモ

多分使わないメモ。

・カラム名column_nameのあるテーブルを探す。
 select t.relname,c.attname,format_type(c.atttypid, c.atttypmod) from pg_attribute as c
 inner join pg_stat_user_tables as t on(c.attrelid = t.relid)
 where attname = 'column_name';

・テーブルとインデックスのサイズを確認する(ブロックサイズ*ブロック数)。
 SELECT tablename,pg_relation_size(tablename::text) from pg_tables where tableowner != 'postgres';

 SELECT indexname,pg_relation_size(indexname::text) as indexsize from pg_indexes where schemaname != 'pg_catalog';

・今ロックされているテーブルを調べる。
 SELECT relname from pg_stat_all_tables where relid in(select relation from pg_locks) and schemaname != 'pg_catalog';

Facebooktwitterlinkedintumblrmail

Munin で PostgreSQL を監視する

PostgreSQL 大好きっ子なので PostgreSQL を監視するプラグインを追加するんだぜー。

PostgreSQL 監視用のプラグインはパッケージを導入した際にいくつか入ってます。

$ ls -l /usr/share/munin/plugins/postgres*
-rwxr-xr-x 1 root root 5377 2009-10-18 19:53 /usr/share/munin/plugins/postgres_block_read_
-rwxr-xr-x 1 root root 7777 2009-10-18 19:53 /usr/share/munin/plugins/postgres_commits_
-rwxr-xr-x 1 root root 2159 2009-10-18 19:53 /usr/share/munin/plugins/postgres_locks
-rwxr-xr-x 1 root root 6118 2009-10-18 19:53 /usr/share/munin/plugins/postgres_queries_
-rwxr-xr-x 1 root root 7243 2009-10-18 19:53 /usr/share/munin/plugins/postgres_space_

もちろん /usr/share/munin/plugins/ には、PostgreSQL 用だけじゃなくていろんなプラグインが入ってます。いっぱい、いっぱい。

PostgreSQL のコネクション数の監視をするプラグインは残念ながらここにはないので
http://munin-monitoring.org/wiki/plugin-pg__connections
から取ってきました。

こいつも /usr/share/munin/plugins/ に置いて、実行できるようにしておきましょう。

$ sudo chmod +x /usr/share/munin/plugins/pg__connections 

プラグインの設定方法はプラグインのファイルを開いて読むと書いてありますので、そのようにしていきます。

Munin のプラグインは /etc/munin/plugins/ ディレクトリにあるかどうかで管理されています。まずは、取ってきた pg__connections のシンボリックリンクを作成。

$ sudo ln -s /usr/share/munin/plugins/pg__connections /etc/munin/plugins/pg_5432_connections

プラグインのファイルの Usage には pg__connections ってな名前をつけるように書いてありますが、ポート番号にしてみました。このプラグインについてはこの文字列が動作に影響を及ぼすことはなさそうなので何でもいいと思います。

用意されているプラグインからも監視したい対象のプラグインをセットアップ。

$ sudo ln -s /usr/share/munin/plugins/postgres_block_read_ /etc/munin/plugins/postgres_block_read_5432
$ sudo ln -s /usr/share/munin/plugins/postgres_space_ /etc/munin/plugins/postgres_space_5432

この2つにしました。

シンボリックリンクの最後にデータベース名を付けるように書いてありましたがこれらについてもポート番号の5432にしてみました。これらのプラグインでは付けた文字列がグラフのタイトルで使用されるのでちゃんと考えて付けましょう。

ちなみに postgres_block_read_5432 だとグラフのタイトルが「:: Postgres data reads from 5432」となります。postgres_space_5432 の方は「:: Postgres database 5432」となって、データベースの容量に関するグラフのタイトルとしてはイマイチな感じになっちゃいました。

PostgreSQLのプラグインについては設定ファイルに記述がないので設定を追記する必要があります。

$ sudo vi /etc/munin/plugin-conf.d/munin-node

私の実験環境での設定ですが、次のように追記しました。

[postgres_*]
env.PGHOST 127.0.0.1
env.PGPORT 5432
env.PGDATABASE postgres
env.PGUSER postgres
env.PGPASSWORD trust

[pg_5432_connections]
env.dbhost 127.0.0.1
env.dbport 5432
env.dbname postgres
env.dbuser postgres
env.dbpass trust

[postgres_*] は postgres_ が頭に付いているプラグインの設定、すなわち、用意されているプラグインの設定です。
[pg_5432_connections] はパラメータ名なども異なりますし別途書く必要があります。

実験環境の PostgreSQL の 接続設定は 127.0.0.1 からは trust にしています。よって、データベースの接続にパスワードは不要なのですが、何か書いていないとエラーなったので仮に trust としています。

PostgreSQL 側でやらなければならない設定として「postgresql.conf の stats_start_collector = true として統計情報収集器を有効にせよ」的なことも書いてありますが、PostgreSQL 8.3 以降、この設定は削除され、UDP ソケットの作成に成功したら必ず統計情報収集器が起動するようになったようです(http://www.sraoss.co.jp/technology/postgresql/8.3/ 参照)。

あとは Munin-Node を再起動すればOK、と言いたいところですが、実はこれでは動かない場合があります。 libdbd-pg-perl が入っていない場合です。プラグインが PostgreSQL にアクセスするのに使っているのです。
Ubuntu に Munin をインストールする時には入りませんでしたので、libdbd-pg-perl が入っていない場合には別途インストールする必要があります。

$ sudo aptitude install libdbd-pg-perl

こんどこそ、準備OK。Munin-Node を再起動します。

$ sudo /etc/init.d/munin-node restart
 * Stopping Munin-Node
   ...done.
 * Starting Munin-Node
   ...done.

再起動完了。

$ tail -n 20 /var/log/munin/munin-node.log

ってな感じで、 Munin-Node のログを見てエラーが出てないか確認すると良いでしょう。データがないせいで正常動作をしていてもエラーが出ていたりする場合もあります。内容で判断するしかないですね。

しばらく待つと、こんな感じに PostgreSQL のリソースのグラフが追加されたページが生成されます。

Facebooktwitterlinkedintumblrmail

画面いっぱいのUITextViewがキーボードに隠れないようにする

iPadで画面いっぱいにUITextViewを配置すると、入力状態になった際にキーボードが出てきて入力カーソルが隠れてしまいます。これには「キーボードが表示・非表示になるタイミングで、UITextViewの高さを変えてあげる」ことで 対処可能です。UICatalogのサンプルが少し古く、3.2ではDeprecatedになっているUIKeyboardBoundsUserInfoKeyを使っていたため、UIKeyboardFrameEndUserInfoKeyを使うようにしてみました。恐らくiPhoneでも同じようにできるはずです。

@interface CustomViewController : UIViewController  {
    UITextView *_textView; //対象となるテキストビュー。UIViewControllerのサブビューとして追加する。
}
@property (nonatomic, retain) IBOutlet UITextView *_textView;
@end


@implementation CustomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];    
    //親ビューの高さが変更された時に追従するようにする
    _textView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    //キーボード表示・非表示の通知の開始
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    //キーボード表示・非表示の通知を終了
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

//キーボードが表示された場合
- (void)keyboardWillShow:(NSNotification *)aNotification {
    //キーボードのCGRectを取得
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardRect = [[self.view superview] convertRect:keyboardRect fromView:nil];
    
    //キーボードのanimationDurationを取得
    NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    //メインビューの高さをキーボードの高さ分マイナスしたframe
    CGRect frame = self.view.frame;
    frame.size.height -= keyboardRect.size.height;

    //キーボードアニメーションと同じ間隔でメインビューの高さをアニメーションしつつ変更する。
    //これでUITextViewも追従して高さが変わる。
    [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
    [UIView setAnimationDuration:animationDuration];
    self.view.frame = frame;
    [UIView commitAnimations];
}

//キーボードが非表示にされた場合(keyboardWillShowと同じことを高さを+してやっているだけ)
- (void)keyboardWillHide:(NSNotification *)aNotification {
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardRect = [[self.view superview] convertRect:keyboardRect fromView:nil];

    NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    CGRect frame = self.view.frame;
    frame.size.height += keyboardRect.size.height;

    [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
    [UIView setAnimationDuration:animationDuration];
    self.view.frame = frame;
    [UIView commitAnimations];
}

@end
Facebooktwitterlinkedintumblrmail

メモ:Linux::Inotify2 でディレクトリを監視して処理

Linuxサーバー上のディレクトリにファイルが作成されたら処理するってのをやりたくて、調べてたら cpan の Linux::Inotify2 が良さそうだったので試してみました。

モジュールをインストール(cpanminusを使用)。イベントループに AnyEvent を使うといいらしいので、そちらも。

$ cpanm Linux::Inotify2
$ cpanm AnyEvent

指定ディレクトリにファイルを投入したら別ディレクトリに mv するスクリプトを作成。

#!/usr/bin/env perl
use strict;
use warnings;

use Linux::Inotify2;
use AnyEvent;

my $watch_dir = $ENV{HOME} . '/inotify/queue';
my $processed_dir = $ENV{HOME} . '/inotify/processed';
my $inotify = Linux::Inotify2->new or die $!;

$inotify->watch(
    $watch_dir,
    IN_CLOSE_WRITE | IN_MOVED_TO,
    sub {
        my $e    = shift;
        my $name = $e->fullname;
        print "test!:${name}\n";
        system( 'mv', $name, "${processed_dir}/" );
    }
);

my $cv = AnyEvent->condvar;
my $inotify_w = AnyEvent->io(
    fh   => $inotify->fileno,
    poll => 'r',
    cb   => sub { $inotify->poll }
);
$cv->recv;

起動して queue ディレクトリにファイルを置いたら processed ディレクトリに移動するのを確認できました。

Facebooktwitterlinkedintumblrmail

Gitで短すぎるコミットログを禁止する

コミットコメントを意地でも書かせたい

http://d.hatena.ne.jp/kanu-orz/20100531/1275279046

上記を見て感化されたので、Gitで短すぎるコミットログのコミットを禁止するhookを書きました。

#!/usr/bin/env ruby

#place this file in .git/hooks/commit-msg

MIN_LENGTH = 10

log = File.readlines(ARGV[0]).grep(/^[^#].+/)
length = log.to_s.split(//u).size - 1

if length < MIN_LENGTH
  system('say Way way wait')
  puts <<-EOS

##################################################################
このコミットは許しません!

1行目   [変更した理由、目的を簡潔に]
2行目以降 [必要ならば詳細を]

最低でも何故変更したのかのを、
未来の自分と保守担当者に向かって書きましょう。

コミットログは未来の自分へのメッセージです。
今は不要に思っても、未来にはきっと役に立ちます。

#{length}文字しかありません。
有効なメッセージを#{MIN_LENGTH}文字以上
##################################################################
  EOS
  exit 1
end

せっかくMacなのでsayコマンド使ってAlexさんにしゃべらせてます。
ちなみにコミットログはcommit-msgスクリプトの第一引数に.git/COMMIT_EDITMSGというファイル名が渡ってきますので、それを覗いてやれば参照できます。

Facebooktwitterlinkedintumblrmail

Perlでインタラクティブシェル

Ruby、Python等の言語にはインタラクティブシェルが付いてます。PerlではDevel::REPLというモジュールをインストールすることで実現できます。(作者様には感謝です。)書くまでもないのですが、インストールにはcpanを使用します。(当方環境はMac OS X 10.6及び、Perl5.10)

$ sudo cpan
cpan[1]> install Devel::REPL

インタラクティブシェルの起動には下記Perlを実行します。

$ re.pl

後はコード書いてEnterを叩いていけば即座に実行されていきます。
ちょっとした実験したりするときに大変重宝します。

Facebooktwitterlinkedintumblrmail

Munin のプラグインを無効にして監視対象を減らす

Munin はデフォルトの監視対象が多くて素敵です。
ですが、entropy ってのはいらんかなぁと思ったので消しちゃいます。

Munin では /etc/munin/plugins/ にあるプラグインが読み込まれます(Ubuntu にパッケージでインストールした場合)。

$ sudo ls -l /etc/munin/plugins/
total 0
lrwxrwxrwx 1 root root 28 2010-03-30 03:35 cpu -> /usr/share/munin/plugins/cpu
lrwxrwxrwx 1 root root 27 2010-03-30 03:35 df -> /usr/share/munin/plugins/df
lrwxrwxrwx 1 root root 33 2010-03-30 03:35 df_inode -> /usr/share/munin/plugins/df_inode
lrwxrwxrwx 1 root root 27 2010-03-30 03:35 entropy -> /usr/share/munin/plugins/entropy
lrwxrwxrwx 1 root root 30 2010-03-30 03:35 forks -> /usr/share/munin/plugins/forks
lrwxrwxrwx 1 root root 32 2010-03-30 03:35 if_err_eth0 -> /usr/share/munin/plugins/if_err_
lrwxrwxrwx 1 root root 28 2010-03-30 03:35 if_eth0 -> /usr/share/munin/plugins/if_
lrwxrwxrwx 1 root root 35 2010-03-30 03:35 interrupts -> /usr/share/munin/plugins/interrupts
lrwxrwxrwx 1 root root 31 2010-03-30 03:35 iostat -> /usr/share/munin/plugins/iostat
lrwxrwxrwx 1 root root 33 2010-03-30 03:35 irqstats -> /usr/share/munin/plugins/irqstats
lrwxrwxrwx 1 root root 29 2010-03-30 03:35 load -> /usr/share/munin/plugins/load
lrwxrwxrwx 1 root root 31 2010-03-30 03:35 memory -> /usr/share/munin/plugins/memory
lrwxrwxrwx 1 root root 35 2010-03-30 03:35 open_files -> /usr/share/munin/plugins/open_files
lrwxrwxrwx 1 root root 36 2010-03-30 03:35 open_inodes -> /usr/share/munin/plugins/open_inodes
lrwxrwxrwx 1 root root 34 2010-03-30 03:35 processes -> /usr/share/munin/plugins/processes
lrwxrwxrwx 1 root root 29 2010-03-30 03:35 swap -> /usr/share/munin/plugins/swap
lrwxrwxrwx 1 root root 31 2010-03-30 03:35 vmstat -> /usr/share/munin/plugins/vmstat

このように実際はシンボリックリンクを作成・削除することでプラグインの有効・無効がコントロールされています。

ので、いらないのは消しちゃおうね。

$ sudo rm /etc/munin/plugins/entropy 

そして、Munin-Node を再起動。

$ sudo /etc/init.d/munin-node restart

これでプラグインは無効になります。

もしかすると Munin-Node の再起動は必要ないかもしれません。
でも気持ち悪いしやっとこうぜって感じ。

Facebooktwitterlinkedintumblrmail

メモ:CentOS 5.5 で perlbrew + cpanminus

ユーザーのホームに全部入るので影響範囲を限定できてうれしい。
OSのバージョンとかあまり関係ないのですが、試した環境が CentOS 5.5 なので。

まずは perlbrew から。

ホームに移動。インストール用のファイルを取ってきてインストール実行。

$ cd
$ wget http://xrl.us/perlbrew
$ chmod +x perlbrew 
$ ./perlbrew install

インストール用ファイル削除。イニシャライズを実行。

$ rm perlbrew 
$ perl5/perlbrew/bin/perlbrew init

用意された設定を読み込むように .bashrc に追加。

$ echo "source $HOME/perl5/perlbrew/etc/bashrc" >> ~/.bashrc
$ source .bashrc 

perlbrewで perl 5.8.9 をインストール。インストールした perl 5.8.9 に切り替え。

$ perlbrew install perl-5.8.9
$ perlbrew switch perl-5.8.9

確認。使用するものに(*)がつく(アカウントapacheでやってます)。

$ perlbrew installed
perl-5.8.9(*)
/home/apache/perl5/perlbrew/perls/current/bin/perl
/usr/bin/perl

次に cpanminus 。

ホームに bin がなかったんで掘って移動。

$ mkdir ~/bin
$ cd ~/bin

ファイルを取ってきて実行権限付ける。

$ wget http://xrl.us/cpanm
$ chmod +x cpanm 

以上。あら簡単。
※この方法だと後で不便があります。コメントでご助言いただいていますのでご参照下さい。

ちまたで噂の cpan-outdated + cpanminus での全モジュールのアップデートもやっときます。

cpan-outdated 入れる。

$ cpanm App::cpanoutdated

cpan-outdated は古くなったモジュールの一覧返してくれるのですが、

$ cpan-outdated | cpanm 

と cpanminus に食わせると古くなったモジュールを全部アップデートしてくれる。素敵!

Facebooktwitterlinkedintumblrmail

モバイルアプリケーション向けユーザサポートサイトをホスティングする SuppApp( http://supp-app.com/ )をオープンしました。

この度、有限会社ランカードコムは、モバイルアプリケーション向けユーザサポートサイトをホスティングする SuppApp(http://supp-app.com/)をオープンしました。

iPhoneから始まったモバイルアプリケーションブーム。多くの方々が続々と開発に参入しています。ユーザからの評価が高いアプリケーションの共通事項として、「ユーザの声をよく聞いている」という事が挙げられます。SuppAppは「ユーザの声を聞く」ことを強力に支援します。

「認証にTwitterを使用」

開発者(アプリの登録)、アプリユーザ(サポートサイトへの投稿)共にTwitterのOAuthによって認証を行います。面倒なメールアドレス等の登録が要りません。またアプリユーザに関しては認証無しでも投稿が可能です。

「トピックの状態」

トピックは質問・要望・賞賛・バグの4つのカテゴリに分けられ、例えばユーザからの要望が投稿された場合、開発者はそれを(対応します・対応中です・リリースしました)とマークすることができます。これによりユーザは新機能が実装されるのかどうかを把握することができます。

「トピックへの投票」

ユーザはトピックに対して投票することができます。開発者は投票数を見て要望を実装するかを決める事ができます。

「iPhone、iPadへの対応」

アプリを登録する際にiPhoneアプリか、iPadアプリかを登録してください。するとトップページには登録したスクリーンショットをiPhone、iPadの端末画像にはめ込んで表示します。今後Android等にも対応する予定です。

「ヘルプページ」

アプリの使い方を登録するページも用意しました。

「モバイルブラウザに対応」

サポートサイトはモバイル向けにも見やすく表示できるよう最適化しています。アプリ内にサポートサイトへのリンクを用意しておけば、ユーザはそのまま質問したり、要望を出したりすることができます。

「開発者向けページ」

開発者がアプリにどんな投稿があるのか、回答がなされているのかを一目で把握できるようなページを用意しています。またアプリ毎のフィードも用意しています。

SuppAppはモバイルアプリケーションの開発者様を強力にサポートします。数分で登録できますので、是非ご登録をお願いします!

Facebooktwitterlinkedintumblrmail

ホームページのリニューアルとブログの開設

初めまして、有限会社ランカードコムの吉田です。

この度ホームページのリニューアルと、当ブログの開設をしました。
サーバの設置を弊社代表の峰松、ブログの設置を私吉田、そしてデザインをデザイナの田頭にやってもらいました。
このブログは各社員が技術的なこと、会社での出来事などをそれぞれ書いていくつもりです。
まだまだ記事も少ないですが、充実させていきたいと思っています。

では、よろしくお願いいたします。

Facebooktwitterlinkedintumblrmail