nota_nuc 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +48 -0
  5. data/README.md +41 -0
  6. data/Rakefile +5 -0
  7. data/db/Quarrier.rb +430 -0
  8. data/db/create_db_Penrhyn.rb +186 -0
  9. data/features/commands.feature +119 -0
  10. data/features/cucumber_LICENCE +22 -0
  11. data/features/offline.feature +65 -0
  12. data/features/passwords.feature +37 -0
  13. data/features/step_definitions/command_steps.rb +142 -0
  14. data/features/step_definitions/offline_steps.rb +211 -0
  15. data/features/step_definitions/password_steps.rb +45 -0
  16. data/images/arrowleft_image.png +0 -0
  17. data/images/arrowright_image.png +0 -0
  18. data/images/arrowright_imageone.png +0 -0
  19. data/images/arrowright_imagetwo.png +0 -0
  20. data/images/blue_light.png +0 -0
  21. data/images/error_symbol.png +0 -0
  22. data/images/gift_glow2.png +0 -0
  23. data/images/gift_nonglow2.png +0 -0
  24. data/images/gift_nonglow2_bottom.png +0 -0
  25. data/images/green_light.png +0 -0
  26. data/images/key_glow.png +0 -0
  27. data/images/key_nonglow.png +0 -0
  28. data/images/lock_image.png +0 -0
  29. data/images/new_slate_icon.png +0 -0
  30. data/images/pencil_glow image.png +0 -0
  31. data/images/pencil_glow_image_red.png +0 -0
  32. data/images/pencil_nonglow.png +0 -0
  33. data/images/red_light.png +0 -0
  34. data/images/settings_icon.png +0 -0
  35. data/images/typing_image.png +0 -0
  36. data/images/updating_image.png +0 -0
  37. data/images/yellow_light.png +0 -0
  38. data/lib/Billboard_module.rb +372 -0
  39. data/lib/Exercitus_romanorum.rb +572 -0
  40. data/lib/error_choose_a_slate.rb +20 -0
  41. data/lib/final_eye.rb +777 -0
  42. data/lib/nota_nuc.rb +5 -0
  43. data/lib/nota_nuc/version.rb +3 -0
  44. data/log/history.log +3 -0
  45. data/log/slate.log +3 -0
  46. data/nota_nuc.gemspec +36 -0
  47. metadata +196 -0
