[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Help: very simple script problem

Tristan Knowles

7/14/2005 3:03:00 PM

Hi,

After reading up on Ruby I thought it sounded good and
decided to learn it so I can manipulate my files on my
linux server such as log, csv, conf etc. Anyway, i'm
a beginner when it comes to programming, so bear with
me.

I use the Asterisk PBX and came across this script
here which reads a csv file and puts each record into
an html table:
http://rubyforge.org/snippet/detail.php?type=snippet...


Anyway, I thought I would then apply this basic
concept to a log file, but I cannot get it to display
through a web browser. Here is my script:


===========
#!/usr/bin/ruby

My_Title = "Testing Log Read"
Log_File = "/var/log/apache2/error.log"

require 'cgi'

cgi = CGI.new
printf cgi.header("Content-type" => "text/html\n\n")


printf "<html>\n<head>\n"
printf "<title>#{My_Title}</title>\n"
printf "</head>\n<body bgcolor=\"#efefef\">\n"
printf "<table width=\"80%\">\n<tr><td>Call
records</td></tr>\n"
if File.exists? Log_File
lines = File.open(Log_File).readlines
lines.each_with_index do |line, index|
printf " <tr%s>\n <td>%d</td>",
index % 2 == 0 ? ' bgcolor="#dddddd"' : '
bgcolor="#cccccc"', index + 1
entries = line.chop.split(/\n/)
entries.each_with_index do |field, index|
printf "<td>%s</td>", entries
end
printf "\n</tr>\n"
end
else
printf "No File Found\n"
end
printf "</body>\n</html>"
===========


If I comment out all the printf commands related to
web and cgi, and run it through the shell, it seems to
be taking each line and putting it into <tr><td>
brackets, but I can't get it to display through a
browser, it stops at the third printf command.


I have tried heaps of different things, but feel like
i'm running around in circles now.

Any advise with this one?


Cheers.
Tristan






___________________________________________________________
Yahoo! Messenger - NEW crystal clear PC to PC calling worldwide with voicemail http://uk.messenger...


11 Answers

pat eyler

7/14/2005 3:27:00 PM

0

Here's a working version that I've made some changes to (some of the
changes were merely to show a different way of doing things -- but I
got rid of the cgi module since you weren't really making enough use
of it to justify the extra load time):

#!/usr/bin/ruby

My_Title = "Testing Log Read"
Log_File = "/var/log/apache2/error.log"

puts <<EOF
Content-type: text/html

<html>
<head>
<title>#{My_Title}</title>
</head>
<body bgcolor=\"#efefef\">
<table width=\"80%\">
<tr><td>Call records</td></tr>
EOF

if File.exists? Log_File
lines = File.open(Log_File).readlines
lines.each_with_index do |line, index|
index % 2 == 0 ? color = "#dddddd" : color="#cccccc"
puts " <tr bgcolor=\"#{color}\">\n <td>#{index}</td>"

entries = line.chop.split(/\n/)
entries.each do |field|
puts "<td>#{field}</td>"
end
puts "\n</tr>\n"
end
else
puts "No File Found\n"
end
puts "</body>\n</html>"



On 7/14/05, Tristan Knowles <cydonia_1@yahoo.com> wrote:
> Hi,
>
> After reading up on Ruby I thought it sounded good and
> decided to learn it so I can manipulate my files on my
> linux server such as log, csv, conf etc. Anyway, i'm
> a beginner when it comes to programming, so bear with
> me.
>
> I use the Asterisk PBX and came across this script
> here which reads a csv file and puts each record into
> an html table:
> http://rubyforge.org/snippet/detail.php?type=snippet...
>
>
> Anyway, I thought I would then apply this basic
> concept to a log file, but I cannot get it to display
> through a web browser. Here is my script:
>
>
> ===========
> #!/usr/bin/ruby
>
> My_Title = "Testing Log Read"
> Log_File = "/var/log/apache2/error.log"
>
> require 'cgi'
>
> cgi = CGI.new
> printf cgi.header("Content-type" => "text/html\n\n")
>
>
> printf "<html>\n<head>\n"
> printf "<title>#{My_Title}</title>\n"
> printf "</head>\n<body bgcolor=\"#efefef\">\n"
> printf "<table width=\"80%\">\n<tr><td>Call
> records</td></tr>\n"
> if File.exists? Log_File
> lines = File.open(Log_File).readlines
> lines.each_with_index do |line, index|
> printf " <tr%s>\n <td>%d</td>",
> index % 2 == 0 ? ' bgcolor="#dddddd"' : '
> bgcolor="#cccccc"', index + 1
> entries = line.chop.split(/\n/)
> entries.each_with_index do |field, index|
> printf "<td>%s</td>", entries
> end
> printf "\n</tr>\n"
> end
> else
> printf "No File Found\n"
> end
> printf "</body>\n</html>"
> ===========
>
>
> If I comment out all the printf commands related to
> web and cgi, and run it through the shell, it seems to
> be taking each line and putting it into <tr><td>
> brackets, but I can't get it to display through a
> browser, it stops at the third printf command.
>
>
> I have tried heaps of different things, but feel like
> i'm running around in circles now.
>
> Any advise with this one?
>
>
> Cheers.
> Tristan
>
>
>
>
>
>
> ___________________________________________________________
> Yahoo! Messenger - NEW crystal clear PC to PC calling worldwide with voicemail http://uk.messenger...
>
>


--
thanks,
-pate
-------------------------
We are often unable to tell people what they need to know, because
they want to know something else, and would therefore only
misunderstand what we said
- the Raven (George MacDonald, Lilith)


Berger, Daniel

7/14/2005 3:49:00 PM

0

Tristan Knowles wrote:
> Hi,
>
> After reading up on Ruby I thought it sounded good and
> decided to learn it so I can manipulate my files on my
> linux server such as log, csv, conf etc. Anyway, i'm
> a beginner when it comes to programming, so bear with
> me.
>
> I use the Asterisk PBX and came across this script
> here which reads a csv file and puts each record into
> an html table:
> http://rubyforge.org/snippet/detail.php?type=snippet...

<snip>

For simple tables, allow me to shamelessly promote my html-table package.

# example
table = Table.new("Call Records")
table.width = "80%"

IO.foreach(log_file){ |line|
table.push(Table::Row.new(line.chomp))
}

File.open("test_out.html", "w+"){ |fh|
fh.puts(table.html)
}

That isn't exactly what you were trying to do with your example, but I
hope you get the idea.

Regards,

Dan


Tristan Knowles

7/14/2005 4:21:00 PM

0

Ahhh. Thats better :). Much easier to understand
now.

