Header text

EssayTagger is a web-based tool to help teachers grade essays faster.
But it is not an auto-grader.

This blog will cover EssayTagger's latest feature updates as well as musings on
education, policy, innovation, and preserving teachers' sanity.

Sunday, July 31, 2011

Progress update: 3,605 lines of code so far

Lines of code don't really tell you much of anything; it's all about quality over quantity and good programmers tend to code more concisely and efficiently than novice coders. But it is fun to check the numbers from time to time. Here's where I'm at thus far:

3,605 lines of actual code. That's pretty solid, especially considering that I've put a lot in place to avoid repetitive "boilerplate" code. Each Java file averages only about 50 lines of code; that's pretty light and efficient--the way I like it!

Code "comment" lines are super-important; that's where the developer explains to other developers (or him/herself) what the code is doing. Comments should count toward the total.

And even "blank" lines are important, otherwise all of your code is jammed together and is a lot less readable. I program like I write essays--with distinct paragraphs where each paragraph contains its own complete thought. Whitespace matters.

So if we add back in the comments and the blank lines, we get 5,630 lines!

Whew! Toldya I was busy!

Thursday, July 28, 2011

Time-out for: Mosquitos... and the death of the English language

Oh, the pain.

I'm suffering from two mosquito bites that are out of reach of my normal method for alleviating the itch: scalding them with hot water. I claim that there are vaguely scientific reasons for why the scalding hot water does actually work (I'll get to those at the end).

But I figured it couldn't hurt to google--yet again--to see if there was another remedy to try. I came across a particular Yahoo article that was vaguely interesting. The reader comments had a lot of home remedies to offer as well.

Now let me warn you. Plenty of readers had mistakenly used the possessive S "mosquito's" when they meant the plural S "mosquitos." That happens all the time. Everywhere. Sorry, English teachers; this might be a battle we cannot win.

But nothing could have prepared me for the grammatical terror of this comment:
Click to view full-size, if you dare

Friday, July 22, 2011

How to programatically upload a file to Google Docs when you can't create a java.io.File in App Engine

Google's Data API (gdata) makes accessing their suite of tools and sites a lot easier than making direct HTTP calls to the Web-based service interfaces. But there don't seem to be too many code snippets out there--or at least not enough that do what I want to do.

I have a document that was uploaded through a Servlet and is now sitting in a byte[] array. Now I want to upload that file to my app's Google Docs account. Here's what Google's documentation offers:

Fairly straightforward, but there's one catch: The setFile() method is expecting a java.io.File. Normally that isn't a problem, but if you're developing in Google App Engine (GAE), then you know that you can't create filesystem files.

Digging through the DocumentListEntry code (thank you, Google, for making gdata open source!!) I was able to figure out how to avoid this File creation entirely:

Wednesday, July 20, 2011

Elegant coding with Objectify, Java generics, and interfaces

David Chandler posted code for an ObjectifyGenericDao on his blog. It takes care of all of the typical Objectify datastore operations you might need to perform on any kind of entity type.

It works great as-is. Here's a code snippet of the generic DAO in action:

Pretty simple. You define the generic type as you directly instantiate the DAO and you get instant access to ObjectifyGenericDao's suite of basic datastore operations.

But directly instantiating any service layer should set off an alarm in your head: "Wait! I'm supposed to code to interfaces!"

Tuesday, July 19, 2011

Google App Engine update: OAuth2 access into Google Storage!

This isn't the biggest accomplishment ever, but it is a necessary step for what we want to do.

I still don't like that I have to use three-legged OAuth2 authentication from my company's Google App Engine site into my company's Google Storage cloud storage account. I should be able to trivially directly connect them (tighter Google Storage integration is high on the GAE team's to-do list).

But instead I'm forced to use three-legged authentication which, by design, protects my Google Storage username and password from my GAE app. Call me crazy, but I'd much rather just store my Google Storage account info in a protected properties file and let my GAE app log in directly. I don't need the level of indirection/protection that three-legged authentication provides.

In fact, it makes me worry more. Instead of a permanent link between my app and my cloud storage, I have a refresh token that I use to ask Google Storage for permission to do anything. If anything goes awry with that refresh token, my app can no longer access its own cloud storage provider. That's a problem. And resetting that connection requires manual intervention on my part--I have to re-initiate the authorization process by hand and approve the connection, then feed the resulting access code to my GAE app so it can then get a new refresh token from Google Storage.

