It’s been over a year?

Filed under:General — eric @ 10:48 am

Just stopping by to note that it’s been over a year since I wrote anything here. Huh.

All my action these days is on Twitter (and echoed on my right sidebar under the old musty photos).


More Delays

Filed under:General — eric @ 10:44 pm

Just popping in to say that the Food Network deadline was extended again, to November 15.

I think the reason is the unexpected departure of Mario Batalli from the network. As one of the Iron Chefs, they needed to replace him. Which they’re doing with a show very similar to “The Next Food Network Star” — “The Next Iron Chef”.

Which makes me wonder… do I want to win, now that I won’t be a colleague of Mario’s?

Yeah. Yeah I do.


Food Network Contest Delayed

Filed under:General — eric @ 3:19 pm

When I made the video, the deadline was July 31, and I pretty much had to throw the video together over a weekend. Then, the deadline was extended to September 1st. Just now, I see it has been extended again to mid October. So, more waiting.


The Final Cut (Maybe)

Filed under:General — eric @ 7:35 pm

I got some great feedback on my video, and I’ve made another cut to reflect them. I inserted 11 seconds at the beginning to set up the local food idea (something I’d cut out earlier in the editing), and to make up for that time I trimmed 11 seconds in several bits throughout the rest of the video. The result is a better story, but with maybe slightly less production quality. It’s supposed to be amateur, and the story is paramount, so I’m OK with that.

What’s this for again? Think “American Idol”, only with cooking instead of singing. Hopefully “instead”, anyway. I’m not exactly known for my singing.


Another Victim of Reality TV Syndrome

Filed under:General — eric @ 9:10 pm

So, I’ve been watching “The Next Food Network Star” on (of all places) the Food Network, and I get to thinking, “Hey — I can do that better than they are!” And a little ad comes up saying that the network is now looking for contestants for the next season, and all it takes is a three minute video showing what I’ve got.

And here it is. I’ve got a few more days to re-edit it if I want before submitting, but I’m rather happy with it just as it is. How about you? Would you watch my show?

If you’re feeling adventurous, here’s a nine and a half minute lightly edited first cut of the video.


Well, this is easy.

Filed under:General — eric @ 7:34 pm

Turns put to be very easy to write on the weblog from the iPhone. Does this mean I’ll write more? Don’t know, but it can’t hurt.


Live Demonstration of Slingshot

Filed under:RailsDay, Joyent Slingshot — eric @ 4:21 pm

The last week has seen a lot of changes to the Slingshot codebase that have made much of my previous work obsolete. That’s OK, though… the newest code takes care of a lot of the troubles I had getting things going.

I’m going to be doing a live demonstration of Slingshot in its entirety tomorrow evening at the Atlanta Ruby User Group meeting. I’ve spent the weekend making a dirt-simple Personal Inventory Application. It’s up and running on my accelerator right now, and I’m packing up a Slingshot application to download. I’ll show what goes into making an application Slingshot-ready and how to create the Slingshot application itself. Those in attendance with Macs* will be able to get online, create an account, download the Slnigshot application, sync the data down, go offline, make changes, go online, and sync those changes back up. Should be good times!

If you’re at all interested, come on by. If you RSVP, we’ll even have enough pizza to go around.

*Slingshot is not yet ready for Windows. If it is by tomorrow and I can easily package the app, I’ll let the Windows users play along too.


Slingshot On Target

Filed under:Ruby On Rails, Joyent Slingshot — eric @ 8:09 pm

When I last left you, I had moved a scratch copy of my application to a shiny new Joyent Accelerator, brought it current with Rails, and was preparing to migrate new created_at and updated_at columns to my database.

All that went well. Several of my models already had created_on (date) fields, but Slingshot needed more detail. Those got converted over to full datetimes. I also inserted raw SQL into my migration to quickly set all of the new created_at and updated_at to the current date/time.

