Running a Ruby script via the web - ruby

I have a small Ruby script that I want to run by visiting a page in a browser. This might seem like a dumb question but what's the easiest way to accomplish this? I haven't found very good documentation on how to get Ruby working with Apache so I'm open to any suggestions at this point.

I suggest Sinatra. As shown on that page, it's very lightweight, and Apache is not even necessary. As you get to needing more performance you might use Nginx or Apache as a reverse proxy (serving your static files quickly) and something like Thin to make your application run faster.
But for now, just start using Sinatra. As shown on the home page, you can get started in just a few lines.

Related

How do you move a sinatra app to github pages?

I created a sinatra app and I'm trying to put it on github pages. I can run my app on localhost, but I don't know how to push it to the actual web.
I have tried googling and searching stackoverflow and I keep seeing people use heroku. Is this required? Is there anyway to push directly from sinatra to the web? I can get a simple index.html file to run on github pages, but I don't know how to get my sinatra app to run. Any help would be great.
As Sirajus says, Github pages only serve static HTML pages. Sinatra is a framework for producing code that produces web pages. It's really there for sites that require some server side processing (i.e. dynamic), but can serve static pages too (a wise decision).
It doesn't serve the pages itself, it runs on a Rack compliant application server (like Thin, Puma, Unicorn or Webrick) and when asked, it builds the page, gives it to the server and the server gives it to you.
Entirely static sites like Github pages or those served via Amazon's S3 are just a collection of HTML files sitting behind HTTP file servers (those of the Apache and Nginx variety). They're static because they're not generated on the fly… dynamically. They don't change, there's no extra processing needed to serve them. They're just sat there wait to be served. You could use things like Sinatra and Thin to do this, but the added complexity adds maintenance work, security issues, costs extra money, time… and crucially, slows the serving speed down. If your site is essentially all static, by which I mean there's no need for the server to process anything, then you may be better off using something that generates static pages from the off. There are many libraries to help with this, Middleman (based on Padrino and hence Sinatra) and Jekyll come to mind, as does Nanoc.
You can emulate what these libraries do by saving the output of each route and uploading that, if it's appropriate. There are libraries that help with this, like Sinatra Static and its fork, Sinatra Export. You could use cURL to save the pages with a command like curl http://localhost:9292/ > index.html for every single path if you wanted. I did something like this for my own blog the other day.
If it's not appropriate to do this or you can't be bothered, set up some server hosting. A lot of these services are free to start with so it won't hurt to give them all a try, you'll learn a lot from doing each.
To run your sinatra app you need to host it with a server. Github pages only run html page not a ruby web application.
To host your sinatra app you can use heroku/ digital ocean.

Can I create a simple website to accept input and display, without Rails, database or external web server?

I am trying to see if I can create a simple website, like a blog, using only Ruby. No Rails or a database or outside web servers. I plan to store the data in a file for persistence.
I wanted to use TCPServer, CGI, and Net::HTTP.
Is there an easier way I can use?
There are a lot of moving parts when designing a website.
Depending on the purpose of the exercise, you might want to consider using a very simple web framework like Camping, Sinatra, or Ramaze. This is probably the best solution if you're trying to get a top level understanding of web programming because it only has exactly what you need (Camping is less than 4k!) and handles stuff like routing.
Building a web server is more an exercise in HTTP parsing. You might want to omit the framework and try to build something on top of Rake (an API for lots of popular web servers) and a simple web server like Webrick or Thin.
You could also try Espresso
It is easy to learn and fast to run.
And offers all the liberty you need for creation process.
Also it has no hidden "fees", everything is transparent.

How to access sprockets/coffee script assets from a plugin in the ror3 host application

Imagine a rails engine with a /app/assets/javascripts/my_engine.js.coffee.
I use the engine as a gem in the Gemfile.
What would I have to do, to be able to access "my_engine.js" from the consuming host? In the (my) best case it would directly enter the host's application.js without any further editing on the host side...
Any ideas? I tried looking this up on the internets, but so far I could not find anything that explains it (and I guess that this functionality ia more or less the point of the whole sprocket/asset pipeline).
On a very different note it is odd that I get so few responses lately...
You probably have already solved this, but for anyone else who comes across this.
Within your Applications /app/assets/javascripts/application.js file you add:
//= require my_engine