I didn't realise you could use puts to write plain
html to a file, much quicker and easier than cgi.

I can actually cut this down to this much now, not
sure if i'm losing anything here, still seems to
output the same.


======
#!/usr/bin/ruby

My_Title = "Testing Log Read"
Log_File = "/var/log/apache2/error.log"

puts <<EOF
Content-type: text/html

<html>
<head>
<title>#{My_Title}</title>
</head>
<body bgcolor=\"#efefef\">
<table width=\"95%\">
<tr><td colspan=\"2\">Apache Log Records</td></tr>
EOF

if File.exists? Log_File
lines = File.open(Log_File).readlines
lines.each_with_index do |line, index|
index % 2 == 0 ? color = "#dddddd" :
color="#cccccc"
# where index == 5
puts "<tr bgcolor=\"#{color}\">\n
<td>#{index}</td>\n <td>#{line}</td>"
puts "</tr>"
end
else
puts "<tr><td>No File Found:<br /> Check path:
#{Log_File}</td></tr>\n"
end
puts "</body>\n</html>"
======

Thanks again for your help:).


Tristan



--- pat eyler <pat.eyler@gmail.com> wrote:

> Here's a working version that I've made some changes
> to (some of the
> changes were merely to show a different way of doing
> things -- but I
> got rid of the cgi module since you weren't really
> making enough use
> of it to justify the extra load time):
>
> #!/usr/bin/ruby
>
> My_Title = "Testing Log Read"
> Log_File = "/var/log/apache2/error.log"
>
> puts <<EOF
> Content-type: text/html
>
> <html>
> <head>
> <title>#{My_Title}</title>
> </head>
> <body bgcolor=\"#efefef\">
> <table width=\"80%\">
> <tr><td>Call records</td></tr>
> EOF
>
> if File.exists? Log_File
> lines = File.open(Log_File).readlines
> lines.each_with_index do |line, index|
> index % 2 == 0 ? color = "#dddddd" :
> color="#cccccc"
> puts " <tr bgcolor=\"#{color}\">\n
> <td>#{index}</td>"
>
> entries = line.chop.split(/\n/)
> entries.each do |field|
> puts "<td>#{field}</td>"
> end
> puts "\n</tr>\n"
> end
> else
> puts "No File Found\n"
> end
> puts "</body>\n</html>"
>
>
>
> On 7/14/05, Tristan Knowles <cydonia_1@yahoo.com>
> wrote:
> > Hi,
> >
> > After reading up on Ruby I thought it sounded good
> and
> > decided to learn it so I can manipulate my files
> on my
> > linux server such as log, csv, conf etc. Anyway,
> i'm
> > a beginner when it comes to programming, so bear
> with
> > me.
> >
> > I use the Asterisk PBX and came across this script
> > here which reads a csv file and puts each record
> into
> > an html table:
> >
>
http://rubyforge.org/snippet/detail.php?type=snippet...
> >
> >
> > Anyway, I thought I would then apply this basic
> > concept to a log file, but I cannot get it to
> display
> > through a web browser. Here is my script:
> >
> >
> > ===========
> > #!/usr/bin/ruby
> >
> > My_Title = "Testing Log Read"
> > Log_File = "/var/log/apache2/error.log"
> >
> > require 'cgi'
> >
> > cgi = CGI.new
> > printf cgi.header("Content-type" =>
> "text/html\n\n")
> >
> >
> > printf "<html>\n<head>\n"
> > printf "<title>#{My_Title}</title>\n"
> > printf "</head>\n<body bgcolor=\"#efefef\">\n"
> > printf "<table width=\"80%\">\n<tr><td>Call
> > records</td></tr>\n"
> > if File.exists? Log_File
> > lines = File.open(Log_File).readlines
> > lines.each_with_index do |line, index|
> > printf " <tr%s>\n <td>%d</td>",
> > index % 2 == 0 ? ' bgcolor="#dddddd"' : '
> > bgcolor="#cccccc"', index + 1
> > entries = line.chop.split(/\n/)
> > entries.each_with_index do |field, index|
> > printf "<td>%s</td>", entries
> > end
> > printf "\n</tr>\n"
> > end
> > else
> > printf "No File Found\n"
> > end
> > printf "</body>\n</html>"
> > ===========
> >
> >
> > If I comment out all the printf commands related
> to
> > web and cgi, and run it through the shell, it
> seems to
> > be taking each line and putting it into <tr><td>
> > brackets, but I can't get it to display through a
> > browser, it stops at the third printf command.
> >
> >
> > I have tried heaps of different things, but feel
> like
> > i'm running around in circles now.
> >
> > Any advise with this one?
> >
> >
> > Cheers.
> > Tristan
> >
> >
> >
> >
> >
> >
> >
>
___________________________________________________________
> > Yahoo! Messenger - NEW crystal clear PC to PC
> calling worldwide with voicemail
> http://uk.messenger...
> >
> >
>
>
> --
> thanks,
> -pate
> -------------------------
> We are often unable to tell people what they need to
> know, because
> they want to know something else, and would
> therefore only
> misunderstand what we said
> - the Raven (George MacDonald, Lilith)
>
>