The Slingshot synchronization process has two components: a plug-in/generator that adds a new controller and several methods to the “live” application and a somewhat complicated rake task that resides on the client side.

In the new controller you build an array of arrays that contain the data that is able to be brought up and down, using any rules and logic you need. For my first tests, I went ahead and included almost everything. In future work, it’ll have to be much more complicated, as my application has a three-tiered authentication scheme. First, each registered subdomain acts as a standalone instance of my application (though in truth they’re all served up by the same mongrel processes). Second, each subdomain has a set of users. Third, each user has a set of roles. There is a mechanism for passing authentication information from the client to the server, but in the interest of just getting things working I only bothered to check subdomain.

The controller (named in my routes.rb “sync”) has three main actions: “down”, “up”, and “log”. The down action builds the array of arrays of allowed data and the serves up an XML file containing the data as well as a number of meta data. The up action…. well, I actually haven’t yet gotten that far. The log action records the successful imports and exports, so it knows where to pick up next time.

The rake script does all of the client side work. It calls sync/down from the server, receives the XML data and saves it to the local /log directory, parses it, and performs the necessary deletes, updates, and inserts to the local sqllite database.

It took me a *long* time to get that part to work properly. First, it was silently failing and I didn’t know enough to be watching OS X’s terminal log to see what was going on. I actually opened it up by accident and found the error messages I had been looking for. The first few were related to errors in the documentation (then very meager but now much better as Joyent prepares for a general release), but I was able to get past those in pretty short order.

The rest were my fault. The data transfers are not raw SQL. They create instances of your Models and use all of the regular model methods, including validations. First, the instances were failing because I did not include all of the gems required by my application into Slingshot’s local VM (more on that in another post). Once I took care of that, then they were failing on the save validations. I have a number of custom validations that check for things such as uniqueness within a subdomain, and as I mentioned above, I was skipping most of my authentication for this test. I got past this by modifying the rake task to use save(false) (and thus bypassing validations). I think it’s safe to say the data coming from the live app has already been validated, so I was fine with that change. Then, saves were failing because of database integrity constraints. You see, when my real app first went live, I allowed null values for several fields that I had since switched to not. The old null values were still in the database, though, so when the imported data was saved, sqlite rejected them. I fixed that by changing the nulls to “Unknowns” and everything was fine.

So that’s where I stand. Slingshot is able to pull data down and I can interact with that data locally. Next up, sending the changes back up. And then, adding the real authentication.


Exploring Joyent Slingshot

Filed under:Ruby On Rails, Joyent Slingshot — eric @ 3:09 pm

Last Friday, I received the Slingshot SDK (Software Developer Kit). About an hour later, I had a copy of my Rails application running in an off-line, fully self-contained environment.

Of course, that was only the beginning, but it did right away show that you could use Slingshot to quickly deploy stand alone Rails applications. Slingshot provides the database (sqlite), the browser (Webkit in OS X and IE7’s engine in Windows), and the server, all in one application window. All you need to supply is the code. No one had talked about that use of Slingshot on the weblogs and forums (that I saw), but it was the first thing that came to mind when I saw it face to face.

My application was not ready for data synchronization. First, I hadn’t upgraded it to Rails 1.2 yet (it was frozen to a slightly pre-1.2 edge release). Second, all of the models to be synched need to have created_at and updated_at data — mine did not. Third, my live app is currently sitting on a shared TextDrive server, and a shared server is not the place to be playing with something like this.

Joyent is helping me with the third problem by providing me with a small accelerator for the duration of the pre-release testing period. An email mix-up on my part kept me from accessing the accelerator until late Wednesday. Yesterday, I logged in for the first time and found myself sitting at the business end of a console prompt in Solaris for the first time in 15 years or so.

