MojoMojoをSEOフレンドリーにするBK

wikiアプリケーション、MojoMojoはなかなかSEOのことを考えて作られている。
しかし、肝心の title タグの中身があまりいけていないので、ちょっと無理やり対応した。


[/lib/MojoMojo/Controllar/Page.pm: L108-]

    my ($title) = ($content->body =~ m![\r\n]?(.+)[\r\n]={8}!m);
    ($title) = ($content->body =~ m!#([^#]+)#[^#]!) unless $title;
    if ($title) {
        $title =~ s/(:?^\s+|\s$)//g;
        $stash->{title} = $title;
    }

あるディレクトリ以下のファイルを再帰的に取得して消す

キャッシュの purge 用にさらっと書いた。
あるディレクトリ以下のファイルで最近アクセスされていないものをまとめて消す。

[purge.pl]

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

use File::Find;
use File::stat;

# 探索ディレクトリ
my @search_directories = ('/path/to/dir');

# このunixtimeより古いものを対象とする
my $LIMIT = time - 60*60*24*60;

# カウント用
my $FILE_COUNT    = 0;
my $RM_FILE_COUNT = 0;

# 探索実行
find(\&exec, @search_directories);

# 結果出力
print "$RM_FILE_COUNT / $FILE_COUNT\n";


# 見つかったファイルに対して実行するルーチン
sub exec {
    $FILE_COUNT++;
    my $finded_file = "$File::Find::dir/$_";
    my $stat_info = stat($finded_file) or die "oops, $finded_file";
    if ($stat_info->atime < $LIMIT) {
        $RM_FILE_COUNT++;
        print "$finded_file\n". $stat_info->atime . "\t" . $stat_info->mtime . "\n\n";
        my $ret = system "rm -f $finded_file";
        if ($ret) {
            die "rm error! $finded_file: $ret";
        }
    }
}

File::Find++

PV計算機 by perl

PVとトラフィックの計算で欲しくなった。

[calcpv]

#!/usr/bin/perl
use strict;
use warnings;
#use bigint;
use Data::Table;

=pod

    PV calculator

    $ calcpv 4500pv/min 100

=cut

my @UNIT_LIST = qw/sec min hour day week month year/;
my $REGEX = join '|', @UNIT_LIST;

my $input = shift;
unless ($input) {
    _usage();
    exit;
}

my $size = shift || 0;

my ($pv, $unit, $value);
if ( $input =~ m!(\d+).+/($REGEX)! ) {
    ($pv, $unit) = ($1, $2);
}
else {
    _usage();
    exit;
}

my $data;
for my $u (@UNIT_LIST) {
    if ($u eq $unit) {
        $value = $pv;
    }
    else {
        my $func = \&{$unit."2$u"};
        $value = $func->($pv);
    }
    my $traffic = $value * $size;
    push @{$data}, [$u, _opti($value), _opti($traffic)];
}

my $t = Data::Table->new( $data, ['unit', 'pv', 'traffic(KB)'], 0, );
print $t->tsv;


sub _opti {
    my $num = shift;
    my ($value) = ( $num =~ m!^(\d+\.?\d?\d?)! );
    while($value =~ s/(.*\d)(\d\d\d)/$1,$2/){};
    return $value;
}

sub _usage {
    print "Usage: $0 NUMBERpv/[$REGEX] size(KB)\n";
    print "ex: $0 4500pv/min 80\n";
}



sub sec2min {
    return $_[0] * 60;
}
sub sec2hour {
    return $_[0] * 60 * 60;
}
sub sec2day {
    return $_[0] * 60 * 60 * 24;
}
sub sec2week {
    return $_[0] * 60 * 60 * 24 * 7;
}
sub sec2month {
    return $_[0] * 60 * 60 * 24 * 7 * 30;
}
sub sec2year {
    return $_[0] * 60 * 60 * 24 * 7 * 365;
}



sub min2sec {
    return $_[0] / 60;
}
sub min2hour {
    return $_[0] * 60;
}
sub min2day {
    return $_[0] * 60 * 24;
}
sub min2week {
    return $_[0] * 60 * 24 * 7;
}
sub min2month {
    return $_[0] * 60 * 24 * 30;
}
sub min2year {
    return $_[0] * 60 * 24 * 365;
}



sub hour2sec {
    return $_[0] / 60 / 60;
}
sub hour2min {
    return $_[0] / 60;
}
sub hour2day {
    return $_[0] * 24;
}
sub hour2week {
    return $_[0] * 24 * 7;
}
sub hour2month {
    return $_[0] * 24 * 30;
}
sub hour2year {
    return $_[0] * 24 * 365;
}



sub day2sec {
    return $_[0] / 24 / 60 / 60;
}
sub day2min {
    return $_[0] / 24 / 60;
}
sub day2hour {
    return $_[0] / 24;
}
sub day2week {
    return $_[0] * 7;
}
sub day2month {
    return $_[0] * 30;
}
sub day2year {
    return $_[0] * 365;
}



sub week2sec {
    return $_[0] / 7 / 24 / 60 / 60;
}
sub week2min {
    return $_[0] / 7 / 24 / 60;
}
sub week2hour {
    return $_[0] / 7 / 24;
}
sub week2day {
    return $_[0] / 7;
}
sub week2month {
    return day2month( week2day($_[0]) );
}
sub week2year {
    return day2year( week2day($_[0]) );
}



sub month2sec {
    return $_[0] / 30 / 24 / 60 / 60;
}
sub month2min {
    return $_[0] / 30 / 24 / 60;
}
sub month2hour {
    return $_[0] / 30 / 24;
}
sub month2day {
    return $_[0] / 30;
}
sub month2week {
    return day2week( month2day($_[0]) );
}
sub month2year {
    return $_[0] * 12;
}



sub year2sec {
    return $_[0] / 365 / 24 / 60 / 60;
}
sub year2min {
    return $_[0] / 365 / 24 / 60;
}
sub year2hour {
    return $_[0] / 365 / 24;
}
sub year2day {
    return $_[0] / 365;
}
sub year2week {
    return day2week( year2day($_[0]) );
}
sub year2month {
    return $_[0] / 12;
}


* 未全テスト。

MojoMojoリンク

MojaMoja に wktk しながら MojoMojo (PerlWikiアプリケーション)入れてみようと思いまして。


公式サイト http://mojomojo.org/

公式サイト:インストール http://mojomojo.org/documentation/installation

公式サイト:デプロイ http://mojomojo.org/documentation/deployment

gitリポジトリ http://github.com/marcusramberg/mojomojo

CPAN http://search.cpan.org/dist/MojoMojo/


個人的な wiki もってなかったんで、、、

XML::LibXSLT をインストールした記録

perlモジュールのXML::LibXSLT はlibxsltライブラリに依存してる。
libxslt をインストールしようとすると libxml のバージョンが低いと怒られた><

Vine Linux 4.2 だと、apt-get で入れられる libxml/libxml2、libxml-devel/libxml2-devel は XML::LibXSLT の最新版1.70 に対して古いようす。
そういうわけで、rpm探すのも面倒なので、ソースから入れました。


[libxml2]

# wget ftp://xmlsoft.org/libxml2/libxml2-2.7.6.tar.gz
# tar zvxf lixml2-2.7.6.tar.gz
# cd libxml2-2.7.6
# ./configure --prefix=/usr
# make && make install

[libxslt]

# wget ftp://xmlsoft.org/libxslt/libxslt-1.1.26.tar.gz
# tar zvxf libxslt-1.1.26.tar.gz
# cd libxslt-1.1.26
# ./configure
# make && make install

[XML::LibXSLT]

# cpan -i XML::LibXSLT
...(snip)...
/usr/bin/ld: cannot find -lgdbm
collect2: ld はステータス 1 で終了しました
make: *** [blib/arch/auto/XML/LibXSLT/LibXSLT.so] エラー 1
  PAJAS/XML-LibXSLT-1.70.tar.gz
  /usr/bin/make -- NOT OK

o.....rz


libxslt は通ったが、今度は gdbm ライブラリがないとか言われてた(ldがないのか?)。

# apt-get install gdb gdbm-devel


したらOKだった。

# cpan -i XML::LibXSLT

  PAJAS/XML-LibXSLT-1.70.tar.gz
  /usr/bin/make install  -- OK

done.


で、最終的に何がやりたかったかと言うと、MojoMojo 入れたかっただけなんですけど、Catalyst も古かったみたいで、特に Catalyst::Plugin::* をのきなみ入れなおしくらったりしつつ、、、


以下のエラーだけ追わずに force してしまった。

t/c/comment.t ................... ok

#   Failed test 'new password emailed'
#   at t/c/email.t line 25.
#          got: '0'
#     expected: '1'
Can't call method "header" on an undefined value at t/c/email.t line 29.
# Looks like you planned 14 tests but ran 4.
# Looks like you failed 1 test of 4 run.
# Looks like your test exited with 9 just after 4.

でもなんとか入れた。

# cpanm -f MojoMojo
Fetching http://search.cpan.org/CPAN/authors/id/M/MR/MRAMBERG/MojoMojo-0.999042.tar.gz
Building and testing MojoMojo-0.999042 for MojoMojo...
MojoMojo installed successfully.

自宅サーバ群の ssh 設定メモ

自宅サーバは WANに port:80 しか公開していなかったので、LAN内では ftpssh も root でログインしてやりたい放題だった。
リモートでどうこうする必要に迫られたこともなかったし、特にそれが原因で大災害が起きるようなこともなかったと思う。
まあだけど、最近必要だなあと思うようになってきたので、重い腰を上げて sshd まわりの設定を見直した。

やること

  • root ログインをやめる
  • リモート(LAN外)からつなげるようにする
  • パスワードなしでログインできるようにする
  • LAN内サーバでパスワードなしの ssh を可能にする

レシピ

  • ユーザ管理 (useradd(adduser) userdel passwd)
  • ルータの設定
  • SSH (/etc/ssh/sshd_config ~/.ssh/*)
  • アクセス管理 hosts.allow/hosts.deny
  • hosts でも何でも良いので、予めサーバにホスト名でアクセスできるようにはしておく

root ログインをやめる

root でログインしないことにするので、代わりの一般ユーザを作成する。

# useradd -g users -d /home/bayashi -s /bin/bash bayashi
# passwd bayashi
Changing password for user bayashi.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

useradd と adduser は混同しやすいが、Vine Linux ではそもそも同じコマンド(# ls -l adduser)。
「useradd -D」とすると、引数なしで useradd した時のデフォルト設定が見える。
当初、デフォルト確認せずにオプションなしで実行してたら、シェルが /sbin/nologin となっていて、ログインできずにはまった。
useradd をやり直すときは、「userdel -r USERNAME」とすると、ホームディレクトリごと消してくれて楽ができる。


さて、
代わりのユーザができたところで、root によるログインをやめるわけですが「root でログインしない」ということはつまり「root でログイン出来ないようにする」わけです。
設定は、 /etc/ssh/sshd_config にディレクティブを書きます。
(まあ、むしろ root でログインできるようにしたときの逆をするわけですね)

# root によるログインを許可(yes:する no:しない)
PermitRootLogin no

# ログインを許可するユーザ(複数の場合はスペースで区切って並べる)
AllowUsers bayashi

# ホームディレクトリの権限が対象ユーザのみであるかチェック(yes:する no:しない)
StrictModes yes

sshd_config を編集したら sshd を再起動します。

# service sshd restart


なお、
/etc/ssh には sshd_config ではなくて、ssh_config (dがない)というファイルもありますが、こちらは ssh クライアントとして利用する場合の設定ファイルなので、sshサーバの方は sshd_config で設定することになります。


また、
sshd_config をさわる時は、予備で root ログインしているセッションを持っておいた方が良いです。
もちろん、端末のコンソールに直接入れればそれでも良いのですが。
設定を失敗して、ログインできなくなってはまるということを防げます。

リモート(LAN外)からつなげるようにする

root で入れないようにして、代わりのユーザの準備もできたので、リモートからつなげるようにしてみます。
すなわち、リモートから、一般ユーザでパスワード認証をもってログイン出来るようにします。


まず、
ルータを設定。
port:22 に来たアクセスを規定のサーバに向かうように設定します。


そして、
LAN内のみからアクセスできるように制限していた /etc 下の hosts.allow/hosts.deny を編集します。


[/etc/hosts.deny]

ALL : ALL


[/etc/hosts.allow]

sshd : ALL
ALL : 192.168.1.


もうちょっと制限かけたいところですが、取り急ぎ sshd へのアクセスは全部通るようにしてみた(ぇ
これで、外部から bayashi ユーザでログインできればOK。
念のため、root でのログインが出来なくなっていることも確認する。

パスワードなしでログインできるようにする

LAN内サーバでパスワードなしの ssh を可能にする

パスワードなしでログインできるようにするといのは、RSA認証による秘密鍵と公開鍵の生成を行い、サーバとクライアントの双方でそれらの鍵を利用してログインをするというもの。
それの応用というか、自宅サーバ群にまとめて設定をして、パスワードなしで sshコマンドを使った行き来が自由にできるようにする。


この辺のやり方は検索すればいくらでも出てくる。
今回はこちらで紹介されていたスクリプトを少し改修して、サクッとやってしまった。

#!/bin/sh

#------------------
# set param
hosts="Server01 Server02 Server03 Server04 Server05"
user=bayashi

#------------------
cd
mkdir .ssh
chmod 0700 .ssh
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/*

for host in ${hosts}
do
    ssh ${user}@${host} 'ssh-keygen -t rsa'
    ssh ${user}@${host} 'cat ~/.ssh/id_rsa.pub' | cat ->> ~/.ssh/authorized_keys
done

for host in ${hosts}
do
    scp ~/.ssh/authorized_keys ${host}:~/.ssh
    ssh ${user}@${host} 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*'
done

exit


秘密鍵の id_rsa をクライアントに持っていき、ログインできたら終了。
サーバの id_rsa は削除してしまう。
それぞれサーバ間を ssh で行き来できることも確認する。


以上、疲れた。


パスワードなしのログインは推奨されないので、RSA認証とパスワード認証は併用した方が良いと思います。