How can I use Mongrel for my non-rails ruby webapp?

I've got a non-RoR but ruby webapp in the works.
So far, I've just been using requests, hacks, and mod_ruby; but I'd really like to try out Mongrel--which seems to work really well for RoR sites.
I looked at the examples given in GitHub, and none of them does dynamic changing of content w/o having to restart Mongrel like you can do in RoR under dev mode.
How can I do this? (Just using load doesn't work.)
I use Sinatra with a Mongrel backend; hello world really is as easy as it says on the front page. I actually started with Sinatra, and then changed the server from webrick to mongrel after experimenting around with which gave better performance.
See this question for how that testing worked out.

Why is my sinatra website so slow?

After asking this question, I started using Sinatra as a way to serve web pages.
This evening, a friend of mine and I started to test the speed of the server.
The file to log in looks like:
require 'rubygems'
require 'sinatra'
require 'haml'
enable :sessions #for cookies!
get '/' do
haml :index
end
And the index.haml looks like:
%title
First Page
%header
%h2 First Page
He's sitting on a recent laptop, as am I, with an Apple 802.11n router between the two of us. We're both running Windows 7. I've also tried these same files on a laptop running Ubuntu 9.10 x64 with Sinatra and all relevant files installed from apt-get.
Sinatra is taking 7 seconds to serve up a single page request, no matter the server OS, Windows or Linux. I see that here the author managed to get over 400 requests/second processed. What gives? (or should this be on SuperUser or the like?)
I'll set aside any opinions on when you should optimize your web application.
Set up different configurations in your Sinatra app for development and production because some of these suggestions, you won't always want to use. In fact, you should probably go ahead and setup and environment similar to how you would deploy in production. You would not deploy by simply running ruby app.rb. You'd want to put apache or nginx in front of your Mongrel. Mongrel will serve up your static files, but that's really only advisable for development mode. In deployment, a web server is going to do a lot better job for that. In short, your deployed environment will be faster than your standalone development environment.
At this point, I wouldn't worry about Mongrel vs. Thin. If Thin is twice as fast - it isn't - then your 7 seconds becomes 3.5. Will that be good enough?
Some things to try ...
I know I just told you to set up a deployment environment, but maybe it's not the server side. Have you tried running YSlow or PageSpeed on your pages? I/O is going to take up more of those 7 seconds (Disclaimer: I'm assuming that there's nothing wrong with your network set up) than the server. YSlow - Firebug actually - will tell you how long each part of your page takes to get to the browser.
One of the things that YSlow told me to do was to put a far forward Expires header on my static assets, which I knew but I was leaving optimization until the end. That's when I realized that there were at least 3 different places that I could specify that header. I'm convincing myself that doing it in nginx is the right place to put it.
If you're happy with those results, then you can look at the server. Off the top of my head, so not exhaustive
Turn on gzip responses.
Combine your stylesheets so there's only one per page request. There may be some Rack Middleware for this, if you don't do it manually.
Cache. I'm trying Rack::Cache.
Use sprites to decrease the number of image downloads you use.
Minify your Javascript. Again, maybe via Rack Middleware.
Rack Middleware is neat, but it uses CPU. So, manually minifying your Javascript adds a new step to your workflow, but on the server, it's faster than Middleware. It's a tradeoff.
Sorry if this was rambly.
I had this problem when running Sinatra with shotgun but not when running my app directly (i.e., ruby -rubygems app.rb). This is because shotgun forks and reloads the application for each request.
I found a thread in Sinatra's mailing list which discussed this issue and people there advised using rerun instead of shotgun. I'm happy to say it solved this issue for me.
Try using Thin as the server. I noticed an increase in performance compared with WEBrick and Mongrel.
gem install thin
When you run your app using ruby TestServer.rb you'll see the following:
Sinatra/0.10.1 has taken the stage on 4567 for development with backup from Thin
I'm running Sinatra inside VMWare Fusion with Vagrant. My app was running slowly (about ten seconds to service a request). Then I found this gem:
Webrick is very slow to respond. How to speed it up?
It seems that WEBrick was (by default) configured to reverse dns lookup on every request, and that was slowing it down.

Resources