I’ve been a shared host sort of guy since I’ve been on the internet, just before the World Wide Web was invented. Having my own server computer, getting it up and running from scratch, has not been something I’ve ever done. Still, by this morning, I had everything installed, Apache was proxying to four Mongrel instances, and a scratch copy of my Rails app was being served smokin’ fast. The documentation to get all this going is still spotty (accelerators are still a new offering, and the early adopters tend to already know what they’re doing), but I was able to piece enough together to get off the ground.

I’ve already frozen my application to Rails 1.2, so that step is out of the way. Now, I have to add created_at and updated_at columns to all my tables, and at that point I can begin adding code to support extraction for offline use and full data synchronization. I’m still not sure what that’s going to entail (I’ve been reading all about accelerators instead of Slingshot these last few days).


So It Goes

Filed under:General — eric @ 8:53 am



Successful Phone Call

Filed under:Ruby On Rails, Joyent Slingshot — eric @ 3:42 pm

I talked with David Young of Joyent and Jeff Mancuso of Magnetk (the developer of Slingshot). They asked me some details about locallygrown.net and possible offline use cases for it. We all agreed that it could very well be a good match for Slingshot, so the project will proceed.

They’ll be sending me a developer’s kit next week that will get me started. I did learn that I decide (at the controller level) what data (and controllers and actions) get taken offline and how the data gets merged back in. Slingshot provides the framework to get it done but I tell it *how* to do it. I like that.

Locallygrown.net is now sitting on a shared hosting server (don’t worry… I’m a good neighbor, or at least try to be). I’ll be migrating it over to a Joyent Accelerator, essentially a dedicated server running the Solaris operating system. This will allow for future growth, among other things. Since the move will be tied to getting Slingshot running, I’ll document that process here as well.


A new series of posts

Filed under:Ruby On Rails, Joyent Slingshot — eric @ 11:32 pm

Regular readers (all four of you) know that over the past two years I’ve picked up a new programming language, Ruby on Rails. I’ve been using it for every bit of web programming I’ve done over the past two years.

Most recently, I used it to build my farmers market system, LocallyGrown.net (my own Athens market). LocallyGrown is getting a lot of attention, and I truly feel it can revolutionize how small farms get thier produce on people’s plates.

The web hosting company I use, Joyent, has announced an exciting innovation for Rails applications that will allow developers to make their online programs work offline, with data synchronization when the user connects back up. This could be very useful for LocallyGrown, as market managers could take their online market with them on a laptop to the physical market, even if there is no wi-fi or other network connection on site.

Joyent has offered to give me early access to this framework, which they’re calling Slingshot. I don’t yet know how it works technically, and it may actually not be a good fit for LocallyGrown. The project kicks off with a coference call with the Joyent folks in the morning, and then we’ll take it from there.

One interesting thing about this early access program: I’m required to write about my experience with it, both good and bad, here on my weblog. So, this entry is the first in a series of entries that will document just that. I’ve created a new category, “Joyent Slingshot“, so all of these entries will be grouped together for easy access.

More to come!


The Food Chain (as understood by a two year old)

Filed under:General — eric @ 8:16 pm

Cows gives us milk
cows gives us milk
hi ho derry oh
cows gives us milk

Chickens gives us eggs
chickens gives us eggs
hi ho derry oh
chickens gives us eggs


Horses gives us… fish!
horses gives us fish
hi ho derry oh
horses gives us fish


Dylan Hears a Who!

Filed under:General — eric @ 5:00 pm

Dylan Hears a Who!

I’ve been meaning to post about some of the fine, fine music I’ve found here and there on the ‘net recently. I just started listening to this a few moments ago, and had to rush here to tell you all about it.

This is far, far better than it had any right to be.


Look over there — I’ve been writing!

Filed under:General — eric @ 4:58 pm

Just because I’ve not been posting here doesn’t mean I’ve not been doing things, you know?

I’ve got all these other weblogs here and there, so now this page will go and collect everything I write elsewhere (when it has the means to do so) and stick them over in the sidebar over there to the right. Below the pictures.

