Building a MCP server in Swift

Cursor is a fantastic tool for developing with AI, but it’s also a wonderful tool for interacting with any folder of files with AI. I use it to search through and chat with a folder of 1000s of Markdown files (downloaded from my Notion bookmarks database). Cursor indexes the files with its vector index, can read the file contents, summarize multiple files, and link to the source files – it’s changed how I interact with my bookmarks.

Continue reading "Building a MCP server in Swift"

Podcast Transcripts with WavoAI, Cursor, Hugo

During its 84 episode run, the Metamuse podcast was a much loved for its discussion on local first software, deep work, creativity, and authenticity. Hosted by Muse founders Adam Wiggins and Mark McGranaghan, the podcast featured guests ranging from Obsidian CEO Stephan Ango, Roam’s founder Conor White-Sullivan, MindNode’s founder Markus Müller-Simhofer, and too many more to count. Wonderful conversations with the leaders of much loved deep-work products and researchers at the forefront of human-computer interaction.

Since going solo with Muse in late 2023, I’ve wanted to get the transcripts of all of these episodes online, but I knew that writing transcripts manually was an insurmountable task. Whisper had recently been released, and I was hopeful for AI transcription to help solve this. While Whisper’s transcription accuracy is fantastic, it does not do speaker diarisation – it doesn’t separate the transcript per speaker.

Continue reading "Podcast Transcripts with WavoAI, Cursor, Hugo"

Testing Background Uploads in iOS

When implementing background uploads on iOS, I found this incredibly helpful article by Antoine van der Lee. Any feature that relies on uncontrollable iOS system behavior is a tough one to implement, and his article was my map through the void. Since it was published, some things have changed slightly in iOS, so I’m writing this post to add some corrections about implementing background uploads in iOS.

Invalidating URLSession

One tip it gives at the end is to invalidate the URLSession on app launch so that you can start from a clean slate:

Continue reading "Testing Background Uploads in iOS"

Translating an iOS/Mac app with AI and humans

I’ve long wanted to get Muse translated into multiple languages – Muse has been English-only since launch. The problem isn’t so much the one time translation cost at the beginning, but having a strategy to translate for every single update going forward. Getting Muse into German isn’t a problem, keeping Muse in German is the problem.

Unlike just a few years ago, we now live in a world with high quality AI translations! As good as these AIs are, they’re still not human, and they’ll still miss important context about how these translations are used and viewed in the app, so having a human in the loop is still incredibly important. However – they do reduce the human-time cost of adding and maintaining multiple languages.

Continue reading "Translating an iOS/Mac app with AI and humans"

Finding unused code with Periphery

The Muse codebase is over 5 years old with over 350,000 lines of Swift, and I’m sure is filled with more than a few archeological code-fossils. Like any startup (frankly, like literally every code project), it’s difficult to prune old unused code while keeping up velocity of new features. Code cleanliness is always a tradeoff with velocity, and often comes in second place. That’s why I love tooling that can help automate this otherwise brutally slow manual task.

Continue reading "Finding unused code with Periphery"

Localize Screenshots using Figma

I’ve recently translated Muse into French 🇫🇷! As part of localizing the app, I also needed to translate the App Store description and screenshots. All of the App Store screenshots for Muse are setup in Figma, and I was hoping beyond hope that I could setup multiple languages in Figma to make it easy to export for all storefronts.

Thankfully, Figma came through! The strategy is to use Figma’s variables and modes. The basics flow is to:

Continue reading "Localize Screenshots using Figma"

Gmail IMAP configuration in Zoho

I’ve been using Zoho for my personal email for years, and I love it. I moved for a few reasons, privacy being a big one. If you’re not paying for the product, you are the product! I had used Gmail since it came out in college, and it was time to take control of my online privacy and data security.

After moving to Zoho, I found that they also had fantastic customer support! I can file a ticket and get a human response who actually helps to resolve my question. It’s been such a breath of fresh air.

Continue reading "Gmail IMAP configuration in Zoho"

Think On My Feet

I keep a list of random ideas, and any time I need to inject a bit of creativity into my weekend I try to pick off a small easy win and see if I can create it. Today’s idea:

Think On Your Feet:

Custom printed socks with thought bubble emojis all over them. So you can ‘think on your feet.’

After filtering through many search results for “custom socks,” most of which were aimed at youth sports leagues, I finally found that none other than Shutterfly offers the option. A little work creating a ‘photograph’ of the Thought Bubble emoji and one Shutterfly template later, voila!

Continue reading "Think On My Feet"

Removing Xcode Simulator Touch Indicators

I’ve been working on creating new Muse onboarding and tutorial videos, and I’m using my HandShadows Swift package to show the gestures visually during the video. Muse is a gesture heavy app, and showing plain dots for the finger locations doesn’t always make it clear what’s actually happening. These shadows make each gesture much more clear.

To record these demos, I’m using Screenflow, a wonderfully simple screen recorder and video editor.

For reasons beyond my understanding, I found that using Screenflow to record the simulator gave higher quality video than using the Simulator’s built in Record Screen functionality. Similarly, it’s better quality than recording the screen directly on the iPad as well.

Continue reading "Removing Xcode Simulator Touch Indicators"

Integrating Sparkle framework in a sandboxed Mac Catalyst app

I’m working to take an App Store-only Catalyst app and allow it to be distributed outside the App Store. Part of that is making sure that we can auto-update the app, and we’re using the Sparkle framework for the task.

Since Sparkle is an AppKit framework, and our app is a UIKit Catalyst app, I needed some help joining these two worlds together, and I found this fantastic step-by-step tutorial by Eskil Sviggum: https://betterprogramming.pub/configuring-app-updates-for-mac-catalyst-apps-with-sparkle-beef7a90a515.

Continue reading "Integrating Sparkle framework in a sandboxed Mac Catalyst app"

Embedded command line tool in Mac App Store app

I’ve started work on a command line tool for Developer Duck, an AI powered developer helper tool. The app can act as a rubber-duck-style chat assistant to help you with your code, and can also automate some of the simple and tedious tasks: adding/removing documentation comments, adding explanation comments, even code completion. I’d like to offer this functionality through the command line for integration into the rest of a developer’s workflow too.

Continue reading "Embedded command line tool in Mac App Store app"

PonyExpress: Type-safe notifications in Swift

I’m very excited to be releasing my type-safe notification Swift package PonyExpress. I’m really enjoying the type-safety of Swift, and all of the compiler warnings and errors that it provides. Each compiler error from a type issue is a runtime crash that’s been saved.

The Swift Package

By default, the provided NotificationCenter inherited from Objective-C let’s us send notifications in Swift as well. Unfortunately, it’s not type-safe in a number of ways. First, observers are registered with a #selector which may or may not have it’s input argument correctly typed – the compiler won’t complain.

Continue reading "PonyExpress: Type-safe notifications in Swift"

Limits of Generic Types in Swift

I’ve been working on a type-safe notification system for Swift called PonyExpress. The Foundation framework gives us NotificationCenter, but unfortunately we can only send [String: Any] along with the notification. Consider the following swift playground:

import Foundation

public extension NSNotification.Name {
    static let MyCustomNotification = Notification.Name("MyCustomNotification")
}

struct MyData {
    let data: Int
    let other: Float
}

class SomeObserver {
    init() {
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(didHearNotification),
                                               name: .MyCustomNotification,
                                               object: nil)
    }
    @objc func didHearNotification(_ notification: Notification) {
        guard let myData = notification.userInfo?["myData"] as? MyData else {
            fatalError("uh oh, didn't get my notification")
            return
        }
        print("\(myData)")
    }
}

let observer = SomeObserver()

NotificationCenter.default.post(name: .MyCustomNotification, object: nil, userInfo: ["myData": MyCustomNotification(data: 12, other: 9)])

There’s a few issues with this code:

Continue reading "Limits of Generic Types in Swift"

DocC build consistency

I’ve been working on a Swift package for type-safe notifications called PonyExpress, and this is the first package I’ve built that includes full documentation. In the past, I’ve been content with a README, but this time I wanted documentation for each method to show neatly in Xcode’s info windows.

Xcode integrated documentation.

The magic to make this happen is DocC comments – neatly formatted comments preceded by ///. This is the same format documentation that Apple provides for their own frameworks. After generating documentation for my packages, the documentation will be available both in Xcode and online. And of course, generated automatically with the build script.

Continue reading "DocC build consistency"

GitHub Actions and Private Swift Packages

At Muse, we have our primary Xcode application, and we also have a number of private Swift packages to help organize our code and control dependencies. Each package has its own unit tests, and then our main project has its unit tests as well. Our app is built on iOS and uses Catalyst for the Mac app. There’s a few places in our codebase where we #if targetEnvironment(macCatalyst), so it’s important to run the tests compiled for both platforms.

Continue reading "GitHub Actions and Private Swift Packages"

Muse Sync at Programming Local First Workshop – ECOOP’22

The past few weeks I’ve been trying to better document how Muse sync works, with posts describing how our hybrid logical clock helps us build up objects from atomic attributes. While I’m sure I’ll continue to write about our strategies and lessons learned, I’ve also done some talking about the topic recently too.

Just about a month ago, I explained the basics of Muse‘s sync architecture on the Metamuse podcast. We cover durable vs ephemeral changes, our last-write-wins strategy for the CRDT, and overall strategy for sync. Listen below, or subscribe to the podcast.

Continue reading "Muse Sync at Programming Local First Workshop – ECOOP’22"

Atomic Attributes in Local-First Sync

When we set out to build device-sync in Muse, we had a very strict requirement at the outset: it should be local-first.

Most apps work by storing all of your data on the server, and send only little bits of it to each device as you use it. Then, if a document is modified on two devices at once causing a conflict, the server is the mediator to choose the winner.

With local-first sync, the world gets much more complicated. Every device you use contains a full copy of your data. If you edit the same document from multiple devices, there is no server to mediate which device wins. Instead, both devices get a full copy of each other’s changes, and they need to independently resolve to the same state.

Continue reading "Atomic Attributes in Local-First Sync"

Kailh Pro Red: Shorter Travel Distance

Over the past few months, I’ve been slowly transitioning to my new Lily58 Pro split keyboard. In addition to switching to this new keyboard, I’m also learning the Colemak-DH layout, so it’s been quite a process. Unfortunately, I can’t afford to move cold-turkey to the new keyboard, as that’d dramatically lower my productivity at work for a few weeks, so instead I’m learning in bits and spurts over the weekends and evenings.

Continue reading "Kailh Pro Red: Shorter Travel Distance"

Type-safe notifications in Swift

I’ve been coding exclusively in Swift for the past 2 years, and I’ve really been enjoying it. So much of my career has been in type-ambiguous languages – Javascript, PHP, or Objective-C. There’s some typing there, but the compiler doesn’t enforce too much. Swift, on the other hand, has brought me back to my Rice days, where so much of the education in Java and Scheme was built on functional programming and strong typing.

Continue reading "Type-safe notifications in Swift"

A New Year and a new RSI

