Rewriting the landing page

The Marketing Examples newsletter hits my inbox irregularly, but it’s always been valuable. I’ve re-read the Guide to Landing Pages That Convert several times.

Wanting to get out of a winter/Corona funk, I’ve decided to invest some energy in sprucing up the Worksheet Generator. I still think it’s my best chance to convert something I’ve made into a second income. And, reading the examples he provides, I think “I can do that.”

Sitting down to actually do it, it’s much harder.

I use too many words. Still, I’ve tried to cut things down. The current landing page is at dynamic-efl.com, you can have a look a that, if you’re curious. Once you’ve seen that, here’s what I have:

The unformatted landing page

Above the fold:

Title: Provide your learners with tailor-made vocab review and save time.

Subtitle: Review worksheets so specific, they’re single-use. Made with only moments of effort. (Learners will think you spent hours.)

Instead of social proof: Vocabulary isn’t easy for learners, and no amount of work you do will make it easier. You can give some structure and a clear review task to do.

Visual: Video showing Dynamic-EFL in action (not a walkthrough, just moments of it in use) (see below)

CTA: Button: Try it for for 3 months, no charge Subtitle: (not even a charge card)

Below the fold:

Make it concrete: Manage a vocabulary list for each class and generate structured review worksheets and one-off review activities.

Classroom vocabulary rotates through different activities, coming back again in the next worksheet to refresh learners’ memories. Use the same vocab list to make crosswords, word searches, memory, and more.

Frequently asked questions:

Do I really want to give my learners another resource printed off from the internet?

No. That’s why I don’t brand the worksheets. In fact, the goal is to make this look like you did all the work. Use your own branding or change the text on one worksheet–or on every worksheet you make. 

Do I really have time to do the extra work of making worksheets for each class?

I don’t know. I can say that, not counting writing down the classroom vocabulary as we go in class, I invest about two minutes per class. The secret? Most of the work has already been done, and the rest is easily done by a computer.

I have my own way of explaining things. Should I worry that yours will confuse my learners?

Probably. I think you can use 99% of what I’ve written as it is–especially if you’re teaching Germans (they’re who I write for)–and I’ve included tools to let you tweak things as much or as little as you think you need to.

I don’t really have time to learn something new. How difficult is this to learn?

Not very. I’m a teacher and built this for teachers. If you can type vocabulary and click on “make a worksheet,” you already have the skills you need.

Second call to action:

Let me start making your review worksheets and I think you’ll see the value of what I do. I’m so convinced that I’m ready to do it for free.

Button: Try it free for three months

Subtitle: (no credit card required)

Founder’s Note: I’m a teacher, first, not a coder. But, when students told me they “couldn’t learn vocab” or were “too old,” I knew that my standard bit about how to learn vocabulary didn’t help, it just made me feel better by making it their problem.

I teach adults: none of them needed another problem. They needed a teacher who would step up and find a way to help

I began to make structured review activities. They were a hit. Students saw their own success and thought I was a big part of it. It felt good to be a part of their success story.

But it also ate time. Lots of time.

So I thought of automating it with a software product. And, when I realized what it would cost to hire a coder to make it for me, I taught myself to code. (We all have dry spells in freelance work, right?)

Very quickly, it went from a time-suck to a time-saver. I had time to help my students in other ways (see my collection of stories and other worksheets), but I still think of this as my greatest teaching idea, yet.

Automating it doesn’t only mean that I can produce great worksheets in minutes. It means that anyone can.

Video script:

The idea is simple. As I teach, I write down the words that I’m introducing–and also the vocabulary that comes up as learners talk about their own stories.

After class, I type the words here into the classroom’s vocabulary list. That’s done in seconds.

Then, I double-check that the vocabulary is being understood correctly–a table can be furniture, but it can also be a tool to format a document–and I’m done.

For a worksheet, I click and skim through the worksheet that the system wants to make for me.

When I got that much done, I was proud of myself. The magic is in the next worksheet, though, when vocabulary from the previous worksheet comes back.

That’s the gist of what I do in a nutshell, but if you want to keep watching, I’ll keep talking.

From the same vocabulary list, I can make a memory game… a crossword puzzle… a word search… or a vocabulary puzzle…

