line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package App::QuoteCC; |
2
|
|
|
|
|
|
|
BEGIN { |
3
|
1
|
|
|
1
|
|
62278
|
$App::QuoteCC::AUTHORITY = 'cpan:AVAR'; |
4
|
|
|
|
|
|
|
} |
5
|
|
|
|
|
|
|
BEGIN { |
6
|
1
|
|
|
1
|
|
19
|
$App::QuoteCC::VERSION = '0.10'; |
7
|
|
|
|
|
|
|
} |
8
|
|
|
|
|
|
|
|
9
|
1
|
|
|
1
|
|
34
|
use 5.010; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
38
|
|
10
|
1
|
|
|
1
|
|
7
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
44
|
|
11
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
38
|
|
12
|
1
|
|
|
1
|
|
2829
|
use Moose; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
use namespace::clean -except => 'meta'; |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
with qw/ MooseX::Getopt::Dashes /; |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
# MooseX::Getopt 81b19ed83c by Karen Etheridge changed the help |
18
|
|
|
|
|
|
|
# attribute to help_flag. |
19
|
|
|
|
|
|
|
{ |
20
|
|
|
|
|
|
|
my @go_attrs = MooseX::Getopt::GLD->meta->get_attribute_list; |
21
|
|
|
|
|
|
|
my $help_attr = 'help_flag' ~~ @go_attrs ? 'help_flag' : 'help'; |
22
|
|
|
|
|
|
|
has $help_attr => ( |
23
|
|
|
|
|
|
|
traits => [ qw/ Getopt / ], |
24
|
|
|
|
|
|
|
cmd_aliases => 'h', |
25
|
|
|
|
|
|
|
cmd_flag => 'help', |
26
|
|
|
|
|
|
|
isa => 'Bool', |
27
|
|
|
|
|
|
|
is => 'ro', |
28
|
|
|
|
|
|
|
default => 0, |
29
|
|
|
|
|
|
|
documentation => 'This help message', |
30
|
|
|
|
|
|
|
); |
31
|
|
|
|
|
|
|
} |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
has input => ( |
34
|
|
|
|
|
|
|
traits => [ qw/ Getopt / ], |
35
|
|
|
|
|
|
|
cmd_aliases => 'i', |
36
|
|
|
|
|
|
|
cmd_flag => 'input', |
37
|
|
|
|
|
|
|
isa => 'Str', |
38
|
|
|
|
|
|
|
is => 'ro', |
39
|
|
|
|
|
|
|
documentation => 'The quotes file to compile from. - for STDIN', |
40
|
|
|
|
|
|
|
); |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
has input_format => ( |
43
|
|
|
|
|
|
|
traits => [ qw/ Getopt / ], |
44
|
|
|
|
|
|
|
cmd_aliases => 'I', |
45
|
|
|
|
|
|
|
cmd_flag => 'input-type', |
46
|
|
|
|
|
|
|
isa => 'Str', |
47
|
|
|
|
|
|
|
is => 'ro', |
48
|
|
|
|
|
|
|
documentation => 'The format of the input quotes file. Any App::QuotesCC::Input::*', |
49
|
|
|
|
|
|
|
); |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
has output => ( |
52
|
|
|
|
|
|
|
traits => [ qw/ Getopt / ], |
53
|
|
|
|
|
|
|
cmd_aliases => 'o', |
54
|
|
|
|
|
|
|
cmd_flag => 'output', |
55
|
|
|
|
|
|
|
isa => 'Str', |
56
|
|
|
|
|
|
|
is => 'ro', |
57
|
|
|
|
|
|
|
default => '-', |
58
|
|
|
|
|
|
|
documentation => 'Where to output the compiled file, - for STDOUT', |
59
|
|
|
|
|
|
|
); |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
has output_format => ( |
62
|
|
|
|
|
|
|
traits => [ qw/ Getopt / ], |
63
|
|
|
|
|
|
|
cmd_aliases => 'O', |
64
|
|
|
|
|
|
|
cmd_flag => 'output-type', |
65
|
|
|
|
|
|
|
isa => 'Str', |
66
|
|
|
|
|
|
|
is => 'ro', |
67
|
|
|
|
|
|
|
documentation => 'The format of the output file. Any App::QuotesCC::Output::*', |
68
|
|
|
|
|
|
|
); |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
sub run { |
71
|
|
|
|
|
|
|
my ($self) = @_; |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
my $dynaload = sub { |
74
|
|
|
|
|
|
|
my ($vars, $new_args) = @_; |
75
|
|
|
|
|
|
|
my ($self_method_type, $class_type) = @$vars; |
76
|
|
|
|
|
|
|
my %args = %$new_args; |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
my $x_class_short = $self->$self_method_type; |
79
|
|
|
|
|
|
|
my $x_class = "App::QuoteCC::${class_type}::" . $x_class_short; |
80
|
|
|
|
|
|
|
{ |
81
|
|
|
|
|
|
|
my $x_class_pm = $x_class; |
82
|
|
|
|
|
|
|
$x_class_pm =~ s[::][/]g; |
83
|
|
|
|
|
|
|
$x_class_pm .= ".pm"; |
84
|
|
|
|
|
|
|
require $x_class_pm; |
85
|
|
|
|
|
|
|
} |
86
|
|
|
|
|
|
|
my $obj = $x_class->new(%args); |
87
|
|
|
|
|
|
|
return $obj; |
88
|
|
|
|
|
|
|
}; |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
my $input = $dynaload->( |
91
|
|
|
|
|
|
|
[ qw/ input_format Input / ], |
92
|
|
|
|
|
|
|
{ file => $self->input }, |
93
|
|
|
|
|
|
|
); |
94
|
|
|
|
|
|
|
my $quotes = $input->quotes; |
95
|
|
|
|
|
|
|
my $output = $dynaload->( |
96
|
|
|
|
|
|
|
[ qw/ output_format Output / ], |
97
|
|
|
|
|
|
|
{ |
98
|
|
|
|
|
|
|
file => $self->output, |
99
|
|
|
|
|
|
|
quotes => $quotes, |
100
|
|
|
|
|
|
|
}, |
101
|
|
|
|
|
|
|
); |
102
|
|
|
|
|
|
|
$output->output; |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
return; |
105
|
|
|
|
|
|
|
} |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
__PACKAGE__->meta->make_immutable; |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
=encoding utf8 |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
=head1 NAME |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
App::QuoteCC - Take a quote file and emit a standalone program that spews a random quote |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
=head1 SYNOPSIS |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
Compile a quotes file to a stand-alone binary: |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
curl http://v.nix.is/~failo/quotes.yml | quotecc -i - -I YAML -o - -O C | gcc -x c -o failo-wisdom - |
120
|
|
|
|
|
|
|
curl http://www.trout.me.uk/quotes.txt | quotecc -i - -I Fortune -o - -O C | gcc -x c -o perl-wisdom - |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
Or to a fast stand-alone minimal Perl script: |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
curl http://v.nix.is/~failo/quotes.yml | quotecc -i - -I YAML -o failo-wisdom.pl -O Perl |
125
|
|
|
|
|
|
|
curl http://www.trout.me.uk/quotes.txt | quotecc -i - -I Fortune -o perl-wisdom.pl -O Perl |
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
See how small they are: |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
$ du -sh *-wisdom* |
130
|
|
|
|
|
|
|
56K failo-wisdom |
131
|
|
|
|
|
|
|
44K failo-wisdom.pl |
132
|
|
|
|
|
|
|
80K perl-wisdom |
133
|
|
|
|
|
|
|
76K perl-wisdom.pl |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
Emit a random quote with the C program: |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
time (./failo-wisdom && ./perl-wisdom) |
138
|
|
|
|
|
|
|
Support Batman - vote for the British National Party |
139
|
|
|
|
|
|
|
< dha> Now all I have to do is learn php |
140
|
|
|
|
|
|
|
<@sungo> it's easy. |
141
|
|
|
|
|
|
|
<@sungo> take your perl knowledge. now smash it against child pornography |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
real 0m0.004s |
144
|
|
|
|
|
|
|
user 0m0.000s |
145
|
|
|
|
|
|
|
sys 0m0.008s |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
Or with the Perl program: |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
$ time (perl failo-wisdom.pl && perl perl-wisdom.pl) |
150
|
|
|
|
|
|
|
I just see foreign words like private public static void feces implements shit extending penis |
151
|
|
|
|
|
|
|
<@pndc> Imagine if cleaners were treated like sysadmins. "I've just |
152
|
|
|
|
|
|
|
pissed all over the office floor; it's the cleaner's fault." |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
real 0m0.022s |
155
|
|
|
|
|
|
|
user 0m0.012s |
156
|
|
|
|
|
|
|
sys 0m0.004s |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
Emit all quotes: |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
./failo-wisdom --all > /tmp/quotes.txt |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
Emit quotes to interactive shells on login, in F</etc/profile>: |
163
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
# spread failo's wisdom to interactive shells |
165
|
|
|
|
|
|
|
if [[ $- == *i* ]] ; then |
166
|
|
|
|
|
|
|
failo-wisdom |
167
|
|
|
|
|
|
|
fi |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
=head1 DESCRIPTION |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
I wrote this program because using L<fortune(1)> and Perl in |
172
|
|
|
|
|
|
|
F</etc/profile> to emit a random quote on login was too slow. On my |
173
|
|
|
|
|
|
|
system L<fortune(1)> can take ~100 ms from a cold start, although |
174
|
|
|
|
|
|
|
subsequent invocations when it's in cache are ~10-20 ms. |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
Similarly using Perl is also slow, this is in the 80 ms range: |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
perl -COEL -MYAML::XS=LoadFile -E'@q = @{ LoadFile("/path/to/quotes.yml") }; @q && say $q[rand @q]' |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
Either way, when you have a 40 ms ping time to the remote machine |
181
|
|
|
|
|
|
|
showing that quote is the major noticeable delay when you do I<ssh |
182
|
|
|
|
|
|
|
machine>. |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
L<quotecc> solves that problem, showing a quote takes around 4 ms |
185
|
|
|
|
|
|
|
now. That's comparable with any hello wold program in C that I |
186
|
|
|
|
|
|
|
produce. |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
=head1 AUTHOR |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
E<AElig>var ArnfjE<ouml>rE<eth> Bjarmason <avar@cpan.org> |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
=head1 LICENSE AND COPYRIGHT |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
Copyright 2010 E<AElig>var ArnfjE<ouml>rE<eth> Bjarmason <avar@cpan.org> |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
This program is free software, you can redistribute it and/or modify |
197
|
|
|
|
|
|
|
it under the same terms as Perl itself. |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
=cut |
200
|
|
|
|
|
|
|
|