I’ve been very fortunate to not have suffered a repetitive strain injury in my years at the keyboard, until now. Over the past few months, I’ve started to get some pain in my right wrist. I type on a macbook pro keyboard, and it seems to be from how I turn my wrist to reach the backspace key in particular (we’re not all perfect typists!).

I attribute my lack of pain so far to a combination of luck and possibly my hand position when typing. Instead of twisting my wrist to have my hands straight on the keyboard, I keep my wrists straight which leaves my fingers tilted on the keyboard. This lets my fingers travel straight to the keys on the rows above and below, almost like i’m forcing an ortho hand position into the staggered keyboard layout.

Continue reading "A New Year and a new RSI"

Fastlane, xcconfig files, and build numbers

I recently migrated 4 Xcode build configuration settings from being stored in the *.xcodeproj file into separate *.xcconfig files per configuration. I used James Dempsey‘s Build Settings Extractor to autogenerate the config files for me from the existing project build settings.

I updated the build configurations to use these xcconfig files, and then deleted the manually set values from the project file’s build settings. All of those bold customized values in Xcode’s build settings are a thing of the past – everything is in clean xcconfig files now, and it’s fantastic. Any changes we make to a build are much easier to see in the git diff, a bit win for simplicity and readability.

Continue reading "Fastlane, xcconfig files, and build numbers"

Distributed Clocks and CRDTs

At Muse we’ve been thinking a lot about conflict-free replicated data types, and how they might enable local-first sync across devices. Automerge, out of the Ink and Switch labs, has done incredible work building a sophisticated CRDT implementation.

I learn best by getting my hands dirty and building. As I’ve been learning about CRDTs, the first piece that caught my eye was the various clocks that can be used to keep disconnected peers aligned with each other.

Continue reading "Distributed Clocks and CRDTs"

Texas deer crossing

Over the past year, Christi and I have been on lots of ‘driving dates.’ They’re a fun way to see some sites and not have to worry about social distancing, protocols, masks, 6 feet. We can pretend the world is normal and enjoy our drive together. We’ll often drive out into the country and look over the farmland and little houses and barns, dreaming of some future retirement with a little house and a good view.

Continue reading "Texas deer crossing"

Books for Robots

The year: 2847

The overlords: robots

The Sunday afternoons: for leisure reading


Robots need books.

I’ve had this thought stuck in my head for quite a while: We humans are very analog creatures, but we surround ourselves with digital tools. And the wonderful part, I think, is that these digital tools are communicating back to us with analog information – audio waves from speakers, text glyphs on the screen, haptic feedback from the sensors. In the end, we only really process analog information, even though we’re using digital tools to give it to us.

Continue reading "Books for Robots"

Muse: Not just a whiteboard, it’s a tool for thought

The past few months have been an exciting transition for me – I recently joined the team at Muse building a sense-making-more-than-a-whiteboard-deep-thinking iPad app.

Download

Muse is a working set of your thoughts – it sits right between your short term memory and your long term memory: it’s your working memory. It helps you make sense of things that just don’t quite make sense. It’s a whiteboard with ink, but also images, text, PDFs, and files, and more. It’s a canvas that expands with your thoughts. It’s nested boards-within-boards because some thoughts need a bit more space to grow.

Continue reading "Muse: Not just a whiteboard, it’s a tool for thought"

Using Psalm and PhpStorm for realtime static analysis

Building on the static analysis of Phan, I’ve also recently started using Psalm, a PHP static analyzer from Vimeo’s engineering team. What I particularly love about Psalm is its realtime analysis and integration within PhpStorm. Instead of needing to run a report after any changes, Psalm can highlight issues as they happen with my source code open.

While Psalm includes the necessary language server to integrate with PhpStorm, a plugin is needed to make the connection. I’m using the LSP Support plugin by Guillaume Tâche. Here’s what I did to get everything setup, and some lessons I learned along the way.

Continue reading "Using Psalm and PhpStorm for realtime static analysis"

Setting up PhpStorm as a new developer

Recently I’ve started working on Funnel Cake, a sort of IFTTT for your marketing data (or any data, really). You can sign up for free and try it out here, but today I want to document my development workflow.

It’s been nearly 10 years since I’ve done heavy PHP or Javascript development, so I’m starting in some ways as a beginner again. It might be helpful for others to see how I’ve setup my development environment.

Continue reading "Setting up PhpStorm as a new developer"

Aurora Calendar

I was working on my server the other day, and came across some very old code. I felt like an archeologist! I had unearthed the surprisingly well preserved remains of Aurora Calendar!

Aurora was the precursor to Jotlet.net, the calendar app that Buck Wilson and I built in 2007. All of the code for Aurora was built while we were still in college, circa 2003 and 2004.

It was built for PHP 3 I believe, and PHP 4 came out during that time with support for classes. I was able to make a few minor modifications and get it running on PHP 5 here on this server. You can now see the login page here.

Continue reading "Aurora Calendar"

Making every year better than the last: my goals for 2018

A year in review

2017 didn’t go quite as I hoped it would. In January, I imagined I’d spend the better percentage of the year on Kiwi, an AI natural language bot that I’ve been excited to start for years. And in some ways that’s happened – I’ve built a proof-of-concept grammar parser for speech input, and I’m nearly done building my own wikipedia text corpus that I’ll be able to use for AI training, but I’m conflicted about my progress this year.

Continue reading "Making every year better than the last: my goals for 2018"

Understanding and Building the Simplest Neural Network

Over the past year I’ve been reading and learning about neural networks, how they work, and how to use them. I’ve found the overwhelming majority of tutorials and introductions to NN either: a) focus on the math and derivations, or b) focus on the code and tools, but rarely seem to c) match the math 1:1 with the code. Both of these tutorial styles are often guilty of handwaving and simplifying the derivations, making it difficult for me to follow exactly how the math and code relate to each other.

Continue reading "Understanding and Building the Simplest Neural Network"

Introducing ClippingBezier: Find find intersecting points, paths, and shapes from UIBezierPath

UIBezierPath’s an an incredibly powerful tool for modeling complex paths and shapes in Objective-C and Swift, but it’s surprisingly difficult to perform operations on two or more paths. Applications like PaintCode make it easy to get the difference or intersection between two paths, but there are limited options for doing this on demand in code. This is particularly meaningful in drawing apps like Loose Leaf, where all of the paths are generated by the user.

Continue reading "Introducing ClippingBezier: Find find intersecting points, paths, and shapes from UIBezierPath"

Introducing JotUI: An Open Source OpenGL Drawing view for iOS

When I started working on Loose Leaf, I quickly realized that the hardest part of the app was finding a fast and efficient drawing UIView that I could add into my app. There were a fair number of tutorials that would solve the first 80%, but there was always some important pieces left as an exercise for the reader: Smooth curves, removing lag and stutter, or main-thread-blocking save/load.

All of the code I found could do some, but not all, of the following:

Continue reading "Introducing JotUI: An Open Source OpenGL Drawing view for iOS"

Securely Access All of Your Files from Anywhere

remotely iconRemotely lets you access all of the files on your Mac from your iPhone – from anywhere – with zero network setup. It’s available for free on the iTunes App Store and Mac App Store.

While we were building Remotely, we kept 2 things sacred: we wanted zero network setup, and we wanted the app to be incredibly secure.

Zero Network Setup

We know through experience just how complicated and inconsistent network setup can be. Typically, you might need to “login to your router”, “forward ports,” or even “setup a network bridge.” And if you’re part of the 99.99% who have no idea what any of that means, then you’d just be SOL. But with Remotely, when we say zero network setup, we really mean zero network setup.

Continue reading "Securely Access All of Your Files from Anywhere"

Loose Leaf 2.0 with iPad Pro and Apple Pencil support!

It’s been a long time, but it’s never too late for a great app update! Lots to love in this 2.0 release!

1. iPad Pro support
2. Apple Pencil support
3. Full page PDF import
4. New pen, marker, and highlighter tools
5. Delete scraps by dragging off left
6. Lots of bugs fixed!

The new Apple Pencil support makes Loose Leaf even better for taking notes and organizing your thoughts.

Continue reading "Loose Leaf 2.0 with iPad Pro and Apple Pencil support!"

Staying Sane with Git

You might have seen it – @kkuchta christmas tree gif making the rounds these past holidays:

tumblr_inline_o0mdgf6twL1t74qoj_540

For a short story, that sums up my early experience with git with surprisingly accuracy!

For anyone else who’s struggled with git over the years, here’s a bit of my process to help me stay sane with git:

1. Where I am in the tree?

I use the command line to make new commits, pull, merge, etc, and when I first started using git I had a lot of trouble understanding just where I was in the repo at any given time. After branching a few times, I’d get lost pretty easily and forget which branch I was currently on. A simple fix – I added the following line to my .bash_profile:

Continue reading "Staying Sane with Git"

Procrastination as a tool for Productivity

There’s a thousand small things that I need to get done during the week. They’re only mildly the same week-to-week, and they all individually don’t take up much time at all, but together they eat far more of my productivity than they deserve. I’d found that I was spending far too much time context-switching between my real work – programming – and these other smaller tasks. Programming is the sort of job that doesn’t work well with small distractions, and these small tasks were eating far more of my time than they deserved. Something needed to change.

Continue reading "Procrastination as a tool for Productivity"

Automatically Include Open Source Licenses into the Settings Bundle

There’s a good chance your iOS app includes a number of open source frameworks in its codebase, and Loose Leaf is no different. Many of these dependencies’ licenses require that you include a copy of the license in your final build. Some require other attribution or URLs. Even with just a few includes, it can quickly become difficult to manage.

Last week, we talked through how to automate our app’s version numbers, and this post will automate our bundled licenses.

Continue reading "Automatically Include Open Source Licenses into the Settings Bundle"

Streaming Xcode and iPad Development with OBS

Developer Livestreams

Since January, I’ve occasionally live streamed Loose Leaf iOS development to YouTube. I even took some time in April to stream and open source a 2D physics game from scratch! It’s been a challenging and fun experience personally, and has more broadly grown into quite a subculture – sites like Watch People Code, Livecoding.tv, and even articles by CNN and Wired show the trend’s recent growth.

Continue reading "Streaming Xcode and iPad Development with OBS"

Using Git to Specify the Version of Your App

It’s the simple things in life: One of the best workflow changes I made for Loose Leaf was to use git to manage the version number of my app. To release a new version, just add a tag in git, and the version in my app’s Info.plist would automatically update to match. There’s a number of different ways to set something like this up, and I’ve pieced my particular strategy together from various Stack Overflow posts, and I thought it’d be helpful to put an end-to-end post together to describes the how and why in 1 place.

Continue reading "Using Git to Specify the Version of Your App"

Make a better app video: Show off gestures with hand shadows

For gesture-centric apps, it can be difficult to quickly and easily show how to perform specific gestures. Two handed gestures, like Loose Leaf’s ruler gesture, can be particularly difficult to describe. As I was making tutorial content for Loose Leaf, I quickly realized that showing dots for touch locations just isn’t enough.