When vocabulary enters the classroom list through one student’s funny story, I can make that part of the definition of the word… or I can make that part of the gapfill sentence. Learners see that one, small personal touch and think that I made the whole thing.

I mean, I did make the whole thing–these are translations, definitions, and gapfills that I’ve created over years of developing this–but your learners will think that this was all your work. You can reenforce that impression by putting your branding on the worksheets, or by setting up your own default definitions and gapfills.

(I timed a read-though of this about just about two minutes)

Next steps

You’d be forgiven for thinking that the next thing for me to do is to just copy and paste that in some format on the landing page and see what happens. But I have a grander vision.

I’d like to take my time and format everything new with my newfound CSS skills from freecodecamp.org. And, while I’m doing that, I’m thinking about how to do my own stats.

Feeling Inspired by a Changelog

In what is material for another post, I recently decided to take another class in Django. And, in lesson two of Django for Everybody, I thought “I should start a project to practice on.”

That lead to me thinking it wouldn’t be all that much work to get a barebones version of Governors and Generals going. How hard could it be, right?

Turns out, it’s not super-hard–the literate programming preparation I did really helped–but it’s hard to know where to stop.

Enter the eldest son. He’s been looking over my shoulder as I do these things and I try to always have time to explain what’s going on. Some of his suggestions are our of my league (“there should be a 3D version to download”) but on suggestion changed the way I’ve been working: He said I should put a version number at the bottom.

So, I did. It was simply a matter of altering the footer template. And then I thought: “this could be a link to a changelog page that lists the stuff added. Then, I could look back to see the work I did.”

That was done pretty quickly.

Today is my third day of working on the project and I’ve found it to be quieting to finish the day’s portion of work by writing short, bullet-point entries about what I did that day. It’s nice to think “yeah, I got some stuff done.”

What’s more, starting at version 0.0.1 I’ve decided that version 0.0.2 will be reached when I’ve made something to put on PythonAnywhere and ask people to have a look at it. Initially, it’ll just be the framework on which the game mechanics will be built. Using that, I’ll start putting game mechanics together, though I expect there will only be intermittent days of intense coding after that. (At least until I start learning new stuff and updating the front end.)

Django!

So, I reached a milestone without ever blogging about it: I ‘perfected’ the desktop version of my software.

Note the quotes. Obviously, there’s a lot more it could do, and the interface couldbe a little less clunky (you can tell I just tacked things on as I made them), but the software does what I wanted it to do when I started writing it: It creates PDFs of vocabulary workhsheets for English learners, entirely using hand-made material, but re-using material that’s been used before.

In fact, someone had the idea to add crosswords and wordsearches, and that wasn’t difficult at all. In addition, it will make a nice, alphabetized vocabulary list for the vocab a group has learned.

Arguably, it does more than I had intended for it to do when I got started. And that can only mean one thing:

It’s time to do the django. Since I got about halfway into the desktop version, I realized that it made more sense as a service than anything else, and that the web was the right vehicle for distribution. Imagine if material that I made for my classes could be used in other classes. Imagine if material that my friends and colleagues create for their classes could be leveraged in my classes?

The goal, pure and simple: make it seem like I’m working harder for my students than I am. And the web is the way to do that.

So, I’ve started trying to create a web interface using django. And I’ve been mostly successful. It seems as though very little that I wrote for tkinter can be directly ported without extensive re-writing, but, since I already know how it ‘works,’ I don’t have to figure out how to do it, I just have to adjust it.

Right now, a lot of basic functions have been taken care of, and I have to do a lot of the ‘filler’ work that isn’t so much difficult as… plentiful.

So, look for me to write a bit more about that as time progresses. As well as my insecurities as I go from the pride of working with software that I created myself, to the insecurity of asking my friends to take my software for a spin.

A quick and dirty grammar check in NLTK

So, while working on my app to generate worksheets (update: I’m using it! Like, in practice!) I’ve wanted a way to identify the grammar in a sentence. A quick Google search on doing this in NLTK came up mostly with diagramming sentences and looked more complicated than I am ready to tackle. (Though I will learn!)

So, with a bit of poking around, I found a method that I liked. It works with NLTK’s pos_tag function. And that, in turn, works like this:

>>> import nltk
>>> t = "This is a test."
>>> tokens = nltk.word_tokenize(t)
>>> nltk.pos_tag(tokens)
[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('test', 'NN'), ('.', '.')]

