typrtail 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,39 @@
1
+ h1. typrtail
2
+
3
+ Tail or cat a file: make it look like someone is typing them.
4
+
5
+ For some processes I was monitoring, this was far more entertaining than just watching a @tail -f@.
6
+
7
+ <pre>
8
+ user@host ~$ tail -f /var/log/messages | typrtail
9
+ </pre>
10
+
11
+ <pre>
12
+ user@host ~$ wget -q -O - http://www.gutenberg.org/files/730/730.txt | head -n 20 | typrtail
13
+ </pre>
14
+
15
+ h1. Installation
16
+
17
+ <pre>
18
+ user@host ~$ gem install typrtail
19
+ </pre>
20
+
21
+
22
+ h1. FAQ
23
+
24
+ h2. What good is this?
25
+
26
+ Come on, it's just for fun.
27
+
28
+ h2. Why'd you do this?
29
+
30
+ I was overworked and needed an escape.
31
+
32
+ h2. Doesn't this already exist?
33
+
34
+ Yeah, I'm sure it does, they're probably better too, I needed a break.
35
+
36
+ h2. It's too slow, can you make it faster?
37
+
38
+ Yes, you can. It's a plain Ruby program, open it up and take a look at the top, there are a lot of constants (yes, globals - *gasp* globals! I know, how awful!) that control things like the typing speed. Have at 'em!
39
+
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/gempackagetask'
4
+ require 'spec/rake/spectask'
5
+ load 'typrtail.gemspec'
6
+
7
+
8
+ Rake::GemPackageTask.new(SPEC) do |t|
9
+ t.need_tar = true
10
+ end
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # to make everything faster, make this <1.0, sower >1.0 HTH
4
+ $speed_adjust = 1.0
5
+
6
+ $rand_base = 10
7
+ $rand_range = 100.0
8
+
9
+ # 1 in X chance of a typo :D
10
+ $typo_prob = 50
11
+ $min_typo_prob = 10
12
+ $min_slp = 0.02
13
+
14
+ # repeated chars are fast
15
+ $repeat_time = 0.05
16
+ # typing the same char 2x is fast
17
+ $same_type_time = 0.075
18
+ # oops, how fast do you recover from seeing you made one or more typos?
19
+ $time_to_recognize_typo = 0.3
20
+ $sleep_after_space = 0.2
21
+
22
+
23
+ # spacebar is wicked quick to hit, so is enter -- unshifted characters are
24
+ # easier than those that require a shift key...
25
+ $typing_rates = {
26
+ " " => 2.0,
27
+ "\n" => 1.5,
28
+ "abcdefghijklmnopqrstuvwxyz" => 0.9,
29
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" => 0.50,
30
+ "`1234567890-=[]\\;',./" => 0.60,
31
+ "~!@#\$%^&*()_+{{}|:\"<>?" => 0.2,
32
+ }
33
+
34
+ # typos are near the character typed :)
35
+ $typo_table = {
36
+ "a" => "qwsz",
37
+ "b" => "ghvn ",
38
+ "c" => "dfxv ",
39
+ "d" => "ersfxc",
40
+ "e" => "34wrsd",
41
+ "f" => "rtdgcv",
42
+ "g" => "tyfhvb",
43
+ "h" => "yugjbn",
44
+ "i" => "89uojk",
45
+ "j" => "uihknm,",
46
+ "k" => "iojlm,",
47
+ "l" => "opk;,.",
48
+ "m" => " n,jk",
49
+ "n" => " bmhj ",
50
+ "o" => "90ipkl",
51
+ "p" => "0-o[l;",
52
+ "q" => "12wsa ",
53
+ "r" => "45etdf",
54
+ "s" => "weadzx",
55
+ "t" => "56ryfg",
56
+ "u" => "78yihj",
57
+ "v" => "fgcb ",
58
+ "w" => "23qeas",
59
+ "x" => "sdzc ",
60
+ "y" => "67tugh",
61
+ "z" => "asx",
62
+
63
+ "A" => "aaQWSZ",
64
+ "B" => "bbGHVN ",
65
+ "C" => "ccDFXV ",
66
+ "D" => "ddERSFXC",
67
+ "E" => "ee\#$WRSD",
68
+ "F" => "ffRTDGCV",
69
+ "G" => "ggTYFHVB",
70
+ "H" => "hhYUGJBN",
71
+ "I" => "ii*(UOJK",
72
+ "J" => "jjUIHKNM,",
73
+ "K" => "kkIOJLM,",
74
+ "L" => "llOPK:<>",
75
+ "M" => "mm N<JK",
76
+ "N" => "nn BMHJ ",
77
+ "O" => "oo()IPKL",
78
+ "P" => "pp)_O{L:",
79
+ "Q" => "qq!@WSA ",
80
+ "R" => "rr$%ETDF",
81
+ "S" => "ssWEADZX",
82
+ "T" => "tt%^RYFG",
83
+ "U" => "uu&*YIHJ",
84
+ "V" => "vvFGCB ",
85
+ "W" => "ww@#QEAS",
86
+ "X" => "xxSDZC ",
87
+ "Y" => "yy^&TUGH",
88
+ "Z" => "zzASX",
89
+
90
+
91
+ "`" => "1",
92
+ "1" => "`22q",
93
+ "2" => "1133qw",
94
+ "3" => "2244we",
95
+ "4" => "3355er",
96
+ "5" => "4466rt",
97
+ "6" => "5577ty",
98
+ "7" => "6688yu",
99
+ "8" => "7799ui",
100
+ "9" => "8800io",
101
+ "0" => "99-op",
102
+ "-" => "00=p[",
103
+ "=" => "-[]",
104
+ "[" => "-=p];'",
105
+ "]" => "=[\\'",
106
+ "\\" => "]",
107
+ ";" => "p[l'./",
108
+ "'" => "[];/",
109
+ "," => " m.kl",
110
+ "." => ",/l;",
111
+ "/" => ".;'",
112
+ "~" => "`!",
113
+ "!" => "11~@Q",
114
+ "@" => "22!#QW",
115
+ "\#" => "33@$WE",
116
+ "$" => "44#%ER",
117
+ "%" => "55$^RT",
118
+ "^" => "66%&TY",
119
+ "&" => "77^*YU",
120
+ "*" => "88&(UI",
121
+ "(" => "99*)IO",
122
+ ")" => "00(_OP",
123
+ "_" => "--)+P{",
124
+ "+" => "==_{}",
125
+ "{" => "[[_+P}:\"",
126
+ "}" => "]]+{|\"",
127
+ "|" => "\\\}",
128
+ ":" => ";;P{L\">?",
129
+ "\"" => "''{}:?",
130
+ "<" => ",,KLM> ",
131
+ ">" => "..<?L:",
132
+ "?" => "//>:\"",
133
+
134
+ " " => " "
135
+ }
136
+
137
+ # keep it real ;)
138
+ def plausible_typo ch
139
+ chars = $typo_table[ch.chr]
140
+ return nil unless chars
141
+ chars[rand(chars.size)]
142
+ end
143
+
144
+ # Ruby msut have these, just don't know what they are
145
+ def is_alpha? ch
146
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".include? ch
147
+ end
148
+
149
+ def is_num? ch
150
+ "0123456789".include? ch
151
+ end
152
+
153
+ # Hammer^H^H^H^H^H^Hpause time
154
+ def pause_time ch
155
+ slp = 0.05 + (rand($rand_base) / $rand_range)
156
+ modifier = $typing_rates.keys.detect do |chars|
157
+ chars.include? ch
158
+ end
159
+ modifier = $typing_rates[modifier] || 0.5
160
+ slp / modifier
161
+ end
162
+
163
+ # backup, erase, backup (for next char)
164
+ # NB: should peek, and not do this if next char is a newline b/c this will add
165
+ # a space before the end of the line...
166
+ def erase_typo
167
+ $stderr.putc("\b"[0])
168
+ $stderr.putc(" "[0])
169
+ $stderr.putc("\b"[0])
170
+ end
171
+
172
+ lastch = ' '
173
+ chars_since_typeo = 0
174
+ total_chars = 0
175
+ while ch = $stdin.getc
176
+ total_chars += 1
177
+ slp = pause_time(ch)
178
+ # repeated characters are quick
179
+ if ch == lastch
180
+ slp = $repeat_time
181
+ # sequences of the same 'type' are quick
182
+ elsif is_alpha?(ch) && is_alpha?(lastch)
183
+ slp = $same_type_time
184
+ elsif is_num?(ch) && is_num?(lastch)
185
+ slp = $same_type_time
186
+ end
187
+
188
+ # awww, it gets harder to keep going w/o making a mistake :-)
189
+ typo_prob = $typo_prob - (chars_since_typeo/2)
190
+ typo_prob = typo_prob < $min_typo_prob ? $min_typo_prob : typo_prob
191
+ num_typos = 0
192
+ while rand(typo_prob) <= 1.0
193
+ chars_since_typeo = 0
194
+ typo_prob = $typo_prob
195
+ typo = plausible_typo ch
196
+ if typo
197
+ $stderr.putc typo
198
+ $stderr.flush
199
+ num_typos += 1
200
+ sleep($speed_adjust * $time_to_recognize_typo)
201
+ end
202
+ # making a typo makes another one more likely :P
203
+ typo_prob /= 2
204
+ end
205
+ num_typos.times { erase_typo }
206
+
207
+ # so you made it thorugh the gauntlet? emith the char...
208
+ lastch = ch
209
+ slp += Math.sin(total_chars) / 4.0
210
+ slp = slp < $min_slp ? $min_slp : slp
211
+
212
+ sleep($speed_adjust * slp)
213
+
214
+ $stdout.putc ch
215
+ $stdout.flush
216
+ sleep($speed_adjust * $sleep_after_space) if ' ' == ch.chr
217
+ chars_since_typeo += 1
218
+ end
Binary file
Binary file
@@ -0,0 +1,39 @@
1
+ h1. typrtail
2
+
3
+ Tail or cat a file: make it look like someone is typing them.
4
+
5
+ For some processes I was monitoring, this was far more entertaining than just watching a @tail -f@.
6
+
7
+ <pre>
8
+ user@host ~$ tail -f /var/log/messages | typrtail
9
+ </pre>
10
+
11
+ <pre>
12
+ user@host ~$ wget -q -O - http://www.gutenberg.org/files/730/730.txt | head -n 20 | typrtail
13
+ </pre>
14
+
15
+ h1. Installation
16
+
17
+ <pre>
18
+ user@host ~$ gem install typrtail
19
+ </pre>
20
+
21
+
22
+ h1. FAQ
23
+
24
+ h2. What good is this?
25
+
26
+ Come on, it's just for fun.
27
+
28
+ h2. Why'd you do this?
29
+
30
+ I was overworked and needed an escape.
31
+
32
+ h2. Doesn't this already exist?
33
+
34
+ Yeah, I'm sure it does, they're probably better too, I needed a break.
35
+
36
+ h2. It's too slow, can you make it faster?
37
+
38
+ Yes, you can. It's a plain Ruby program, open it up and take a look at the top, there are a lot of constants (yes, globals - *gasp* globals! I know, how awful!) that control things like the typing speed. Have at 'em!
39
+
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/gempackagetask'
4
+ require 'spec/rake/spectask'
5
+ load 'typrtail.gemspec'
6
+
7
+
8
+ Rake::GemPackageTask.new(SPEC) do |t|
9
+ t.need_tar = true
10
+ end
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # to make everything faster, make this <1.0, sower >1.0 HTH
4
+ $speed_adjust = 1.0
5
+
6
+ $rand_base = 10
7
+ $rand_range = 100.0
8
+
9
+ # 1 in X chance of a typo :D
10
+ $typo_prob = 50
11
+ $min_typo_prob = 10
12
+ $min_slp = 0.02
13
+
14
+ # repeated chars are fast
15
+ $repeat_time = 0.05
16
+ # typing the same char 2x is fast
17
+ $same_type_time = 0.075
18
+ # oops, how fast do you recover from seeing you made one or more typos?
19
+ $time_to_recognize_typo = 0.3
20
+ $sleep_after_space = 0.2
21
+
22
+
23
+ # spacebar is wicked quick to hit, so is enter -- unshifted characters are
24
+ # easier than those that require a shift key...
25
+ $typing_rates = {
26
+ " " => 2.0,
27
+ "\n" => 1.5,
28
+ "abcdefghijklmnopqrstuvwxyz" => 0.9,
29
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" => 0.50,
30
+ "`1234567890-=[]\\;',./" => 0.60,
31
+ "~!@#\$%^&*()_+{{}|:\"<>?" => 0.2,
32
+ }
33
+
34
+ # typos are near the character typed :)
35
+ $typo_table = {
36
+ "a" => "qwsz",
37
+ "b" => "ghvn ",
38
+ "c" => "dfxv ",
39
+ "d" => "ersfxc",
40
+ "e" => "34wrsd",
41
+ "f" => "rtdgcv",
42
+ "g" => "tyfhvb",
43
+ "h" => "yugjbn",
44
+ "i" => "89uojk",
45
+ "j" => "uihknm,",
46
+ "k" => "iojlm,",
47
+ "l" => "opk;,.",
48
+ "m" => " n,jk",
49
+ "n" => " bmhj ",
50
+ "o" => "90ipkl",
51
+ "p" => "0-o[l;",
52
+ "q" => "12wsa ",
53
+ "r" => "45etdf",
54
+ "s" => "weadzx",
55
+ "t" => "56ryfg",
56
+ "u" => "78yihj",
57
+ "v" => "fgcb ",
58
+ "w" => "23qeas",
59
+ "x" => "sdzc ",
60
+ "y" => "67tugh",
61
+ "z" => "asx",
62
+
63
+ "A" => "aaQWSZ",
64
+ "B" => "bbGHVN ",
65
+ "C" => "ccDFXV ",
66
+ "D" => "ddERSFXC",
67
+ "E" => "ee\#$WRSD",
68
+ "F" => "ffRTDGCV",
69
+ "G" => "ggTYFHVB",
70
+ "H" => "hhYUGJBN",
71
+ "I" => "ii*(UOJK",
72
+ "J" => "jjUIHKNM,",
73
+ "K" => "kkIOJLM,",
74
+ "L" => "llOPK:<>",
75
+ "M" => "mm N<JK",
76
+ "N" => "nn BMHJ ",
77
+ "O" => "oo()IPKL",
78
+ "P" => "pp)_O{L:",
79
+ "Q" => "qq!@WSA ",
80
+ "R" => "rr$%ETDF",
81
+ "S" => "ssWEADZX",
82
+ "T" => "tt%^RYFG",
83
+ "U" => "uu&*YIHJ",
84
+ "V" => "vvFGCB ",
85
+ "W" => "ww@#QEAS",
86
+ "X" => "xxSDZC ",
87
+ "Y" => "yy^&TUGH",
88
+ "Z" => "zzASX",
89
+
90
+
91
+ "`" => "1",
92
+ "1" => "`22q",
93
+ "2" => "1133qw",
94
+ "3" => "2244we",
95
+ "4" => "3355er",
96
+ "5" => "4466rt",
97
+ "6" => "5577ty",
98
+ "7" => "6688yu",
99
+ "8" => "7799ui",
100
+ "9" => "8800io",
101
+ "0" => "99-op",
102
+ "-" => "00=p[",
103
+ "=" => "-[]",
104
+ "[" => "-=p];'",
105
+ "]" => "=[\\'",
106
+ "\\" => "]",
107
+ ";" => "p[l'./",
108
+ "'" => "[];/",
109
+ "," => " m.kl",
110
+ "." => ",/l;",
111
+ "/" => ".;'",
112
+ "~" => "`!",
113
+ "!" => "11~@Q",
114
+ "@" => "22!#QW",
115
+ "\#" => "33@$WE",
116
+ "$" => "44#%ER",
117
+ "%" => "55$^RT",
118
+ "^" => "66%&TY",
119
+ "&" => "77^*YU",
120
+ "*" => "88&(UI",
121
+ "(" => "99*)IO",
122
+ ")" => "00(_OP",
123
+ "_" => "--)+P{",
124
+ "+" => "==_{}",
125
+ "{" => "[[_+P}:\"",
126
+ "}" => "]]+{|\"",
127
+ "|" => "\\\}",
128
+ ":" => ";;P{L\">?",
129
+ "\"" => "''{}:?",
130
+ "<" => ",,KLM> ",
131
+ ">" => "..<?L:",
132
+ "?" => "//>:\"",
133
+
134
+ " " => " "
135
+ }
136
+
137
+ # keep it real ;)
138
+ def plausible_typo ch
139
+ chars = $typo_table[ch.chr]
140
+ return nil unless chars
141
+ chars[rand(chars.size)]
142
+ end
143
+
144
+ # Ruby msut have these, just don't know what they are
145
+ def is_alpha? ch
146
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".include? ch
147
+ end
148
+
149
+ def is_num? ch
150
+ "0123456789".include? ch
151
+ end
152
+
153
+ # Hammer^H^H^H^H^H^Hpause time
154
+ def pause_time ch
155
+ slp = 0.05 + (rand($rand_base) / $rand_range)
156
+ modifier = $typing_rates.keys.detect do |chars|
157
+ chars.include? ch
158
+ end
159
+ modifier = $typing_rates[modifier] || 0.5
160
+ slp / modifier
161
+ end
162
+
163
+ # backup, erase, backup (for next char)
164
+ # NB: should peek, and not do this if next char is a newline b/c this will add
165
+ # a space before the end of the line...
166
+ def erase_typo
167
+ $stderr.putc("\b"[0])
168
+ $stderr.putc(" "[0])
169
+ $stderr.putc("\b"[0])
170
+ end
171
+
172
+ lastch = ' '
173
+ chars_since_typeo = 0
174
+ total_chars = 0
175
+ while ch = $stdin.getc
176
+ total_chars += 1
177
+ slp = pause_time(ch)
178
+ # repeated characters are quick
179
+ if ch == lastch
180
+ slp = $repeat_time
181
+ # sequences of the same 'type' are quick
182
+ elsif is_alpha?(ch) && is_alpha?(lastch)
183
+ slp = $same_type_time
184
+ elsif is_num?(ch) && is_num?(lastch)
185
+ slp = $same_type_time
186
+ end
187
+
188
+ # awww, it gets harder to keep going w/o making a mistake :-)
189
+ typo_prob = $typo_prob - (chars_since_typeo/2)
190
+ typo_prob = typo_prob < $min_typo_prob ? $min_typo_prob : typo_prob
191
+ num_typos = 0
192
+ while rand(typo_prob) <= 1.0
193
+ chars_since_typeo = 0
194
+ typo_prob = $typo_prob
195
+ typo = plausible_typo ch
196
+ if typo
197
+ $stderr.putc typo
198
+ $stderr.flush
199
+ num_typos += 1
200
+ sleep($speed_adjust * $time_to_recognize_typo)
201
+ end
202
+ # making a typo makes another one more likely :P
203
+ typo_prob /= 2
204
+ end
205
+ num_typos.times { erase_typo }
206
+
207
+ # so you made it thorugh the gauntlet? emith the char...
208
+ lastch = ch
209
+ slp += Math.sin(total_chars) / 4.0
210
+ slp = slp < $min_slp ? $min_slp : slp
211
+
212
+ sleep($speed_adjust * slp)
213
+
214
+ $stdout.putc ch
215
+ $stdout.flush
216
+ sleep($speed_adjust * $sleep_after_space) if ' ' == ch.chr
217
+ chars_since_typeo += 1
218
+ end
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+
3
+
4
+
5
+ SPEC = Gem::Specification.new do |s|
6
+ s.name = "typrtail"
7
+ s.version = "0.0.1"
8
+ s.author = "Kyle Burton"
9
+ s.email = "kyle.burton@gmail.com"
10
+ s.platform = Gem::Platform::RUBY
11
+ s.description = <<DESC
12
+ typrtail is a toy program.
13
+
14
+ It simulates a person typing a file, it is suitable to be used in a pipeline.
15
+
16
+ user@host ~$ tail -f /var/log/messages | typrtail
17
+
18
+ DESC
19
+ s.summary = "Hey! It looks like you're typing but your fingers aren't moving!"
20
+ # s.rubyforge_project = "typrtail"
21
+ s.homepage = "http://github.com/kyleburton/typrtail"
22
+ s.files = Dir.glob("**/*")
23
+ s.executables << "typrtail"
24
+ s.require_path = "bin"
25
+ s.has_rdoc = false
26
+ end
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+
3
+
4
+
5
+ SPEC = Gem::Specification.new do |s|
6
+ s.name = "typrtail"
7
+ s.version = "0.0.1"
8
+ s.author = "Kyle Burton"
9
+ s.email = "kyle.burton@gmail.com"
10
+ s.platform = Gem::Platform::RUBY
11
+ s.description = <<DESC
12
+ typrtail is a toy program.
13
+
14
+ It simulates a person typing a file, it is suitable to be used in a pipeline.
15
+
16
+ user@host ~$ tail -f /var/log/messages | typrtail
17
+
18
+ DESC
19
+ s.summary = "Hey! It looks like you're typing but your fingers aren't moving!"
20
+ # s.rubyforge_project = "typrtail"
21
+ s.homepage = "http://github.com/kyleburton/typrtail"
22
+ s.files = Dir.glob("**/*")
23
+ s.executables << "typrtail"
24
+ s.require_path = "bin"
25
+ s.has_rdoc = false
26
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: typrtail
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Kyle Burton
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-07-27 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: " typrtail is a toy program. \n\n It simulates a person typing a file, it is suitable to be used in a pipeline.\n\n user@host ~$ tail -f /var/log/messages | typrtail\n\n"
23
+ email: kyle.burton@gmail.com
24
+ executables:
25
+ - typrtail
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - bin/typrtail
32
+ - pkg/typrtail-0.0.1/bin/typrtail
33
+ - pkg/typrtail-0.0.1/Rakefile
34
+ - pkg/typrtail-0.0.1/README.textile
35
+ - pkg/typrtail-0.0.1/typrtail.gemspec
36
+ - pkg/typrtail-0.0.1.gem
37
+ - pkg/typrtail-0.0.1.tgz
38
+ - Rakefile
39
+ - README.textile
40
+ - typrtail.gemspec
41
+ has_rdoc: true
42
+ homepage: http://github.com/kyleburton/typrtail
43
+ licenses: []
44
+
45
+ post_install_message:
46
+ rdoc_options: []
47
+
48
+ require_paths:
49
+ - bin
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ hash: 3
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ requirements: []
69
+
70
+ rubyforge_project:
71
+ rubygems_version: 1.3.7
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: Hey! It looks like you're typing but your fingers aren't moving!
75
+ test_files: []
76
+