Word Processing Mobile Apps: A Review Of Three Of Them

So here’s where I admit I’m probably a little nuts. Because I am. For a lot of good (and perhaps a few not so good) reasons. But the reason I’m focusing on at moment is how I wrote the first draft of the book I just finished.

You see, I wrote a good 75% of it on my phone.

I have tired thumbs.

The thing about phones these days is that they’re handheld computers. My iPhone is a web browsing, word processing, relationship maintaining, gaming console. It’s everything you might find in a 1990 Radio Shack ad. Like, everything. In a 3×5 sliver of glass and metal.

Because phones are obviously so portable and these days so powerful, I was able to fill any little nook and cranny of spare time I had using my phone as my pen. Waiting in a long line? Write some. Stuck in the passenger seat on a long car ride? Write some. In a darkened room waiting for a child to fall asleep? Write some.

Seriously, with a phone and a word processing app, you can literally write anywhere, anytime.

With that said, I tried three different writing apps for iPhone. Bearing in mind I haven’t tested every single function each had to offer, and may be therefore missing something cool, here’s my rundown of each:

  • Evernote – This was the first app I used, back when I had a Droid phone. It’s gone through a number of updates since then. It has a clean interface and pretty seamless web component. You can also down the add-in part for programs like Microsoft Office and Internet Explorer, and the add-in helps you clip things you like or feel you need to keep for later. My primary problem with Evernote is that the “notes” are captured and displayed in HTML (hypertext markup language, the primary language of displaying content on the web). This makes it difficult to edit your work due to the fact that the formatting is guided by what your browser needs to see, rather how you would like to see it. At its heart, it’s a note-capturing, web-clipping program, and not a word processing app.
  • Quip – I hadn’t heard about this one until late last year. I downloaded it and tried it and it was nice, fairly streamlined, clean user interface. That’s for the mobile app. Like Evernote (and Google Drive, coming up below), you can access your work online. That when this one lost me.I found the online UI was clunky and hard to work with. Try to edit a paragraph and you are essentially clicking into a text box version of your paragraph to edit. The online version has a nice feature that tracks what you’ve edited and keeps it off to the side. But like Evernote, it approaches the text as content to be formatted for HTML. Because of the lack of word processing capabilities (first paragraph indentation, for example) and because I was looking for a seamless transition between phone and browser, this app left me wanting.
  • Google Drive – Does anybody know anybody who uses Google Drive (formerly Google Docs)? Actually, I do know a few. I’ve done some work for a company who used to keep their P&L on a Google spreadsheet. Is it Excel? No, not even close. Is passable for what you need? Sure, if you need basic spreadsheet stuff. Same holds true for the word processor. Is it going to replace Microsoft Word? Not a chance. Is it a good alternative if you want to keep your stuff in the cloud? You betcha. I just wanted to find something that would work like a word processor online. This ended up being the one. Does it have it’s drawbacks? Of course. Fully opening a long document for edit takes a long time as Google Drive retrieves all of that information. Full word processing capabilities are available on the web only and not in the mobile app. But is this the one I ultimately chose to write my book in? Sure was. And it’s ready availability helped me keep my book on the front burner and finish it.

This is just my experience with mobile word processors with a companion web component. Google Drive seems to me to be the one to beat. My two cents. Probably worth half a penny, but there you are.


Happy Birthday, Gram: A Story Of My Grandmother

My grandmother belly-laughing at something my daughter did when she was a toddler
My grandmother belly-laughing at something my daughter did as a toddler

This is a little bit of a love letter. Today would have been my grandmother’s 95th birthday. She passed away at the end of last August. In honor of her memory, I thought I’d share a family anecdote I didn’t know before she passed. I learned about this one in the weeks after her passing, as all the stories, memories, and tall tales started to emerge.

This one is about the first house she bought. And what’s important to note here is that she bought it. My grandfather had joined the marines and was serving in a tiny little corner of hell called the Pacific. My grandmother, on her own, decided that the time was right for her to buy a house and settle into it. I don’t know the exact reasons why, so I’d have to speculate, but I would guess it was so that my grandfather would have a house to call “home” when he was finally able to come home.