NLTK actually includes a help interface to help with the ‘DT’ and ‘VBZ’ tags. It didn’t take me long to put together a few ‘patterns’ that basically represented the grammars I was looking for:

self.grammar_lookup = {
            'SIMPLE_PAST': ['VBD', "VBD-did/RB-n't/VB", "VBD-did/VB", "VBD-did/RB-not/VB"],
            'SIMPLE_PRESENT': ['VBZ', 'VBP', "VBP-do/RB-n't/VB", "VBP-do/RB-not/VB", "VBZ-does/RB-n't/VB",
                               "VBZ-does/RB-not/VB"],
            'SIMPLE_FUTURE': ['MD-will/VB', "MD-wo/RB/VB", "MD-will/RB/VB"],
            'COMPARISON_AS': ["RB-not/RB-as/JJ/IN-as", "RB-n't/RB-as/JJ/IN-as", 'RB-as/JJ/IN-as',
                              "RB-not/RB-as/RB/IN-as", "RB-n't/RB-as/RB/IN-as", 'RB-as/RB/IN-as'],
            'COMPARISON_THAN': ["JJR/IN-than", "RBR/IN-than"]
        }

As an explanatory note, the ones with a hyphen in them represent the part of speech tag and the specific word. I did that because I want to reduce the chance of false positives.

From there, it was a fairly straightforward process to start iterating over sentences and looking for these patterns. I’m not especially proud of the code that does this and I think that any serious coder could do it more elegantly, so I’m not going to post that. Still, I’m proud of myself for finding a solution to my problem that works…

…for now. (As you can see, I’ve only tested it on five grammars. I’ll add more as I need them.)

We’re not there yet

There are times when I fantasize about volunteering to help kids learn to make apps. Each time the thought crosses my mind, I’m torn. The shy, insecure part of me says “You need to get more experience, first!” But, another, more idealistic part of me, says “Bah! It would be good for kids to see you learning the same way they are.”

I think that second voice is probably right. But, recently, I’ve been glad that I haven’t volunteered. After all, with the magic of kivy and python, it does seem as though app development is something that you can quickly learn.

Case in point: I was talking to a friend (when the best ideas happen) and had the idea for a different kind of GPS running / biking app. A quick search revealed that Plyer allows access to the device’s GPS hardware. It was literally the work of an hour — including extensive Googling, as I’d fogotten some syntax for individual widgets — to get a first draft done.

With the GPS app, however, I didn’t have any GPS hardware on the notebook I was coding on, so I’d have to do the testing on my phone.

No problem.

Or, so I thought.

First, I was able to compile an APK (that’s apparently what we call the file that you can send to an Android phone to install an app), but it didn’t want to install on my phone. Hmm. That’s the kind of problem enough ‘Google research’ can almost always fix.

Then, it was installing, but not opening. Right. Time to connect my phone to the notebook to run the logcat utility. You’d be amazed at the amount of stuff your phone will output — while it’s just doing nothing — to the logcat. Eventually, though, I found it: Plyer wasn’t included in the APK.

Okey-doke. A bit of searching and an edit to the buildozer.spec file and things were fine.

Fire it up again and. . . it just didn’t compile.

That’s where things were stuck for a while — me looking for terminal commands to update individual pieces of software, installing things, removing and re-installing software, trying again — until today.

Today, I went thermonuclear. I deleted the virtual machine I’d been using to compile APKs and I’m in the (very long) process of installing a new one. If that doesn’t work, I’ll be forced to post a question of stackoverflow (something I’m scared of, because almost every question ever posted seems to be considered a duplicate).

To return to the point of this ramble: sometimes, it feels like we’ve (I mean humanity, not that I had any part of it) made software development so accessible that we must be on the cusp of some sort of revolution. And then, you run up against one of the potholes that hasn’t been filled in yet.

This is not a complaint, by the way. This is all by way of “Gosh, aren’t we lucky that not every step in the process is like this?”

A Forest Scene

image

In working on some placeholder art fit the ‘Papa’s Work‘ app, I worked up a forest scene that I’m more than a little proud of.

I’m not going to pretend that it’s not strongly inspired by the adult coloring book I have (‘Enchanted Forest‘ by Johanna Basford).