@@ -0,0 +1,572 @@
1
+ require_relative '../db/Quarrier.rb'
2
+ module Exercitus_romanorum
3
+ include Quarrier
4
+
5
+ ####
6
+
7
+
8
+ GETTINGSTARTED = "\n Getting started.
9
+
10
+ This program is meant provide you with a quick and easily accessable place to jot down all those thoughts that pop into your head. The program allows you to create multiple sets of notes and move between them at any time using commands, the arrow buttons, or the Control Right key.
11
+
12
+ In this program each set of notes is called a slate. A slate has a name and its associated text. When you type something into a slate, it will automatically be saved 3 seconds after the last key was hit. To switch between the command line at the top and the maintext area, you just have to hit the tab key. The previous(or p) and next(or n) commands move you from slate to slate. Typing in the name of a slate will bring you right to it. The ls command lists all of your slates and the v command brings you back to the slates maintext. To learn how to create, delete and rename slates using commands use the help command. The program must have 3 slates at any given time.
13
+
14
+ To get the most out of this program, you should have it start every time your computer starts and leave it running against the right side of the screen. You want the program to be available all the time so that when that thought, idea or note pops into your head you have a place to put it instantly.
15
+
16
+ This is an ongoing project and I would love to hear any comments you may have. You can e-mail any ideas, opinions or thoughts here: fakemail@google.com This project is called nota_bene and can be found on bitbucket.org which is where you can can post any bug reports, contribute or fork the project.
17
+
18
+ https://bitbucket.org/mfocella/nota_bene"
19
+
20
+ HELPTEXT = "\n Help
21
+
22
+ The commands included with this program are:
23
+
24
+ next #I bring you to the next slate
25
+ n #I am a shorter way to say next
26
+ previous #I bring you to the previous slate
27
+ p #I am the short version of previous
28
+ viewslate #I bring the a slates text back into view
29
+ v #I am an alias for viewslate
30
+ exit #I shut the program down
31
+ e #I am an alias for exit
32
+ version #I show you the version of this program you are running
33
+ lastlog #I list the last part of the log file
34
+ history #I show you what the last commands you used were
35
+ help(This is me)
36
+ about #I give you a little more information about this program
37
+ demote #I get rid of admin abilities
38
+ super #I give admin abilities
39
+ rename #I rename a slate
40
+ list #I list your slates
41
+ ls #I am an alias for list
42
+ delete #I delete stuff
43
+ d #I delete the command you are viewing
44
+ new #I can be used to add new stuff
45
+
46
+ The above commands have a variety of different ways to be used. To get more information on any of the commands, type in the command name and then help.
47
+
48
+ examples
49
+ list help
50
+ delete help
51
+ restore help
52
+
53
+
54
+
55
+
56
+ To lock the program from others from removing and creating new slates, you can go to the general settings window which is accessed by clicking the button at the bottom right of the program.
57
+ "
58
+
59
+
60
+
61
+ THANKYOUALL = "\n Thank you matz for the lovely language that is ruby. You had me at hello world. This program also would not exist without those who have created such wonderful ruby libraries including ActiveRecord, Shoes, Logger, Sqlite3 and cucumber. The pickax book, Eloquent Ruby, Practical Object Oriented Programming in Ruby, Build Awesome Command Line Applications in Ruby, and Designing with the Mind in Mind have been invaluable to my learning and have given me the knowledge to create this software you are using. Thank You Bell Labs for the transistor! \n\n Anyone who is reading this and using my program, I hope this program makes your life easier. I am working to make this the best it can be. Thank you for your support. \n\n Mom and dad, you are always doing your best in guiding and helping me. I love you. I would like to thank my coworkers at AMEWAS, who inspired me to create such a program. Steve Atkinson, you are amazing. Your existance has brought me joy. You are a great friend. Andrew, I would not be here today if it were not for you. I owe everything to you. I don't think there exists enough lifetimes to show you what you mean to me. For now, lets push forward.
62
+
63
+
64
+ \n\n\n\nMark Focella"
65
+
66
+
67
+
68
+
69
+
70
+
71
+ def is_arg_cmd?(arg)
72
+ off_limit_args = [ "--slates", "--hosts", "new", "version", "delete", "rename", "lastlog", "history", "next", "previous", "exit", "demote", "super", "help", "about", "viewslate", "list", "ThankYou" ]
73
+ off_limit_args.each do |cmd|
74
+ if arg =~ /^#{cmd}\s*$/
75
+ return true
76
+ else
77
+ #return nil
78
+ end
79
+ end
80
+ end
81
+
82
+ def access?
83
+ if get_admin_status == 1
84
+ if is_admin? == 0
85
+ return false
86
+ end
87
+ end
88
+ end
89
+
90
+
91
+ def is_slate?(command)
92
+ slates = []
93
+ slates = list_slates
94
+ slates.each do |slate|
95
+ if command =~ /^#{slate}\s*$/
96
+ return true
97
+ else
98
+ #return nil
99
+ next
100
+ end
101
+ end
102
+ end
103
+
104
+ def slatecount
105
+ slates = []
106
+ slates = list_slates
107
+ number = slates.length
108
+ return number
109
+ end
110
+
111
+ def cmd_no_ops?(recievecmd, matchcmd)
112
+ if recievecmd =~ /^#{matchcmd}\s*$/
113
+ return true
114
+ else
115
+ return false
116
+ end
117
+ end
118
+
119
+ def cmd_option2?(recievecmd, matchcmd, flag1, flag2)
120
+ if recievecmd =~ /^#{matchcmd}\s*(#{flag1}|#{flag2})\s*$/
121
+ return true
122
+ else
123
+ return false
124
+ end
125
+ end
126
+
127
+ #below method isn't being used
128
+ def cmd_flag1?(recievecmd, matchcmd, flag1)
129
+ if recievecmd =~ /^#{matchcmd}\s*#{flag1}\s*/
130
+ return true
131
+ else
132
+ nil
133
+ end
134
+ end
135
+ #########################
136
+
137
+
138
+ def cmd_argument?(recievecmd, matchcmd, flag1, flag2)
139
+ if recievecmd =~ /^#{matchcmd}\s*(#{flag1}|#{flag2})\s.*\s*$/
140
+ return true
141
+ else
142
+ nil
143
+ end
144
+ end
145
+
146
+
147
+
148
+ def cmd_onlytwo_arguments?(recievecmd, matchcmd)
149
+ if recievecmd =~ /^#{matchcmd}\s*\S+\s*\S+\s*$/
150
+ return true
151
+ else
152
+ nil
153
+ end
154
+ end
155
+
156
+ def cmd_get_arg1(recievecmd)
157
+ arg1 = /^\S*\s*(\S*)\s*\S*\s*$/.match(recievecmd).captures
158
+ return arg1
159
+ end
160
+
161
+ def cmd_get_arg2(recievecmd)
162
+ arg2 = /^\S*\s*\S*\s*(\S*)\s*$/.match(recievecmd).captures
163
+ #put in a check here if argument is equal to one of the commands or already existing slatenames
164
+ return arg2
165
+ end
166
+
167
+ def cmd_get_argument(recievecmd, matchcmd)
168
+ argument = /^#{matchcmd}\s.+\s(.+)\s*$/.match(recievecmd).captures
169
+ #put in a check here if argument is equal to one of the commands or already existing slatenames and if so return error can't be cmd or slatename
170
+ return argument
171
+ end
172
+
173
+ def arg_has_special?(arg)
174
+ arg.match(/\W+/) { return true }
175
+ end
176
+
177
+ def is_arg_slate?(arg)
178
+ slates = []
179
+ slates = list_slates
180
+ slates.each do |slate|
181
+ if arg =~ /^#{slate}$/
182
+ return true
183
+ else
184
+ #return nothing
185
+ next
186
+ end
187
+ end
188
+ end
189
+
190
+
191
+
192
+
193
+ def use_cmd
194
+ if using_cmd? == 0
195
+ set_cmd_view("1")
196
+ else
197
+ nil
198
+ end
199
+ end
200
+
201
+ def admin_check
202
+ if is_admin == 0
203
+ return "You must be an admin to use this command"
204
+ else
205
+ end
206
+ end
207
+
208
+ def get_command(command)
209
+ #send the command to a file which will be used by the history command and up and down arrows scrolling through old commands that were run !!here
210
+ use_cmd
211
+
212
+ if command =~ /^about/
213
+ parse_about(command)
214
+ elsif command =~ /^new/
215
+ parse_new(command)
216
+ elsif command =~ /^delete/
217
+ parse_delete(command)
218
+ elsif command =~ /^d\s*$/
219
+ parse_delete(command)
220
+ elsif command =~ /^ls/
221
+ parse_ls(command)
222
+ elsif command =~ /^list/
223
+ parse_list(command)
224
+ elsif command =~ /^ThankYou$/
225
+ parse_thankyou(command)
226
+ elsif command =~ /^rename/
227
+ parse_rename(command)
228
+ elsif command =~ /^exit/
229
+ parse_exit(command)
230
+ elsif command =~ /^e\s*$/
231
+ parse_exit(command)
232
+ elsif command =~ /^help/
233
+ parse_help(command)
234
+ elsif command =~ /^h\s*$/
235
+ parse_help(command)
236
+ elsif command =~ /^demote/
237
+ parse_demote(command)
238
+ elsif command =~ /^history/
239
+ parse_history(command)
240
+ elsif command =~ /^version/
241
+ parse_version(command)
242
+ elsif command =~ /^lastlog/
243
+ parse_lastlog(command)
244
+ elsif command =~ /^next\s*\S+\s*$/ || command =~ /^n\s*\S+\s*$/
245
+ next_help
246
+ elsif command =~ /^previous\s*\S+\s*$/ || command =~ /^p\s*\S+\s*$/
247
+ previous_help
248
+ elsif command =~ /^viewslate\s*\S+\s*$/ || command =~ /^v\s*\S+\s*$/
249
+ viewslate_help
250
+ elsif command =~ /^super\s*\S+\s*$/
251
+ super_help
252
+ else
253
+ nocommand(command)
254
+ #return "\n#{command}\n\n\n This is not one of the commands or slates. Type help if you would like a list of commands. To learn more about this program type about."
255
+ end
256
+ end
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+ private
267
+
268
+ def nocommand(command)
269
+ return "\n#{command}\n\n\n This is not a valid command or slate. Type help if you would like a list of commands. To learn more about this program type about."
270
+ end
271
+
272
+ def super_help
273
+ return "\nsuper\n\n\nThis command asks for the administrator password so that you could become an admin. If you are an admin, you will be able to access all the commands and sectons. This command does not take any arguments.\n\nUsage: super"
274
+ end
275
+
276
+ def next_help
277
+ return "\nnext\n\n\nThis command brings you to the next slate in your list of slates. It does not take any arguments. \n\nUsage: next\n\n\n\nAlias: n"
278
+ end
279
+
280
+ def previous_help
281
+ return "\nprevious\n\n\nThis command brings you to the previous slate in your list of slates. It does not take any arguments. \n\nUsage: previous \n\n\n\nAlias: p"
282
+ end
283
+
284
+ def viewslate_help
285
+ return "\nviewslate\n\n\nThis command removes the command output and lets you view the slatetext. It does not take any arguments. \n\nUsage: viewslate\n\n\n\nAlias: v"
286
+ end
287
+
288
+ def parse_version(command)
289
+ match = "version"
290
+ if cmd_no_ops?(command, match) == true
291
+ ver = "\nYou are running Version 0.1.0 - Gumshoe"
292
+ return ver
293
+ else
294
+ usage = "\nversion\n\n\nThis command displays the version of this program that is running. It does not take any arguments. \n\nUsage: version"
295
+ return usage
296
+ end
297
+ end
298
+
299
+ def parse_about(command)
300
+ match = "about"
301
+ if cmd_no_ops?(command, match) == true
302
+ return "\n#{GETTINGSTARTED}"
303
+ else
304
+ return "\nabout\n\n\nThis command gives you information about Slates. It gives you an overview of the functions and features this program offers. If you are new to Slates, I suggest you start here. \n\nUsage: about"
305
+ end
306
+ end
307
+
308
+ def parse_new(command)
309
+
310
+ flag1 = "-s"
311
+ flag2 = "--slate"
312
+ match = "new"
313
+
314
+ if access? == false
315
+ return "\nYou must be an administrator to run this command."
316
+ else
317
+ if cmd_no_ops?(command, match) == true
318
+ return "\nThe new command requires an option and an argument."
319
+ elsif cmd_argument?(command, match, flag1, flag2) == true
320
+ @argument = cmd_get_argument(command, match).join("")
321
+ if arg_has_special?("#{@argument}") == true
322
+ return "\nThe slatename can't contain special characters"
323
+ elsif is_arg_slate?("#{@argument}") == true
324
+ return "\nThe slate #{@argument} already exists."
325
+ elsif @argument =~ /^(..|.)$/
326
+ return "\nSlatename must be more than 2 characters long."
327
+ elsif is_arg_cmd?(@argument) == true
328
+ return "\nYour slate cannot be the name of a command."
329
+ else
330
+ new_slate("#{@argument}")
331
+ return "\nThe slate #{@argument} has been created."
332
+ end
333
+ else
334
+ return "\nnew\n\n\nThis command allows you to create a new slate. \n\nUsage: new -s <slatename> or new --slate <slatename> \n -s stands for slate. You can only use one flag each time this command is run.\nThis command takes only one argument after the flag which is the name of the slate you want to create."
335
+ end
336
+ end
337
+ end
338
+
339
+ def parse_delete(command)
340
+
341
+ flag1 = "-s"
342
+ flag2 = "--slate"
343
+ match = "delete"
344
+ match2 = "d"
345
+
346
+ if access? == false
347
+ return "\nYou must be an administrator to run this command."
348
+ else
349
+ if cmd_no_ops?(command, match) == true || cmd_no_ops?(command, match2) == true
350
+ @numofslates = slatecount
351
+ if @numofslates <= 3
352
+ return "\nYou cannot delete this slate, because there must be at least 3 slates at all times."
353
+ else
354
+ viewingslate = get_slatename
355
+ previous = previousslate
356
+ set_viewing("#{previous}")
357
+ remove_slate("#{viewingslate}")
358
+ return "\nThe slate #{viewingslate} was deleted."
359
+ end
360
+ elsif cmd_argument?(command, match, flag1, flag2) == true
361
+ @argument = cmd_get_argument(command, match).join("")
362
+ if arg_has_special?("#{@argument}") == true
363
+ return "\nThere is no slate with the name #{@argument}"
364
+ elsif is_arg_slate?("#{@argument}") == true
365
+ @numofslates = slatecount
366
+ if @numofslates <= 3
367
+ return "\nYou cannot delete this slate, because there must be at least 3 slates at all times."
368
+ end
369
+ if viewing?("#{@argument}") == 1
370
+ previous = previousslate
371
+ set_viewing("#{previous}")
372
+ end
373
+ remove_slate("#{@argument}")
374
+ return "\nThe slate #{@argument} was deleted."
375
+ else
376
+ return "\nThere is no slate with the name #{@argument}"
377
+ end
378
+ else
379
+ return "\ndelete\n\n\nThis command allows you to delete a slate. \n\nUsage: delete -s <slatename> or delete --slate <slatename> \n -s stands for slate. You can only use one flag each time this command is run. Delete can only take one argument which is the name of the slate you would like to delete. If you want to delete the slate you are viewing, just type delete or d without any arguments."
380
+ end
381
+ end
382
+ end
383
+
384
+ def parse_ls(command)
385
+ match = "ls"
386
+ if cmd_no_ops?(command, match) == true
387
+ sap = list_slates.join("\n")
388
+ @numofslates = slatecount
389
+ far = "\n You have #{@numofslates} slates.\n\n\nYour slates include:\n\n #{sap}"
390
+ return far
391
+ else
392
+ usage = "\nls\n\n\nThis command lists the slates. It is a shortcut for list. It doesn't not take any arguments or flags.\n\nUsage: ls"
393
+ return usage
394
+ end
395
+ end
396
+
397
+ def parse_list(command)
398
+
399
+ match = "list"
400
+ flag1 = "-s"
401
+ flag2 = "--slates"
402
+ @numofslates = slatecount
403
+
404
+ if cmd_no_ops?(command, match) == true
405
+ sap = list_slates.join("\n")
406
+ hap = list_hosts.join("\n")
407
+ slates = "\n You have #{@numofslates} slates.\n\n\nYour slates include: \n\n #{sap}"
408
+ return slates
409
+ elsif cmd_option2?(command, match, flag1, flag2) == true
410
+ sap = list_slates.join("\n")
411
+ slates = "\n You have #{@numofslates} slates.\n\n\nYour slates include: \n\n #{sap}"
412
+ return slates
413
+ else
414
+ return "\nlist\n\n\nThis command lists the slates you have. \n\nUsage: list [options]\n\t -s, --slates list only slates\n\t \n\n\n The alias for list is: ls"
415
+ end
416
+ end
417
+
418
+ def parse_thankyou(command)
419
+ return "\n\n\n\n\n#{THANKYOUALL}"
420
+ end
421
+
422
+ def parse_rename(command)
423
+ match = "rename"
424
+ if access? == false
425
+ return "\nYou must be an administrator to run this command."
426
+ else
427
+ if cmd_no_ops?(command, match) == true
428
+ return "\nThe rename command requires two arguments. The first argument must be an existing slatename and the other argument must be the name you want to change it to."
429
+ elsif cmd_onlytwo_arguments?(command, match) == true
430
+ oldname = cmd_get_arg1(command).join("")
431
+ newname = cmd_get_arg2(command).join("")
432
+ if newname =~ /^(..|.)$/
433
+ return "\nThe slatename must be more than 2 characters long."
434
+ elsif newname =~ /\W/
435
+ return "\nYou can only use letters, numbers and underscores in the name of a slate."
436
+ elsif oldname =~ /^help$/
437
+ return "\nrename\n\n\nThis command renames an already existing slate to some other name. \n\nUsage: rename <oldslatename> <newslatename>\n This command must take in the name of an already existing slate and the name you want to change it to."
438
+ elsif oldname =~ /\W/
439
+ return "\nYou do not have a slate named: #{oldname}."
440
+ elsif is_arg_cmd?(newname) == true
441
+ return "\nYour slate cannot be the name of a command."
442
+ elsif is_arg_slate?(newname) == true
443
+ return "\nYou already have a slate called #{newname}."
444
+ elsif is_arg_slate?(oldname) == true
445
+ slateid = get_slateid("#{oldname}")
446
+ set_slatename("#{slateid}", "#{newname}")
447
+ return "\nThe slate #{oldname} has changed its name to #{newname}."
448
+ else
449
+ return "\nThe first argument #{oldname} is not the name of a slate."
450
+ end
451
+ else
452
+ return "\nrename\n\n\nThis command renames an already existing slate to some other name. \n\nUsage: rename <oldslatename> <newslatename>\n This command must take in the name of an already existing slate and the name you want to change it to."
453
+ end
454
+ end
455
+ end
456
+
457
+ def parse_exit(command)
458
+ match = "exit"
459
+ if cmd_no_ops?(command, match) == true
460
+ return exit
461
+ elsif cmd_no_ops?(command, "e") == true
462
+ return exit
463
+ else
464
+ usage = "\nexit\n\n\nThis command exits the program. A shortcut for this is e.\n\nUsage: exit"
465
+ return usage
466
+ end
467
+ end
468
+
469
+ def parse_help(command)
470
+ match = "help"
471
+ if cmd_no_ops?(command, match) == true
472
+ return "\n#{HELPTEXT}"
473
+ elsif cmd_no_ops?(command, "h") == true
474
+ return "\n#{HELPTEXT}"
475
+ else
476
+ usage = "\nType in help if you need assistance."
477
+ return usage
478
+ end
479
+ end
480
+
481
+ def parse_demote(command)
482
+ match = "demote"
483
+ if cmd_no_ops?(command, match) == true
484
+ set_admin("0")
485
+ return "\nYou are no longer an administrator"
486
+ else
487
+ return "\ndemote\n\n\nThis command takes away administrator abilities. \n\nUsage: demote"
488
+ end
489
+ end
490
+
491
+ def parse_history(command)
492
+ match = "history"
493
+ if cmd_no_ops?(command, match) == true
494
+ numolines = File.read("../log/history.log").scan(/\n/).count
495
+ if numolines == 0
496
+ return ""
497
+ elsif numolines >= 50
498
+ read = IO.readlines("../log/history.log")[-50..-1]
499
+ return read.join("")
500
+ else
501
+ numolines *= -1
502
+ read = IO.readlines("../log/history.log")[numolines..-1]
503
+ return read.join("")
504
+ end
505
+ =begin
506
+ file.readlines.each do |line|
507
+ count = 0
508
+ if count <= 39
509
+ lines << line
510
+ #linetxt = "#{@period}" + "#{line}\n"
511
+ #@period = "#{linetxt}"
512
+ count += 1
513
+ else
514
+ linetxt = lines.join("\n\n\n\n")
515
+ return "#{linetxt}"
516
+ end
517
+ =end
518
+
519
+
520
+ else
521
+ return "\nhistory\n\n\nThis command gives you a listing of the last 50 commands that were run. It does not take any arguments. \n\nUsage: history"
522
+ end
523
+ end
524
+
525
+ def parse_lastlog(command)
526
+ match = "lastlog"
527
+ if cmd_no_ops?(command, match) == true
528
+
529
+ numolines = File.read("../log/slate.log").scan(/\n/).count
530
+ if numolines == 0
531
+ return ""
532
+ elsif numolines >= 100
533
+ read = IO.readlines("../log/slate.log")[-100..-1]
534
+ return read.join("")
535
+ else
536
+ numolines *= -1
537
+ read = IO.readlines("../log/slate.log")[numolines..-1]
538
+ return read.join("")
539
+ end
540
+ =begin
541
+ lines = []
542
+ File.open("../log/slate.log", "r") { |file|
543
+ @period = ".START\n\n\n\n"
544
+ file.readlines.each do |line|
545
+ count = 0
546
+ if count <= 39
547
+ lines << line
548
+ #linetxt = "#{@period}" + "#{line}\n"
549
+ #@period = "#{linetxt}"
550
+ count += 1
551
+ else
552
+ linetxt = lines.join("\n\n\n\n")
553
+ return "#{linetxt}"
554
+ end
555
+ end
556
+ }
557
+ =end
558
+ else
559
+ return "\nlastlog\n\n\nThis command shows you the last few lines of this programs logfile. It does not take any arguments. \n\nUsage: lastlog"
560
+ end
561
+ end
562
+
563
+
564
+ end
565
+
566
+
567
+
568
+
569
+
570
+ #Developer : Mark Focella (m.focella@gmail.com)
571
+ #Date : February 17, 2014
572
+