了解五险一金以及 Perl 程序加密

前N天在博客园看到了这篇讲五险一金的文章. 这篇博客写的相当好, 让我对这个五险一金有了一个基本的认识, 在此感谢作者~

作为一个屌丝程序员, 我很多时候对一些东西都很没概念, 比如一些政策之类的东西, 又比如这个五险一金. 有些东西确实蛮重要的, 自己也应当多了解下, 不能就这么稀里糊涂地过去了. 上面那篇文章的作者根据公司相应的情况结合相关信息整理出了个人和企业相应的支出, 里面的信息相当全, 因此准备自己也动手写一写, 也好加深印象, 同时也试试之前看到的扶凯大哥介绍的加密perl代码的方法. 在此强烈推荐一下~

动手写一写

我本人表示自己的语言表达能力很差, 数学逻辑计算能力也一样很差, 依稀记得初中高中时候的计算个人所得税和银行利率的题目, 当时做这类题目真的是各种苦恼…. 因为上面文章的作者提到的各个保险以及基金的信息都是参考文库中的文档, 因此我也动手搜了一下相关的信息, 表示好难搜到… 去了几个政府网站上也没有很明确的说明, 好吧, 又一次打击了我的积极性. 于是就根据上面列出的信息写了一个很混乱的perl程序: 程序运行是读取当前目录的配置, 然后计算出个人最后到手的工资:

彩色的是提示信息;)

程序读取本地的.config文件(yaml格式):

.config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
desc: just for fun
name: not cool
salary: 8000

insurance:
    retirement: 0.08
    health: 0.02
    unemployment: 0.002
    injury: 0
    birth: 0

fund:
    house: 0.12

tax:
    base: 3500
    level:
        0: 0.03
        1500: 0.1
        4500: 0.2
        9000: 0.25
        35000: 0.3
        55000: 0.35
        80000: 0.45

有些保险交的真够多的…..

因为代码写的很难看, 所以要不就用加密工具加密一下吧;)

使用 filter 加密 perl 代码

这里采用扶凯大哥推荐的方法, 这里简单做了一下尝试:

加密

  1. 在本机下载Filter模块, 然后解压
  2. 修改Filter-1.49/decrypt/encrypt的第11行以及Filter-1.49/decrypt/decrypt.xs的第31行. 前面的文件用于加密, 后面的文件用于安装时生成对应的库文件再来进行解密
  3. 好, 使用encrypt your_program进行对源码的加密(小心记得备份, 程序会自动修改源程序). 打开一看正文都是二进制的了

在另外一台机器上运行:

  1. 重复加密的前两步
  2. 编译安装模块(记得安装完后把包删了哈)
  3. 接着就可以直接运行程序了

至于如何解密, 大家可以直接参考扶凯大哥博客里的方法. 感谢扶凯大哥.

代码

这里贴一下计算的代码, 真心很混乱…..

(wxyj.pl) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/perl

use 5.010;
use strict;

use DDP;
use POSIX qw/floor/;
use YAML  qw/LoadFile/;

sub find_level($@)
{
    my ($target, @array) = @_;

    my ($f, $e, $m) = (0, $#array);
    my $cnt = 0;

    while( 1 ){
        $cnt++;

        $m = floor(($f + $e) / 2);

        if( $target < $array[$m] ){
            $e = $m - 1;
        }
        elsif( $target > $array[$m]){
            $f = $m + 1;
        }
        else{
            last;
        }

        last if $f > $e;
    }

    $m = $target < $array[$m] ? $m - 1 : $m;
    return $array[$m];
}


sub load_config
{
    my $path = shift || './.config';

    return LoadFile($path);
}

my $cfg = load_config();


my %cal = (
    insurance => \&cal_percent,
    fund      => \&cal_percent,
    tax       => \&cal_tax,
);

my $result = {};
my $salary = $cfg->{salary};

# cal insurance
foreach my $name (keys %{$cfg->{insurance}}){
    $result->{insurance}{sum} +=
        $result->{insurance}{$name} =
            $cal{insurance}->($salary, $cfg->{insurance}{$name})->();
}

# cal fund
foreach my $name (keys %{$cfg->{fund}}){
    $result->{fund}{sum} +=
        $result->{fund}{$name} =
            $cal{fund}->($salary, $cfg->{fund}{$name})->();
}

# cal tax
$result->{tax}{sum} =
    $cal{tax}->(
        $salary - $result->{fund}{sum} - $result->{insurance}{sum},
        $cfg->{tax}{base}, $cfg->{tax}{level}
    )->();

p $result;

print <<'HEAD', <<BODY;
====================================================================
 _         _     ___ _     ____         _____ _                   
| |    ___| |_  |_ _| |_  | __ )  ___  |_   _| |__   ___ _ __ ___ 
| |   / _ \ __|  | || __| |  _ \ / _ \   | | | '_ \ / _ \ '__/ _ \
| |__|  __/ |_   | || |_  | |_) |  __/   | | | | | |  __/ | |  __/
|_____\___|\__| |___|\__| |____/ \___|   |_| |_| |_|\___|_|  \___|

====================================================================
HEAD
name:   $cfg->{name}
before: $cfg->{salary}
after:  @{[ $cfg->{salary} - $result->{fund}{sum} 
                - $result->{insurance}{sum} - $result->{tax}{sum}]}

BODY

sub cal_percent
{
    my ($salary, $percent) = @_;

    return sub {
        $salary * $percent
    }
}

sub cal_tax
{
    my ($salary, $base, $level) = @_;

    my $r = gen_tax_v($level);

    return sub {
        my $s = $salary - $base;

        my $t = find_level $s, sort {$a <=> $b} keys %$level;

        p $t;
        return $s * $level->{$t} - $r->{$t}
    }
}

sub gen_tax_v
{
    my $level = shift;
    my @le    = sort {$a <=> $b} keys %$level;
    my $p1;

    my $r = {0=>0};

    $p1 = 1;
    while( defined $le[$p1] ){
        my ($low, $prev_l) =
            ($le[$p1], $level->{$le[$p1 - 1]});

        $r->{$low} = $low
                    * ($level->{$low} - $prev_l) + $r->{$p1 - 1};

        $p1++;
    }

    return $r;
}

PPPPSSSS

  1. Struts2被爆了很严重的漏洞, 站长们要注意呀

Comments