Still, when accepting that it’s not as original as I’d like, I’m still impressed that a pen I held in my hand was capable of that.

Writing For An App

So, as I move towards a sort of beta (at what point does software become beta?) of the app, I’m becoming more and more frightfully aware of the fact that I’m going to need content to display my idea.

And isn’t that where so many great ideas die?

The idea for the app is great. And, to be perfectly objective, the very general idea I have for content is great: a child talking about how his father goes to work when the child would rather he stayed home, followed by work described by a child who’s only ever been able to ask his Papa about it. And, at the end, the child asks the Papa “Why do you go to work if it’s so bad?” And the Papa can say, “Well, I don’t really like the work. But, I get money if I go, and there are a lot of things I like to do with you — from simple things like eating, to more fun things like going to the swimming pool — that I can only do with money.”

And, yeah, that long last sentence is currently how it goes. I’m not crazy about it (translation: I know it’s bad).

That’s what I’m talking about. As I write, I try my hardest to not think about the need to illustrate everything, but it’s not working. I write three sentences and think “I don’t know what should be happening on the screen during this time.” And the story suffers, because I seem to feel a need to work in as many things that I can get a doodle for as possible.

It’s not good writing. And it’s not going to make it into the app. What I’m wondering is whether it’s an inevitable step in the development process.

The To-Do List

This seems like a pretty big project to me. So big, in fact, that I’m ready to bring in outside help: I’ve already contacted an illustrator and asked if she would be willing to do the illustrations, should I send her a proof-of-concept that she finds convincing. The answer was a “yes,” but a tentative one.

So, outside of the ‘simple’ act of coding, I see several things for me to be working on:

  • Defining what a ‘success’ will be in this project. It has to be more than just a working app, as I don’t think I can afford to pay an illustrator just to prove that I can make the app. And I certainly can’t expect her to work without some sort of reward. What are we working towards?
  • Deciding if this thing is going to cost money? That’s obviously a subset of whether or not I want it to make me money, or if I’m doing all this just to prove that I’m cooler than the next guy. (Still a worthwhile goal, but is it enough?)
  • Researching how to get my app in front of a few eyeballs. I get that it can get lost in the Play Store, but how do I get the people who would be interested in it to see it?

I genuinely love the idea of seeing an idea that I had realized. Sure, it’s not something physical in the traditional sense, that I can frame and put up on the wall. But, nonetheless, it would be something I could point to and say “See that? I had that idea and I made it happen.”

On the other hand, I sense that success is going to require more than just a finished project. And the idea of marketing my idea, of being forced to try and convince people to look at what I made, well, that’s the part of this project that I’m looking forward to the least. Forget the tedium of trying to figure out why my code isn’t doing what I think it should be doing, this will be the hardest part of the project for me.

And that means it’s the part that I need to work the hardest on.

The Vision

The vision, I think, is simple: an app that tells children an entertaining story, but in an entertaining way. There are a lot of story-telling apps in the Play Store, but few of them are what I would give my kid. They’re basically videos that ask the kid to press the button for the next page.

I don’t know how you read to your children, but that’s not how I read to my children. If they won’t sit still for me, why should they sit still for a device?

What I’d like to build is an app that tells kids a story the way I would, or very nearly. I would love to be able to have the app read the story wrong and respond to kids correcting it (“No! He’s not a horse! He’s a boy!”) But I don’t think that is within my reach as an amateur programmer.

Telling children a story and then becoming increasingly — and comically — frustrated as they keep touching the things in the pictures, now that is something I could do. (I think.)

Imagine for a moment that you’re basically passively consuming a story and you touch the funny picture of a cat. The narration stops for a moment and says “Yeah, that’s a pretty strange picture of a cat. I bet that cat is having a bad day.” And then the narration picks back up again. I don’t know what you would do, but I would touch other things, what does the narrator say?

If I touch the cat again, will the narrator do it again? This time he says, “We talked about the cat already, come on, let’s do this story.” I try it again, of course. In a voice that is so comically frustrated it sounds more like the Cookie Monster than anything else, the narrator complains: “Enough with the cat! I am trying to tell a story here!”

I think my kids would eat that up. And, of course, I’m banking this project on the idea that other kids would eat it up, too.