Help: very simple script problem

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&id=76

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.yahoo.com

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&id=76

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.yahoo.com

--
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)

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&id=76

<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

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&id=76

>
>
> 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.yahoo.com
>
>

--
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.yahoo.com

--- 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.yahoo.com

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

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.yahoo.com

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 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

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

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

···

--- 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:

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

Thanks again. IO.readlines(file)[a..b] worked a
treat.
I will have a look at foreach.

Once i am able to understand the reference more
easily, I'm sure the doors of opportunity will open
up. For now, I know the logical way i want to do
something, but I'm not sure the ways ruby allows it.

So far its been so simple though, its great.

Cheers.
Tristan

···

--- Daniel Berger <Daniel.Berger@qwest.com> wrote:

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.

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