___________________________________________________________
How much free photo storage do you get? Store your holiday
snaps for FREE with Yahoo! Photos http://uk.photos...


Tristan Knowles

7/14/2005 4:30:00 PM

0

--- Daniel Berger <Daniel.Berger@qwest.com> wrote:
> For simple tables, allow me to shamelessly promote
> my html-table package.
>
> # example
> table = Table.new("Call Records")
> table.width = "80%"
>
> IO.foreach(log_file){ |line|
> table.push(Table::Row.new(line.chomp))
> }
>
> File.open("test_out.html", "w+"){ |fh|
> fh.puts(table.html)
> }
>

Hey that looks nice. Would be a much nicer way to put
any file into a table, that can be my next step. I'm
just trying to get the basics down first, but that
definately looks useful.

Can i just confirm that the above needs some sort of
tables.rb file and a "require 'tables'" sort of thing?
Or is this something else?


Tristan




___________________________________________________________
How much free photo storage do you get? Store your holiday
snaps for FREE with Yahoo! Photos http://uk.photos...


Berger, Daniel

7/14/2005 4:32:00 PM

0

Tristan Knowles wrote:
> --- Daniel Berger <Daniel.Berger@qwest.com> wrote:
>
>>For simple tables, allow me to shamelessly promote
>>my html-table package.
>>
>># example
>>table = Table.new("Call Records")
>>table.width = "80%"
>>
>>IO.foreach(log_file){ |line|
>> table.push(Table::Row.new(line.chomp))
>>}
>>
>>File.open("test_out.html", "w+"){ |fh|
>> fh.puts(table.html)
>>}
>>
>
>
> Hey that looks nice. Would be a much nicer way to put
> any file into a table, that can be my next step. I'm
> just trying to get the basics down first, but that
> definately looks useful.
>
> Can i just confirm that the above needs some sort of
> tables.rb file and a "require 'tables'" sort of thing?
> Or is this something else?

Yes, this would be at the top:

require "html/table"
include HTML

That's it.

Regards,

Dan


Ezra Zygmuntowicz

7/14/2005 5:06:00 PM

0

Daniel-
Where can I get your html-tables package?

Thanks -Ezra
On Jul 14, 2005, at 9:32 AM, Daniel Berger wrote:

> Tristan Knowles wrote:
>
>> --- Daniel Berger <Daniel.Berger@qwest.com> wrote:
>>
>>> For simple tables, allow me to shamelessly promote
>>> my html-table package.
>>>
>>> # example
>>> table = Table.new("Call Records")
>>> table.width = "80%"
>>>
>>> IO.foreach(log_file){ |line|
>>> table.push(Table::Row.new(line.chomp))
>>> }
>>>
>>> File.open("test_out.html", "w+"){ |fh|
>>> fh.puts(table.html)
>>> }
>>>
>>>
>> Hey that looks nice. Would be a much nicer way to put
>> any file into a table, that can be my next step. I'm
>> just trying to get the basics down first, but that
>> definately looks useful.
>> Can i just confirm that the above needs some sort of
>> tables.rb file and a "require 'tables'" sort of thing?
>> Or is this something else?
>>
>
> Yes, this would be at the top:
>
> require "html/table"
> include HTML
>
> That's it.
>
> Regards,
>
> Dan
>

-Ezra Zygmuntowicz
Yakima Herald-Republic
WebMaster
509-577-7732
ezra@yakima-herald.com



Tristan Knowles

7/14/2005 5:14:00 PM

0


--- Ezra Zygmuntowicz <ezra@yakima-herald.com> wrote:

> Daniel-
> Where can I get your html-tables package?
>
> Thanks -Ezra
> On Jul 14, 2005, at 9:32 AM, Daniel Berger wrote:

In all its glory...
http://raa.ruby-lang.org/project/h...





___________________________________________________________
Yahoo! Messenger - NEW crystal clear PC to PC calling worldwide with voicemail http://uk.messenger...


Tristan Knowles

7/14/2005 6:48:00 PM

0

Just another quick question regarding flow control.

What variable can I refer to, and what method do I use
to create a while loop so that only x amount of lines
are shown at once from a file?

This is how I have been approaching it, its obviously
not working, and I'm still not up to speed at working
out how to use methods based on the online reference
details only.

=====
if File.exists? Log_File
lines = File.open(Log_File).readlines
lines.each_with_index do |line, index|
index % 2 == 0 ? color = "#dddddd" :
color="#cccccc"

while index <= 50

puts "<tr bgcolor=\"#{color}\">\n
<td>#{index}</td>\n <td>#{line}</td>"
puts "</tr>"

end

end
=====


Am I even approaching this the correct way? Or should
this be handled once step before with a grep
statement?

Thanks again.
Tristan



___________________________________________________________
How much free photo storage do you get? Store your holiday
snaps for FREE with Yahoo! Photos http://uk.photos...


Berger, Daniel

7/14/2005 7:00:00 PM

0

Tristan Knowles wrote:
> Just another quick question regarding flow control.
>
> What variable can I refer to, and what method do I use
> to create a while loop so that only x amount of lines
> are shown at once from a file?
>
> This is how I have been approaching it, its obviously
> not working, and I'm still not up to speed at working
> out how to use methods based on the online reference
> details only.
>
> =====
> if File.exists? Log_File
> lines = File.open(Log_File).readlines
> lines.each_with_index do |line, index|
> index % 2 == 0 ? color = "#dddddd" :
> color="#cccccc"
>
> while index <= 50
>
> puts "<tr bgcolor=\"#{color}\">\n
> <td>#{index}</td>\n <td>#{line}</td>"
> puts "</tr>"
>
> end
>
> end
> =====
>
>
> Am I even approaching this the correct way? Or should
> this be handled once step before with a grep
> statement?

Your code looks fine as is, although I wonder if 50 is a constant number
you can rely on. But, here's some more info for you:

If you only want 1 line per iteration, then your best bet is to use
IO.foreach. If you only want to slurp X number of lines into a
variable, then just keep in mind that IO.readlines returns an array.
So, you can use a range as the index and do:

# No need to use the File class, btw
lines = IO.readlines(Log_File)[0..49]

Just keep in mind that, even though you're only selecting 50 lines, the
entire file has been slurped into memory.

Regards,

Dan



Ryan Leavengood

7/14/2005 7:04:00 PM

0

Tristan Knowles said:
> Just another quick question regarding flow control.
>
> What variable can I refer to, and what method do I use
> to create a while loop so that only x amount of lines
> are shown at once from a file?

I think this is what you wanted to do:

if File.exists? Log_File
lines = IO.foreach(Log_File).readlines
lines.each_with_index do |line, index|
index % 2 == 0 ? color = "#dddddd" : color = "#cccccc"
puts "<tr bgcolor=\"#{color}\">\n
<td>#{index}</td>\n <td>#{line}</td>"
puts "</tr>"

break if index > 50
end
end

But there are definitely several improvements that could be made on this.
For example, the above reads all the lines, whereas this only reads the
lines you care about from the file:

if File.exists? Log_File
index = 0
IO.foreach(Log_File) do |line|
index % 2 == 0 ? color = "#dddddd" : color = "#cccccc"
puts "<tr bgcolor=\"#{color}\">\n
<td>#{index}</td>\n <td>#{line}</td>"
puts "</tr>"

break if (index+=1) > 50
end
end

Ryan