A Daring Adventure

or, A Good Life

I’ve been floundering. I’ll go ahead and call it an early “midlife crisis”. For the past few years I have been drastically thrashing about, unsure of what I’m doing with my life. I went to grad school and earned a Masters in HCI. I joined a start-up, and then left it unexpectedly. I started my own business, shut it down, reopened it, and am now wondering what to do with it. I built software I no longer use myself. I write about open source software, and use a Mac on my desk, but Linux on my servers at the day job. I have a hard time concentrating on any one thing because I’m torn in so many different directions at once. Things need to change.

The Why

I once considered myself something of an adventurer. I left school before graduation and spent months camping in a tent on the Washington coast. I joined the Navy and travelled, visiting Spain, Portugal, France, Greece, Italy, and Israel. Shortly after my wife and I married we moved to England and rented a farmhouse in the countryside of Cornwall. We stayed there for four years, and in that time we honeymooned in Dublin over St. Patricks day, and I went rafting in Wales, and caving closer to home in Cornwall. I drove through London in an American Jeep. When my tour in England was up, I joined the Defense Threat Reduction Agency, once known as the Defense Nuclear Agency, in New Mexico in a special duty assignment. We used to travel to the deserts of Nevada, north of Las Vegas. In my free time I would take the kids hiking in the Sandia mountains.

Things changed when I left the Navy. We moved to Iowa, I got a job at a desk in a cubicle, we had our fourth child, and I started living a “normal” life. Day in, and day out. For the past six years I’ve been a Linux systems administrator. In the same position, in the same desk. I started to believe that my adventure was over, and that belief made me desperate. I was wrong; I’ve been traveling through the deep.

The “why” of Farmdog, my Mac software company, stems from my desire to escape the cubicle and build a sustainable income that I can run on my terms, from anywhere in the world. Farmdog was meant to be a way to facilitate more adventure, more travel, more life. I thought if I could earn enough with my software business, I could pay off my student loans and eventually quit my day job. The reality has been far less interesting. Farmdog has barely sold enough copies of either Paragraphs or Go2 to pay for the annual Mac developer account and the two icons I had done for Paragraphs. I’ve earned far more as a freelance writer than I have as a developer, which is a disappointment.

After spending months and months learning Cocoa and Objective-C, and months and months more after that developing Go2 and Paragraphs, I was crushed when sales dropped to nothing after launching Paragraphs over the summer. I called it off, shut it down, then felt that I’d reacted poorly so I brought everything back up again. I sent a friend, who’s opinion I trust, an early version of this post, and he replied with a quote:

“Security is mostly a superstition. It does not exist in nature… Life is either a daring adventure, or nothing.”

That of course is Helen Keller, who was nothing short of amazing. I’ve been mulling that quote over for the past several weeks, and in the last few days I’ve come to understand more about myself, my motivations, and where I want to go with my personal and professional life.

It came to me while jogging the other day. We’ve built a good life here. In this house, on this land. My family is together, my kids are well behaved and on their way to becoming confident, competent members of society. My faith has never been stronger, and our church is fantastic. My relationship with my wife has never been better. But, getting here hasn’t been easy. The repetition of my daily life has allowed the kind of deep soul-searching that I don’t think I would have done before. I’ve had to do a lot of deep digging, honest, bare-bones, white-knuckle type of digging.

I thought my adventures were over, but I’ve been digging through the deep. The biggest challenge a man can face is to master himself, only then can he face his greatest adventure: being a father and a husband. With the help of Christ, I am doing just that. My motivations behind Farmdog were to pay off debt so we could travel again. We will travel again, but at an appropriate time, perhaps when the seasons of life change again and our kids are leaving home to begin their own lives, their own adventures. Now is not that time, now is time for slowing down as much as we can, enjoying and teaching our kids as much as we can, and living our day in and day out life to the best of our ability.

The Details

Farmdog as a company is selling two products that I, personally, do not use. Go2 has been replaced by a Quicksilver plugin that reads my .ssh/known_hosts file. Paragraphs is a fairly good blogging platform, but it combines two tasks into one application, and winds up doing neither of them as good as competing products. Jekyll is fantastic, and includes free hosting with Github, and the Mac has an embarrassment of riches when it comes to fantastic text editors. MacVim, BBEdit, IA Writer, and Byword are at the top of that list. Paragraphs does have a few neat tricks, but it is nowhere near as good, or as bug free, as other text editors.

If I were to have the time over the next five years to dedicate several hours each week to developing Paragraphs, I think I could build it into a fantastic application. But, each minute I work on Paragraphs I’m taking a minute away from something else that needs done. If I’m programming, that means that I’m not doing any freelance writing, and as previously stated, writing makes me far more money each month than programming ever has. Since the goal is to pay off some bills, it seems counterproductive to spend my time working on something that makes little to no money.

I hate to take Paragraphs and Go2 down, but it seems hypocritical of me to keep them up for sale when I’m taking my personal and professional life in another direction. What makes this decision so hard is the amount of help I’ve had along the way. For years I’ve been able to send off a new build to a good friend or two and have them tear it apart, and send me back a long list of wrongs in need of repair. I cannot express how important having someone test your software honestly is, or how much I appreciate the help I’ve received. But, however highly I value it, loyalty to friends seems like a poor motivator for running a business. Luckily, since I have such smart friends, they already know this.

Farmdog will remain a business, and I will support Paragraphs and Go2 for one year from the date of the last purchase of either application, but further development will be very, very slow, if at all. I may keep developing Go2, but the future looks dim for Paragraphs.

Now, and Soon

My personal life needs me to keep working, but also to keep growing and finding new avenues for change. To find contentment in my professional life, and to solidify the many aspects of my work, I needed to find a new direction, one that met this criteria:

  1. Made use of my experience as a Linux sysadmin in a web environment
  2. Made use of my degree in HCI.
  3. Provided an opportunity for both freelance and corporate work.
  4. Shows promise and sustainability for the future.
  5. Incorporates open source software and a new stream of topics for writing, until freelance writing is no longer needed.

Considering my professional needs, experience, education, and desires, it seems clear that I should be modifying Farmdog Co. into a web design and development business.

In many ways, this new direction reminds me of when I decided to learn Cocoa. Design now seems like programming did then: out of reach, too far from what I’m good at, just a little too much for me to grasp. I love a good challenge. Especially when that challenge can quite literally change my life. However, the difference is that I’m actually far more familiar with web work than I ever was with Cocoa. I started building web sites almost as soon as I got a computer. I was put in charge of building the command intranet back in 2000 - 2001, and I’ve been involved with the web since. Even with Cocoa, Paragraphs builds web sites, and I designed the default theme (such as it is) myself.

Web design and development feels right. After many nights of prayer and meditation, I feel good about this change. My first client will be, of course, Farmdog, followed by this site. I expect many slips and falls along the way, after all who am I to think that I can just decide one day to be a web designer. But I know one thing for sure, this will certainly be a daring adventure.


Personal Information Architecture

For my computer to be useful to me I need to be able to quickly save information, and then easily retrieve it later. Saving and retrieving information sounds like a simple enough use case, but doing both quickly and easily does not. The more information you have saved on your computer, the more difficult it is to effectively retrieve the information you need the moment you need it. Researchers and developers have been tackling this issue for decades, but so far no one has come up with a single best solution that works for everyone. What we need is a way to store and retrieve information without having to stop and think about the method or means of organization. The organizational method should provide an effective affordance without resorting to decoding the method itself.

The first organizational method I tried used a hierarchical folder structure based on dates and file types. For example, inside the “2002” folder, I had a folder for each month, and inside the “January” folder I had a folder for Word documents, and another for Excel, another for text, and so on. However, there was no naming system for files, and no way to associate related files for different projects. It was more of an archive than a persistent and useful file organization system.

I purchased the first version of Yojimbo when it was released, and used it heavily in conjunction with the folder structure. Yojimbo let me quickly save information, and provided a simple search box for retrieving it later. In my opinion, the best feature of Yojimbo was the quick entry window I had mapped to F1. Yojimbo was smart enough to recognize the data I had on the clipboard, and presented an appropriate template filled out with the data. For example, if I copied a URL, Yojimbo would offer to save a bookmark or a web archive. If I copied a serial number, Yojimbo would present the software screen filled out with the serial number and ask for the name of the software. Yojimbo worked well for me up until the iPhone was released, and I realized I wanted ubiquitous access to my data. I contacted Bare Bones several times to ask about an iPhone companion, but the answer was always that there were no plans for one.

Another important change in thinking happened about this time. I began to care quite a bit about the format of my data, and the ability of my data to remain in a retrievable format over time. Yojimbo worked out well for this, since with it I was able to export the data exactly as I put it in. However, the most attractive competitor to Yojimbo, Evernote, did not respect the original format. The third player in the information management apps is DEVONthink.

DEVONthink is a beast of an application with some very special, specific use cases. It is similar to both Evernote and Yojimbo in that it is an information organizer, but where it departs is how deep into the information DEVOnthink goes. DEVONthink includes an form of AI that can help you sort and search your information, but to help the AI engine along, the developers suggest separating your data into several topic specific databases. DEVONthink then lets you open and close individual databases and sync between Macs or the iOS companion application, DEVONthink To Go. I recently gave DEVONthink another try for a few days, and found it a worthwhile experience. DEVONthink helped me get a new perspective on the information I keep, and in doing so I found that I didn’t really need an application with this much power.

DEVONthink suggested that I separate everything out into topics, which could be viewed as top-level folders. Inside each folder could be several groups, and groups within groups. After using DEVONthink for a few days, the similarities between it and the Finder were obvious, and for my use case, DEVONthink became too limiting. It is an application that can handle almost everything, but not quite. Anything that needs its own folder structure cannot live inside DEVONthink, so I eventually wind up maintaining two distinct folder hierarchies. One of databases and groups inside DEVONthink, and one of standard folders in the filesystem. I realized, again, that if I wish to simplify my information storage and retrieval, I needed a system that could accommodate everything. The only system that fits the bill is maintaining a nested folder structure in the filesystem.

I have tried several file naming conventions, including the The Bunsen Method. Seth Brown is extremely intelligent, but I found his method a bit boggling. Keeping all of your files in one of three folders assumes two things: 1, that you are going to be able to remember when a file was created, and 2, that you are accessing the file using an interface convenient enough to accommodate the obscure file name. My experience when faced with a wall of text, all of it starting with a long string of numbers was that I was confused, and had trouble scanning for what I was looking for. My eyes would instantly scan past the date, time, and token fields and straight to the title. What I decided on was much closer to David Sparks’ method, using a simple date stamp followed by a descriptive name.

2013-07-16-Personal_Information_Architecture.md

The folder hierarchy itself is based off of areas of my life. For example, I have a top level folder in Documents for work, and another for home, and a third for Farmdog. Inside each of those are project specific folders, for example inside home I have one for Appliances, another for Oliver (our dog), and another for Finances. Separating out my files this way provides easy backups, separation (in case I ever get a new computer for work), and an easy way to quickly identify where a file might belong. Where the folder hierarchy falls apart is when I avoid stopping to think about what the information I’m saving is and what use it might be to me. When this happens what I used to do was save it to the Desktop, or to the top level of my Documents folder with a default name and forget about it. To avoid this situation, I use a top level folder named “Inbox”, and Hazel. Hazel lets me define what types of files I might have ahead of time, and define rules for what the files should be named and where to put them in the folder structure. I’ve adopted this system from David Sparks’ book Paperless, and for the most part it works well. I set a weekly reminder in OmniFocus to sort through the Inbox folder and update the Hazel rules accordingly, or simply throw the files where they need to be.

The folder hierarchy and naming system I use allows me to think about where I am, what I am working on at the moment, and what I need. I find this structure far better suited to my computer use than thinking about what search terms I should use to find what I am looking for.

But what about ubiquitous access? I could use Dropbox for a portion of the data, but I have found that my needs for information away from my computer are actually so small that I don’t need all of it. What I want is not really what I need, and until what I want is available in to me in an acceptable format, I’m not going to worry about it. The closest thing I’ve seen to exactly what I would like is the Transporter, I’m considering picking one up.

Even with a standard naming convention, an environment and topic based folder hierarchy, and Hazel rules enforcing the standard, there are still things that I find that I want to keep. Just stuff. For this, I’ve gone back to saving random bits of things in Yojimbo. I’m not sure how long I’ll keep this up, I may wind up exporting all the notes into the filesystem and letting Hazel sort them out, but for now I’m enjoying the speed and ease of using Yojimbo. Yojimbo is looking a bit long in the tooth, I hope to see an update soon.

The unlimited flexibility of the filesystem is both a blessing and a curse. You can arrange your data in any way you choose, and save any type of information you wish, but doing so without strict guidelines on naming conventions and placement within a ridged folder structure will cause clutter and lost information. Many people find that relying on a third party application like Evernote or DEVONthink to be perfect for their needs, but I found both of them far too limiting for my needs. Giving up access to data on my iOS devices in return for the secure knowledge that there is a place for everything, and everything is in its place, is a trade off I’m willing to make.


Farmdog Closed

Update: July 30, 2013 - Farmdog is not closed, but I am rethinking everything. Paragraphs will continue to be supported for the foreseeable future.

Farmdog Co. has closed. There had not been a single sale of Paragraphs for two weeks, and over three weeks since there was more than a single sale in a day. Farmdog was a fun project, but flawed in both concept and execution.

For anyone looking for similar functionality to Paragraphs, I highly recommend Byword 2.0 with Wordpress or Jekyll.


Where We Stand

In the online help for Paragraphs, I have a rather odd statement:

Farmdog is made of dreams.

That comes from the heart. My company, Farmdog LLC, is made out of dreams. What if I could afford to move closer to our friends and church? What if I could quit the day job and rent out an office close enough that I could bike to work? What if my wife didn’t have to work? What if we didn’t have to worry about money and bills? Obviously, our life would be better. I was foolish with money for a very long time, and now that I’ve wizened up, I’m trying to put things right. Unfortunately, I’m not sure how well I’m doing.

Paragraphs was released earlier this month, and as I wrote on the company blog, I was very lucky to have been mentioned by a few high traffic sites. The initial publicity spawned a good start to sales, but it was simply not enough. I don’t have the budget for advertising, so word of mouth is the only publicity I can get, and without it, Paragraphs drifts off into mediocrity.

Sales figures

That chart is disappointing, but it’s not the end of the world. I was watching a talk by Kevin Hoctor about building a good indie software business, and one slide absolutely resonated with me.

Never Give Up

At one point, and I’m paraphrasing here, Kevin says “you can’t just ship your app and drop it after the first month when sales are not what you expected.” Quite true. I found another encouraging quote by Daniel Jalkut:

Always remember that the main thing separating people who succeed from people who don’t is a commitment to keep trying while the others give up.

Knowledge and cleverness are key components to achieving your goals but they pale in comparison to persistence and an unwillingness to admit defeat.

What separates successful people from others is a commitment to keep trying.

I’m not known to be a quitter, and I’m not about to start now. If I can teach my kids anything by the example of my life, I want it to be about being persistent.

So, where we stand with Paragraphs and Farmdog Co. is that initial sales are disappointing, but I’ve learned quite a bit about what the market is looking for, and I’m working hard to address Paragraphs’ shortcomings. However, given that I’m a father of four, I have a full time job, and I’m a freelance writer as well as a developer, there are a few very real constraints that I need to work within.

First, even as I plan for the future, I can’t ignore the fact that my kids are growing up right now. My oldest will be starting high school next year, and I’m teaching my youngest how to ride his bike. Each child needs one on one time with Dad, and all of my work will be wasted if I don’t make time to spend with them. We work so we can live, not the other way around. It is also important to spend time with my wife, fitting in little dates when we can, like a midnight pizza.

Second, even though I have big plans for Farmdog, during the day when I’m at work, I have to give 100% of my abilities to the company that pays the bills. Even when they frustrate me, even when I think I could build a better system on my own, and especially when I’m just not feeling up to it, I need to make sure that I’m taking care of the company that takes care of me and my family. Without the day job, not even the dream of Farmdog could exist. The someday in the future that I imagine is at the least five years away.

Third, I despise debt with a passion I can not put into words. The fact that I have debt gnaws at me, deep in my soul. So, to speed up paying it off, I’ve committed to freelance writing three nights a week, at least. Freelance writing is difficult, but it is good to keep that part of my brain in action, and it is great to keep up with the industry and the open source community in general. It would be easy to focus on the small section that we use at work, writing keeps me engaged and learning new things. Often I don’t feel that I completely understand a topic until I’ve written about it.

So, with all of these commitments, with my life in context, where does this leave Paragraphs? Again, where do we stand? I have to refocus from time to time on the dream. I did not start Farmdog to get rich, I started it to have more control over my life. That’s not something that is going to go away, the dream is here to stay, and, therefore, so is Farmdog. Practically, what this means right now is that work on Farmdog is relegated to the weekends, unless a customer sends in a bug that needs immediate attention. What this also means for Farmdog is that I get time to think through hard problems, and I get to bring a lot of experience to the product. This is why I believe Farmdog will eventually be successful. Paragraphs might not be perfect, but the feature set is well thought out and addressing a market segment that I believe is under-served.

It is my intention to make Paragraphs the easiest way to write online. I know there are a few geek hurdles to overcome, but I’m working on a lot of new things that are a bit outside my wheelhouse to get the product where it needs to be. I don’t want to go into detail, but suffice to say that by the time I’m done, I hope that Paragraphs will be the only thing a customer needs to publish their thoughts online.

So, where we stand with Paragraphs and Farmdog is that we plan on improving the product, slowly and deliberately over time, until we reach the dream. And then, maybe we will start working on version two. (just kidding, I already started on version two) Paragraphs is a labor of love, it will not be ignored, it will be lovingly nurtured.


The Hardware Racket

Every now and then something just gets to me, and for the past few weeks, that something has been the process of purchasing enterprise hardware. Servers, SANs, load balancers, the kind of equipment that, instead of a price and an “Add to Cart” link, comes with directions on who to call.

Most hardware is not purchased directly from the manufacturer. It’s purchased through resellers, and each reseller will have a regional representative who will want to meet with you. The resellers don’t really want to just sell you the hardware, they want to “partner” with you to “build a solution”. They want to add consulting fees to your hardware purchase, and they want to jack up their margin on selling the hardware as much as possible.

It’s not small money we are talking about either. I’ve seen purchases of a single piece of equipment drop by $22,000 by modifying a single software line item. How much of that cost was the actual price of the software, and how much of it was reseller markup we will never know. The reseller program is built to keep us in the dark. For example, NetApp has a few nice bullet points on their “Become a NetApp Partner” page:

The NetApp Partner Program for Resellers is designed to help you grow your business and maximize profitability. With NetApp® products and services in your portfolio, you can deliver innovative storage and data management solutions that satisfy even your most demanding customers.

As a NetApp Reseller, you can:

  • Increase revenue
  • Earn greater returns on your investment
  • Leverage our tools, best practices, and technical experts
  • Create opportunities with our co-marketing resources, sales enablement programs, and prequalified leads

The combination of market momentum, increased demand for storage products, and innovative technology from NetApp makes this a great time to be a NetApp partner.

Pay special attention to “maximize profitability” and “increase revenue”, because as a consumer of these goods, that’s money out of your pocket. It’s not that companies like NetApp don’t have a price list, they do, it’s just that the price goes through an algorithm first. I believe the algorithm takes into account the volume of sales by the reseller, the number of discounts available to the reseller, and probably a few other items. I’d love to get a look at it someday.

In fact, I’d love to see a centralize, crowd-created database of hardware costs. A Web site that let me check on what the going rate was on a 10TB SAN. I’m not sure if I could convince anyone to do it, but it would be fantastic if sysadmins and IT managers around the country would upload the PDF quotes they get from resellers. Then we could parse the quotes, and come up with a general idea of what the market price is for the equipment. Right now, we just have to trust that whatever regional reseller we are working with is being honest and not gouging us. Hard to do with the salesmen arrive in BMWs and talk about their private pilots license.

I’ve heard that it is “unethical” to share the quote we get from one reseller with another. I’m not sure about that. I believe that if the vendor knew that anything they gave to us had no expectation of privacy, we would be free to share the quote with whoever we choose. The resellers are the ones deciding the practice would be unethical because it would be bad for their business if they had to fairly compete on price. Personally, I would be satisfied with whichever reseller let me know up front what their cut of the deal was, and how I could calculate the most honest transaction for my company. Dealing with resellers is like trying to buy a used car or a gym membership. It’s shady.

Here’s another example of resellers behaving badly. We were in a meeting with a salesman, and an engineer from his company, and they had a manufacturer on a conference call to discuss the equipment we were pricing out. When we got to the end of the meeting and we thought we had all of our questions answered, we hung up on the manufacturer, and the resellers started undercutting their manufacturer “partner” to try to sell us a similar piece of equipment from another manufacturer. They said it was because they wanted to partner with us to make sure we got the best deal, but I was left with the impression that the equipment they tried to pitch simply gave them a fatter margin.

This is the biggest draw, in my opinion, for open source software and hardware. If we can match the performance of these big name vendors using hardware that we can purchase from NewEgg, we won’t have to deal with slimy resellers.


Mozilla Turns 15

Mozilla has been one of my favorite open source projects since I first learned of them back in 2002. I remember downloading the Mozilla browser, and thinking that it was just like Netscape Navigator (no surprise there), an all-in-one browser that threw in the kitchen sink, just in case you needed it. You can still download it’s descendant, SeaMonkey. Not long after, I heard about another browser they were calling Phoenix, that, as it was explained to me, pulled out just the web browser from Mozilla, and left everything else alone. I downloaded it, and it was fantastic. Incredibly fast, lean, and simple. It became my favorite right away. There was only one release of Phoenix, after that the browser was renamed briefly to Firebird, and finally, Firefox.

It was an exciting time for the web. The world was starting to get broadband, but most connections were still dial-up. The slow connection speeds and slow computers meant that any small improvements in browsing meant a lot. To many people, the web was Internet Explorer. IE represented upwards of 90% of Internet traffic, so there was a real David and Goliath feel to Mozilla’s snappy little browser. There were many sites that rendered correctly only in IE, and Microsoft was busily expanding their monopoly on desktop computers to the web with FrontPage and IIS. The web could have turned out very different, and I like to think that we have the openness and inclusion of the web today in thanks, at least in part, to the work done by Mozilla back in the late 1990’s and early 2000’s.

Over the years Firefox has both grown and waned in popularity, but the impact of Firefox, and how it helped shape the web should not be underestimated. Today we have several projects that work to keep the web an open platform (like the ubiquitous WebKit project), but the work is far from over. Privacy online is a major issue for the future, as big companies become more sophisticated about tracking your activities on the web, and despite the advances of Firefox and other browsers like Chrome and Opera, Internet Explorer still makes up for the lions share of web traffic.

I’ve used all (or, ok, most of) the different browsers out there, but returning to Firefox always feels like coming home to me. Firefox is different because Mozilla is different. They are a non-profit organization dedicated to making the web a better resource for everyone. In my book, that’s something to be proud of. Mozilla is always looking for people who want to help, so if you feel like being part of something big, you might want to check it out.


Paragraphs

Alt Text

In the back of my mind, I always knew that the name “Scout” made no sense. I like the name, I like the bit of a kick the “Sc” at the start of it makes, and the snappy end with the “t”. It sounds good, but there is no correlation between what this application does, and what it was named.

Scout is now Paragraphs.

paragraph ˈparəˌgraf

noun

a distinct section of a piece of writing, usually dealing with a single theme and indicated by a new line, indentation, or numbering.

verb [ with obj. ]

arrange (a piece of writing) in paragraphs.

And, as you can see by the image above, we now have a snazzy new icon. I spent a long time thinking about the name and icon, and how they related to the function of the app. I commissioned two icons to be created. The first one was intended to look at home in the dock, and mimicked the “chrome circle with something inside of it” look

Alt Text

It’s a fine looking icon, and I might find some use for it eventually, but I think it accomplished it’s goal of “fitting in” a bit too well. To me, it looks bland, without character. For days after receiving the final icon I racked my brain about what to do. I even got out Photoshop and tried to edit it myself, to no avail. Then I remembered Shawn Blanc’s article about his grandfathers Royal Quiet De Luxe typewriter, and the pieces started to fall into place.

In addition to the name and icon of Paragraphs (I’m still having trouble not calling it Scout), I’ve squashed a ton of bugs, and added a few niceties. If you highlight a word and press Command-I, the word will be surrounded by asterisks, Markdown syntax for italics. Similarly, pressing Command-B will surround the word with two asterisks, Markdown for bold. Finally, highlighting a word, while you have a link on the clipboard (meaning you just copied a link from Safari or another browser), and pressing Command-L will format the highlighted word as a Markdown link. It’s pretty snazzy if I do say so myself.

I’ve put a lot of work lately into the animations, trying to make them as smooth as possible. There is still work to do there, but I think we are miles ahead of where we started. I also have a new theme that will ship with Scout, thanks to Kev Rodgers. Now Paragraphs will have the Default theme, a minimal CSS “Plain” theme, and Kev’s “Fresh Install” theme, which also looks quite nice. I hope to add many more in the future. RSS feed is fixed again, and I’ve put a lot of additional checks into the site parsing code to ensure that Paragraphs can continue running if it can’t build the site for some reason, testing that strings are valid, not null, and not empty, before using for example.

I got word today that the DUNS number for Farmdog Co. has been approved, and will be available to use in two weeks. So, barring any unforeseen disasters, we should be looking at a product launch within the next month. However, I’ve read that you should never pre-announce shipping dates, so take that with a very large grain of salt.


Scout Beta 2

So, quite a bit has changed in the past week or so. I got a lot of great feedback from a few beta testers, and stomped out a few bugs. A bigger deal though came from a couple of people who noted that they got confused in some of the views on how they were meant to proceed. Confusing the customer is absolutely the last thing I want to do with Scout, so I took off my developer hat and put on my HCI hat and tore Scout apart.

Scout now has a proper preferences window, just like every other Mac app. It comes up by hitting Command-Comma, goes away by hitting escape. Similarly, both the media manager and the theme chooser are in panels, keeping the main text editor view clean, and much less confusing about which view you are in, and how to get back to where you want to be. I’ve added a toolbar to the top of Scout, with a pair of buttons to switch between the text editor and the web preview. The other two buttons on the toolbar are to add a new post, and to show and hide the library of previous posts.

Alt Text

I’ve cleaned up the library view quite a bit too, and a added search field to the top which should come up with focus when you open the library. The search field searches both the title and the text of every post, so it should be able to find what you are looking for. The blue background was removed, and replaced by subtle dotted lines separating the posts on a white background.

I’ve also tweaked the image preview that comes up when you click an image link. The image is bigger now, and the background is more of a smokey white instead of the black it was before. I think this change makes the image more viewable, and makes the background fade out better, drawing attention to the image and away from itself.

Alt Text

I’ve fixed a few things about the default text editor theme that bothered me (and John), making it easier to read and overall more pleasant, at least I think so. It looks especially good full screen. In fact, my opinion is that the full screen view is the best way to use Scout.

Finally, I’ve made a few tweaks to the data storage engine, fixing a bug that prevented publishing a site on the first run. Funny story about that. Last week I became a bit overconfident in Scout, and sent out invitations to try it to a group of well known writers that I respect. One of whom replied that he had downloaded and tried Scout, found a laundry list of things wrong with it, tried to publish to a folder, and Scout crashed. I was mortified. Turned out to be a stupid change that I had made, and obviously not tested thoroughly enough, right before sending out the application. I put the publishing code on a background thread to continue user interface responsiveness while Scout wrote out the files. Turns Out, that’s not a good thing. However, what crashed the app on the background thread merely caused an error that Scout recovered from on the main thread, so finding the crash actually allowed me to find and fix a major bug. I just wish I had found it before sending it out.

Live and learn. Test harder next time.

With all of that being said, I really think that Scout is in much better condition now than it was a week ago. I’m excited.


Updates on Farmdog, Scout, and Go2

Last week I sent in the certificate of organization to recreate Farmdog as an LLC in the state of Iowa. I have the domain name, twitter account, and a test site built. Assuming everything goes through with the state without problem, Farmdog Co. will be ready to launch very soon.

Scout has a couple of rough edges to clean up before shipping, I need to finish the help doc for it, and fix a couple of odd user interface inconsistencies. But, for the most part, I think Scout is ready to ship. Narrowing the scope and number of features slotted for 1.0 was a big help. I’m planning on selling Scout through the Mac App Store, as well as on Farmdog.co using Fastspring. So, I still have some work to do on Sandboxing, as well as license keys and trial limitations. Probably a few days work to get all of that integrated and tested.

Which brings us to Go2, my professional bookmarking app. I’m rewriting Go2 from the ground up, and I’m pretty happy with how it is coming so far.

Alt Text

When the Mac App Store launched, Go2 was there on day one. It sold well the first month, but was downhill from there. Previously, Go2 had a bit of an identity crisis as it tried to find it’s place. Was it a general bookmarking app like Delicious or Pinboard? Was it a replacement for Command-K in the Finder? When customers downloaded Go2, what were they expecting? As time went on and as I talked to other Go2 users, it became clear that they were using it similarly to how I use it, as a professional bookmarking tool for quick access to servers over SSH, FTP, or as web pages. So, the newest version of Go2 builds on these strengths, and makes it even easier to get to where you want to go. Here’s a quick rundown of new features:

  • Importing the SSH known_hosts file.
  • Search field in the status bar now launches the first bookmark when the user hits the return key.
  • When you down arrow out of the search field, you can now use the forward slash key to return to the search field.
  • Overall improved look and feel

Also, interactions with Go2 are normally through opening bookmarks. So, the main interface is now in the status bar, and new bookmarks will be added through the preferences pane.

Finally, I’ve abandoned core data as the storage engine for Go2, and am in the process of moving the plain text storage engine I wrote for Scout into Go2. Hopefully, this means that upgrades will be easier, and I should, finally, be able to sync through Dropbox or some other file syncing technology. This should make it easier for teams to use Go2 as their central source of truth for network servers.

Like I said, I’m excited about relaunching Farmdog. I’ve learned a lot over the years, and I can’t wait to get rolling.


More Scout Tips

Eventually I’m going to need to compile this into a proper help doc, but for now, documenting Scout with Scout will do.

Scout handles pages just a little differently than posts. New pages do not show up on the home page, and are not organized into subfolders based on date. Pages are converted into HTML and saved in the root of the site directory, right next to index.html. To create a page, add a new post, but before the title of the page add the characters @@ . That is two “at” symbols followed by a space. For example: @@ Contact.

Secondly, the default theme that ships with Scout, the theme of this site, is my own creation that I’ve cobbled together over the past few years. What I hope to see are a few people more talented than I create some really great themes. In fact, assuming Scout is successful, I plan on hiring a designer to do just that. However, there are a number of hurdles to overcome before that happens.

To create a Scout theme, create a folder with the following files inside:

  • atom.xml
  • atomTemplate.xml
    • The two xml files are for creating the site RSS feed.
  • base.css
    • Should contain all of the site CSS
  • default.html
    • The standard HTML template for the site.
  • indexTemplate.html
    • Wraps each post in a div with an id of “posts”.
  • post.html
    • Creates the page template for each post
  • robots.txt
    • Not currently used, but probably should be.
  • screenshot.png
    • A nice screenshot of the post at 400x341 pixels.
  • toc.html
    • The template for building the archive or table of contents.

Scattered throughout the files listed above are strings that look like: YYYY_SCOUT_SOMETHING_YYYY. These are the Scout “Y Codes”, as in, “why are they so ugly?” I was looking for something that was unlikely to be reproduced anywhere else, and this was the first thing that came to mind. I currently have the following Y codes defined:

  • SCOUT_5ATOMPOSTS
  • SCOUT_AUTHOR
  • SCOUT_CONTENT
  • SCOUT_CSS
  • SCOUT_CURRENTDATE
  • SCOUT_CURRENTYEAR
  • SCOUT_POST_CONTENT
  • SCOUT_POST_DATE
  • SCOUT_POST_TITLE
  • SCOUT_POST_URL
  • SCOUT_SUBTITLE
  • SCOUT_TITLE
  • SCOUT_URL

Hopefully, the titles of the codes are self-explanitory, but as I have time I will be documenting them properly. For now, you can probably take a look at how the files in default.stemplate are arranged. Scout looks for these codes in the template and replaces them with the proper data from the posts to generate the site.

Lastly, you should never feel like you need to save your work in Scout. Scout automatically saves your work at various intervals. For example, whenever Scout looses focus as the main window, or whenever a new post is chosen, or when a new view is looked at, Scout automatically saves the current post as a plain text markdown file saved in ~/Library/Application Support/Scout/Posts/. If you like you can watch the file being written to in the finder or as you use the application. Likewise, if you have a markdown file that you would like Scout to know about, you simply need to name it according to the naming convention of YYYY-MM-DD-HH-MM-SSSS##Title_Of_Post.markdown and drop it into this directory. Next time Scout is restarted it will treat this file as its own.

Scout is intended to give you control over what you write without getting in your way about it. I know there are going to be some rough edges, but as we progress I’m sure they’ll get worked out.


Beta Testing Scout

Well, as much as I’d love to procrastinate for the rest of eternity, the time has come for Scout to take it’s first baby steps out of it’s private testing ground and out to a few interested folks who would be brave enough to beta test.

Alt Text

I’m honestly very happy with how Scout is turning out so far. It seems very stable, and now that I’ve worked out a few annoying bugs it is as easy to use as I’d hoped. Here is a quick rundown of supported features:

  • Markdown Editing - Scout is built for Markdown.
  • Post Previews - The post is rendered into the chosen theme, so what you see in the preview should be exactly what you see when published online.
  • Media Manager - A nice grid of the pictures Scout knows about.
  • In-line Image Preview - Speaking of images Scout knows about, dragging and dropping an image onto the text editor will create the markdown code for inserting the image in the post, and clicking on the text will show a pop-up preview of the image.
  • Themes - Scout supports a very easy theming model that I’m hoping will attract web designers.
  • Text Editor Themes - A few nice built-in themes. I generally use Solarized Light.
  • A Very Nice Full Screen Editor - Where I spend all my time in Scout.

Since I’m shooting for 1.0 here, there are a couple of features that I’ve intentionally left out because they were simply not there yet.

For one, no syncing support just yet. I have the inner structure to support syncing over Dropbox, or any other form of file syncing, but in practice it is a bit janky, so it will not be supported in 1.0.

Secondly, Scout will only publish to a folder on your hard drive. It will not publish to the web. I’m working on integration with Site44, but as with syncing support, it’s just not quite polished enough to include in the 1.0. With that being said, I’m hosting this site with Scout and Site44, I just choose the Site44 folder with the publish file picker. Works well, but could be smoother. Maybe that’s a 1.1 or 1.2 enhancement.

Anyway, I would be grateful if you would beta test Scout for me. If you are interested, drop me a line on twitter. I’ll get right back to you.


Real Music

My grandparents house was outside of town, at the foot of the mountains, surrounded by woods. Papa kept his guitar in a black case under his bed, along with his violin. Sometimes, after dinner, if we grandkids begged and pleaded enough, Papa would get his old guitar out and play us a few tunes. They were simple folk songs, sang without any of the southern drawl common in country music. One I remember the most was about his mama sending him to town to buy a chocolate ice cream cone. The little house would spring to life those nights, we would be warm from the fire, and full from Grandma’s cooking, and listen to the simplest, most honest music I have ever heard.

Papa tried to teach me how to play, and I think if I had not been so young and stubborn I would have listened to him. He would tell me where to put my fingers, I would get it wrong, and he would grab my fingers and try to put them where they were supposed to go. It didn’t work out, and so far I have only learned a few basic chords. Right now my guitar sits in the corner of my office, staring blankly at me through it’s black case, waiting for me to bring it to life.

Sometimes a friend will come over who knows how to play, and I’m always amazed at how he can call such beautiful music from the strings of the guitar that I can only coax out a basic tune from. Years ago this friend and few other sailors who shared a place in Virgina would get together to write, play, and even try to sing. For now, learning to play guitar is still on my to-do list, but appreciating honest music has always been close to my heart.

The other day I was helping my daughter do the dishes, and we were taking turns picking songs to listen to while we washed. She would pick out one pop song after another, and as she did I realized that pop music hasn’t changed in at least twenty years. It is still as synthetic and manufactured as ever, pandering to the lowest common denominator. I struggled to find something that we could both enjoy, but almost every song I chose was coldly marked as “weird”.

She has a point, a lot of it is strange. Strange, and a bit raw, unprocessed, analog. I have, so far, 22 albums of the Grateful Dead, most of them live bootlegs from the seventies. There is something about the energy of the live shows, how I can close my eyes and almost be there. Sometimes you can hear the crowd yelling out asking for a song, the Dead hear it and when they start playing you can feel the energy spread through the crowd like wildfire, the beat of the drums matched by clapping hands. There was nothing scripted about these old shows, the Dead would just get up there and start playing.

This is real music, a person and an instrument coming together to create something beautiful. From Papa’s strumming to the Dead’s wall of sound, there runs in my musical preferences a common thread of musicianship, of jamming for the love of the song. I was browsing through the Archive’s library of Grateful Dead shows the other day when I saw mention of a Grateful Dead cover contest. That mention led me to YouTube, where I found one of the best covers of one of my favorite Dead songs:

The Giving Tree Band had me captivated as soon as I heard the violin, but when the steel guitar and the piano started, I was there. It’s not just the song, although it is a fantastic song, and it is not just that they have these instruments, the band appeals to me because it sounds sincere. It is hard (for me at least) to explain the difference in this recording and any other, but I think it has a lot to do with the lack of post processing. I believe I’m hearing the musicians real voice, not a digitized representation of it that’s been leveled and artificially harmonized. I’m hearing the banjo, and the electric guitar as the musicians intend their instruments to be heard.

I love music, even if I would sometimes rather drive in silence. I like to listen to music that relates to me, that’s played by people who might just drop by for a cup of coffee to catch up on old times. Music that makes me feel at home. Music that reminds me of the smell of burning pine, the taste of pumpkin pie fresh on my lips, the sound of Papa’s guitar, and knowing deep in your heart that you are warm, safe, and loved.


Paperman

Just beautiful.


Electrogent's 50 Rules

One of my favorite things about the Internet is finding a little treasure trove of writing and style that I previously did not know existed. Electrogent is one of those little gems, and his list of 50 rules for his son is full of timeless advice.

Thanks to science, we have all sorts of polymers, synthetics, polyesters, crystalline, and other man-made materials for making life a little better. However, few materials are as awesome, timeless, and useful as leather.

Travel the world… but then come home. Your mother misses you.

You should strive to become an expert in everything like Galileo. The old adage “shoot for the moon and even if you miss you’re still among the stars” applies here. Even if you try and fail to become a great master in all fields of study, you will still attain great knowledge across many disciplines and become a well-rounded person. Even though failing is sometimes necessary, there is basically no way to fail in this pursuit because anything you learn is a success in itself.

Life is meant to be a quest of continuous self-improvement, becoming a little better every day. Electrogent gets it.

Don’t miss his fantastic gallery.


Details

Thought of the week:

I don’t like this “top ten” business. It’s the bottom ten that I like. I think you’ve got to go for the little things, the stones that make up the wall.

– Donald Knuth


Meta

You get good at something by doing it repeatedly. I’ve been writing on this site for six years now, but with little direction or topic. I’ve gotten good at not making anything of the site, which is not where I wanted to be when I wrote about why I kept this site in 2011. I’ve not kept to a regular schedule, or a common theme, so I am not surprised to see that the only traffic I have going to the site is my own, and a few that found the site from Google. The preceding statement will make the next seem a bit ridiculous, but bear with me.

I’m starting a weekly sponsorship program for the site. When you sponsor a week of posts on jb, your product post will appear in the main feed three times, Monday, Wednesday, and Friday. Your product or service will also be mentioned in the site header for the week. Sponsoring jb will expose your product to a small, but growing, audience of creative and technical professionals. Consider this your opportunity to “get in on the ground floor”.

I have, for the past six years, been practicing finding my voice, my interests, and honing my writing style. I have also been deciding on the topics that interest me, that I’m passionate enough to write about, and that I care enough to share with the world. This is a site about quality, quality in our things, how we choose them, what we decide to accept into our lives, and what we spend our time on. I want to shine a light on the goods and services that I find exceptional.

I am also putting up some barriers to what I will write about here. I will not write about systems administration topics, or anything dealing with the general topic of open source software. I already have a venue for those topics, so they are out of scope here. If an open source application that I use is outstanding in some way or another, I might cover it here, but not on the merits of it being open source. Personal and family subjects have been mostly taboo since I started, and will remain so now. I will also not talk about politics or religion. These barriers are mostly to keep myself on track.

This is also a site about the pursuit of excellence in all that we do. This site is about using things that are worth having, and spending our time building things that are worth selling. The previous years were a warm up, the main game starts now, this is a great place to start reading.


Cutting Corners

After reading the MacSparky piece on craftsmanship, I’m reminded of how I like to look at my career as a systems administrator. I find that there are times when things that are not quite right just bother me. Like when there are inconsistencies or one-offs scattered throughout the environment I am responsible for. There may well be perfectly logical reasons why some systems are monitored and some are not, why some are registered with configuration management and others are not, but in my mind it is these little inconsistencies that add up and make your work look sloppy.

A craftsman is not sloppy. They are careful, competent, precise, and thorough. It is knowing that the little details matter, if to no one else but you, the accumulation of details is what defines the quality of your craft. It is knowing what the right tool for the job is, it is knowing when to use the power tools, and when to do it by hand. It is knowing that every corner you cut will come back to you in the end.

Cutting corners is unacceptable for a professional sysadmin. It doesn’t matter if you consider yourself “devops” or an old school neckbeard, you must decide to do the right thing and make sure that all of your bases are covered. I like to think of the environment like the internal workings of a clock. There are lots of tiny little gears, but when they all work together, you can feel the system ticking happily along.

Your profession matters less than how you approach your work. Do you do it sloppily, haphazardly, or as a craftsman?


Misunderstanding NSString

So, while I was debugging the first post using Scout, I found an oddity in NSString. I was building the links between the posts using stringByAppendingPathComponent, to join the site’s base URL with the path component of the individual post. Unfortunately, that method seems to be stripping one of the forward slashes off of the http:// string, which screws up building links.

To test it, I created a blank Xcode project, and added this method to the App Delegate:

-(void)awakeFromNib{NSString *first = @"http://first";NSString *second = @"second/part.html";NSLog(@"first + second = %@", [first stringByAppendingPathComponent:second]);}

And, sure enough, here is the output from that method:

2013-01-03 19:26:02.388 NSStringTester[39861:303] first + second = http:/first/second/part.html

A quick search through Scout’s source files shows that I’m using stringByAppendingPathComponent 53 times. Looks like I’ve got some work to do.

Also, this is a good time to point out that when you are doing web development, it is very important to test with multiple browsers. Safari hid the problem, Firefox did not.

Finally, it turns out that this is not actually a bug in NSString, but a bug in my understanding of this method. My thanks to Matt Yohe who was kind enough to point out my mistake on Twitter.

@ibuys @eridius also: “Note that this method only works with file paths (not, for example, string representations of URLs).”
  — Matt Yohe (@mattyohe) Thu Jan 3 2013 7:34 PM CST

I’m still considering filing this as a bug, but I can see where they are coming from. Double slashes would not work for a file URL, but if they are already parsing the string for something like that, why not just check for “http” as well?


Scout and FTP

Building a desktop application that manages creating your site is great, but only publishing to a local folder is for the birds. After only a few posts using Scout, I can say that the process of publishing to a folder, switching to Terminal, and running rsync will not fly for any potential customers I may have. It’s a pain.

However, the choices for publishing online like Scout is meant to are not great. The point of Scout is that you can publish to any bare-bones, $3-per-month web host in the world, and not have to worry about the site going down because of high PHP or database processing overhead. There is no database, and there is no active code being executed. The only thing you need for Scout to work is a web server to serve up the site, and an ftp server to get your site to the server. But, that means that I need to write the code for dealing with FTP, and probably SFTP.

This is going to be hard for a couple of reasons. There could be a thousand different implementations of FTP, and a virtually unlimited number of “edge” cases that I might run into. For example, just testing some FTP code with my current web host caused all of my FTP connections to the host to be denied for a few minutes, too many connections at once. I clearly still have a lot to learn about stream programming, but if there were ever anything I would like to use a library for, this is it.

Speaking of libraries, I’ve kind of got a thing about using external code, and I’m a bit conflicted about it. On one hand, I don’t want to continuously reinvent the wheel, but on the other hand, I don’t want to mindlessly drop someone’s half-baked framework into my project. Choosing someone else’s code to use must be done very carefully. Right now, I’m considering two things for networking, writing everything myself using CFNetwork, or building in support for libcurl. The libcurl library might be a better choice, since I could also use it for SFTP file transfers, but, it might also complicate my code, and add an external dependency. Tough call, still need to think it through.

In the mean time, another thing I’ve noticed Scout needs is a decent full screen mode. The current full screen mode just makes the window bigger, which is not really a lot of help. Full screen should vertically center the current text being edited, make the font bigger, and possibly make the text view a bit narrower than the full width of the screen.

Also, themes are coming along nicely. Scout will support a fairly simple development of themes for your site, in a little theme.stemplate package file. Double-click on the theme and Scout will import it, and it will show up as an available choice in the theme chooser.

Scout is by far my most ambitious project. Still tons to talk about, and lots of possibilities. Who knows, what about live statistics in the app? Beautiful PDF report generation? A Farmdog hosted option available with in-app subscription and zero configuration? It’s all possible, all it takes is time.

Development continues.


Footnotes and Other Scripts

I’d like a really simple way to insert footnotes in the text. However, I’m not sure how much of that I can do with the Markdown parser that I have now, which means inserting ugly HTML, which I’d really rather not have. I could do something in the generation of the site, inserting my own marker in the text and parsing through that later, but that seems like reinventing the wheel. Surely there are better ways to go about this.

I’ve also been thinking about other scripts or “plugins” for Scout. An early idea I had was to build in analytics, so you could download hit counts and other statistics from your host and Scout would build a nice report for you. Or, maybe even do some type of live updating, but I think that might be taking it a bit too far.

MathJax would be a nice addition, but I don’t think it would be appropriate for everyone. Maybe a preference pane with optional plugins you could check and uncheck and have them included in your site. That way, if you want MathJax or Google Analytics or jQuery you’d just select them and hit publish. Still so far to go to get there.

Which leads me to the next thought, when is it enough for 1.0? I need to balance two weights; on one hand, I need to actually ship the app, but on the other hand, I want Scout to be great from day one. What is it going to take for it to be great? What is the bare minimum that I need in 1.0 before I can ship it? These are the questions I’m asking myself.

One feature that I keep coming back to is the ability to have zero configuration publishing. For example, what if you don’t have a web site or a domain name, but you’d just like to write and publish online in the easiest way possible? Scout should be able to grab your iCloud user name, have you click an in-app subscription, and let you publish to a Farmdog hosted server. That way, you can just download Scout and start writing, and Scout and Farmdog take care of all the little details. That’s the dream anyway, but is that a 1.0 feature? Tough call.

Syncing is another thing that’s going to be a tough call. I’m using plain text as the data storage, so I should be able to monitor changes in the filesystem and merge them into the application. Hopefully, building on plain text and integrating with Dropbox will allow me to (eventually) build an iOS companion to Scout. Scout on the iPad with Dropbox on the backend could be fantastic for writers.

If I only had 30 hours per day to work on this.