Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2013-10-31 (Thu)

SSLプロセッサが付けてくれる/に付けてほしいHTTPヘッダ

付けてくれるやつ

やつヘッダ備考
AWS ELBX-Forwarded-Protohttps
Apache/mod_sslX-Forwarded-HTTPSon要設定: RequestHeader set X-Forwarded-HTTPS %{HTTPS}s

付けて欲しいやつ

やつヘッダ備考
Plack::Middleware::ReverseProxyX-Forwarded-HTTPSonhttps://github.com/lopnor/Plack-Middleware-ReverseProxy/blob/master/lib/Plack/Middleware/ReverseProxy.pm#L14-L15
Plack::Middleware::ReverseProxyX-Forwarded-Protohttpshttps://github.com/lopnor/Plack-Middleware-ReverseProxy/blob/master/lib/Plack/Middleware/ReverseProxy.pm#L16-L17

2013-10-28 (Mon)

秘伝のタレ化していたmodule-setupをDist::Zilla化してみた (仮)

今まで秘伝のタレ化したmodule-setupのテンプレでモジュールのひな形を生成してたんですが、なういMakefile.PLやBuild.PLの書き方とかcpanfileとかMYMETA.*とかそのへんもろもろに追従するのがしんどくなってきたので、milla (Dist::Milla) を元に秘伝のタレをポーティングしてみたメモです。

Dist::Zillaの作法がまだよくわかってないんで、変なところがあったら指摘もらえるとうれしいです。

Milla相当のデフォルトプロファイルを用意

milla の資産はありがたく頂戴したいので、mill new Foo-Bar = dzil new -P Milla Foo-Bar 相当になるようなデフォルトプロファイルを作ります。

$ mkdir -p ~/.dzil/profiles/default
$ vi ~/.dzil/profiles/default/profile.ini
# https://github.com/miyagawa/Dist-Milla/blob/master/profiles/default/profile.ini
# と同じ内容にします。

$ vi ~/.dzil/profiles/default/Module.pm.template
# https://github.com/miyagawa/Dist-Milla/blob/master/profiles/default/Module.pm.template
# と同じ内容にします。

モジュールのひな形ファイルをいじる

先程作った Module.pm.template を好きにいじればよいです。

  • {{$name}} → Foo::Bar
  • {{$dist}} → Dist::Zillaのインスタンス
  • {{$dist->name}} → Foo-Bar

に置換されます。


PodWeaverを使うとPODの記述量を減らしたり「=method」といった記法も使えるようになりますが、git repos上のPODが変換前のであるのが自分は気持ち悪かったので使いませんでした。

ひな形ファイルの追加

milla (Dist::Zilla::Plugin::Milla::MintFiles) により、以下のファイルが new したときに生成されます。

  • dist.ini
  • Changes
  • .gitignore
  • cpanfile
  • t/basic.t

幾つかのファイルはオレオレ用にいじりたかったので、Milla::MintFiles は使わずに GatherDir::Template で生成するようにしました。

$ vi ~/.dzil/profiles/default/profile.ini
-[Milla::MintFiles]
+[GatherDir::Template]
+root = skel
+include_dotfiles = 1
+
+[DistINI]
+append_file = plugins.ini

# Milla::MintFiles を消す
# GatherDir::Template を追加
# DistINI を追加

$ mkdir ~/.dzil/profiles/default/skel
$ vi ~/.dzil/profiles/default/skel/Changes
Revision history for {{$dist->name}}

{{ '{{$NEXT}}' }}
    [NEW FEATURES]
    [IMPROVEMENTS]
    [INCOMPATIBLE CHANGES]
    [BUG FIXES]
    [DOCUMENTATION]
    [SECURITY]
        - Initial version

$ vi ~/.dzil/profiles/default/skel/.gitignore
/{{$dist->name}}-*
/.build
/_build*
/Build
MYMETA.*
!META.json
/.prove
# ...あとはお好みで追加...

$ vi ~/.dzil/profiles/default/skel/cpanfile
requires 'perl', '5.008005';

# requires 'Some::Module', 'VERSION';

on test => sub {
    requires 'Test::More', '0.88';
};
# ...あとはお好みで追加...

$ vi ~/.dzil/profiles/default/skel/t/xxx.t
# お好みで追加


$ vi ~/.dzil/profiles/default/plugins.ini
[@Milla]

