Posted: March 31st, 2010 | Author: jgeiger | Filed under: web | Tags: apple, fail, numbers | No Comments »
The problem is that it just doesn’t work.
Take a file with more than 50 lines. Paste it into Numbers. Notice that it gets cut off (for me it was 45).
How can you not expand the number of rows to fit the content you’ve pasted? Just wow.
Posted: March 22nd, 2010 | Author: jgeiger | Filed under: web | Tags: amazon, google voice, ipad, kindle | No Comments »
So it seems Amazon has created a Kindle app to run on the iPad…
If this makes it into the store, Apple will have a lot to answer for. There is no way they can approve this. It directly competes with the base functionality of the device. If it does get through, I want the Google Voice app on my iPhone immediately.
http://www.wired.com/gadgetlab/2010/03/amazon-shows-off-kindle-for-ipad/
Posted: March 18th, 2010 | Author: jgeiger | Filed under: Uncategorized | Tags: apple, fail, ipad, mac | No Comments »
I just wanna use it with my mac…

Posted: March 16th, 2010 | Author: jgeiger | Filed under: ruby, web | Tags: cloud crowd, gminer, mcw, rabbitmq, rails, redis, resque, ruby | No Comments »
I’ve been working on a project that requires the processing of a series of jobs. I had originally written my own system for doing this because I wanted to know more about how they work. After a time, I decided to modify it, and found that I had broken it. Instead of trying to fix it, I decided to see if there was anything out there that someone else had done that would work better for me.
Resque
My first attempt was to use resque. It worked, but as I started to scale things up, I ran into some issues that I didn’t like.
It polled the DB a lot. While it was in memory, it was a lot of “do I have a message?” checks which seemed messy.
It wasn’t fast. There was a lot of overhead. Things “felt” slow as they were running.
It was memory based. Redis will store data to the disk, but it’s meant as an in memory system which gives it the speed.
What I did like is that it worked. The jobs finished and there was a nice web interface to see what was going on.
Cloud Crowd
I had looked at Cloud Crowd before and it seemed interesting. I like the web dashboard but it was also one of the biggest problems with Cloud Crowd. According to the authors, it was created to handle a small number of very expensive jobs. I have no doubt based on my experience that it would excel in that environment. My problems consists of a very large number of small fast jobs. Cloud Crowd ground to a halt pretty quickly. The dashboard was taking too much time to render which began to multiple the render time and eventually it needed to be turned off.
The other big issue I ran into was with how the workers processed their jobs. It wouldn’t start another job until all of the other jobs it had created finished. If you have a scheduling job that launches 10 processing jobs, the system gets stuck waiting for the 10 processing jobs to finish before it can start another scheduling job. Again, it works very well. Everything gets done and you get a result string but it was slow.
RabbitMQ
I decided to figure out what was wrong with my system since it was working at one point. I’m using RabbitMQ as a message broker to pass the jobs back and forth between daemons running on linux machines. I believe my issue was caused by using a topic exchange with a key per worker. I was running into issues where some processors were picking up messages from the topic that were not assigned to their key. Once I realized this was happening I decided to go back to a queue per worker. I wanted to get away from that since originally I had been creating multiple queues in rabbit that never disappeared. I changed the queues to be exclusive. Exclusive means that only one client (processor) can read from that queue. It also makes the queue self-delete when the consumer disappears.
I’m attaching the code for my system below. I’ll post more about how each of the parts works later. I hope to add a bit more control into the system, but as of now it’s pretty self healing and very fast.
http://github.com/mcwbbc/gminer_scheduler
http://github.com/mcwbbc/gminer_node
http://github.com/mcwbbc/gminer_processor
http://github.com/mcwbbc/gminer_databaser
Posted: March 2nd, 2010 | Author: jgeiger | Filed under: grocery | Tags: pick n save, roundys, sendiks | No Comments »
Every week I go to the Pick N’ Save in Brookfield at 15170 W. Greenfield Avenue.
Every week I buy milk.
Every week I take a milk gallon up to the front desk that has a “Sell By” date that has passed. This week I took one up that was SIX DAYS past the sell by date. I’ve been doing this for the last 3 months EVERY WEEK. I’ve been told by the managers on multiple occasions, “We’ll fix it”. I was told once they hired a new Dairy manager to deal with it.
I give up. I’m going to Sendiks Fine Foods.
Posted: March 2nd, 2010 | Author: jgeiger | Filed under: ruby, web | Tags: google, rails, ruby | No Comments »
I just migrated a site that had a bunch of links that have been in in the search engines for a while. Oddly it seems that the only thing hitting those links seem to be the crawlers themselves. I needed a way to invalidate those links, since I couldn’t create a proper redirect because of changing IDs.
/records/show/12345 used to be valid, but has been replaced with the RESTful version /records/00123. The ID is now also meaningful instead of a MySQL generated id.
My first attempt was to just redirect to the 404 page.
record = Record.find(params[:id]
rescue ActiveRecord::RecordNotFound
redirect_to("/404.html")
But as I watched the logs, I noticed that this really wasn’t right since it was still returning a 302 (redirect) and the a 200 (OK) code for those links. The crawlers were getting the instruction that you should just display the 404 page for those links. That might seem OK, but really I wanted them to get the 404 immediately and remove the page from their databases.
record = Record.find(params[:id]
rescue ActiveRecord::RecordNotFound
render(:file => "#{RAILS_ROOT}/public/404.html", :layout => false, :status => 404)
By rendering the 404.html directly and including the 404 status code, it should help to fix the situation.
Posted: February 24th, 2010 | Author: jgeiger | Filed under: ruby, web | Tags: mongodb, rails, ruby, vps | No Comments »
I started looking into moving off of dreamhost because I’ve had some issues with responsiveness on my applications. For $20 a year, I could put up with it. Now that I’m paying $100, it’s a bit more annoying since there are other options out there at that price point.
I’m considering slicehost.com, linode.com and webfaction.com.
I guess the other big reason is that I want to play with MongoDB and each of these gives me that option.
Posted: February 24th, 2010 | Author: jgeiger | Filed under: ruby | Tags: bundler, rails, rails 3, ruby | No Comments »
I wish they would have made a bigger deal about this, but it seems that bundler now has two different gems.
bundler08 is for bundler 0.8.4 and such, which plays really well with rails 2.3.5
bundler is for bundler 0.9.x and beyond which plays well with rails 3 (and rails 2.3.5 if you can get it to work…)
This is a really good thing because you can now install both of them at the same time and the warning that you must un-install all previous versions of bundler is now moot. Really helpful if you’re running on dreamhost with mixed rails 2/3 sites.
Posted: February 16th, 2010 | Author: jgeiger | Filed under: entertainment | Tags: facebook login, really? | No Comments »
There was a post a while ago about how Facebook users don’t actually go to facebook.com to log in. They use the search field in their browsers for “facebook login” and just click on the first thing that pops up.
Here’s the blog post where I found this.
Here’s the actual page.
No wonder there are massive bot nets and phishing scams and email spams going every day. People are just… wow.
Posted: February 9th, 2010 | Author: jgeiger | Filed under: ruby, web | Tags: bundler, rails | No Comments »
Seems I was missing a few things.
Take a look at this gist and see if it can help you.
Edit: Updated the gist to a better one.