My grandmother found the house she wanted and went into the bank. She was working for the now defunct Bonwit Teller department store. She need to work to make up the balance of the budget, since the pay for a marine serving overseas wasn’t terribly large.

She arranged the financing and settled the mortgage. Knowing her the way I did, she did this without fanfare or panache; it was simply the right thing to do. Not that she wasn’t full of doubt. Buying a house is a big deal, a lot of money, and no matter how full of confidence you are, there’s always a certain specter of doubt that lingers. Maybe not long, maybe it’s smaller or larger, depending on your personality. But it’s there.

Or at least it was for my grandmother. She had her doubts. After all, she was a woman buying a house in the 1940’s, not exactly the most liberated time for women, and with the shadow of government telegrams always edging around the door—well, of course there were doubts.

However, doubts or not, my grandmother was deeply spiritual. She was a lifelong Catholic, and had a particular fondness for St. Therese of Lisieux. St. Therese is known as the “Little Flower”, and is have reported to have said upon her deathbed “After my death, I will let fall a shower of roses…”, meaning she would send a little bit of heaven to earth. Since she loved roses so much, that was a little bit of heaven to her. My grandmother took strength from the story of St. Therese.

My grandmother settled on the financing with the bank and prepared to go straight to the house. On her way out of the bank, as a thank you for being a customer, someone was handing out roses. Given my grandmother’s spirituality and attachment to St. Therese, she must have seen this rose as a good sign. A coincidence perhaps, but a good sign nevertheless.

This purchase took place in the winter, not a typical time for blooming flowers in New York. But upon showing up at the house, directly from the bank, there in the garden was a rose bush. And despite the fact that it was winter, on the rose bush bloomed a single red rose.

It was then that all of her doubts receded. When my grandfather returned from the war, together they started a family, and it was in that house that my mother and my uncle were raised.

Happy Birthday, Gram. I hope there are roses wherever you are.

Love, Scott

My grandmother at the wedding reception of my cousin
My grandmother at the wedding reception of my cousin

What I Didn’t Do This Weekend

This weekend was a busy one:

  • There was more birthday celebration for another family member.
  • There were the cupcakes my elder daughter insisted had to be baked as part of the celebration, and the extra time involved in supervising her, as she wanted to bake them herself.
  • There was a mid-year music lesson concert for the kids, who are taking five instruments between them, and so had five separate, albeit short, performances.
  • There was the annual meeting of the church, for which I helped with the preparation of the lunch food that was served.
  • There was the usual running around to grocery stores, Target, and the like.
  • There was a nice five mile run in a -2 degree windchill. Okay, maybe describing that as “nice” is a bit of a stretch. But I was needed and I enjoyed it.

So, quite a lot.

You know what I didn’t do this weekend? I didn’t write.

This may sound strange coming from a writer and self-publishing author, but I didn’t write, didn’t want to, and don’t have any regrets about it.

I finished a first draft of a novel on Friday, after making sure that I was consistently writing for five straight months. And I loved finishing and love the fact that in another five or six weeks I’ll get to go back and tackle it like it’s brand new to me. I love the fact that my head is already moving on to finishing done other editing projects I’ve got in various states. I love the fact that I’ve already got the idea for the next novel in this detective series, and that I’m starting to plot the outline.

But as much as I love it, I also need the break. Stephen King once answered in an interview the question of how often he writes by saying he writes every day but Christmas and his birthday. He gave this answer because it sounded good to him, and because it sounded less crazy that the real answer which was, at the time, every day. That’s great for him. He’s Stephen King after all. But I need the break.

Writing is like anything else, at least for me. I love it, but even though I do love, and often need to do it, like a type of compulsion, I need a break from it, a mini-vacation if you will. I love pizza too, but if I had it every day, I’d eventually hate it.

So here’s to a little time off. I figure in about a week, I’ll be going stir crazy and will dive head first into another project. In the meantime, I think I’ll read a little and catch up on some TV.

First Draft Done!

I finished the first draft of a new book tonight. I’m both pleased and surprised by this. Typically it takes me forever to finish the first draft of a book. How It Ends took nearly a year, and my second book (currently unedited, in first draft status, and tentatively titled Dirt) took me three years.

So what’s the difference?

Length for one. This new book clocks in at only 54,000 words. That’s barely a novel. Like, just scraping by as a novel. Personally, I think it will expand as I edit it. Stephen King once described himself as a “putter-inner”, and that describes me pretty well, too. When I’m editing, things tend to swell. Then, as I go through the second pass, they come back down again. And knowing this book is only in the fifty thousand word range, and Dirt is edging on 130,000 words, it’s no wonder that this one took less time. I started this one around September and finished it up five month later.

The other reason is that I made a concerted effort to write it, almost every day. There were some days I didn’t, some days I just couldn’t make the time. Life happens, right? ‘Course it does. But unlike my other books, I’d always come back, and in a relatively short span of time. I think the longest I stayed away from this book was two days, whereas I left Dirt in a near-complete state for nine months before finishing it up. This makes a big difference. For one, it’s not as daunting when you return to the book and try to pick up the threads after having been out of the practice of writing for nine months. For another, you don’t have to spend half hour going back several pages to several chapters to try and remember what the hell was happening when last you saw the characters. I was able to keep the characters and the plot points foremost in my writing thoughts and never needed to wonder if I was woefully out of bounds. When I go back through the book, there will be some continuity gaps and some things out of character, but not on the level I’ve experienced before. (I hope…)

So now for the editing, and for that, I will wait. Taking further cues from Uncle Stevie (hey, his term, not mine), I plan to let this one sit for a bit so I can forget all about it. I figure I’ll pick it back up in March and begin to go through it and it will be like reading a brand new book. One with all kinds of typos and errors and issues just itching to be fixed up. It’s hard-boiled crime fiction, so I hope to edit quickly and have it ready to go for summer reading. I figure a nice way to kick of the beach season is with a beach book.

In the meantime, Dirt calleth my name. “Scott: edit me. Edit me…”

Given the size and difficulty I had writing it, I shudder when I hear it call…

Excel Geeking: A Class Wrapper for Winzip

A couple of years ago I was involved in the implementation of a software system that required data files transferred to the hosted system via FTP. Each set of data required four different files to be bundled together in a compressed format. Most of the time, the data we needed could be pulled right out of mainframe systems. But there was one exception. One particular data element had to come from Excel files we were using at the time. There was no getting around it.

I started doing some research on Winzip and how to control it using VBA. Turns out it was both simple and not so simple. The simple stuff was that Winzip has some command line options that are, apparently, undocumented. If you want a great, concise explanation of these, check out this page. Using the Shell command in VBA, I could easily control Winzip in the way I needed. The not so simple stuff was controlling which of the parameters I would send to the command line, which depended entirely on the state of the Excel file. And I needed to be able to do that dynamically.

What I ended up doing was wrapping the various bits and pieces of Winzip and its parameters in a class module. That way, as the code finished compiling the data into the requisite .TXT file, I could then call the Winzip class module and bundle it along with the other files together and fire them off to a shared network location for processing.

Below is the code. If you want to use it, just copy it all and place it into a class module called CWinzip (or whatever you want to call it). The usually rules apply, use at your own risk, I assume no responsibility, etc. Also, if you have any suggestion as to how to improve this code, I’m always open to hearing ideas.

' Name:         CWinZip
' Description:  This is a class module that acts as a wrapper for using VBA to
'               manipulate WinZip
' Programmer:   Scott Lyerly
' Contact:      scott.c.lyerly@gmail.com
' Notes:        None
' Bugs:         None identified.
' Change Log:
' Date          Author          Version     Action
' 22-JAN-2014   Scott Lyerly    1.0         Original development

Option Explicit

' Constant, variables, and other declarations

' Constant declarations.
Private Const gsWINZIP_PROGRAM As String = "C:\Program Files\WinZip\winzip32"
Private Const gsDOUBLE_QUOTE As String = """"
Private Const gsSPACE As String = " "

' Enumerations for Winzip Action.
Public Enum gwzActionType
End Enum

' Variable declarations.
Private msWinZipFile As String
Private msZippedFile As String
Private mcolZippedFiles As Collection
Private mbOneFile As Boolean
Private msExtractFolder As String
Private mwzAction As gwzActionType
Private mbMinimized As Boolean
Private mbOverwrite As Boolean

' Class properties

' The archive into which files will be archived (zipped)
Public Property Let WinZipFile(ByVal sWinZipFile As String): msWinZipFile = sWinZipFile: End Property
Public Property Get WinZipFile() As String: WinZipFile = msWinZipFile: End Property

' The folder to extract files to.
Public Property Let ExtractFolder(ByVal sExtractFolder As String): msExtractFolder = sExtractFolder: End Property
Public Property Get ExtractFolder() As String: ExtractFolder = msExtractFolder: End Property

' The action type being used by Winzip
Public Property Let ActionType(ByVal wzAction As gwzActionType): mwzAction = wzAction: End Property
Public Property Get ActionType() As gwzActionType: ActionType = mwzAction: End Property

' Whether Winzip will run minimized so it's mostly hidden from view.
Public Property Let Minimized(ByVal bMinimized As Boolean): mbMinimized = bMinimized: End Property
Public Property Get Minimized() As Boolean: Minimized = mbMinimized: End Property

' Whether the files to be unzipped will overwrite an existing files in the extract location of the same name.
Public Property Let Overwrite(ByVal bOverwrite As Boolean): mbOverwrite = bOverwrite: End Property
Public Property Get Overwrite() As Boolean: Overwrite = mbOverwrite: End Property

' These properties are for zipping a singel file.
Public Property Let ZippedFile(ByVal sZippedFile As String):
    msZippedFile = sZippedFile
    mbOneFile = True
End Property
Public Property Get ZippedFile() As String: ZippedFile = msZippedFile: End Property

' These properties are for zipping multiple files.
Public Property Let ZippedFiles(colZippedFiles As Collection)
    Set mcolZippedFiles = colZippedFiles
    mbOneFile = False
End Property
Public Property Get ZippedFiles() As Collection: ZippedFiles = mcolZippedFiles: End Property

' Class methods and functions

Public Function ZipFile() As Long
' Description:  This is used to zip (compress) a file into an archive.
' Author:       Scott Lyerly
' Contact:      scott.c.lyerly@gmail.com
' Name:         Date:           Init:   Modification:
' ZipFile       22-JAN-2014     SCL     Original development
' Arguments:    None
' Returns:      Long        Value returned as part of the Shell function
On Error GoTo ErrHandler:

    Dim sShellString    As String
Dim i               As Integer
Dim sFiles          As String
    ' Check first for both the file to be zipped
    ' and the archive in which to zip the file.
    If Not Exists(msWinZipFile) Then Exit Function
If Not Exists(msZippedFile) Then Exit Function
    ' Set string for the Winzip program.
    sShellString = gsWINZIP_PROGRAM & gsSPACE

    ' Minimized, if applicable.
    If Minimized Then sShellString = sShellString & "-min" & gsSPACE

    ' Check the Action type to make sure we're not trying to zip and unzip at the same time.
    If ActionType = wxExtract Then Exit Function
    sShellString = sShellString & GetAction(ActionType) & gsSPACE

    ' Set the string for the Zip archive.
    sShellString = sShellString & gsDOUBLE_QUOTE & msWinZipFile & gsDOUBLE_QUOTE & gsSPACE

    ' Set the File(s) to archive.
    If mbOneFile = True Then
        ' Set this string if it's only one file.
        sFiles = gsDOUBLE_QUOTE & msZippedFile & gsDOUBLE_QUOTE
        'Interate through the collection if it's multiple files to archive.
        For i = 1 To mcolZippedFiles.Count
            If Not Exists(mcolZippedFiles(i)) Then Exit Function
            sFiles = sFiles & gsDOUBLE_QUOTE & mcolZippedFiles(i) & gsDOUBLE_QUOTE & gsSPACE
        Next i
    End If
    sShellString = sShellString & sFiles

    ' Execute the command line.
    ZipFile = Shell(sShellString)

    Exit Function

    ZipFile = Err.Number

End Function
Public Function UnZipFile() As Long
' Description:  This is used to zip (compress) a file into an archive.
' Author:       Scott Lyerly
' Contact:      scott.c.lyerly@gmail.com
' Name:         Date:           Init:   Modification:
' UnZipFile     22-JAN-2014     SCL     Original development
' Arguments:    None
' Returns:      Long    success = returns the task ID of the program started with the Shell
'                       failure = returns the error number
    Dim sShellString As String
If Not Exists(msWinZipFile) Then Exit Function
If Not Exists(msExtractFolder) Then Exit Function
    ' Winzip program
    sShellString = gsWINZIP_PROGRAM & gsSPACE

    ' Action
    If ActionType <> wxExtract Then Exit Function
    sShellString = sShellString & GetAction(ActionType) & gsSPACE

    ' Overwrite option
    If mbOverwrite Then sShellString = sShellString & "-o" & gsSPACE

    ' Zip file
    sShellString = sShellString & gsDOUBLE_QUOTE & msWinZipFile & gsDOUBLE_QUOTE & gsSPACE

    ' Folder to extract to.
    sShellString = sShellString & gsDOUBLE_QUOTE & msExtractFolder & gsDOUBLE_QUOTE

    ' Execute the command line.
    UnZipFile = Shell(sShellString)

End Function
Private Function GetAction(wzAction As gwzActionType) As String
' Description:  Returns the Action Type to routines internal to this class only.
' Author:       Scott Lyerly
' Contact:      scott.c.lyerly@gmail.com
' Name:         Date:           Init:   Modification:
' GetAction     22-JAN-2014     SCL     Original development
' Arguments:    Action Type enumeration
' Returns:      String: converts the action type to a string to be used in the
'                       zipping or unzipping command line string.
    Select Case wzAction
        Case wzAdd: GetAction = "-a"    'default
        Case wzFreshen: GetAction = "-f"
        Case wzUpdate: GetAction = "-u"
        Case wzMove: GetAction = "-m"
        Case wxExtract: GetAction = "-e"
    End Select
End Function
Private Function Exists(sFile As String)As Boolean
' Description:  This check to ensure that a file exists.
' Author:       Scott Lyerly
' Contact:      scott.c.lyerly@gmail.com
' Name:     Date:           Init:   Modification:
' Exists    22-JAN-2014     SCL     Original development
' Arguments:    sFile (string): the file for which we're checking existence.
' Returns:      Boolean
    On Error Resume Next
    Exists = (Len(Dir$(sFile)) > 0)
    If Err.Number <> 0 Then
        Exists = False
End If
End Function
Private Sub Class_Initialize()
' Description:  This runs when the class is created.
Set mcolZippedFiles = New Collection
    mbOneFile = False
    mbMinimized = True
    mbOverwrite = False
End Sub
Private Sub Class_Terminate()
' Description:  This runs when the class is destroyed
Set mcolZippedFiles = Nothing
End Sub

Review: Sky Zone Indoor Trampoline Park

I’d never heard of this place before six months ago. And once I did, the idea sounded AWESOME. A place that made up entirely of trampolines, and you can just bounce and jump for an hour. The child in me that was never allowed to jump on trampolines was sparked.

So when my daughter decided she wanted to have her birthday there, I was psyched. Maybe I’d get to jump as well!

First, a little history on Sky Zone. And for that, I turn it over to Wikipedia.

Okay, that’s done. And now on to the review. I’ll set the stage by starting with the fact that our particular Sky Zone was in Westborough. And how was the Sky Zone experience?

The experience was a several very good things, and one very bad one.

First the good. The park itself is pretty amazing. There is one giant arena that contains a large number of trampolines on the ground. The arena is then walled in by even more trampolines set at about 60 degree angles. So you can literally bounce off the walls. There are three smaller arenas with narrow single entrances in the same configuration as the large arena. These are the dodgeball courts, were staff referee trampoline dodgeball. There’s a set of four trampolines in another part of the park laid out side by side. At the end of them is a foam pit. You can literally take off airborne and crash-land into the foam pit. My kids in particular enjoyed that.

The staff was very friendly. A member of the staff was assigned to the party room and took charge of serving the pizza (one pie of which comes with the admission price–you can order more at registration time) and the cake. Our staff member also gave us some extra time in the room because my daughter wanted to open her gifts in front of her friends so they could see how much she liked their gifts. This is something you don’t get at a lot if places, which make you wrap up early and take the gifts home so they can get the turnover. For a kid who seemed like she was still in high school, our staff member was very friendly and accommodating, something that’s a bit hit or miss in high schoolers.

When you arrive, you need to register. For birthday parties there is a special birthday party line that is separate from the rest of the general admission line. This makes it easy for the birthday boy or girl and all of their friends to be whisked through the registration. And there are multiple party rooms so you don’t feel rushed out of the one you’re in.

Okay, so those were some of the good things about Sky Zone. Now the bad.

There was no control over the coming and going of the kids. I mean none. Zero. We found this to be particularly unnerving.

We had fourteen kids there, including our own. There are multiple ways to enter the play arenas. Some are stairs on one side, some are ramps on the other side. So a kid could leave the arenas without an adult knowing it. A single point of entry in or out of the arenas is one thing. What made this worse was that there was no single point of entry/egress of the building itself. You could go in the front entrance and out the back/side entrance if you wanted to. There was no mechanism or process the staff went through to ensure that the party members stayed together, or that they left with the right adult. Half our party was dropped off by one set of parents and picked up by another. This is fine for us, we live in a small town where we all know each other and where this kind of carpooling happens all the time. But what if we didn’t? I try not to think of EVERY possible bad thing tha can happen, but I’m a father of daughters, so I tend to go to worst case scenarios. And they all went through my head.

I know from prior retail experience that all locations are not created equal, and that layouts are going to differ location by location. So I can only talk about these things in regards to Westborough. But if they’re all like that, then my official take on that is “yeesh”.

So in the end, would I recommend Sky Zone for birthday parties? Yes. It was a lot of fun (and very noisy, but that shouldn’t be a shock). The kids jump for a full hour, which is more than enough time to have them tuckered out and ready for bed by 8:30PM. But I would only recommend it if you have enough adults to keep eyes on the kids.

Early, Early, Early, (Did I Mention Early?) Notice Of My First Interview


I have an old high school friend who runs a pretty popular podcast. The podcast is called “Words With Nerds”, and from what I remember about my friend, that sounds about right. I met this kid when we were doing set work for the high school drama club. (Yeah, I was that guy.) We started talking about Star Wars and that was it, he became one of my core friends throughout high school.

I, and many of my high school friends, have gone our separate ways. I’ve migrated north to Massachusetts, and my friend is fighting traffic in Northern Virginia. But one of the beautiful things about social media these days is that we all can still hang out, as it were, on things like Twitter, Facebook, and the like.

Well, this friend of mine, John, has a weekly podcast he does with a friend of his. It’s called “Words With Nerds”, and he and his podcast partner talk about all things geeky and nerdy.

So, it is with great pleasure that I announce that sometime this Spring, I will be calling into the “Word With Nerds” podcast to discuss my sci-fi book, “How It Ends”.

Stay tuned to date and time.