Sound complicated? It is. And for direct internal access, it's way too cumbersome. I'm going to have to build an interface to streamline the process of re-authorizing my site with my storage just in case something goes wrong with the current refresh token.

But the good news is that the code is working and I'm able to make authorized requests into Google Storage.

Up next: Upload a file from a Web browser and push it into the cloud.

After lunch. Maybe.

Friday, July 15, 2011

Time-out for: Kind words from my students

I love that I had all seniors the last two years. It makes it easier to leave my position at the school knowing that we're all moving off toward our own new adventures.

The kids were a little shocked to hear that I resigned but they've been super-sweet and supportive.

I wanted to collect some of the things they had to say in one place and I figured I may as well share it with y'all too.

"I'm just sad my sister won't be able to have you. You were one of my favorite teachers and I hope that even out of the classroom you can put your talent to good use and influence kids in alternative ways. Thank you for being awesome. Good luck wherever your life takes you now."
--Colleen R.

Tuesday, July 12, 2011

Diving into Google App Engine!

As discussed in a previous post, it's become obvious to me that Google App Engine (GAE) is really the only viable choice, given how I feel about server uptime, config, backups, disaster recovery, etc.

GAE's cutesy logo
So this is Day One of figuring out this weird, sheltered, somewhat limited environment that is GAE. I won't be posting daily updates, but I will post major progress points. This blog is as much a public information portal as it is a diary for me to remember how this company got itself off the ground (well, let's hope it does!).

And this will definitely prove to be a major piece of the puzzle; the odds of this company's success ride squarely on my ability to hitch ourselves to that silver and blue engine.

Here we go!

Source code control on the cheap: Assembla

A solitary developer at a tiny startup can use Drobox as a poor man's source code control system. In fact, that's what I started with to use as a just-in-case code backup. It's also super-convenient for syncing work between multiple computers (see my extended post on Dropbox). Not so great for team-based coding though.

Pretty soon though you'll want to incorporate a real source code control system--CVS, SVN, take your pick.

Latest addition to the team: Mike, Visual Designer

I've tapped Mike, a former co-worker, to be our visual designer for the interactive Flash portions, the Website look-and-feel, and the EssayTagger logo!

Here are a few samples of his work:

Print work for Sony

I almost worked for these guys (or their parent company) in Austin, TX!

Mailer for the company where I met Mike: AlphaDetail, Inc.

Check out the rest of Mike's online portfolio here: mikegracedesign.com

I have reasonable aesthetic sensibilities (I am, after all, a photographer), but I really don't have the chops to be a full-blown visual designer. Having a professional visual designer of Mike's caliber working for us is a huge win; we'll look much more established and impressive than we would if it was just me hacking elements together in my spare time.

That being said, we're still a tiny organization. I'm the only full-time employee. Mike has a full-time day job and is contributing what he can in his free time. Since Mike is a friend of mine and a believer in the project, we've been able to work out an arrangement where his compensation will come in the future. This preserves our tiny cash reserves while giving Mike incentive to see us be successful; he'll profit as we profit.

I'll see if I can get Mike to occasionally post here as he develops and refines the visual design for EssayTagger.com!

Teacher Tech Tip: Cloud storage via Dropbox.com, pt3

Cloud storage via Dropbox.com, pt1
Cloud storage via Dropbox.com, pt2

Part 3: How I set it up