Importantly, the shadows actually animate to match your hand – notice the pinch gesture above actually animates the pinch shadow slightly. Also in the code is a two finger ‘peace sign’ shadow, perfect for a two finger pan. And also a single finger shadow for taps and single finger pan.

Continue reading "Make a better app video: Show off gestures with hand shadows"

The Give and Take of New Features: WWDC ’15

Every WWDC brings unexpected changes, and this year is no different. While I’m excited about many of the new announcements this year, I quickly realized that one of my favorite Loose Leaf features will breath its last with the launch of iOS 9 later this month: swipe from the edge to turn the page.

Up through iOS 8, you can quickly peek through pages by swiping two fingers from the left or right edge of the screen. In iOS 9 however, that same swipe from the edge will bring up the new split-screen multi-tasking view instead! I can’t even count the weeks I spent developing and testing that custom bezel-gesture, so it’s particularly sad for me to see it go. Even more – I’m discouraged that custom bezel-gestures are entirely out-of-scope for app developers from here on out – iOS system gestures now cover the top/bottom/left/right bezels.

Continue reading "The Give and Take of New Features: WWDC ’15"

An Open Source Guide for Launching Your Indie App

Since launching Loose Leaf 5 months ago, I’ve learned a lot about how to get an app in front of its target audience, and everything I’ve learned would’ve been exponentially more powerful if I’d known it pre-launch instead of post-launch. That’s exactly why I’ve written and open sourced the App Launch Guide for indie devs.

This guide is perfect for developers who’ll be working on both the marketing and development of their apps, with the goal of helping make sure nothing is missed in the run up to launch. And while I’ve learned a lot about marketing, I certainly don’t know everything, so I’ve opened this guide into the public domain and posted to Github so that the indie dev community can iterate on this foundation for a more organized launch plan for all of us.

Continue reading "An Open Source Guide for Launching Your Indie App"

The 2 Week Open Source Live Stream App Experiment

I’ve just recently completed an interesting experiment: coding an iOS game in only 2 weeks, open sourcing 100% of the code, and doing 100% of the development on live stream. The result: Spare Parts – a silly 2D physics game where you can build crazy contraptions. The videos below might give you an idea for the app:

Why on earth would I do this?

Loose Leaf took me over 2 years to build, and the vast majority of that development was closed off from feedback – I didn’t start showing my work until well into the 2nd year of development. If I had it to do over again, this is the biggest thing I’d change – early feedback is incredibly important.

Continue reading "The 2 Week Open Source Live Stream App Experiment"

Programming Without a Computer

I think of this quote almost every day:

I was trying to understand why rockets were so expensive. Obviously the lowest cost you can make anything for is the spot value of the material constituents. And that’s if you had a magic wand and could rearrange the atoms. So there’s just a question of how efficient you can be about getting the atoms from raw material state to rocket shape.

– Elon Musk

Continue reading "Programming Without a Computer"

Using Augmented Reality Code for a Better Stretch Gesture

Loose Leaf is more about photos and imports than it is about drawing or sketching, and I wanted to make sure it was easy not only to cut and create new scraps, but also to manipulate and duplicate existing scraps. To make a copy of a photo or scrap, I thought through numerous gesture options, menus, long press popups, buttons, and more, and in the end I settled on a simple pull-it-apart-gesture.

Continue reading "Using Augmented Reality Code for a Better Stretch Gesture"

Improving UIBezierPath Performance and API

I shared two weeks ago how I built the scissors feature in Loose Leaf; short story, lots and lots of UIBezierPath. As I worked through the algorithm for slicing paths together, it didn’t take me long to realize that default performance of UIBezierPath was… lacking. The only way to introspect the path itself is to create a custom function – not block mind you, function – and use CGPathApply() to iterate the path and calculate what you’re looking for. Every time.

Continue reading "Improving UIBezierPath Performance and API"

Step by Step App Store Optimization: An Objective Measure to Find the Best Keywords

When I launched Loose Leaf, I’d heard about how bad app discovery was in the App Store, so I’d assumed any search optimization I did for the App Store would be a wasted effort. If quality Twitter apps are outranked by unrelated apps, it seems like a crap shoot to even try, so I didn’t.

Big mistake. It turns out that roughly half of users are finding and downloading apps through App Store search. Put another way, by not optimizing for App Store search, I’ve effectively cut my sales in half.

Continue reading "Step by Step App Store Optimization: An Objective Measure to Find the Best Keywords"

The Making of Loose Leaf’s Killer Feature: Scissors

I easily spent the most time during development on the scissors tool, which might be surprising given how simple it is to use. You can see a quick example below. Just like real scissors, you can easily slice your pictures into any shape.

It seems simple enough right, so what makes this so tough? The next example shows just how robust the scissors are. For a dramatically bizarre shape, they still cut it into pieces just as you’d expect, and quickly at that. And it even supports cutting holes into scraps too.

Continue reading "The Making of Loose Leaf’s Killer Feature: Scissors"

Opening Up Loose Leaf Development

You wouldn’t know it, but I had to solve some difficult and interesting problems to get Loose Leaf shipped. You wouldn’t know because I never told anyone. I never described how I built Loose Leaf’s list view before UICollectionView, or how hard it was to get the pen ink to “stick” to scraps efficiently, or what went into creating the scissors tool. I spent 2 years working without sharing anything, and it took me that long to see the missed opportunity of coding silently.

Continue reading "Opening Up Loose Leaf Development"

Anatomy of an App Launch: Success and Failure of Loose Leaf’s First Day

You only get one chance at a first impression – and your app’s first impression is almost entirely dependent on what you do before your launch day even arrives. I first launched Loose Leaf on Nov 18th with only mild success, and I’ve learned an incredible amount since then. I want to use this post to share what I did right with Loose Leaf’s launch, and where I went wrong, and hopefully you can avoid some of the mistakes I made.

Continue reading "Anatomy of an App Launch: Success and Failure of Loose Leaf’s First Day"

Step by Step: Making an iTunes App Preview Video

Possibly the most exciting piece of building Loose Leaf was making the App Preview video that’d show in iTunes when I launched. Making this video was the culmination of over 2 years of work, and symbolized it’s completion in a very tangible way. It was my final step before I could finally submit to Apple!

Working on an App Preview video took a surprising number of tools, and in this post I’ll walk through all of the steps I went through to create the final 30s video for Apple. Before we jump in, be sure to read over what Apple has to say about App Previews and review the specs.

Continue reading "Step by Step: Making an iTunes App Preview Video"

An Easy Way to Show UITouch in App Preview Video

One of the most important pieces of any app launch is the app preview video that’ll show next to your screenshots in the App Store. With Loose Leaf, nearly every feature and all of the navigation is through multi-touch gestures, so it was incredibly important to be able to show those touches on screen when I recorded the video.

The Preview

Watch the Loose Leaf preview to see the touch dots in action – it’s a small animation when the touch begins, and the blue dot follows each finger for the rest of the touch.

Continue reading "An Easy Way to Show UITouch in App Preview Video"

Building the promo video for Loose Leaf

For any other indie devs out there wondering what its like to hire out a promo video, I wanted to share my experience working with Josh at Bluepic Studios on the Loose Leaf app promo we’ve just finished up. Check out our final video below:

Step 1: Get good references

Honestly, the hardest part of the process came right at the start: finding a video firm. I followed a friend’s recommendation to Josh and Bluepic Studios, and I’m extremely glad I did. I’ll start your search off with a strong recommendation for Bluepic, and you should also ask your friends, ask your colleagues, ask your twitter/fb/ello/linkedin followers as well. Get as many options as you can, this is by far the most important step.

Continue reading "Building the promo video for Loose Leaf"

Loose Leaf for iPad is available!

Loose-Leaf-logoI’m exhausted. I’m relieved. I’m excited – Loose Leaf for iPad is finally available in the App Store!

If I had to pick only one of those emotions, it would be relief. After over 2 and a half years of development, I was beginning to doubt it’d ever be ready. Even in the weeks before launch, I fixed more bugs and found more new issues than I’d ever thought possible – the date kept getting pushed back, but here we are! Even the night before launch I still didn’t have a finished layout for the website, and Christi and I stayed up until midnight recording the demo videos for the site.

Continue reading "Loose Leaf for iPad is available!"

The rebirth of AskMeEvery

AskMeEveryAskMeEvery is simple tool to help bring you daily accountability for whatever task you need. You simply setup a question, and it emails you that question every day. It’s as simple as replying to an email. All of your replies are stored and graphed to show your progress.

I’ve been using it for nearly a year, and it’s been incredibly helpful for me to stay focused during Loose Leaf development. Every evening I ask myself two questions: “What did you accomplish today?” and “What do you want to accomplish tomorrow?” Two narrow questions focused on getting things done and moving forward. It’s helped me immensely to focus on small completable tasks that move me toward my goal of launching Loose Leaf.

Continue reading "The rebirth of AskMeEvery"

A “shortcut” for multiplying any two numbers

I ran into something interesting when working last night that wasn’t immediately obvious to me at first. It’s an alternate way to calculate the product of any two numbers.

I first noticed something was going on when I squared a number and then compared it to the product of numbers on either side of the original number:

5 * 5 = 25
6 * 4 = 24 (1 from 25)
7 * 3 = 21 (3 from 24)
8 * 2 = 16 (5 from 21)
9 * 1 = 9 (7 from 16)

If you subtract each result from the one before it, you see the series: 1, 3, 5, 7. “That’s interesting, I’m increasing the distance between the two numbers, and the result keeps changing by 2 also, I wonder if there’s something to that. Maybe I just got lucky, and this is something odd about 5*5 in particular. So I tried the same process, but started with 6*6, or 8*8 and got the same result.

Continue reading "A “shortcut” for multiplying any two numbers"

Great talks and coffee at AltConf

eaf1ca963806147642c96f7463349f83Lots of really great stuff at AltConf this year. I wasn’t lucky enough to get a raffled badge for WWDC, but I’m very glad I was still able to come and hang out at AltConf and meet some new people. Already, this week has been a huge inspiration to get Loose Leaf done and shipped. Being surrounded by folks who are churning on really cool projects rubs off on you. This year, AltConf is hosting its lab sessions at its 2nd location, and it’s been great to spend some time each afternoon coding hard and combing through all the Apple announcements in a crowded room of other folks doing the same thing: like we’re all racing to know all the things.

Continue reading "Great talks and coffee at AltConf"

Tracking IOKit Dirty Memory in iOS using Instruments

I’ve been spending the past week of Loose Leaf development tracking where and how my app’s memory is allocated at run time. My goal is to send all of my memory stats to MixPanel with every event I track. During beta and after launch, all of this information will help me to better understand how people are using the app.

LooseLeaf Runtime Memory

This’ll be especially helpful if/when I get memory crash reports – tracking down which iPad models are having the hardest time, and being able to use MixPanel to see how Loose Leaf is allocating memory on those iPad models – is it OpenGL textures? Vertex buffers? UIImages? Core Animation?

Continue reading "Tracking IOKit Dirty Memory in iOS using Instruments"

Providence Cancer Center: $1M Matching Donations Challenge