It’d be great if somehow I could get it to copy each of them verbatim as a new entry here, so it’d all be integrated, and you could comment, and so forth, but so far I’ve not found a way to do that.

So, in the meantime, just have a look over there, under the stale pictures (I really need to start taking more of those), and above the “My Status” block, and you’ll see what I’ve been writing elsewhere.


Just a few more weeks…

Filed under:General — eric @ 12:49 pm

Here’s a letter I sent out to my mailing list last night:

Hello again! It’s Eric, the fellow working on the on-line farmers’ market software you were at one time interested in.

It’s been a few weeks since I’ve written you, so I though it was time for an update. The system has come a long way since the last time. It’s not fully functional, but you can right now do a lot of the “grunt” work of getting your market online. I’m still on track to move my own market completely to the new system in early to mid January.

Here’s what you can already do using my system::

* You can create your market at a unique locally grown address (i.e. http://myfarmersmarket.locallygrown.net )

* Your market comes with a welcome page, an Frequently Asked Questions system, and a weblog (news page), all out of the box and all fully configurable and ready for your own content.

* Users can create accounts at your market. There are three levels: Market Manager (you, and anyone else you want to promote), Growers (all sellers through the market are called growers), and Customers.

* Any number of growers can join the market. Unsolicited requests require approval from a market manager before they are listed and can begin selling.

* Growers get their own “About” page and a photo gallery, with unlimited photos and captions.

* Market Managers and Growers can organize product categories and list products, giving them full descriptions, images, prices, etc. You can build your product category structure from scratch, or just automatically use the categories I’ve been using at my market for the last five years and go from there.

* Market manager and growers can quickly adjust availability, pricing, and other items at any time. Growers can only edit their own products, but Market Managers can edit everything.

* Membership is flexible. You can charge customers an annual membership (you set the amount). You can charge growers a fee to join the market and charge a fee to sell their products (either as a variable percentage of sales, set per grower, or as a flat fee per item).

* Pricing is flexible. Growers set their own prices. The market can tack on a surcharge for each item. The customer sees the total of the two. The Grower gets the sales price, minus any surcharge, minus any sales percentage. It’s hard to succinctly describe, but should be easy in practice.

All of that is working as of right now. Here’s what I’m still working on:

* Automatic sending of the availability email. Each week I send out an email to our customers with a little chatty news section followed by the complete listing of products for that week. They go to the website to place their orders, but they enjoy getting the email as a reminder. So, the new system will allow you to type the chatty news section through the weblog, and by checking a box it will email all your customers the weblog entry plus the product listing.

* Ordering system. This should come online very soon, probably within a couple days. Customers can place their own orders, and market managers can place orders for customers unable to do so themselves. Confirmation emails go out to both the customer and the market manager.

* Order processing. The market manager should be able to edit and adjust individual orders and individual items within the order. This includes price adjustments, credits, etc.

* Grower harvest notification. The growers can see the orders for their products in real time through the website, but at the end of the ordering window, the website will automatically send emails out to the growers letting them know of the orders, what needs to be harvested, etc.

* Label generation. Labels for each grower will be automatically generated as PDF documents formatted for printing to several standard Avery label sizes. The growers can print them on their own using their own printer (or the market manager can do it for them).

* “Delivery Day” reports. PDFs will be created for processing grower drop-offs/pickups, invoices for the customer, and packing lists for those putting orders together.

* After-pickup adjustments. Customer orders can be adjusted after the fact to account for rejections, shortages, credits, etc.

* Minor stylesheet issues. Internet Explorer, always difficult for web designers to work with, is not displaying some pages as nicely as it should. This is particularly true of the photo galleries. I’ll fix that.

And that about sums it up.

You can see what we’ve done with our market at http://athens.locallygrown.net — feel free to look around, “tour” our member farms (They’re used to me doing everything for them, but I’m walking them through uploading photos, etc.), and browse our product listings.

Some other markets have already begun putting their markets together using what I have in place so far. Cumberland Co-op in Tennessee is the farthest along — you can find their site at http://sewanee.locallygrown.net

Feel free to create a site for your market to get the ball rolling and see for yourself how it works. Just go to http://www.locallygrown.net and click on “Our Markets” to get started.

And as always, if you have any questions, feature requests, etc., please let me know. Over the last five years I’ve seen how our system has revolutionized marketing for small growers and farmers markets in general in our area, and I know it can do the same for yours.


The LocallyGrown.net model

Filed under:General — eric @ 5:27 pm

What are the characteristics of a LocallyGrown.net farmers’ market?

The produce is local to the market.

Every market may have a different idea of what that means. For our market in Athens, GA, nothing comes from further away than about 100 miles. The system won’t prevent you from selling something that traveled 1000 miles, but that goes against what I’m trying to accomplish here.

The growers set their own prices.

The system is meant to emulate many aspects of a traditional “booths and tables” farmers’ market. The customers are buying directly from the grower, at prices set by the grower. The grower describes what it available, supplies photos of the items, and sets the purchase price.

The customer has choices.

Just like at a traditional farmers’ market, the customer can browse everything that is available from all of the different growers. The customer can choose exactly what to buy, how much to buy, and from what grower to buy.

The customer has time to decide.

Unlike a traditional market that may be only open for a couple hours (with all the good stuff gone soon after opening), LocallyGrown.net markets are usually open for business for two days—long enough to fully browse the site and plan menus for the week.

Availability is flexible.

The growers estimate how much of each item that will be able to harvest a week ahead of time. This takes both skill and practice. Even so, unpredictable factors—such as whether or not it is sunny on a Wednesday morning—can make the difference between having a bumper crop or a very small harvest. So, the site will allow customers to keep on ordering an item even if sales have passed the estimated availability. The item might not be there when the order is put together, but then again, it just might be.

The produce is harvested to order.

After the ordering window has closed, the growers are notified of all of their orders for the week. They usually have a day or so to go out and harvest exactly what was ordered, package it, and deliver to the pick-up site. The produce is not coming off from a shelf somewhere, but is coming straight from the field to the customer. Of course, this doesn’t apply for some items. Garlic, for example, is often cured for a while before sale. Jams and other preserves may be made in batches. Honey is processed seasonally and then stored. Soap is made in batches. You get the idea, but most things will indeed be harvested to order.

Payment is taken when the orders are picked up.

Most markets will have a set time and location for customers to pick up their orders. Payment is not made in advance through the website but is instead made in person when the order is picked up. This is because adjusting the amount owed for an order will be a common occurrence. Maybe something ran short due to bad weather, or maybe there were extra items available on the table when the customer arrived, or maybe the grower decided to adjust the price down at the last minute to account for an imperfection. In any case, it is much easier to do this in person rather than going back and trying to issue credits and adjustments through the website.

One aspect to this, however, is that if a customer places an order but for whatever reason does not arrive to pick it up, the customer is still responsible for paying for that order. Since everything is harvested to order, the growers still had to work to put the order together, and should therefor still get paid for that effort.

That is what makes a LocallyGrown.net market.

There are other details on how the site works, but in a nutshell, that is what sets our markets apart from buying clubs, CSAs, and traditional farmers’ markets. Over five years in Athens, GA, the system evolved that included the best points from all of those while minimizing the downsides for the customers, the growers, and the community.

From The LocallyGrown.net Weblog, now making its first public appearance. Don’t Slashdot it yet though — it’s not quite ready for the masses.


Locally Grown Update

Filed under:General — eric @ 8:42 am

I’m making some serious strides in my efforts to let other groups painlessly replicate the farmers’ coop we have here. I’ve more or less finished the part that lets one create a new online market (including a weblog, FAQ section, and photo gallery), lets growers join the market (and fully describe their farm, including a photo gallery), and lets customers register at the market. To do is the (rather sizable) task of letting the growers list their wares, the customers to place orders, and the backend to process the orders. But, I’m right on schedule.

Here’s a video that was shot during a market pickup last season by Georgia Organics that describes what we do and why other communities will want to follow in our footsteps:


Habeas Corpus, R.I.P. (1215 - 2006)

Filed under:General — eric @ 1:27 pm

This is What Waterboarding Looks Like, courtesy of the Khymer Rouge at the Tuol Sleng Prison in Phnom Penh, Cambodia. And now brought to you by the good ol’ U.S. of A.

They are cowards.

Either the current administration is populated with cowards without even an iota of honor or they are subverting our Constitution and the honor of our country for purely political gains. The lesser of the two evils is that they are cowards in a crisis that is well beyond their capabilities to handle.

They want us to believe that THIS crisis is the greatest threat our country has ever faced.

Greater than the Revolution when our very existence was in question.
Greater than the War of 1812 when our nation’s capital was burned and pillaged.
Greater than the Civil War when our nation was torn asunder, brother fighting brother.
Greater than World War 2 when we faced a world wide threat of totalitarianism.
Greater than the Cold War when we faced global annihilation.

If they truly believe this, then they must be cowards.

Granted during some of these conflicts we did forget our principals at times and have later regretted the actions. Also granted that in any conflict there will be incidental examples of horror. More importantly some of these crises have given us shining examples of how Americans are supposed to act. How Americans stand on the moral high ground even during our darkest hours.

George Washington refused to torture the Hessians. General Washington said we will not do this. He said these people will be treated with respect and dignity and they will suffer no abuse or torture, because to do otherwise would bring dishonor upon our sacred cause. Where is our honor now?

During WW2, there were reports that American commanders released German POWs because they could not adequately protect them. Consider how we treated the Japanese POWs honorably even when we knew how they treated their prisoners. Where is our honor now?

None of these conflicts caused us to abandon our founding principals as completely as the current Administration is asking us to do. They have replaced “Give me liberty or give me death” with the completely onerous “You have no liberties if you’re dead”. They have forgotten the words of our birth “We hold these truths to be self-evident, that all men are created equal, that they are endowed by their Creator with certain unalienable Rights, that among these are Life, Liberty and the pursuit of Happiness.” These rights are unalienable and they apply to ALL men.

They want to engage in activities (torture) that the rest of the civilized world has abandoned. No one other than pundits and politicians has claimed torture works. The people directly affected by and implementing the policy of torture have stated that it DOES NOT WORK. Israel, which has been on the frontline of terrorism for decades, abandon the practice. When these same activities were perpetrated on members of our armed services, we were rightly horrified and demanded that they cease.

If they want to do these things in my name, stop. If they want to do these things to make me feel safer, stop. Do not bring dishonor to my name or my country because you are cowards.

– Posted by an 8-year Marine


Ten Years of Stalking Finally Pays Off

Filed under:General — eric @ 2:49 pm

After nearly ten years of living and working around Athens, I finally saw R.E.M. perform at one of their notorious unannounced performances. It was a combination release party for And I Feel Fine: Best of the I.R.S. Years 1982-1987 CD and When the Light is Mine: Best of the I.R.S. Years 1982-1987 DVD sets from R.E.M. and Finest Worksongs: Athens Bands Play the Music of R.E.M. benefit CD. I had a hunch, and sure enough the original four (plus another fellow I didn’t know) were the second band to play. Mike Mills and Peter Buck returned to the stage throughout the night to play with the other bands. Thirteen dollars was quite a small price to play to see R.E.M. play from ten feet away at the Fabulous 40 Watt.

EDIT: I knew he looked familiar, but I couldn’t place him at the time. The fifth band member was none other than Young Fresh Fellows frontman Scott McCaughey. I think that probably maximizes the jealousy felt by my fellow Techies.

· next page