Creating an account at dropbox.com is trivial. You can figure that out yourself. Then I had to have our tech folks install the Dropbox application on my school laptop for me (we're not given the adequate permissions to install software ourselves). They said that they could not "officially" support Dropbox--meaning that if anything went wrong, I was on my own. They also knew that I was uber-tech-savvy so they trusted me to not make a total mess of things. The point is: it may take some convincing, but Dropbox is super-simple; you're really not taking on a huge risk here.

Installing the Dropbox app creates a Dropbox directory on your computer.

Dropbox integrated into the MacOS Finder

Then I organized ALL of my school files under the "Dropbox >> Public" directory. I did this because I knew I'd want certain files to be public--like my assignment writeups--so for simplicity I kept everything under that directory (reminder: despite the name "Public", the files I chose not to share were still perfectly safe and protected).

All of my directories that lived under the Public folder

I created a directory for each prep and then organized all of my files inside that directory. Here's a look inside my Senior English directory structure (notice the breadcrumbing links that show each level of the directory hierarchy: Dropbox >> Public >> Senior English >> Q2 >> Sir Gawain):

Note: These screenshots are of Dropbox's Web interface. But the easiest way to organize all of this by just creating folders and moving files around on your actual computer, under the Dropbox directory. The only reason I used the Web interface screenshots is because I already wiped my school laptop so that I could return it to them.

Then just make sure that every file you create for your class goes in the appropriate place under the Dropbox folder. And, voila, you have instant cloud-based backup working on your school computer!

So let's put it to the test. Want to see what I make the kids do in those Sir Gawain Reading Questions assignments? Here's the public link to the Reading Questions for stanzas 1-33. Enjoy!

Then, if you'd like to sync your files at home: install the Dropbox application on your home computer, link it to your Dropbox account, and it will immediately begin syncing your files between work, home, and the cloud.

Pretty damn cool stuff, eh? Toldya.

Update: They have larger referral bonuses for accounts from a .edu domain! You and your referee get bonus free storage space. This double-incentive referral system is actually a big part of their massive, sudden popularity.

Teacher Tech Tip: Cloud storage via Dropbox.com, pt2

Cloud storage via Dropbox.com, pt1  

Part 2: What are the cool things you can do with it?

Sync to other computers
You can set up Dropbox to sync your files not just to the cloud but across multiple computers. Anything that is in your Dropbox account on one computer will be automatically synced to all of your computers.

Start writing up an assignment on your work laptop. Save the file in your Dropbox folder. Leave the laptop at work. Go home. Guess what's waiting for you on your home computer? That's right, the file that you created at work. Keep refining the assignment at home. Go to work. There it is. Mind-blowing.

Access from anywhere on the Web
You're meeting with a colleague and you need to bring up an assignment but you don't have your laptop with you? No problem. Open a Web browser and login to your account on dropbox.com. You'll see the exact same directory structure that is on your laptop. Click on the file you want to download and view it. Done.

And you can upload any file you want to your Dropbox account through a Web browser. And once it's uploaded it will instantly sync with your other computers. Upload via Web and it'll be synced to your school laptop the next time you open the lid.

Access from Web-enabled mobile devices
Out at the club and want to impress the ladies with your amazing Shakespeare PowerPoint presentation (hey, it could happen right?)? Take out your iPhone/Android/whatever and fire up the free Dropbox mobile app. Navigate to your Dropbox directory and download the file to your phone.

Or, more likely, you see a sweet grammar error on a huge outdoor billboard. Snap a picture of it with your camera phone and then "share" it to Dropbox (that option automatically appears once you install the Dropbox app on Android). It will deposit your image in your Dropbox account and you can pull it up at school the next day to show to your kids.

Share files without actually emailing the files
This one really blew my mind. Dropbox automatically creates a "Public" folder. Anything you put in there can be shared with anyone on the Web (don't worry, by default no one can see anything in there). You just ask Dropbox to generate a public link to that file. Anyone with that link will then be able to download the file.

Here's the mindblowing part: The recipient will download only the latest version of your file.

I sometimes find it necessary to tweak assignments. Usually it's to clarify an instruction. But once the kids have the assignment, it's usually too late to change things. But now I can post the public link to the assignment instructions (I have a class moodle site) and I can make changes when necessary. When a student clicks on the assignment link, she will see the most up-to-date version.

Consider another file that often changes: my gymnastics team roster. As the season goes on, kids inevitably quit or sometimes we actually gain a few kids. The activities office needs updated rosters at various points in the season. Instead of emailing them multiple versions of an Excel spreadsheet, I can just send them that one public link to my roster file. I update it on my school laptop. Dropbox syncs the new version to the cloud. The activities office can click on that same link week after week and will get the most up-to-date version of the file each time!

This totally avoids the confusion of, "Wait, you sent me three versions... which one should I look at?"

Amazing. There's no reason to ever email a file as an attachment again. And, as an added bonus, you don't clog up people's Inboxes with large attachments.

Next: Part 3: How I set it up

Teacher Tech Tip: Cloud storage via Dropbox.com

Cloud storage will make your life easier by giving you fool-proof file backups and super-useful new ways to access and share your files! Invaluable for teachers and, well, everyone.

I assure you I'm not a corporate shill (well, other than for my own company, that is), I just like to spread the word when I find a service that I like. Well here's a service that I LOVE:

Dropbox.com is free cloud storage. It's awesome. I used it during this past school year and it kind of changed my life.

Why is cloud storage a big deal and why should you care?
At a basic level cloud storage is a super-easy and super-reliable way to backup your files. But once you've backed up your files to the cloud, there are many awesome new ways to access and interact with your data. It's kind of mind-blowing.

I'm a tech geek and it took me a few weeks to really wrap my brain around what was now possible thanks to cloud storage. It's more than just a backup; it's a massive paradigm shift.

This post is written for teachers but it's also tagged "startup" because anyone building a business could benefit from what cloud storage / Dropbox has to offer.

Monday, July 11, 2011

Sunshine, southern California, and... recruiting?!

From: Marina del Rey, CA
I lived in LA for six years so every summer I come back to enjoy the sunshine, spend time with my acrobat friends on Muscle Beach, and just relax. Well I've just arrived in LA, but this year I'm on a mission: I'm building EssayTagger.com even while I work on my tan and burning off my winter fat!

Here's the view from my "office" (aka the Marina del Rey Starbucks):

I'm also working my contacts while I'm out here. LA isn't nearly as jam-packed with tech talent as the Bay Area is (I lived up there for two years before LA), but there is a lot of development going on down here.

I have an acquaintance that I'm trying to recruit to do some of the more hard-core Flash ActionScript development. And I'm piecing together the company's advisory board; a friend of mine in Santa Monica successfully started his own social networking site (no, I'm not friends with Mark Zuckerburg) and I'm hoping to get him to sign on to advise us as we build and grow.

As you can see, building a company is very stressful
On top of that, I've got to crank through the Java development while I'm here. Our mid-August demo target comes a mere 2-3 weeks after I return from LA. I've got to get the bulk of the work done while I'm here.

So this really is a working vacation--and arguably more work than vacation (right, IRS?).

Thursday, July 7, 2011

I'm going all-in!

As of today I have resigned from my teaching and coaching positions. Building EssayTagger.com will be my sole focus for the foreseeable future.

I agonized over this decision for months, but it essentially boiled down to the push and pull of two factors.

The first was that it was becoming clear that I could not function to the best of my ability in my current environment. I loved everything that was going on inside of my classroom, but--as most teachers are well aware--the frustrations outside of the classroom can become toxic and unbearable. I was working way too hard to be that unhappy.

But I don't want to dwell on past frustrations. This space is about looking ahead, working toward an exciting future.

And that's where the second part comes in.

A friend's photo, but a familiar sight. Poor Jess!
My mentor told me that grading essays was by far the worst part of being a high school English teacher. I'm sure you teachers out there know well where he's coming from. I certainly felt that pain when I had 102 Senior English Lit synthesis papers come in on the same day.

While crawling through those papers I began to dream of ways to make grading more efficient. And then a killer idea crystalized.

As the days and weeks and months went by it became more and more clear that I needed to pursue this idea. It IS the future of grading essays.

As a result, I'm pushing forward with an incredible amount of excitement that far outweighs the frustrations of the past.

I hope those of you who are teachers will forgive me for stepping off the front lines. But I believe in this product that we're building and I am confident that it will improve teachers' lives (how exactly will EssayTagger.com help you grade essays more efficiently? Well, we're still in stealth mode so you'll have to wait a few more weeks to find out).

So while I may no longer be directly impacting students, I am hoping to directly impact teachers (and, let's be honest, make a modest profit along the way!).

I also knew all along that this company would require my full attention; there was no way that I could build it in my free time and still teach and coach. I mean, "free time"?! What free time?! This was always going to be a full-time commitment.

The future looks bright
I am, by nature, a very risk-averse person. I hate gambling. I generally focus more on avoiding the worst-case scenario than shooting for the best-case scenario. It's not very exciting or sexy, but I play it safe.

And yet I have resigned from my job and am launching this startup company with zero fear. I am not up late at night, biting my fingernails, wondering if I'll default on my mortgage. Maybe I should be. Maybe I'm a fool.

18"?! Just give up!
But I know the pain that teachers feel when grading papers and I know that this product we're building can be a huge help. I know that the technology hurdles are daunting--especially since I'm about five years out of date on the latest programming tools and trends!--but I'm confident that I can overcome them. And, as you'll see in the coming weeks, I have access to some incredibly gifted and resourceful people that will be involved in the business.

I'm too optimistic and too excited about all of this to be nervous or scared. The opportunity here and the possibilities are so great that they've overridden my conservative, risk-averse nature.

I know that our profession needs as many dedicated, talented people it can find. I'd like to think I was one of the ones that fit that bill. And I am sorry to leave the ranks. But if I--if we--can make this project a reality... well then we'll all have reason to celebrate.

The plan
Obviously we are already a few weeks into this project. Luckily I've got my brother-in-law on board to help with the business side and I've been reaching out to people I know who can help out on the technology side.

We are tentatively planning a modest round of financing in mid-August to cover operating expenses for the first seven months. That's also the target for a working demo or site beta so we can show the investors what it is they're investing in.

Early September is the target for the actual site launch. We would likely begin with an open beta period for a month or so as we polish off the rough edges and continue implementing more features.

By October we should be fully up-and-running, focusing hard on spreading the word and attracting new users.

We've already figured out how to run the company for a ridiculously tiny amount of money. mostly thanks to crazy advances in technology and the fact that we'll only have one full-time employee: me! A small additional financing round will probably be necessary in March to bridge us to the point where we're making a profit.

I would like to give this company at least a year to see where we end up by September 2012. Because of the low costs of the operation, we don't need insane adoption rates to reach the break-even point. Our initial goal is to hit 1,000 paid users within the first 12-18 months; by Web terms that's just a drop of water in the ocean. There are about 125,000 high school English teachers in America, 114,000 Social Studies teachers, and untold tens of thousands of university instructors and professors that might benefit from our product. And we're just looking to nab 1,000 of them, initially.

I like our odds.

One final pic: At the peak of her insanity, Jess posted this photo with this caption:

"I r helpin u grade, cuz my grammer iz better than theirs."

And no, cats trained to grade essays is not the solution I have in mind. Though I think maybe Flynn here should be our mascot!

Hello, EssayTagger!

Thanks to Keith for that great introduction a few weeks back. Truth be told, my involvement here started over the dinner table and I managed to successfully insert myself in the business. I guess that negotiations class in b-school did come in handy!

All joking aside, this project hits two of my passions: education and technology. Education because - well, who doesn't care about education? I was blessed with a great education with some wonderful teachers back in my time, and I've always wanted to give back to improve the quality of education and teacher's lives. And technology because that's always been my interest from the first day I laid fingers on an Apple IIe back in grade school. My career to date has been on the business software side of things, so I'm looking forward to doing something really amazing to help people (and not just some organization's bottom line).

I'll be posting occasionally about education, the business as well as my non-programmer perspectives on technology. Chief Everything Officer? COO? Whatever my title, I want to have some fun and make a difference!!

Tuesday, July 5, 2011

A Big Decision: Use a traditional Web host or commit to Google App Engine (GAE)?

Oh tradeoffs, why must you torture us so?


The dilemma:
One of the hundreds of things on my to-do list is to figure out Web hosting. For what we want to do a Virtual Private Server (VPS) or cloud VPS seems like the best option. A standard Tomcat host environment won't work because our current designs rely on having OpenOffice installed as a service that we can make calls into. A VPS solution essentially gives us a fresh server that may or may not even have an OS installed on it yet and we can install and configure it however we like.

A VPS setup gives us that freedom and a cloud-based VPS gives us scalable horsepower. Awesome.

But what happens when the server instance crashes? What happens when the database crashes? Presumably a VPS (and certainly the cloud variety) would have redundant-enough distributed/RAID data storage, but what happens if we do suffer data loss?

Any half-decent dot-com needs to have recovery strategies in place to handle any possible calamity, regardless of how unlikely they are.

And here's our first problem: I'm not much of a hardware guy. I really do NOT want to muck through all of this.

But even if we had the world's greatest server admin, we would merely be in good position to recover from disasters when they happen; no one--no matter how good--can make server disasters disappear altogether.

And a VPS--or any Web host or colo option--requires too much machine/environment maintenance and disaster recovery.

The solution(?): Google App Engine
The best way to offload these concerns seems to be to run your code off of Google App Engine (GAE) instead of a traditional Web host/Web server.

Friday, July 1, 2011

Two-legged authentication via OAuth2 to Google Storage: Easier than it seems

First of all, if you're reading this post on purpose and have any clue what the title actually means, then you're in the right place.

If you aren't a tech geek, give up now and make better use of the next five minutes of your life.