Over the past 5 years, we have been extremely blessed with Christi’s good health after being diagnosed with brain cancer. Five years ago, Dr. Gore at Providence hospital saved Christi’s life over the course of 3 brain surgeries. We decided to donate her tumor to the research at Providence, and it’s been used (along with many other tumors and lots of research) to help create a vaccine for brain cancer. It’s absolutely incredible work they’re doing there, and it’s excited to get updates about the research from time to time.

Continue reading "Providence Cancer Center: $1M Matching Donations Challenge"

Loose Leaf – A Different Kind Of Paper

I’m extremely excited to show you the first demo of my new scratch paper app Loose Leaf!

This app has been my labor of love for nearly two years, and I’m finally getting close to the App Store release this summer. (Sign up to be notified when it’s ready if you haven’t already!) All of the major development is done, and I’m now working through the last few features and testing.

Continue reading "Loose Leaf – A Different Kind Of Paper"

Christi’s cancer story is featured by Providence Hospital

Early this December, Providence Hospital asked Christi to come back and share her story during their Festival of Trees fundraising brunch for their Cancer Center. They also asks her to share her story for their “How We Care” video series on their site.

The video of that interview is online here. I’m extremely proud of her for sharing her story. After everything we’ve been through, it’s so rewarding for both of us to see something good come out of it outside of ourselves.

Continue reading "Christi’s cancer story is featured by Providence Hospital"

Automatic PHP API

Screen Shot 2013-10-16 at 9.48.55 PM

I’m a big fan of Automatic. It’s a very cool widget that plugs into your car’s data port and will monitor your driving habits. It tracks your average MPG, alerts you if you accelerate too fast or brake too hard, and rolls all of its data into a simple weekly score – high your score the better you’re driving! It’s a super simple way to reinforce safe driving habits, and improve your fuel efficiency at the same time, very cool!

Continue reading "Automatic PHP API"

My upcoming iPad app Loose Leaf!

Loose-Leaf_256I’m extremely excited to announce my upcoming iPad application Loose Leaf! This app is one that has been rattling in my mind for years, and I’ve finally had time to get some code down for it over these past few months, and I’m really excited about the progress.

So what is Loose Leaf?

Loose Leaf is a brainstorming and note taking app that’s ideal for use in a coffee shop meeting. It’s a perfect piece of scratch paper, or loose leaf if you will, ready for your back-of-the-napkin-no-longer doodles to help you get your point across during an informal meeting. You can draw, type, cut or create small scraps of paper, import and annotate images, and quickly export anything meaningful to a more permanent home like Evernote.

Continue reading "My upcoming iPad app Loose Leaf!"

Adonit Jot Touch SDK with Palm Rejection

It’s amazing to think I’ve been on my own for nearly a year, and a busy year it’s been!

Most of my time has been spent on two iOS applications that I hope to announce soon, but I’ve also been fortunate enough to work with the Adonit team on their new iOS SDK. They’ve done an absolutely fantastic job with their Bluetooth connected Jot Touch stylus, and it was a lot of fun to help out with the iOS side of their development efforts.

Continue reading "Adonit Jot Touch SDK with Palm Rejection"

Off On My Own!

Lots of change recently!

The past year I’ve been working at Visere, where we’ve done some fantastic work for the team at Unstuck (even winning two Webbys!) and Jawbone, among others. In fact, the team at Jawbone was so happy with our work that they decided to acquire Visere outright and bring the team on full time, and I’ve decided to take that opportunity to branch out on my own once again. It’s been nearly 5 years since Jotlet, and I’m eager to get back into the game at the ground level.

Continue reading "Off On My Own!"

Productivity, Lack of Time, and Your Future Self

Using Futures 2.0 to Manage Intractable Futures (pdf) via Alex Pang

Page 11ish:

I had come to realize that my sense of myself had changed very little over the fifteen years or so. Despite getting married, having children, moving several times, and switching careers, I didn’t feel profoundly like I was profoundly different than my 30 year-old self; so why should I see my 60 year-old self as a different person? (The Grant study’s participants likewise showed a great consistency over the decades in their personality and psychological makeup.)

Continue reading "Productivity, Lack of Time, and Your Future Self"

Columnizer jQuery Plugin Update

Good news jQuery column typesetters! My Columnizer jQuery plugin has finally at long last been updated. This new version adds support for jQuery 1.6 and fixes every known issue in reported at the GitHub page. (Secret admission: I didn’t actually test in IE6,7,8, or 9, but I’m pretty sure it still works fine… Please let me know if I made a presumptuous mistake.)

Download here: https://github.com/adamwulf/Columnizer-jQuery-Plugin/zipball/1.5.0

GitHub here: https://github.com/adamwulf/Columnizer-jQuery-Plugin

Project page here: /columnizer-jquery-plugin/

Credit Card security is broken

Quick story:

My sister is traveling to Sri Lanka and has a longer than expected layover in Mumbai. I log onto the internet, purchase a hotel for her while she’s on her flight, and a driver picks her up at the airport.

So far so good.

That international purchase triggers an alarm on my account, so the next day when I’m shopping for groceries my card gets declined.

 

Even supposing a mastermind criminal stole my card and bought $400 in Mumbai, here’s what just happened:

Continue reading "Credit Card security is broken"

The Google+ Feedback Page

I was going to just post a screenshot to twitter, but this is far too impressive to let die in a stream somewhere. i wanted to keep this in my records to draw inspiration from weeks and months from now.

In Google+, like many websites, there is a Send Feedback button. It is unassuming.

But when you click it, you don’t get a boring “yeah what?!” text box, instead, in true Google fashion, the Google analyzes the page before the form shows:

Continue reading "The Google+ Feedback Page"

Turning the page: a new job at Visere!

I just finished up my first week at Visere, and I couldn’t be more excited! This past week has been simply phenomenal.

Leaving Jive is bittersweet. The people I worked with are amazing, I still believe it’s the best collection of engineering talent in Portland. The company is going places. I’m proud of my work there. I’ve been doing heavy lifting in JavaScript for nearly 6 years, but I’ve been stretching my iOS wings, and Visere gives me the opportunity to work on mobile development full time. It’s incredibly exciting to be working in a tiny startup again!

Continue reading "Turning the page: a new job at Visere!"

Security Theater Is Good Product Design

Jon Udell has a great post today on people’s expectactions about their security:

In his recent TED talk he mentions that the Tylenol incident led to tamper-proof caps — a perfect example of what Schneier likes to call “security theater”:

As a homework assignment, think of 10 ways to get around it. I’ll give you one, a syringe.

So far this is typical Schneier. It’s a great point, but one I’ve heard him make many times before. In the next sentence, though, he breaks new ground:

Continue reading "Security Theater Is Good Product Design"

The Future of Education


The Khan Academy is changing education forever. Be sure to also read Sigularity Hub’s review and  watch the walkthrough video below, but rest assured this will change how your child learns. My daughter is only 3 years old and now I can’t wait to get her started on basic arithmatic!

Highlights of the Khan system: Students learn single concepts at a time: step by step by step. First addition, then harder addition, then addition with decimals, then subtraction, etc. Each singular concept has tutorial videos as well as infinite computer generated problems to solve, and every problem has step-by-step hints available to help walk students through solving a problem.

Continue reading "The Future of Education"

Ah the memories.

I just found a screenshot of a very old version of Jotlet – then called Aurora – cerca 2001. It brings back some good memories- built my senior year of high school through freshman year of college, this was Buck‘s and my first and largest project together at the time. I’m uploading here for some grins, and so I can keep all these old images somewhere besides a random directory on my server somewhere…

Continue reading "Ah the memories."

Adventures in Exotic Domain Buying

This past friday, I was poking around my bit.ly/pro account and couldn’t help but notice the giant yellow banner telling me I needed a custom short domain for my bit.ly account. The nerd that I am just had to get my very own shortener, especially since the window of opportunity might be waning. But what could I do? “adamwulf.me” isn’t exactly short, and “wtti.net” isn’t terribly graceful (or even available!).

I used 101domain’s list of TLDs to spur my creativity. I really wanted to get “ad.am” or “re.ad”, but the second level domain has to be at least 3 characters, so I kept looking until I finally thought of “ada.ms”. Perfect! Especially so for a URL shortener; http://ada.ms/hff-promo will read as “Adam’s HFF Promo”. There was just one catch – the domain was unavailable.

Continue reading "Adventures in Exotic Domain Buying"

What I Think About My Boxee Box.

I have to say, when the Boxee Box was announced, I was immediately extremely excited. I’ve been living with an Apple TV for a long time, and while I’ve enjoyed it, it’s only good for showing media that’s already on my home network – its terrible for showing any of the content i’m finding on the web during my day.

Boxee saves me. Their “watch later” functionality is fantastic- I easily installed their easy to use bookmarklet in Safari and for [almost] any video I see on the web, I can simply click the bookmarklet to effectively send that video to my living room for later viewing. Doubly awesome- Safari bookmarks sync to my iPhone, so I can easily add videos while reading RSS feeds on the bus to and from work.

Continue reading "What I Think About My Boxee Box."

I want an Instapaper for video on my TV

Services like Instapaper and Read it Later are fantastic for letting you quickly save webpages that you want to read for later. There are iPhone and iPad apps, they work on the Kindle, they’re perfect for separating finding content from reading content.

I want the same thing for video. When I’m reading through my RSS, browsing the web, or get an email with some awesome video content, I’d love to be able to push that link to a Watch it Later service. Later on when I’m tucked in bed, I can pull the queue up on my iPad, or I can sink into my couch with my favorite beer and watch the queue on my TV.

Continue reading "I want an Instapaper for video on my TV"

Mobile Web is Years Away from Competing with Native

Native mobile apps rule the mobile experience, no one in their right mind would deny that, but I’ve heard a lot of talk over the past year about the impending doom of native apps and how the mobile web is bound to replace them.

DeWitt Clinton:

we’ve been down this road before.

Who among us doesn’t remember the great debates in the late 90’s about how web sites wouldnever replace native applications on the desktop? That was just a decade ago, but now it seems laughable that people didn’t see clearly the upcoming dominance of webapps over native apps on the desktop.

Continue reading "Mobile Web is Years Away from Competing with Native"

Native Mobile Apps vs. Web Mobile Apps is Not a Feature War

While reading my much-loved Flipboard today, I came across an article in the Wired section from Webmonkey called How Do Native Apps and Web Apps Compare? Having worked in both mobile native and web apps, this is a topic very near and dear to my heart. It’s slightly biased towards the mobile web, but the comments in the article keep the overall content as a fair comparison. Definitely worth a read.

Out of the over 15 feature vs feature comparisons, one point stuck out to me in particular:

Continue reading "Native Mobile Apps vs. Web Mobile Apps is Not a Feature War"

Bug Fixes for wpSearchMu WordPress Plugin

Just a quick note that version 2.1.2 of the wpSearchMu plugin went live today. I’ve fixed a fairly common “Uncaught exception Zend_Search_Lucene_Exception” problem that would crop up and require an index rebuild. After you update, you shouldn’t see that error anymore.

I’ve also added a few checks to make sure that the plugin is installed in the correct location. Quite a few people aren’t installing to the mu-plugins folder, and that was causing some index inconsistencies and errors.

Continue reading "Bug Fixes for wpSearchMu WordPress Plugin"

Mobile Apps: User Expectations define User Experience

Lately, I’ve been thinking about how users’ expectations of an app affect the user experience, especially as it relates to mobile development.

As an example: the native Google Maps iPhone app vs the mobile web Maps app.

Both are fantastic apps in their own right, but why are they both awesome apps? The native app is clearly faster to launch, it handles pinch-zoom fluidly, address and bookmark integration, transitions between views keep my context with nice animations. The mobile web app has none of that. It’s slower, the map loads slower, zoom and pan aren’t as fluid, transitions between views are non-existent. All things being equal, the native app is the clear winner, yet my user experience is overall positive for both apps. Why?

Continue reading "Mobile Apps: User Expectations define User Experience"

wpSearchMu updated to work with WordPress 3.0

If you’re a WordPress user, then you know that Automatic is working on merging WordPress with WordPress MU, and they’ve recently released a beta for the new 3.0 version.

It’s been quite a while since I’ve updated wpSearchMu, so this was a perfect time to make sure everything’s still working with this latest release. Visit the wpSearchMu page to download the latest version!

New this version:

  • Support for WP 3.0
  • Better support for post tags
  • Support for searching categories
  • Support for searching author names

It’s already April again

This has been an incredible, horrible, exciting, and difficult weekend for me. Tomorrow marks 1 year since the worst day in my life. Moments from the past year, both good and bad, have flashed to mind this week – today and tomorrow especially. It’s at one time completely awful to relive these memories, but it’s equally amazing to be with Christi on the other side of them. I have been incredibly blessed this past year.

Continue reading "It’s already April again"

Here, File File! iPhone app preview

I’m very excited to have submitted Here, File File! to the App Star Awards.

Here, File File! lets you access your Mac(s) directly from your iPhone wherever you are. Browse files and folders, attached drives, network drives, and stream media straight to your phone. You can even email files from your computer to anyone, regardless of filesize.

Check out the demo video below:

I’m aiming for Here, File File! to be in the App Store by early/mid January.

Continue reading "Here, File File! iPhone app preview"

IBM makes supercomputer significantly smarter than cat

This is amazing.

the group’s massively parallel cortical simulator, C2, now has the ability to simulate a brain with about 4.5 percent the cerebral cortex capacity of a human brain, and significantly more brain capacity than a cat.

The IBM researchers endowed the model with checkpoint-based state-saving capabilities, so that the simulation can be rewound to certain states and then moved forward again under different conditions. They also have the facility for generating MPG movies of different aspects of the virtual brain in operation, movies that you could also generate by measuring an animal’s brain but at much lower resolutions. There’s even a virtual EKG, which lets the researchers validate the model by comparing it to EKGs from real brains.

Continue reading "IBM makes supercomputer significantly smarter than cat"

Enterprise Issue Tracking for One Person: Me

Did you know that Things is made for personal task management with a focus on Getting Things Done. It’s $50.

Did you know that Jira is made for enterprise issue tracking and project management. It’s $10.

Well, it’s $10 if you have less than 10 users, otherwise it’s $1200! Luckily, I am only 1 person. I purchased it so fast it’d make you vomit.

Backstory

Until today, I’ve been using Things for all of my personal tasks and projects. I currently have 18 projects that I’m working on, ranging from self improvement, to software projects, to this blog, to my wife’s cancer. Twelve of those 18 projects are software projects I’m working on to some degree. Projects like WPSearchMu, WelcomeToYourMac, it’s related and upcoming iPhone app, Columizer, etc. Because I have so many projects, it means I have to be exacting and purposeful with every spare moment. If i have an hour to spare to work on something, I need the vast majority of that hour to be spent productively and not spent just getting caught up on where I am in the project.

Continue reading "Enterprise Issue Tracking for One Person: Me"

WelcomeToYourMac iPhone Beta!

I’m excited to finally be asking for beta testers for the WelcomeToYourMac iPhone app!

WelcomeToYourMac lets you remotely access your Mac from any web browser. You can browse files, control your screen, stream your media, and more! This iPhone app is just the first step to offering all of WTYM’s functionaity natively on the iPhone.

Version 1.0 of the iPhone app will let you:

  1. Connect to one or more of you Macs
  2. Browse the files on your computer – even external drives!
  3. View your files and stream your media
  4. Preview .rtf, .html, .pdf, .doc, etc files
  5. Spotlight search to find exactly the file you need!
  6. Uses the icons from your Mac – even custom icons!
  7. Images use thumbnails for their icon!
  8. Music and movies use embeded artwork for icon!

WTYM must be installed on your Mac to power the web services that feed the iPhone app.

Continue reading "WelcomeToYourMac iPhone Beta!"

WelcomeToYourMac v0.2.6 Released

Last week I finally had time to release a new version of WTYM! WelcomeToYourMac is an easy way to access your Mac’s files/screen/apps from any browser – even your iPhone. Download your copy here.

WTYM0.2.6

I’m very excited to finally have released this version. It’d been sitting on my laptop ready to release for the past 3 months, but life just got in the way. I’m finally settling back into a normal routine, so I could finally get a new build out and uploaded. If you already have WTYM installed, then it should auto-update, otherwise head over to the WTYM site and grab a free copy.

Continue reading "WelcomeToYourMac v0.2.6 Released"

The undocumented life of JavaScript’s parentNode property – Internet Explorer edition!

Did you know that the parentNode property in JavaScript doesn’t always point to the element’s parent??! And not only that, but that very same node that’s lying to you also appears multiple times in the DOM.

I didn’t want to have to tell you this way, but there’s just no way around it: in Internet Explorer 7 (I’ve left testing 6 and 8 as an exercise for the reader 🙂 ) the parentNode property can flat out lie to you – specifically – with pasted content in a rich text editor like TinyMCE. That’s right, a bold-faced chain-yanking tall-tale’d lie, and I’ll prove it to you.

Continue reading "The undocumented life of JavaScript’s parentNode property – Internet Explorer edition!"

Cancer is a Blessing – (and a little more about my diagnosis)

My wife Christi was diagnosed with brain cancer in early April of this year. Over the past 3 months, she’s been keeping all our friends and family up to date on facebook by regularly postings notes, and I wanted to copy/paste her last note here; it’s a great summary of where we’re both at in this whole process.

Thanks to everyone for your continued support!

That’s right, cancer is a blessing. I’ve known about my cancer now for a little less than three months and the past three months have been the worst and best three months I have ever experienced. Just to give a quick overview, it’s been the worst for obvious reasons; I’ve been away from my home and normal life, I’ve undergone 3 brain surgeries (not too bad for me, but my poor family having to wait 3-5 hours depending on the surgery), I missed so much of Cailyn’s little world, and Adam’s had to put his life on hold as well.

Continue reading "Cancer is a Blessing – (and a little more about my diagnosis)"

Head Tracking App for iPhone! Sorta!

The day has finally arrived. We are finally living in the future. Buck just sent me a link that head tracking for the iPhone is real (kinda). The horseless carriage and printing press have nothing on this!

Just barely over a year ago, I posted that somebody should build a head-tracking iPhone app. Since the iPhone can’t literally track your head/eyes, it couldn’t be “real” head tracking, but it could infer from the accelerometer well enough… and sure enough someone has done just that! Awesome!

Continue reading "Head Tracking App for iPhone! Sorta!"

Dynamic Multi-Page Multi-Column Newsletter Layout with Columnizer

A Columnizer Case Study

Sample Page Layout

I got an interesting email this week, asking about how to use Columnizer to help layout a multipage and multicolumn newsletter. The length of the content would vary from week to week, so the newsletter needed to be grow/shrink to as many pages as necessary. It also needed a custom header and footer for each page.

Continue reading "Dynamic Multi-Page Multi-Column Newsletter Layout with Columnizer"

Better (?) FriendFeed Stats in Feedburner

Friendfeed now reports subscriber counts to feedburner, so you have a more accurate view of your total subscriber counts all in one place. This is particularly good news for a data nerd like me, since the Friendfeed API doesn’t even let you find out your ff subscriber count.

Friendfeed in Feedburner

There is a down side, however, as Kevin notes at bloggingtips.

In my opinion this is an incredibly bad move from FeedBurner. It is incredibly easy to get people to subscribe to an RSS feed through FriendFeed. Just like Twitter, many people follow anyone who follows them. This means that the feedburner count can be very easily manipulated to show a higher count than it actually has.

Continue reading "Better (?) FriendFeed Stats in Feedburner"

A Better Sitewide Search for WordPress Mu

So far I’m loving WordPress Mu, but I’ve noticed two things: first, WPMu doesn’t even come with a site-wide search out of the box. And second, the search results you can get are generally pretty terrible. Searching this blog for “columnizer” wouldn’t even show the Columnizer Plugin Page until page 3 of the results. yikes!

The Old Options

Until today, the current remedies were:

Continue reading "A Better Sitewide Search for WordPress Mu"

Changing WordPress Mu from Subdomains to Subdirectories

When you install WordPress Mu, it warns you:

Please choose whether you would like blogs for the WordPress µ install to use sub-domains or sub-directories. You can not change this later. We recommend sub-domains.

It’s true there’s no documented way to change this setting, and the current advice is to reinstall (!), but I aim to change that. Instead of reinstalling plugins, reconfiguring plugins, and then powering through the nightmare that is WordPress export->import, I resolved to find whatever setting was buried in WordPress and do it manually. And lucky for me, it turned out to be surprisingly easy.

Continue reading "Changing WordPress Mu from Subdomains to Subdirectories"

the month of april

one month ago my wife christi started suffering from consistent migraines. a week later, she collapsed unconscious and – luckily i was home – i called 911.

scariest day of my life.

over the past 3 weeks, she’s had 3 surgeries to remove a tumor just under the size of a racquetball from the frontal lobe of her brain. the drs were originally optimistic it would be benign, but we found out last thursday that it’s malignant.

Continue reading "the month of april"

The undocumented life of jQuery’s .append()

Did you know that .append() sometimes moves the nodes you pass into it, and other times clones them? This undocumented behavior may cause you some grief if you’re assuming the first, but seeing the second.

If you’re appending to more than 1 node, then jQuery clones the input and then appends the clones to each of the selected items. If you’re appending to just 1 node, then jQuery does not clone the input, but instead moves the item to that place in the document. These two behaviors can leave you with significantly different results.

Continue reading "The undocumented life of jQuery’s .append()"

JavaScript trivia tidbit for all you FF2 developers

Did you know, that in Firefox 2, creating a link like:

<a onclick="javascript:">click me!</a>

will actually open up the Firefox error console?

picture-25

You’d think it’d do nothing, since the href is just “javascript:”, but that’s not the case. To do nothing you need a bit more:

<a onclick="javascript:;">click me!</a>
or
<a onclick="javascript:void(0)">click me!</a>

Notice the semicolon in that first line. If you leave out that semicolon (or a void(0)), then your users will enjoy looking at the error console instead of your site – yikes!

Continue reading "JavaScript trivia tidbit for all you FF2 developers"

Links with borders in TinyMCE

One of my primary projects that I work on at Jive is the rich text editor for Clearspace. I first joined Jive last April and began work completely revamping the RTE for the 2.5 release. Over the course of development and during bug squashing since then, I’ve seen some crazy bugs in various browsers, but I wanted to highlight one I just spent the better part of the day debugging.

Our RTE is a heavily modified TinyMCE editor with lots of custom Jive plugins. Most of the custom work we’ve done fixes small bugs and inconsistencies of TinyMCE across Safari, Firefox, and IE 6 & 7, but some of our customizations are just nice UI touches to make the experience just a little bit easier.

Continue reading "Links with borders in TinyMCE"

Irks and Quirks of iPhoto ’09

I’ve already expressed my sincere gratitude for the iPhoto 09 update, especially the Faces feature, but today I want to go a bit more in depth about why I love the new iPhoto and what I’d like improved.

The day I installed iPhoto, I faced – for lack of a better term – about 1200 photos. It took me about 3 to 4 hours  to get everything installed, upgraded, and faced, and while it was certainly a straight forward process, there were some small areas that – if polished – would have made the whole process much easier.

Continue reading "Irks and Quirks of iPhoto ’09"

Where Is My Head-Tracking-But-Not-Really iPhone App?

I’ve asked for this before, and I honestly expected somebody to have built it by now. Everyone remembers Johnny Lee’s rockstar Wiimote mod right? But instead of moving your head, you’d be tilting your iPhone left/right/up/down to achieve the same effect.

Imagine the mockup below, but instead of my kitchen, you’d be fighting wave after wave of zombie aliens. Seriously, why isn’t this built yet?

Continue reading "Where Is My Head-Tracking-But-Not-Really iPhone App?"

A Productive Mu Day

I mentioned a few days ago that WordPress Mu was released for version 2.7, and today I finally had time to install it. The upgrade was incredibly smooth, just copied the files right on top of my existing Mu install.

Upgrade buttonAfter logging into the admin console, I was prompted to copy/paste a small bit of code into the wp-config.php. Lastly, I ran the Upgrade script inside admin console and I was off to the races! It couldn’t have been easier. Thanks Donncha for all your hard work!

Continue reading "A Productive Mu Day"

Suggestion for Things on the iPhone

I love Things.

It’s a fantastic app. It’s simple, clean, pretty, and helps me get things done. I’ve been using the iPhone app for quite some time now, and I love it too, but there’s just 1 thing I wish it did better: fast task input.

It’s kinda fast right now, there is a handy  button to go straight to the add screen, but all the animations and extra form fields make adding more than 1 task surprisingly slow.

Continue reading "Suggestion for Things on the iPhone"

WordPress Mu 2.7 Released

I’m really excited about the newly released WordPress Mu 2.7Donncha (also responsible for WP-Super-Cache) has done a fantastic job heading up this effort and getting 2.7 mu out the door. I’ve been salivating over the new WordPress admin UI since seeing the preview screenshots many months ago, and now I can finally enjoy it.

Thanks Donncha!

iPhoto 09 is fantastic

I’ve spent at least 2 minutes with iPhoto 09, and come to the following conclusion: it is fantastic.

After installing iLife 09 and booting up iPhoto (does anyone care about the other 3 apps? not I!), it began scanning all of my photos finding and sorting all of the people in my library.

Face recognition is easily the most awesome photo library feature ever. Managing hundreds and thousands of finally became manageable.

Getting Things Done

I just bought Things. I’ve been using the free beta for weeks slash months and love it. So what did I do when the dialog popped up and told me the free loading was over and it’s time to buy version 1.0? I ran for my wallet and spent that money as fast as I could!

A few weeks ago, I also bought Things for the iPhone, and I’ve never been more organized or productive. This is a fantastic application. It’s clean, polished, organized, and gets things done.

Continue reading "Getting Things Done"

Duplicate iPhone SMS Alerts

An incredibly annoying feature of iPhone 2.1:

Repeat alert up to two additional times for incoming text messages

Great. So instead of vibrate meaning “You have a new text message,” it now means “You have a new text message oh wait maybe not it might be an old one.”

When I got a text message, it displays it on the home screen with no need to unlock the phone. This is great, because I can simply read the message, and put the phone back in my pocket. But now, 5 minutes later i get another buzz for the same message I just read

Continue reading "Duplicate iPhone SMS Alerts"

Combined Blog Stats from Google Analytics, Google Reader, Feedburner, and WordPress

Google Analytics is a fantastic tool for tracking web stats, but this past week, I realized it doesn’t track quite as much as I’d like. A few questions I’d like it to answer but it can’t:

  1. Do high traffic posts, like Columnizer updates, generate more subscribers?
  2. Do the frequency or length of my posts affect how long a visitor stays? or subscriber count?
  3. Does higher traffic or more frequent posts generate more comments?
  4. etc

Basically, I want to know not only if a statistic is up or down, but how it correlates to another statistic. And most importantly, I want to know this not only about statistics tracked by Google Analytics, but by statistics that can’t be tracked by Google Analytics – things like post frequency, Feedburner subscriber count, etc.

Continue reading "Combined Blog Stats from Google Analytics, Google Reader, Feedburner, and WordPress"

Columnizer 1.4.0 Released!

You read that right, there’s a brand spankin’ new version of Columnizer over on the project page. Lots of good stuff in this update:

  1. Event handlers are maintained in columnized data for non-IE browsers, and there’s a nice workaround for IE. Columnizer won’t kill your javascripted content anymore :)
  2. No more flicker on page load between uncolunnized content => columnized content. Use the new target option to columnize content from a hidden div into the main page.
  3. A few other formatting options and some bug fixes

Awesome! Visit the the project page for details, documentation, samples, or just download it now:

Continue reading "Columnizer 1.4.0 Released!"

Mint.com iPhone app

Mint.com finally released an iPhone app, and I only say “finally” because I have been looking forward to this day since I signed up with Mint.com to begin with.

If you haven’t used Mint to track your personal finances, then you need to start today. Mint automatically downloads all of your transactions and categorizes them for you. No hassle of entering everything manually, not even a manual sync button. It’s all just some sort of financial magic. Mint is the only reason I have any idea what I’m spending money on, and now I can know if I’m on/off budget where ever I am.

Continue reading "Mint.com iPhone app"

Inspiration

I work with code all-day-everyday. Code code code. To pull my brain out of this recursive day to day, I love looking at industrial and product design sites. If there was no such thing as computers, this is the job I’d want.

Core 77 

Design Milk

Trendir

Blue Ant Studio

Yanko Design

What sites would you recommend for a good shot of motivation and creativity?

Death to the Embargo (and the Last Sliver of Integrity)

I purposefully try not to read Techcrunch, but this came across the twitter and – weak as I am – I bit.

One annoying thing for us is when an embargo is broken. That means that a news site goes early with the news despite the fact that they’ve promised not to. The benefits are clear … Traffic and links flow in to whoever breaks an embargo first.

That means it’s a race to the bottom by new sites…

Continue reading "Death to the Embargo (and the Last Sliver of Integrity)"

WelcomeToYourMac v0.2.5 Released

New WTYM update! WelcomeToYourMac is an easy way to access your Mac’s files/screen/apps from any browser – even your iPhone. Download your copy here.

This latest version was a lot of fun to work on. WTYM is already my first ever Cocoa app to work on, and now it’s my first ever Cocoa app that automatically updates. Just like all those other fancy apps that provide a handy “Check for Updates” button, WTYM now incorporates the Sparkle framework to provide that same seemless upgrade experience.

Continue reading "WelcomeToYourMac v0.2.5 Released"

Resig is spot-on regarding Objective-J

Resig:

Pyjamas, GWT, and Objective-J all hinge around a central concept: Abstracting away the authoring of JavaScript-heavy web applications by allowing the developer to program entirely in their natively language (be it Python, Java, or an Objective-C-like-language accordingly)…

I worry about large abstractions like this for a number of reasons.

Well worth the read.



WelcomeToYourMac v0.2.2 Released

First off – the WTYM site‘s been updated, so check it out!

I’ve updated the Features page with more screenshots and descriptions, as well as a potential roadmap for the project. I’ve also added a poll to the front page, so give me your feedback! There’s a million directions this project could go, and I want to make sure I’m adding the features you’ll actually use, so let me know what you want :) 

Continue reading "WelcomeToYourMac v0.2.2 Released"

Setting up cron / launchd on OS X 10.5?

I had the joy this week of my 1TB network storage dying on me. It now sits on my desk making horrible clicking sounds at me hours on end… Luckily, my irreplaceable music + photos are safe, but I’d literally spent days meticulously ripping, encoding, tagging, and importing my DVDs into iTunes, and I’m not remotely excited about doing all that work again… not excited at all…

However, it did give me a great excuse to go buy two 1Tb My Books from the Apple store today – so that almost made up for it. :) And after a bit of rsync research, I wrote up a nice shell script to keep the two disks mirrored.

Continue reading "Setting up cron / launchd on OS X 10.5?"

WelcomeToYourMac Update – Access Your Mac From Your iPhone

This has been an extremely relaxing vacation weekend. I took a few days off at the end of last week till today to have an early Thanksgiving dinner with the fam. Really good times – and best of all – I had time to kick around some new code for WelcomeToYourMac!

I just released version 0.2.1, which is already leaps and bounds better than the previous version (though still not close to a 1.0 :)).

Continue reading "WelcomeToYourMac Update – Access Your Mac From Your iPhone"

People are excited about other people being excited

I was watching a documentary of sorts about Second Life a while ago, and fell in love with this quote:

TICKY FULLERTON: And yet people are very excited in-world about the idea of buying a book through Amazon [inside of Second Life].

CLAY SHIRKY: No. No-one is excited about that. People are excited about other people being excited about it.

It’s such a great quote to keep in the back of your head. I find I often like the idea of something, but I don’t like the implementation of something – and it’s an important distinction to make, especially when designing a new product. Hype is not reality, and hype is not revenue.

Continue reading "People are excited about other people being excited"

Columnizer 1.3.0 Released

Columnizer has been updated!

Until now, Columnizer required you to set the width on your container and it would fit as many columns as it could into that width – or – it would fit as many columns into the window’s width as it could. This made it difficult to create columns for a horizontally scrolling site.

What if you wanted a 400px tall container to scroll horizontally for as many columns as needed? With old versions this was impossible, but now no longer!

Continue reading "Columnizer 1.3.0 Released"

Google: You are ridiculous.

Usability Post just wrote up a small article on overwriting system level key bindings in web-apps, and how, obviously, it’s a bad idea. Apparently Google overwrote an OS X key binding with their new find and replace feature.

What’s amusing to me isn’t the overlap of the key bindings – that’s just sloppy – no, no what’s amusing is this:

Continue reading "Google: You are ridiculous."

A Product’s Purpose

I recently came across the swiTCH table/chair combo via Core77. It’s a new concept furniture design that can either be a sort of table and chair, or a more complete arm chair.

My immediate reactions is that while this looks beautiful and I love the idea of this furniture, I can hardly imagine this actually being at all remotely comfortable to sit in.

When trying to do two things, this furniture has failed at both, and failed beautifully, in the strictest sense of the word.

Continue reading "A Product’s Purpose"

A Refocus of Efforts… and a Listotron Update

I’m in the middle of a few different projects right now, and, as inevitably happens when attempting to focus on more than one thing, I’m just a tiny bit distracted. Currently, I am:

  1. Trying to get Phase 3 of the MVC in JavaScript Tutorial written
  2. Updating the jQuery Columnizer plugin to include the latest requests
  3. Building Listotron
  4. Building WelcomeToYourMac
  5. Updating the layout/plugins of this site

Add into that my the normal responsibilities of work, church, and family (and multiply the family line-item by 2 to properly account for my two year old daughter), and you’ve just about summed up my current ambitions.

Continue reading "A Refocus of Efforts… and a Listotron Update"

Visitor Segments in Google Analytics

A few days ago, the Google Analytics team rolled out some fancy new features – one of which I found by accident today. I was playing around in my analytics account when my mouse happened upon the Advanced Segments dropdown.

I have been waiting for this little tool since I started my analytics account many years ago. This simple dropdown lets you easily specify a subset of data to use in your analytics reports. This means it’s now incredibly simple to see things like the loyalty of just your returning visitors (Google used to lump in first time visitors into this chart too, which made it close to worthless), comparisons between paid and unpaid traffic, or even compare what content new visitors are reading compared to your returning visitors.

Continue reading "Visitor Segments in Google Analytics"

When Java Apps don’t start in OS X…

I had a problem recently – I use IntelliJ at work, and one day it just stopped launching on my Mac altogether. Looking at the console, I found:

10/23/08 4:13:16 PM idea[248] Apple AWT Startup Exception : *** -[NSCFArray insertObject:atIndex:]: attempt to insert nil 

Googling for that error I was led to this Apple support thread, which says:

You might want to check that the symlink:

/System/Library/Frameworks/JavaVM.framework/Versions/Current

points to:

/System/Library/Frameworks/JavaVM.framework/Versions/A 

As described in this post:

Continue reading "When Java Apps don’t start in OS X…"

Graphs and Charts in JavaScript

I have a number of projects rattling around where I’ll likely need to write up some good looking graphs in JavaScript. The following is a brief list and description of the available graphing libraries I’ve found for JavaScript. Hopefully this’ll help you as much as it’ll help me!:)

Bluff

Bluff is the most recent graphing library I’ve heard of, so it gets top spot on the list. Prints out some pretty results and is cross browser compliant (as long as you also use ExCanvas for IE). Screenshot below:

Continue reading "Graphs and Charts in JavaScript"

Site-wide RSS

Small site update, but it’s worth a mention – I’ve updated my RSS feed to include all posts across my entire site. You may or may not have known that I had 2 feeds for 2 separate blogs – one for the Front Page and one for Page 2. This was, of course, needlessly complicated, but the magics of WordPress MU and the Sitewide Feed Plugin have simplified everything.

In theory, if you’ve already subscribed to my feed then your reader should pick up the changes automatically.

Continue reading "Site-wide RSS"

The Sadness of Syncing iTunes Offline

Did anyone know that iTunes won’t sync your purchased music to your iphone/ipod offline? Of course you did, but I did not. I was more than surprised that iTunes wouldn’t sync my very own music that I bought rented from the iTunes store to my iPhone during my flight back from Houston this past week.

It’s probably common knowledge to all you folk, but this is the first time iTunes refused to sync my music outright. And what’s worse, not only did it not sync my purchased music, but it aborted the sync operation altogether, so even my DRM free music didn’t sync.

Continue reading "The Sadness of Syncing iTunes Offline"

Listotron Prototype

Head over to the Listotron blog and check out the short demo video of the first Listotron prototype! Can anyone say multi-user-realtime-edits-a-la-google-spreadsheets-oh-except-our-ui-is-super- ugly-but-hey-it’s-just-a-prototype?!

What’s better is that the code for this thing is very manageable, even – dare I say it – small? It’s jQuery meets client-side MVC meets bundled AJAX. Sexy times.

I’ll be posting the code and a tutorial soon that goes through how this prototype works, so be on the lookout for that soon.

How to migrate from WordPress to WordPress MU

I’m quite excited to have successfully migrated my blog from 2 WordPress blogs to just 1 WordPress MU install. I had initially set up 2 blogs running on one code-base using WP-Hive, and while I’m really impressed with the hive plugin, it’s always felt more like a hack than a true trustable upgradable solution.

My weekend began with, “Migrating from WordPress to MU can’t be that hard, can it?!” Boy, was I in for a surprise. I hope this brief post will spare you the pain I went through.

Continue reading "How to migrate from WordPress to WordPress MU"

Managing Plugins in WPMU

John Resig released a small script that let’s you easily do some “quick-and-dirty” templating on the client side. I love the idea, but I’m less than a fan of the implementation, but I’ll get to that in a minute. First the love: This small script lets you essentially copy and paste some HTML and hot swap out new data as it’s [presumably] ajax’d in, and that is incredibly handy. You even get fancy template style syntax like “<% for(..) %>”  So how is this done?

Continue reading "Managing Plugins in WPMU"

Bundled and Ordered AJAX

The Problem

Imagine for a moment that you’re building a web application based nearly 100% percent on AJAX. And imagine that you’ll likely need to send bursts of  multiple AJAX requests to your server, and you also need all of these requests to be processed in order when they hit your server. You want a near continuous AJAX connection – every action, every edit, every keystroke the user makes – all of these need to be sent to your server for processing. You are building Listotron.

Continue reading "Bundled and Ordered AJAX"

Cappuccino: Taking the “Web” Out of Web Development

The folks at 280slides.com announced their Objective-J framework Cappuccino which “aims to fundamentally change the way applications are written on the web,” and I’ve no doubt it’ll do just that – but does that mean you should use it?

There are as many tools to build web applications as there are developers in this world – Ruby, PHP, Java, JavaScript, jQuery, Prototype, Python, Lisp, SproutCore, Flash, Silverlight, Flex  – and now Cappuccino’s Objective-J. So what makes it different, where does it fit in, is all the hype true, and is Cappuccino right for you? These are all questions I hope this post will help you answer, and to start out, let me explain the title of this post…

Continue reading "Cappuccino: Taking the “Web” Out of Web Development"

Spore finally released!

Ok ok, I’m a few hours early, but come on – awesome! I don’t know about you, but I’m just a tiny bit excited about this! :)

More good news: it’s being released on PC and Mac (knew this) and iPhone and Nintendo DS (didn’t know this). Well, I knew an iPhone version was in the makes, but didn’t realize it was being released the same day. This will officially be my first paid-for app download for the phone. Also, according to the Washington Post article I’m reading:

Continue reading "Spore finally released!"

Spam-filled Future Ahead For My Inbox

Excerpt from Ars Technica’s RSS feed

If your e-mail address is “adam@whatever.com,” you probably receive a lot more spam than someone whose username is “quagmire.” According to a Cambridge University researcher, spammers target usernames with common first letters more than those that are less common, and therefore less likely to get to a real person.

Read More…

Clearspace 2.5 Announced!

The news is out! Clearspace 2.5 has been officially announced, and it’s glorious! Killer new features, rock solid stability, incredible performance – this is a beautiful release at whatever angle you look at it. Video below (or HD here):

Kalani, Sigler, and others did a stand up job working on that video. Clay did an equally awesome job on the voice over. Nice!

Clearspace 2.5’s Text Editor

I spent a bit over 4 months working on the rich text editor, I’m really happy with how it turned out in this release. It’s so refreshing to see all that hard work finally released to the wild.  A particularly exciting tidbit from Dave’s blog:-)

Continue reading "Clearspace 2.5 Announced!"

PHP 5.3 alpha 1 released

I’m admittedly a bit late (a month) to the news , but PHP 5.3 alpha 1 has been released. I’m lucky to have stumbled on the news, because I haven’t followed PHP’s release schedule at all lately, but the 5.3 release is particularly exciting – PHP finally has support for proper lambda closures – now it’s a real language ;)

New features below, and release notes here:

  1. Namespaces (documentation maybe out dated)
  2. Late static binding and __callStatic
  3. Lambda functions and closures  [Ed. – finally!]
  4. Addition of the intlphar (phar is scheduled for some more work a head of alpha2), fileinfo and sqlite3 extensions
  5. Optional cyclic garbage collection
  6. Optional support for the MySQLnd replacement driver for libmysql
  7. Windows older than Windows 2000 (Windows 98, NT4, etc.) are not supported anymore (details)
  8. New syntax features like NOWDOC, limited GOTO, ternary short cut “?:”

Also exciting: significantly better internationalization support, and a PHP archive format – the .phar. The combo of namespaces and the addition of .phar support should allow for much better organization of libraries and applications. I’d love to upgrade WordPress by uploading a single .phar file instead of the hoopla you have to go through now.

Lessons from Ma.gnolia

Yesterday, Ma.gnolia announced that their next version will be 100% open source. What’s interesting to me, though, is Kirkpatrick’s commentary at ReadWriteWeb:

Just like the service Halff created, the man himself seems like a brilliant guy who you know has great ideas but communicates them poorly enough that it frustrates people pretty quickly. The value proposition is unclear, the site architecture is frustrating – right now it’s a service for standards true believers. This author uses it personally, though almost every time I do I grumble and ask if whether I should go back to using Delicious.

Continue reading "Lessons from Ma.gnolia"

Model View Controller Tutorial: Phase 2

I just finished the next phase of my jQuery MVC Tutorial series. This time, I walk through how to save, edit, and delete data via AJAX with an MVC pattern. One of the major take aways from this one is showing how easy it is to roll-back the View in the unfortunate event of an AJAX request failing.

And of course, all the code remains clean and tidy: data is separate from presentation and all that.

Continue reading "Model View Controller Tutorial: Phase 2"

Pandora on the iPhone

Today, I’ve become a huge fan of the Pandora iPhone app. I usually don’t drive much, but this weekend I’ve been in the car quite a bit and finally had reason to try it out. After downloading the app, I discovered to my sweet surprise that it will stream music over EDGE. Combine this with an FM transmitter, and I have personalized, commercial free radio in my car.

Brilliant? Absolutely.

Continue reading "Pandora on the iPhone"

Replicating the human eye

From ars technica:

With a single lens, [the human eye] achieves a huge effective field of view (around 120 degrees) with a resolution that might make your Nikon SLR turn in its CMOS chip. The reasons for this can be traced back to two simple features: the eye has a curved sensor surface, and it moves continually in tiny, angular steps. Now, researchers have demonstrated the ability to replicate this in an electronic eye that holds the promise of delivering cheap, small, high-resolution cameras.

Continue reading "Replicating the human eye"

Building a Proper MVC Pattern for the web

Search Google for “web application MVC patterns” or any variant thereof, and the vast majority of results will talk about the server side MVC. This traditional answer will tell you the browser sits outside the MVC altogether, and sends in HTTP requests that are handled by the Controller, then all the MVC garble happens, and finally the View spits out a brand new HTML page (or XML/JSON for AJAX) for the browser to consume. All this ends up looking something like:

Continue reading "Building a Proper MVC Pattern for the web"

iPhone OS 2.0.1 Update

Gruber reports: things are running snappier

One thing I’ve noticed in the hour or so in which I’ve been running iPhone OS 2.0.1 is that the UI, system-wide, is snappier — typing, animations, launching apps.

I hope it is in fact the update and not just resetting the phone?

In some cases, the lag can be eliminated by resetting the iPhone: Turn the iPhone off completely, by pressing and holding the Sleep/Wake button (on top of the device) for a few seconds then slide the red slider. Turn it back on by holding the Sleep/Wake button until the Apple logo appears.

Continue reading "iPhone OS 2.0.1 Update"

StupidFilter

StupidFilter

The solution we’re creating is simple: an open-source filter software that can detect rampant stupidity in written English.

So cool.

I lied, it’s Columnizer 1.0.2

I might’ve spoken a bit too soon, but I hate going back and editing blog posts – even 5 minute old posts 🙂

I just added a tad more functionality to Columnizer. Any node that has the CSS class “dontsplit” won’t be split into multiple columns. This is handy for keeping tables and such in 1 column instead of split in half at the bottom of a column.

Also – I’ve set up a dedicated project page for Columnizer, so check it out for the latest news and downloads!

Aurora Feint iPhone App Delisted For Lousy Security Practices

According to their forums, if you opt-in to the community feature, Aurora Feint looks through your contact list, sends it unencrypted to their servers, and matches you up with your friends who are currently playing right now. Great feature, for sure, but that whole looking through our contact list and sending it in plain text to your server is cause for us to go OMGWTFBBQ.

Continue reading "Aurora Feint iPhone App Delisted For Lousy Security Practices"

Multi Column Layout With CSS and JQuery

Until we get native CSS support for multi-column newspaper-style layouts (and draft documents from a year ago don’t give too much hope…), our choices are limited to static column markup, and as has been discussed, there are problems with all of these solutions:

  1. Text doesn’t wrap from column to column
  2. Images and tables can’t easily span multiple columns

But the primary problem with these static column layouts, is that they break down when viewed on a variety of widths. There’s no good way to have multiple dynamic columns for your content. Viewing your webpage on your high resolution wide screen monitor? Wouldn’t it be nice to see it in 4 neat columns instead of 2 extremely wide columns? Viewing on your iPhone? 4 columns is impossible to read!

Continue reading "Multi Column Layout With CSS and JQuery"

Updated WordPress Twitter Widget

I recently installed the Twitter Widget Pro (originally built at Xavysis) on the site, and realized it didn’t cache the twitter feed for more than a few seconds. Naturally, I didn’t want to ping twitter every time a visitor came to the site, especially since my twitter feed doesn’t update terribly often. What’s more, I’d prefer to show the last known twitter feed instead of “twitter is down.” if the plugin can’t connect to Twitter.

Continue reading "Updated WordPress Twitter Widget"

business social commentary

It’s funny to think of the way that the world has changed lately, what with the internet and all. We’ve gone from reading about business news in the paper to giving advice to the business.

Davenetics: Do What You’re Great At

When I am in my email, give me news. When I make a homepage, give me more news choices and tools. Don’t settle for first place. Crush everyone. Be the place I browse for news, search for news, share news, annotate news, IM news, SMS news, listen to and watch news, eat and drink news, shoot news into my veins, snort news off the tits of more news. News goddammit, news. And while I’m there, give me entertainment too. Be the portal. There I said it. Be so dominant as the web’s start page that you can give me the choice of search engines.

Continue reading "business social commentary"

Word Complete on Mac good

Fun fact:

Begin typing a word on a Mac, press the [Esc] key, and see a list of words that begin with that text.

Templating in JavaScript

John Resig released a small script that let’s you easily do some “quick-and-dirty” templating on the client side. I love the idea, but I’m less than a fan of the implementation, but I’ll get to that in a minute. First the love: This small script lets you essentially copy and paste some HTML and hot swap out new data as it’s [presumably] ajax’d in, and that is incredibly handy. You even get fancy template style syntax like “<% for(..) %>” So how is this done?

Continue reading "Templating in JavaScript"

Do 1 thing, and do it well.

Gruber points to a Siegler article showing Google’s search market share climbing just over 5 percentage points over the past 2 years. What’s struck me most about the article wasn’t Google’s steady climb, rather it was Microsoft’s falling search numbers and the footnote of the data table.

The Microsoft’s share dropped 4 points in just over a year – and the caveat is a new live.com search site: club.live.com. For those counting, that makes 3 Microsoft search sites.

Continue reading "Do 1 thing, and do it well."

Tricks with eval()

Great Resig post regarding JavaScript’s eval() statement:

Last week it came out that, in Firefox (and other Gecko-based browsers) you could dip into the private scope of a function using eval, like so:

// Getting "private" variables
var obj = (function() {
  var a = 21;
  return {
    // public function must reference 'a'
    fn: function() {a;}
  };
})();
 

var foo;
eval('foo=a', obj.fn);
console.log(foo)// 21

I think the common response to seeing the above was something like: WUH!?!?

Continue reading "Tricks with eval()"

Microsoft Equipt

The Gruber linked to an article about Microsoft Equipt – MS’s venture into subscription sales for Office. The bundle includes both Microsoft Office and Microsoft’s OneCare antivirus protection. Gruber notes:

Equipt includes Microsoft OneCare anti-virus software. So, when you buy a new Windows machine, even Microsoft encourages you to pay extra for security software.

Now don’t get me wrong, I’m as much not a fan of PC’s as the next guy, but I do tire from the “How telling! MS has to sell antivirus for it’s OS!”

Continue reading "Microsoft Equipt"

Access Your Mac from Anywhere

Today is the day that I started [took over] my first open source project: WelcomeToYourMac (formerlyTelekinesis). The goal of the project is to give you secure remote access to your Mac from any web-browser. Install this app on your Mac, and you can remotely browse your files, control your screen, and stream your media! Basically, a poor man’s GoToMyPC for a Mac 🙂 And the best part of all, it works great on your iPhone!

Continue reading "Access Your Mac from Anywhere"

Firefox vs Safari vs IE… better?

Well today’s the day, and the new Firefox 3.0 has been released, and they’ve been kind enough to compare it to Safari and Internet Explorer for us. The interesting thing that I noticed, is that only on the comparison to IE do they say that Firefox has “Superior speed and performance” – not on the Safari page. Am I to assume then that Safari in fact has the superior speed and performance? Assumption, assumed! 😛

Continue reading "Firefox vs Safari vs IE… better?"

The Encyclopedia and Tree of Life

These are two sites that caught my eye about 2 weeks ago, and I’ve been meaning to write about them – I just haven’t found the time until now.

The first site is the Encyclopedia of Life. The EoL aims to make “all key information about all life on Earth accessible to anyone, anywhere in the world.” It’s a great site to just browse around – and its especially good if you happen to be researching the American Burying Beetle or the Green Anole.

Continue reading "The Encyclopedia and Tree of Life"

The JavaScript Basics: Class Definitions

This is the first post in a new series “The JavaScript Basics” that I hope will be interesting to you the reader, but more importantly I hope will foster some conversation.

I’ll be posting about (1) how I do things in JavaScript – from the basics of class definitions to optimizing 1000+ line applications – and (2) why I choose to do things this way. Hopefully our conversations will teach us both something new about this powerful client-side language. 😀

Continue reading "The JavaScript Basics: Class Definitions"

iPhone SDK Beta 2 released

Today’s big iPhone news: The Beta 2 of the iPhone SDK has been released!

So what’s new in this latest version? Most notably is that Interface Builder finally works! No more building your UIs programmatically – yuck! Also fun, more sample code is included and the documentation has been updated.

I’ve yet to download it – I’m currently on vacation – but once I land back in Houston-town, you bet I’m going to be downloading this.

Continue reading "iPhone SDK Beta 2 released"

Head Tracking on the iPhone

For those of you who haven’t seen head-tracking displays, let me direct you to this video which describes the basics of what’s going on.

Basically, what’s shown on the screen updates in relation to the angle at which you view the screen. The end result turns the screen of your TV or iPhone into a window into a virtual world. It’s a virtual-virtual-reality. Awesome!

Continue reading "Head Tracking on the iPhone"

iPhone OS 1.2 update

Sad iPhoneWhile I haven’t yet been accepted into the iPhone Developer program, I’m not at all happy with the reports that I’ve been hearing. iPhone Atlas is reporting that the beta iPhone OS 1.2 that you need to install to develop iPhone programs on the iPhone hardware will kill your phone’s ability to make calls. Presumably, once the non-beta upgrade is released in June, then the ability to make calls will be restored. One can only hope. I certainly don’t have the budget for a dedicated development iPhone.

Continue reading "iPhone OS 1.2 update"

A Request to Apple regarding the iPhone SDK

Dear Apple,

I appreciate that I can set my own icon for my application, but here’s what I want: I want an easy and programmatic way to add the red circle indicators to my icon just like you have for the Mail and SMS apps.

Cheers,

Adam

Adding the libXML framework to your iPhone App

When working on my first iPhone app, I needed to import the libXML framework into my project. I took a look at a sample app that used the libXML framework, and made sure that the framework list in my project matched the one in the sample project – but for some reason my project wouldn’t compile. It kept complaining that it couldn’t find a libXML header file or some such, and so finally i turned to The Google, and found the answer. I’m sure this stuff is a no-brainer for more experienced Cocoa / iPhone developers, but since I’m neither yet, I thought this was a bit trickier than I expected.

Continue reading "Adding the libXML framework to your iPhone App"

The start of my first iPhone App

I’m excited, because today is the day that I actually started writing code for my first iPhone application! I’m going to write a Bible app for the iPhone, and it’s going to be great.

For this app, I’m planning on letting users download 1 or more versions of the Bible. I’ll have King James and Basic English to start – since those are free. If lots of people actually use my Bible app, I’ll look into licensing the NASB and NIV.

Continue reading "The start of my first iPhone App"

Jotlet JavaScript API

Today was a momentous day: I publicly announced the Jotlet JavaScript API!

I’m very excited to finally get all this past months of work out into the public eye. There is simply nothing even close to similar being offered by any other online calendar out there. I’ve emailed some tech sites and I’m hopeful that it’ll get reviewed, or at least mentioned, in an upcoming article.

It’s certainly worth writing about. This is basically a calendar version of the Google Maps API. Developers can now integrate a fully functional AJAX calendar directly into their site with only a few lines of code. Pretty hot stuff if you ask me!

Continue reading "Jotlet JavaScript API"