pmを生成したTemplateModule/:DefaultModuleMakerと違い、GatherDir::Template では直で「Foo::Bar」を得る方法が無いので、t/* なファイルとかではこうしています。

require {{ (my $mod = $dist->name) =~ s/-/::/g; $mod }};
と書いとくと、
require Foo::Bar;
になる

CPANで見つけたTest系のPluginを追加する

$ vi ~/.dzil/profiles/default/profile.ini
+[Test::Perl::Critic]
+[Test::Fixme]
+[Test::Kwalitee]
+[Test::UnusedVars]
+[ExtraTests]

これで dzil new したときに、t/ 下に

  • author-critic.t
  • release-fixme.t
  • release-kwalitee.t
  • release-unused-vars.t

というファイルが作られます。


dist.iniに [Test::Perl::Critic] などを書くと、dzil newしたときには t/* ファイルは生成されず、dzil testやbuildしたときに生成されるようになるのですが、いまいちあとから生成する意義がわからない(release時にt/{release,author}-*.tをtar.gzに含めない、とかならわかるんですがそうでもないようなので)ので、dzil new時に生成するようにしています。

PodSyntaxTests

PodSyntaxTests = t/release-pod-syntax.t が new 時ではなく build 時に生成されます。これは dist.ini で指定している [@Milla] である Dist::Zilla::PluginBundle::Milla がそうしているからです。

前掲の理由で new 時に生成したいので、profile.ini に追加します。

$ vi ~/.dzil/profiles/default/profile.ini
 [Test::Fixme]
 [Test::Perl::Critic]
 [Test::Kwalitee]
+[PodSyntaxTests]
 [ExtraTests]

これだけだと new したときに、

[DZ] attempt to add t/release-pod-syntax.t multiple times; added by: @Milla/Git::GatherDir (Dist::Zilla::Plugin::Git::GatherDir line 81); @Milla/PodSyntaxTests (Dist::Zilla::Plugin::InlineFiles line 29)

と怒られるので、plugins.iniを編集して [@Milla] から PodSyntaxTests を抜きます。

$ vi ~/.dzil/profiles/default/plugins.ini
-[@Milla]
+[@Filter]
+-bundle = @Milla
+-remove = PodSyntaxTests

Test::PodSpelling

Test::PodSpelling (https://metacpan.org/release/Dist-Zilla-Plugin-Test-PodSpelling) を追加したいと思い、profile.ini に追加したのですがエラーになります。

[DZ] making target dir /var/tmp/r/Foo-Bar
[DZ] no version was ever set at /usr/local/lib/perl/5.10.1/Moose/Meta/Method/Delegation.pm line 110.
[DZ] no version was ever set

エラーメッセージの意味がいまいちわかりませんが、原因は DZ::Plugin::Test::PodSpelling はmintingするためのminter pluginではない、ということのようです。

しかたないので、一旦、dist.ini に [Test::PodSpelling] と書いて dzil build で生成された t/author-pod-spell.t を ~/.dzil/profiles/default/skel/t/author-pod-spell.t としてコピーして new 時に生成されるようにしました。

oreno profile

結局、どうなったかは

に置いてあります。


参考文献

2013-10-04 (Fri)

プロセスが起動した日時を知りたい

プロセスの起動日時は ps の START カラムでわかりますが、24時間経過すると表示上時刻がわかりません。

$ ps auxwwwwww | grep -e PID -e redis-server
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hirose31   775  0.1  0.0  36328  2008 ?        Sl   Sep26  17:47 /home/hirose31/repos/redis/redis/src/redis-server /usr/oreno/etc/redis/oreno.conf

では、日時(日付+時刻)を知るにはどうしたらよいでしょうか?

ps -o lstart

$ ps axwwwwwwwww -o user,pid,lstart,cmd | grep -e PID -e redis-server
USER       PID                  STARTED CMD
hirose31   775 Thu Sep 26 18:29:34 2013 /home/hirose31/repos/redis/redis/src/redis-server /usr/oreno/etc/redis/oreno.conf

/proc/PID/stat の starttime (0オリジンで21番目)

#!/usr/bin/env perl

use strict;
use warnings;

use POSIX qw(strftime sysconf _SC_CLK_TCK);

my $CLOCK_TICK = sysconf(_SC_CLK_TCK);
my $BOOT_TIME = do {
    my @buf = read_file("/proc/uptime") or die;
    my($uptime) = split /\s+/, $buf[0];
    time() - $uptime;
};

for my $pid (@ARGV) {
    my @buf = read_file("/proc/$pid/stat") or next;
    my @stat = split /\s+/, $buf[0];

    my $starttime_jiffies = $stat[21];
    my $starttime_sec = int( $BOOT_TIME + ( $starttime_jiffies / $CLOCK_TICK ) );
    my $starttime = strftime "%Y-%m-%d %H:%M:%S", localtime($starttime_sec);

    my $cmdline = (read_file("/proc/$pid/cmdline"))[0];
    $cmdline =~ s/\0/ /g;

    printf "%5d %s %s\n", $pid, $starttime, $cmdline;
}

exit;

sub read_file {
    my $file = shift;
    my @buf;
    open my $fh, '<', $file
        or do {
            warn "Failed to open $file: $!";
            return;
        };
    @buf = <$fh>;
    close $fh;

    return @buf;
}
$ starttime_of 775
  775 2013-09-26 18:29:33 /home/hirose31/repos/redis/redis/src/redis-server /usr/oreno/etc/redis/oreno.conf

mtime of /proc/PID ←ダメ

/proc/PID ディレクトリの mtime でもとれると思ったんですがちょっと値が違うみたいですね。識者の解説求む。

$ ls -ld --full-time /proc/775
dr-xr-xr-x 7 hirose31 hirose31 0 2013-09-26 19:50:21.735386357 +0900 /proc/775
$ stat /proc/775
  File: `/proc/775'
  Size: 0               Blocks: 0          IO Block: 1024   directory
Device: 3h/3d   Inode: 27440728    Links: 7
Access: (0555/dr-xr-xr-x)  Uid: ( 2050/hirose31)   Gid: ( 2050/hirose31)
Access: 2013-09-26 19:50:21.735386357 +0900
Modify: 2013-09-26 19:50:21.735386357 +0900
Change: 2013-09-26 19:50:21.735386357 +0900
2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |