All posts by Jamie Grove

NewsBee 1.2 is with Apple for review!

It’s been awhile since I’ve released a new version of NewsBee, but it’s not like I’ve been idle. 🙂 I’m happy to announce that NewsBee 1.2 is complete and waiting for Apple’s review!

I’ve been using version 1.2 for the last few months now, making tweaks and changes to the way the application handles extended characters (i.e. “international”) and parses RSS and HTML data. Oh, and I completely rewrote the event handling code to rely on GCD instead of performSelector. Yeah, that was a biggie. I really had no idea how big of a job it would be until I made the changes and then began the process of stripping out all the old code. Woof!

I’m glad I did it though. Under GCD, NewsBee is running very smoothly even with a large number of active sites. No more momentary delays when you pop open a menu or perform a manual refresh. Sure it was just a few milliseconds, but it seemed a little sloppy to me. Well, delays no more!

It’ll take Apple a little while to get back to me, but I want to thank all of the testers who helped me with this version. I especially want to thank those of you from around the world who sent me feeds to test and helped me deal with the thorny issues of character sets. NewsBee 1.2 is way better because of your help!

Fixing Bugs: Using OS X crash logs and atos to symbolicate and find line numbers

How’s that for a subject line?

Ok, so I’ve been tuning up the latest version of NewsBee and the working is going well. The only problem is I had this strange little bug that caused the app to crash every few weeks.


Application Specific Information:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM insertObject:atIndex:]: index 27 beyond bounds [0 .. 23]'
abort() called
terminate called throwing an exception

Now, I recalled back in the mists of time that there was a nice way to take an OSX crash log and extract the line number, but for some reason I couldn’t make my brain give me the information beyond the fact that I needed to use atos. Now that I’ve unraveled the bits and pieces I already knew, I figured I’d drop it in a blog post so that I could recall it later (when I inevitably forget once more).

What is this “atos” of which you speak?

The atos command converts numeric addresses to their symbolic equivalents. If full debug symbol information is available, for example in a .app.dSYM sitting beside a .app, then the output of atos will include file name and source line number information. Mac OS X Developer Tools Reference

Buh? Don’t worry, that’s just some fancy talk from the Apple docs. What it means is that if you give atos your application’s binary and a starting memory address it can tell you things about related memory addresses, including the source file and line number.

Great, so how do I use it?

To begin, open up your crash log and scroll all the way down to the “Binary Images” section. You should see the name of your application on the first line. The very first HEX number is the starting address:


Binary Images:
0x10ae52000 - 0x10ae69fff +com.iphonespaz.NewsBee (1.2 - 1.2) <95951DBD-40CA-3658-8E5C-5EC3E41C00B4> /Users/USER/Desktop/NewsBee-1.2.app/Contents/MacOS/NewsBee
0x10af1e000 - 0x10af27fe7 libcldcpuengine.dylib (2.2.16) /System/Library/Frameworks/OpenCL.framework/Libraries/libcldcpuengine.dylib

In this case, the number I need is 0x10ae52000. Yay!

Next, I need the address where the bad things happened in my app. To get this, scroll up to the top of your crash log and look for the “Application Specific Backtrace” section. There are probably a number of lines here, but what you want to locate is the specific call out for your app.


Application Specific Backtrace 1:
0 CoreFoundation 0x00007fff88955b06 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff887ba3f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8890627a -[__NSArrayM insertObject:atIndex:] + 282
3 AppKit 0x00007fff8a6f9794 -[NSMenu insertItem:atIndex:] + 505
4 NewsBee 0x000000010ae5e276 NewsBee + 49782

From the example above, I want to grab 0x000000010ae5e276. This tells me where my app tried to be bad an insert items out of turn. Now, I’m ready to put it all together and get the mystery reveal on the offending source code.


$ atos -o NewsBee-1.2.app/Contents/MacOS/NewsBee -l 0x10ae52000 0x000000010ae5e276
got symbolicator for NewsBee-1.2.app/Contents/MacOS/NewsBee, base address 100000000
0x000000010ae5e276
-[newsBeeController _loadMenu:] (in NewsBee) (newsBeeController.m:325)

In the first line, I’ve provided the command. The “o” option is for the binary. In this case, I’m looking at the NewsBee app and drilling down to the compiled executable. The “l” option is used to specify the load address I want atos to use when bringing the binary into memory. The final number is the place where the code went wonky.

On execution, atos loads up the binary and helpfully repeats my explanation above in obfuscated language. Then, it’s kind enough to tell me right where the problem is: line 325 in newsBeeController.m. As it turns out, the problem is happening right where I expected it to be (the _loadMenu function), but knowing for sure is awesome because the error itself is difficult to replicate.

Of course, everything I’ve said here can be gleaned by simply reading the man page for atos, but why do that when you can google, right? 😉

Some Try, Some Do

Racist, sexist, bigots are everywhere and unfortunately more than a few have learned to write. Like most chronic diseases, these individuals flare up from time to time. Sure they’re irritating but they’re also dangerous as well. They do real damage those they pursue to say nothing of the perception of their craft. They also recruit others to their cause, which is perhaps the worst part of all.

Ugly stuff, folks.

The world of the Science Fiction and Fantasy Writers of America is dealing with one of these flare ups. There’s a lot of ink (both real and virtual) flying around.

Then there was this post by Tobias Buckell:

Later, he tweeted an apology for cranking out his post in a hasty manner. I thought… Well, at least he did something, and I told him so. His response?

“One tries.”

Now think about this for a second. This guy didn’t just write a blog post, or even a single book about this issue. He created an entire universe and a trilogy where he could grapple with issues of race and gender while still providing readers with a rockin’ good ride.

This is a little more than trying in my opinion. It sounds like a helluva lot of doing. Writers like Toby make me want to be a better writer and a better human being. They make me want to DO something.

So, I did… I bought Tobias Buckell’s books.

All of them. Including different formats of the books I already owned.

Then a tweet by Mur Lafftery pointed me in another direction:

I’d heard about N. K. Jemisin’s work awhile back. I just hadn’t made the time to dig in.

So, I did something. I bought N. K. Jemisin’s books.

All of them.

Am I saying that opening your wallet and doing something good for people who are trying to do good is the way to combat chronic assholery? Yes, I that’s exactly what I’m saying.

And sometimes, the people who need a boost are those who haven’t always been good. Sometimes you have to extend a hand to someone who is trying to do better, trying to lift themselves out of the shit and be a better person:

So yeah, I bought all of Matt’s books too.

Finally, if you’re in a asshole smashing mood, but maybe not in a reading mood, you should drop by John Scalzi’s blog. Scalzi’s thrown up a donation challenge for the Carl Brandon Society and the Octavia E. Butler Memorial Scholarship Fund. You should get in on it…

I did.


So after I did all this stuff, what else did I do? I wrote this post. I wrote it because one person out there might go and do something too. I hope it’s you.

Paul Theroux's Writing Method

20130604-082135.jpg

I don’t carry electronic apparatus. I don’t have a tape recorder. I don’t have a computer. I write everything in longhand, and I usually write it twice. I write it during the day in a small notebook and at night I expand it in a larger notebook. For 40 years that’s what I’ve done. And then when I get home I type it out. I used to use a typewriter, now I use a computer. But it’s all written, hundreds and hundreds of pages of notes, some of which I use, others not.

– Paul Theroux via National Geographic

Squarespace – Great Content Management with a Good Start in eCommerce

I heard about Squarespace (over and over) while listening to a marathon session of This American Life podcasts. I have to admit, it’s a little strange to hear Ira Glass pitching web services so I thought I’d check them out.

What is Squarespace

Squarespace is an all-in-one platform for hosting web content and eCommerce. The tool provides a simple, yet comprehensive back-end for content management and a fairly sophisticated “LayoutEngine” for building pages and making them look swell.

Pricing

  • $10/mo ($8/mo if you pony up for a year in advance) – 20 Pages. 500GB of bandwidth, 2GB of storage, 2 contributors, mobile skin, and a custom domain.
  • $20/mo ($16/mo for a year in advance) – Everything above, except unlimited. You also get form building tools and Google Apps/MailChimp sync along with publishing to Facebook.
  • $30/mo ($24/mo for year in advance) – You get eCommerce added in, along with all the lovely features needed to support such a venture (product catalog, inventory, tax, coupons, etc).

Overall, these prices aren’t too bad. You can self-host a website for about the same price, though you won’t have unlimited storage and you’ll have to do all the heavy lifting yourself. The real question here is whether the tools Squarespace provides are worth the price.

* It’s also worth noting here that Squarespace uses Stripe for payments. I address this in the eCommerce section below, but you should be aware that eCommerce will incur additional costs outside of Squarespace (usually 2-3% of the purchase price).

So, let’s get on with a trial run…

A Trial Run with Squarespace

In the spirit of all things testy, I decided to set up an account with Squarespace and give it a go. They give you 14-days to play around with the product and then you need to shell out.

Selecting a Template

Selecting the initial template for your site is the first thing that happens. The gallery of stock templates is chock full of nice designs that give you the sense that you’re creating something chic, like a high-end magazine:

Select Template - Squarespace
Selecting a template in Squarespace

When you select a design, Squarespace shows you other sites using the same layout templates. This is pretty smart since it gives the user a sense of the customization potential.

Template Usage Example - Squarespace
Squarespace displays other sites using the same template.

Sign up

Once you have your template, Squarespace asks you to sign up. It’s a typical form (name, email, password); no credit card required. Your site is live as soon as you fill out the form.

My god, it's full of forms...
My god, it’s full of forms…

Squarespace sends a confirmation email and then sends a second email that provides a video walk-thru:

Editing and Adding Content

Editing content in Squarespace is very simple. The editor is WYSIWYG, meaning that you’ll basically see the page as it looks in real life. Just clicking on the elements of the page invokes the editor for each type of content (text, images, etc).

Editing Content in Squarespace
Editing Content in Squarespace

Squarespace also provides a quick edit pop-up when you’re looking at your site. Unlike most mini-editors (WordPress, I’m looking at you), Squarespace has provided a powerful tool that allows you full editing capabilities. This is particular useful when you need to make quick changes to a site for typos and such.

Quick Edit - Squarespace
Squarespace’s quick editor

* One thing I didn’t like was the lack of revision history. That said, versioning is a complicated bit to pull off in a user-friendly way.

When you add new content to Sqaurespace (via the Add Block button), you are faced with a ton of choices:

Adding Content - Squarespace

Adding Content - Squarespace

Adding Content - Squarespace

The choices are all pretty self-evident. Form allows you to create a form. Text allows you to add text. The test account will also allow you to add products for eCommerce. I’ll talk a little about that later.

Any block you add is popped onto the end of the page. From here you can edit or move the block as you see fit.

Site Navigation

Adding new pages to the site is just as intuitive as editing content. Squarespace provides a high level tree view of all of your content. You can drag and drop items to change the order. You can click on them to change their relative URLs. To add a new page or section, just click Add Page.

I thought it was pretty helpful to have the Not Linked section in the nav as well. This area lets you know when orphaned content is on the site.

Site Navigation - Squarespace

Tracking

Out of the box, Squarespace provides simple tracking of visits, popular content, referrers, and search terms. Nice for a quick view, but you can also add your Google Analytics account ID for seamless integration (Settings->General).

eCommerce on Squarespace

Since I have a trial account, I can’t go end-to-end on eCommerce, but I can get pretty close.

Setting up Shop

First, I have to give kudos to Squarespace for the easy setup of the product catalog. Adding a new product is just like adding content to the site. In fact, you even do it in the same place within the tool. You can also merchandise your products on any content page. This is a nice feature.

To add a product, you need to select an existing collection of products or create one. To create a collection, you select Add Page and select the option for Products.

Create a Page - Squarespace
Click on Products to create a Product Collection

From here, you click the Add Product button and walk through the steps to create a physical or digital product. The set up for both products is fairly similar, the difference is that with a digital product you provide a file and for a physical product you provide variant or SKU details.

Selecting a product type - Squarepace
Selecting a product type during setup
Digital Product Setup - Squarespace
Setting up a digital product in Squarespace
Physical Product Setup - Squarespace
Variant/SKU setup options for physical products

Payments

Like many new eCommerce platform startups, Squarespace is using an outside vendor for payment processing. In this case, it’s Stripe. Stripe has a good reputation in the developer community and I’ll do a review on their services at a later date.

Promotions

Squarespace allows you to create coupons in four basic categories:

  • Any Order – Global discount without any qualifier.
  • Order Threshold – Discounts applied when order totals reach a certain dollar value.
  • Category Discount – Broad discounts based on a products within specific categories.
  • Single Product – Which should be fairly obvious…
Promotion Setup - Squarespace
Setting up a promotion in Squarespace

The discounts include basic flat discounts and percentage discounts. Free shipping is also available as a discount type with Any Order or the Order Threshold promotions.

Once you create the promotion, you can add coupon codes. You can also set the duration of each code.

Overall, it’s a pretty basic setup in terms of promotions. I’d say 90% of what most very small vendors might need, which is pretty good.

Order and Customer Management

Super basic here. You can see pending, completed, and cancelled orders. You can also export orders as a CSV. This won’t be enough for complicated eCommerce businesses.

Digging Deeper – Development Options

When you pop into settings, you’ll notice that Squarespace provides extensive configuration options. There are tweaks for SEO, comment engines (Disqus is supported), Amazon associates, social account hookups, and more. In commerce, you can configure order and shipping confirmation emails too. However, as great as the tools may be, there’s always going to be an itch you need to scratch. To get at that itch, you’ll need to get inside Squarespace and they give you two basic options: code injection and straight up developer access.

Code Injection

This is pretty simple stuff. Squarespace provides a field where you can add content to the HEAD of your page or down at the footer of the page. Both are generally places where you’ll pop in Javascript add-ons to your site. For example, interested in doing multivariate testing with Optimizely? This is where you’d insert their code.

Code Injection - Squarespace
Adding HEAD and Footer code to templates

Developer Access

Selecting “Developer” in Settings told me that I needed to set up a developer account and directed me to Squarespace’s developer center.

Developer access is extensive. You get deep control of the templates on your site. Squarespace also has a fairly vibrant community forum for Q&A.

I won’t cover all the options as Squarespace does a good job of this in their own blog post: Diving into V6: The Template Development Kit.

Conclusion – Powerful Content Editor with Rising Potential

Creating a tool with this breadth is not an easy task. You have to make a lot of decisions about which tools to include and which to hide. Overall, I think Squarespace has made a lot of good choices. It’s a balanced tool and the pricing is very fair.

I’d give Squarespace a grade of A on the content management side of things. As for commerce, the grade is B-. It’s super basic but enough for small sellers without complex inventory management issues. Again, the order and customer management features look really weak which is something everyone should be aware of. Still, it’s obvious that Squarespace is dedicated to improving the platform. If they put the same thought and energy into eCommerce that they’ve shown in content, I would expect this grade to improve.