Blogs

DejaUIKitCategories: an open source collection of UIKit-level categories for iOS

The final batch of open source categories: DejalUIKitCategories.

DejalUIKitCategories is a collection of categories for UIKit on iOS, to add useful methods to classes like UIBarButtonItem, UIColor, UIView, and others. The categories include:

  • UIApplication+Dejal: Adds methods to get the first responder and keyboard view of the app.
  • UIBarButtonItem+Dejal: Convenience initializers to make UIBarButton instances based on and image, title, system item, custom view, spacer, or segmented control.
  • UIButton+Dejal: A more convenient title property, and a method to add a gloss effect.
  • UIColor+Dejal: Convenience initializers for more standard colors, or based on a platform-specific image or hex value.
  • UIImage+Dejal: Convenience initializers for tinted images, methods to overlay images with colors, and scaling methods.
  • UIImageView+Dejal: Make a white-background image view, and adjust the background color based on the highlighted state.
  • UILabel+Dejal: Convenience initializers for labels with various text, font, width etc attributes, and sizing methods.
  • UISegmentedControl+Dejal: Convenience initializer for a segmented control with specified items, target, action, and initial selection.
  • UITextField+Dejal: A selected range property, and support for gestures to move the insertion point by swiping.
  • UITextView+Dejal: Attributes of the selection or insertion point, and support for the insertion point swiping gestures.
  • UIView+Dejal: Properties for frame and bounds components and an image representation, methods to hide, add to and remove from the superview with animation.

You can get the code and more information from the Dejal Open Source page.

(Looking for an iOS or Mac developer? I'm available for contract or full-time work. Learn more about me.)

DejalAppKitCategories change: methods for radio buttons

Another developer post.

I recently released my DejalAppKitCategories open source project, which includes categories for OS X UI classes.

I am currently working on Time Out 2, and wanted to modernize the radio buttons in the preferences. In the AppKit release notes for OS X 10.10, Apple wrote:

Use of NSMatrix is informally deprecated. We expect to add the formal deprecation macros in a subsequent release, but its use is discouraged in the mean time. The primary use of NSMatrix is for radio button groups, so recall that for applications linked on 10.8 or later, radio buttons that share the same parent view and action will operate as a group.

Which is all well and good, but managing a radio group is annoying when using standalone buttons, so I added some methods to help.

These methods are part of my DejalAppKitCategories open source project, in the NSButton+Dejal category.

Here's the header:

@interface NSButton (DejalRadios)

@property (nonatomic, setter=dejal_setRadiosEnabled:) BOOL dejal_radiosEnabled;

- (void)dejal_selectRadioWithTag:(NSInteger)tag;
- (NSInteger)dejal_selectedRadioTag;

- (NSButton *)dejal_radioPassingTest:(BOOL (^)(NSButton *radio, BOOL *stop))predicate;
- (void)dejal_enumerateRadiosUsingBlock:(void (^)(NSButton *radio, BOOL *stop))block;

@end

And the implementation:

@implementation NSButton (DejalRadios)

/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and selects the one with the specified tag.  Invoke this on any of the radios in the group.  A replacement for -[NSMatrix selectCellWithTag:].

@param tag The tag value to select.

@author DJS 2015-01.
*/

- (void)dejal_selectRadioWithTag:(NSInteger)tag;
{
    [self dejal_enumerateRadiosUsingBlock:^(NSButton *radio, BOOL *stop)
     {
         radio.state = radio.tag == tag;
     }];
}

/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and returns the tag value of the selected radio.  Invoke this on any of the radios in the group.  A replacement for -[NSMatrix selectedTag].

@returns A tag value integer.

@author DJS 2015-01.
*/

- (NSInteger)dejal_selectedRadioTag;
{
    NSButton *foundRadio = [self dejal_radioPassingTest:^BOOL(NSButton *radio, BOOL *stop)
     {
         return radio.state;
     }];
   
    return foundRadio.tag;
}

/**
Returns YES if the radio group is enabled, or NO if not.  Simply returns the state of the receiver; the others are assumed to be the same.  (If you want to know if they are all enabled or disabled, probably best to use -dejal_enumerateRadiosUsingBlock: to scan the group, and handle a mixed case as needed.)

@author DJS 2015-01.
*/

- (BOOL)dejal_radiosEnabled;
{
    return self.enabled;
}

/**
Sets all of the radios in the group to be enabled or disabled.  A replacement for -[NSMatrix setEnabled:].

@author DJS 2015-01.
*/

- (void)dejal_setRadiosEnabled:(BOOL)enabled;
{
    [self dejal_enumerateRadiosUsingBlock:^(NSButton *radio, BOOL *stop)
     {
         radio.enabled = enabled;
     }];
}

/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and performs the block for each of them, passing the radio to the block.  Returns the one that returns YES, or nil if the block requests to stop before completion, or it completes without the block returning YES.  Invoke this on any of the radios in the group.

@param block A block that takes a radio button and stop boolean reference as parameters and returns a boolean.
@returns The found radio button, or nil if none is found.

@author DJS 2015-01.
*/

- (NSButton *)dejal_radioPassingTest:(BOOL (^)(NSButton *radio, BOOL *stop))predicate;
{
    for (NSButton *radio in self.superview.subviews)
    {
        // There's no reliable way to determine if a button is actually a radio button, but it's reasonable to assume that no non-radio will have the same action (and having the same action is what makes it a member of the group):
        if ([radio isKindOfClass:[NSButton class]] && radio.action == self.action && predicate)
        {
            BOOL stop = NO;
           
            if (predicate(radio, &stop))
            {
                return radio;
            }
           
            if (stop)
            {
                return nil;
            }
        }
    }
   
    return nil;
}

/**
Assuming the receiver is a radio button, finds other radio buttons in the group (i.e. in the same superview and with the same action) and performs the block for each of them, passing the radio to the block.  Invoke this on any of the radios in the group.

@param block A block that takes a radio button and stop boolean reference as parameters and returns void.

@author DJS 2015-01.
*/

- (void)dejal_enumerateRadiosUsingBlock:(void (^)(NSButton *radio, BOOL *stop))block;
{
    for (NSButton *radio in self.superview.subviews)
    {
        // There's no reliable way to determine if a button is actually a radio button, but it's reasonable to assume that no non-radio will have the same action (and having the same action is what makes it a member of the group):
        if ([radio isKindOfClass:[NSButton class]] && radio.action == self.action && block)
        {
            BOOL stop = NO;
           
            block(radio, &stop);
           
            if (stop)
            {
                return;
            }
        }
    }
}

@end

To use these methods, simply invoke on any of the radios in the group, e.g.

    [self.iconNoneRadio dejal_selectRadioWithTag:self.statusIconKind];
    self.iconNoneRadio.dejal_radiosEnabled = use;

And:

- (IBAction)chooseIcon:(id)sender;
{
    self.statusIconKind = self.iconNoneRadio.dejal_selectedRadioTag;
   
    [self maintainControls];
}

I hope this helps others! And, of course, if I'm missing anything obvious, or you have any suggestions or comments, please let me know.

This look useful? Do check out my other open source projects, too.

(Looking for an iOS or Mac developer? I'm available for contract or full-time work. Learn more about me.)

Anniversary of the iPhone launch

I just listened to episode 18 of the Upgrade podcast, where Jason Snell reminisced about first seeing and touching the iPhone. (Yes, I'm about a week behind on my podcast listening.)

That sent me down a memory lane of my experience at that event. I haven't attended many conferences over the years, but Macworld Expo in 2007 was one of them. In fact, that was the only Macworld I ever attended. But yes, I was also in the audience for the historic occasion of Steve Jobs introducing the first iPhone.

My seat was rather far back, but I was there (that's a repeater screen on top, and the live stage at the bottom):

Unlike Jason, I didn't get to touch one, but I did get to see it up close, behind well-guarded glass:

After the show, I wrote a followup blog post with my initial impressions of the iPhone and other news at the event (introduction of the Apple TV, and Apple changing its name). Reading over that post now is somewhat amusing, with concerns over the keyboard and developer access.

I had a bunch of other photos from the show, showing various events and presentations, the show floor, iPhone demos, etc. Ah, memories.

DejalAppKitExtensionCategories: an open source collection of categories to extend Foundation classes for OS X

I just released another open source collection of categories: DejalAppKitExtensionCategories.

DejalAppKitExtensionCategories is a collection of categories to extend Foundation classes with methods specific to OS X. The categories include:

  • NSAttributedString+AppKit+Dejal: Adds convenience initializers to load from a bundle resource, image URL or RTF, and to return a RTF.
  • NSDictionary+AppKit+Dejal: Extends NSDictionary and NSMutableDictionary to support NSColor values.
  • NSFileManager+AppKit+Dejal: Adds a method to determine if a path is a directory but not a package, and to move a file to the Trash.
  • NSObject+AppKit+Dejal: Extends the NSObject base class with an old-style modal did-end perform selector, and modifier key detection.
  • NSSString+AppKit+Dejal: Adds methods that depend on fonts, points and colors.
  • NSUserDefaults+AppKit+Dejal: Adds support for points, sizes and colors in NSUserDefaults.

These categories depend on the previously-published DejalFoundationCategories.

You can get the code and more information from the Dejal Open Source page.

Next up: my UIKit categories.

(Looking for an iOS or Mac developer? I'm available for contract or full-time work. Learn more about me.)

Simon 3.6.4 released

When I added recognition of version 4 groups in version 3.6.2, I did so for tests, but services, filters, notifiers and reports can also have groups in version 4. So here's Simon 3.6.4 to fix an issue with editing those.

If you're using OS X 10.10 (Yosemite), I recommend that you upgrade to version 4, if you haven't already. It includes heaps of great improvements. But if you're on 10.6 (Snow Leopard) to 10.9 (Mavericks), you can download Simon 3.6.4 now.

Simon password protection

One of the many enhancements in Simon 4, which was actually also retrofitted to Simon 3.6.2 and later, was the introduction of an optional password feature. This was requested by a volume purchaser of Simon, who also paid for the unusual step of retrofitting it to Simon 3.

The password feature can be used to require a password when Simon is launched or activated. This provides some level of security to prevent unauthorized people from accessing Simon. It doesn't encrypt data or any other changes, it's just a simple access control.

By default, a password is not required. If you want to require one, open up the Preferences. Notice the new Choose Password... button and the text to the left indicating that a password hasn't been set:

Click the button to display the password sheet. If a password hasn't already been set, the first field will be disabled (and display "None"). If one has been set, enter the existing password there. The next two fields are for the new password; enter the same one in both, or leave them both blank to disable the password feature. If entering a password, you should also enter a hint that will remind you of the password (without being too obvious):

After setting a password, the text in the Preferences window will change to indicate so:

When a password has been set, whenever you activate Simon it will display an unlock sheet, asking for the password. It includes a Quit button to quickly stop Simon, and a Cancel to deactivate Simon. After two failed attempts, it will display the password hint (if any); after two more failed attempts, it'll disallow further attempts until after you quit or cancel:

I expect that most people won't need this feature, but for those who do, it should prove quite useful.

Stay tuned for more blog posts delving into Simon 4 enhancements.

DejaAppKitCategories: an open source collection of AppKit-level categories for OS X

I just released some more open source code: DejalAppKitCategories.

DejalAppKitCategories is a collection of categories for AppKit on OS X, to add useful methods to classes like NSMenu, NSTableView, NSTextView, and others. The categories include:

  • NSButton+Dejal: A text color property and a method to display a menu.
  • NSImage+Dejal: Methods to draw flipped images, apply a badge or tint, or get a PNG representation.
  • NSMenu+Dejal: Methods to add and remove items.
  • NSOutlineView+Dejal: Methods for selected items and displaying a menu.
  • NSPopUpButton+Dejal: Methods to add and select items.
  • NSScreen+Dejal: Screen name methods.
  • NSSplitView+Dejal: Methods for split positions and collapsing and expanding.
  • NSTableView+Dejal: Selection, column and copying methods.
  • NSTextField+Dejal: Methods to set values, synchronize with a slider, and resize the window (using autoresizing).
  • NSTextView+Dejal: Properties for string, attributed string and RTF values, methods for length, range, appending, and selection.
  • NSToolbar+Dejal: Methods for the toolbar height and finding an item by identifier.
  • NSView+Dejal: Add a view as a fully-constrained subview, adjust autoresizing, scale, and set the alpha opacity.
  • NSWindow+Dejal: Methods to force editing to end, fade in a window, and adjust the sizing of the window based on a view.

You can get the code and more information from the Dejal Open Source page.

Stay tuned for more OS X and iOS open source code, coming your way over the next week or so.

(Looking for an iOS or Mac developer? I'm available for contract or full-time work. Learn more about me.)

A Simon 4 case study: the default "Dejal posts" test

When I released the major version 4 upgrade of Dejal Simon, I included a couple of new default tests as examples for new customers. One of them is named "Dejal posts", and actually includes a quite sophisticated set of filters.

The general idea of this test is to look at the Recent Posts page of the Dejal site, which lists all recent blog, forum, FAQ etc posts and their comments, and output some tidy text describing the most recent one, along with a changed state when a new post or comment is added.

I thought it'd be interesting to break down this test as an example and tutorial for new and existing customers — even long-term users might learn something!

Firstly, here's the Service page; nothing remarkable here (the cookies are automatically recorded, and unimportant for this test):

[Service page]

The most interesting page is the Filters one (click to see it full-size; you might want to use the appropriate modifier key for your browser to open in a new window):

[Filters page]

When you check the test and look in the Activity log, you can see the output from each of those filters (from bottom to top) — click to see full-size:

[Activity log]

Another way to view the output is via the Preview pane, which now includes not only the service response and headers, but also the full output of each filter, to help you diagnose each step.

Here's the output of the service; the full HTML of the web page:

[Preview service response]

Let's break down each of the filters, via the Preview filter output.

The first filter, a Block one, takes the service response as its Input, and has Start text of <tbody> and End text of <td class="replies">. This finds the first occurrence of each of those bits of HTML in the service response, which corresponds with the most recent post information:

[Filter configuration]

This filter outputs that:

[Preview filter output]

The second filter is another Block one. It takes the output of the first filter as its input, and narrows it down further to just the title of the post. Notice that it also uses options disclosed on the right-hand-side of the filter configuration: it looks for the second occurrence of the Start text, searching from the beginning of the input:

[Filter configuration]

The output of this filter is the post title:

[Preview filter output]

The third filter is yet another Block (it is one of the most useful filters), but the input is different: this time it uses the output of the first filter, instead of the previous one (as is the default). It also has an option to look for the third occurrence:

[Filter configuration]

It extracts the author information:

[Preview filter output]

Filter number four is different. It uses a Ignore Links filter to extract out just the author name from the previous filter output. The previous filter doesn't do this as when you're not logged in on the Dejal site, only the name is included (in which case this filter has no effect):

[Filter configuration]

The output is just the non-HTML part of the input:

[Preview filter output]

Next we're back to a Block filter again, but this time looking at the original service response text to extract the number of replies to the post:

[Filter configuration]

This should always output a number:

[Preview filter output]

We then use a new filter introduced in version 4, Singular or Plural, to take the number found in the previous filter and output "reply" if it is one, or "replies" for any other number:

[Filter configuration]

As seen in the preview:

[Preview filter output]

The last filter puts it all together: an Override Custom filter uses variables to combine the output of several filters in a nice readable way. In this case all the variables are variations of the filter output, but other variables are available too. Something that isn't immediately obvious is that you can insert numbers to reference specific filters (otherwise it refers to the previous one):

[Filter configuration]

Which results in:

[Preview filter output]

So now that we've got some nice output text, what do we do with it? Of course, you can just see it in the Tests list, if you have the last change and failure displayed:

[Tests list]

But you'll probably want to get a notification. For myself, in addition to some generic speech notifiers, I have a notifier to post to the @SimonBot Twitter account; an account I added just for Simon to tweet about Dejal site changes:

[Notifiers page]

The SimonBot notifier also uses variables to add more information about the test:

[SimonBot notifier]

Which appears like this:

You're welcome to follow @SimonBot to learn about Dejal news and discussions.

I hope this case study is helpful. Most tests don't need a series of filters like this, and there are other ways to achieve similar effects (like writing all the logic in a script), but it can be very useful when you want it. You can use similar techniques in your own tests.

I plan to do more case studies or tips on Simon features in the future; please leave a comment if you like this or find it useful, or have suggestions for other things you'd like me to cover.

BlogAssist Express 2.4.1 released

BlogAssist version 2.4.1 was recently released here on the Dejal site.

Those using the Mac App Store edition, BlogAssist Express, will be pleased to learn that Apple has just approved the update, so version 2.4.1 is now available for that edition too.

The changes again are just:

  • Fixed some issues with the Substitutions preference page.
  • Updated for OS X 10.10 (Yosemite).

The standard edition is available for download here, or you can get BlogAssist Express 2.4.1 from the Mac App Store.

DejalFoundationCategories: an open source collection of Foundation-level categories

Today I released two new open source projects: a tiny one, DejalUtilities, and a significantly larger one, DejalFoundationCategories.

DejalFoundationCategories is a collection of Foundation-level categories, to add useful methods to classes like NSArray, NSDictionary, NSString, and others. They work on both OS X and iOS, and include:

  • NSArray+Dejal: 30+ methods extending NSArray and NSMutableArray, including object matching, reversal, sorting, deep copying, adding and removing.
  • NSAttributedString+Dejal: 10+ methods extending NSAttributedString and NSMutableAttributedString, including convenience initializers, RTF and font methods.
  • NSData+Dejal: A couple of methods to make archiving and unarchiving objects slightly more convenient.
  • NSDate+Dejal: 50+ methods extending NSDate, including convenience initializers, handy date component properties and calculators, JSON date support, string formatting, and relative date output.
  • NSDictionary+Dejal: 25+ methods extending NSDictionary and NSMutableDictionary, including object matching, scalar support, deep copying, and more.
  • NSFileManager+Dejal: 15+ methods extending NSFileManager, including convenient file attributes, file renaming, and path building.
  • NSObject+Dejal: 15+ methods extending the NSObject base class, including key-value conveniences, “equivalent” comparisons, and performSelector methods.
  • NSString+Dejal: 80+ methods extending NSString and NSMutableString, including scalar value formatting, contains evaluation, comparisons, substring and range utilities, reformatting, checksum and encoding utilities, internet utilities, file path methods, and appending and replacing methods.
  • NSUserDefaults+Dejal: 15+ methods extending NSUserDefaults, including support for default values, sanitizing values, time intervals, factory settings, and copying preferences.

DejalUtilities is a single header file with some useful #define macros and static functions, also for both OS X and iOS:

  • Adds DejalClassAvailable() and DejalClassSelectorAvailable() macros, to help determine available APIs.
  • Adds DejalIntervalFromMinutes(), DejalIntervalFromDays(), DejalMinutesFromInterval(), DejalMonthsFromInterval(), and similar macros, to convert seconds to and from other units.
  • Adds DEJAL_FILE_NAME and DEJAL_COMPILE_DATE_TIME macros, to help with debug information.
  • Adds a DejalWeakSelf macro to easily make a weak representation of self for use with blocks.
  • Plus several other handy macros and inline functions.

You can get the code and more information from the Dejal Open Source page.

(Looking for an iOS or Mac developer? I'm available for contract or full-time work. Learn more about me.)

Simon 4.0.1 released

Simon 4 was a major release, and great to get it out. Fortunately, there weren't any major issues with it — I always dread having to do an urgent bug fix immediately after a major release.

But there were some minor issues that were important enough to get fixed fairly quickly, especially for non-English users. So here's version 4.0.1. It's a recommended update for everyone.

  • Fixed an issue with duplicating a test where filter settings could become linked with the original until quit.
  • Fixed a localization issue with the Method popup menu in the Web (HTTP) service.
  • Fixed layout of the Twitter and SMS notifier editors.
  • Fixed issues with selecting URLs to import in the Setup Assistant.
  • Fixed the Dock icon static animation getting mixed with the normal status icon when checking or uploading reports while the Licenses or Setup Assistant windows are displayed.
  • Changed the way relative dates are formatted, to make them more compatible with localizations.
  • While uploading a report, a circular progress indicator is now displayed in the Reports list.
  • Fixed the scheduler not starting until the Tests list is displayed.
  • Tweaked the layout of the Context views, and made localizable.

Download Simon 4.0.1 now!

BlogAssist 2.4.1 release

I know that I just said that BlogAssist doesn't need any updates, but apparently I was wrong: I had a report that the Substitutions preference page didn't behave properly under Yosemite. So here's a fix.

  • Fixed some issues with the Substitutions preference page.
  • Updated for OS X 10.10 (Yosemite).

Download BlogAssist 2.4.1 now!

Dejal year in review: 2014

Happy holidays!

Another year is coming to a close, so let's review what happened with the Dejal apps in 2014:

My flagship product to monitor websites and servers for changes and failures, Simon, had a big year in 2014. It started the year with the version 3.6 release, and ended it with the biggest upgrade ever, to version 4.0, with a radical new design and many significant improvements, both visible and behind the scenes.
My handy break reminder tool, Time Out, had several alpha builds of version 2 in 2014. Work on it kept being sidelined by other projects, mostly my contract work on Profile, but the builds slowly improved the app. As previously mentioned, everyone who makes a donation for Time Out now will be automatically eligible for the full-featured paid edition at no additional cost — so you can set your own price for it now! This offer expires when version 2 is released. This also makes you eligible for the alpha; after donating, tell me if you'd like to try it. Thank you to everyone who has already donated; the volume of donations is really encouraging.
Caboodle, my lean clean snippet machine, didn't see any updates in 2014. I do have a new version in the works, which I'll finish off and release once I get Time Out 2 out.
BlogAssist, my tool to help with HTML markup, also wasn't updated in 2014. It isn't a huge seller, so I'm not sure I can justify devoting much time to it. But I use it myself regularly, so I have no plans to discontinue it any time soon. It's basically great as-is.
I introduced a new app in 2014: Pack, a simple iPhone app to make it easy to pack for trips. I actually wrote this for myself a couple of years ago, and have used a pre-release build when packing for vacations and other travel of my wife and I ever since. This year, I polished it up and released it as my first freemium app. Try it for your next trip!
Tweeps, an app for iOS to easily manage Twitter accounts, was updated to version 3.3, including the modern iOS 7 & 8 look.
Profile, a client for Intrahealth's powerful medical practice management system, is where I spent the vast majority of my time once again, as contract work. It hasn't had a public update for a while, but internal builds have numerous improvements. I'm no longer working on this project; Intrahealth has taken maintenance of it in-house, as they continue to grow and refine their processes.

So what's coming up in 2015? Firstly, I am currently looking for a new contract or salary position as an iOS and/or Mac developer. I enjoy working on the Dejal products, but they don't bring in enough to pay the bills, so have always been more of a hobby side-business for me. If you have any leads, please refer them to me; see the Dejal consulting page for more about me.

For my own projects, I am about to get back to work on Time Out 2.0 — full-time until I find some other project. I'll also have updates of Simon, Caboodle and others throughout the year.

Thank you and welcome to my new customers, and many thanks to my long-term customers who are still enjoying my apps. I really appreciate your support. I'm very excited about the much-anticipated Time Out 2 release in the coming year, and other projects in the pipeline.

Featured blog posts of 2013 & 2014

My blog posts often just cover new releases, but sometimes I post general-interest or developer-interest topics. I haven't written all that much over the past couple of years, but some highlights from 2013 and 2014 included:

I hope you enjoyed these posts.

Simon 3.6.3 released

A quick fix to version 3:

  • Fixed an issue that prevented the password preference from being used under OS versions before Yosemite.

As I said in my previous post, if you're using OS X 10.10 (Yosemite), I recommend that you upgrade to version 4, if you haven't already. It includes heaps of great improvements. But if you're on 10.6 (Snow Leopard) to 10.9 (Mavericks), I recommend that you download Simon 3.6.3 now.

Simon 3.6.2 released

Strange as it may seem (to me, anyway) to do a version 3 release after version 4 (out of order releases hurt my brain!), here it is: Simon version 3.6.2.

This is a bug-fix update of version 3, to fix some compatibility issues with version 4. It also retrofits the password feature from version 4, at the request of a volume purchase customer who paid extra for that... yes, sometimes I can be bribed. ;)

And yes, this version still uses the old icon — that makes it easier to distinguish versions 3 & 4.

Here are the changes since 3.6.1 in 3.6.2:

  • Added an option in General Preferences to specify a password to use to unlock Simon access.
  • If set, the password is required when launching or switching to Simon.
  • Now recognizes version 4 groups, and doesn't allow editing, checking, previewing, etc them.
  • Removed the Kagi in-app license options.
  • Fixed handling of version 4 licenses.
  • Fixed the license reminder overlapping the toolbar buttons.
  • Fixed an error when doing an update check if version 4 has been used.
  • Rebuilt for Yosemite using Xcode 6.

If you're using OS X 10.10 (Yosemite), I recommend that you upgrade to version 4, if you haven't already. It includes heaps of great improvements. But if you're on 10.6 (Snow Leopard) to 10.9 (Mavericks), I recommend that you download Simon 3.6.2 now.

Simon 4.0 released

(A note for beta testers: you may need to log out and back in, or use the Terminal killall Dock command, to make the "beta" sash on the app icon disappear. And thanks again for your help in making this general release great!)

A Major Upgrade!

Dejal Simon 4: four years after version 3, four months in development, it's time to go forth. Simon 4 includes a fresh new design, unifying all of the lists, logs and editors into a single window, so everything is at your fingertips. It also uses a more attractive layout for the lists of tests, services, filters, notifiers and reports. A much requested enhancement is the introduction of groups, enabling you to organize your tests, services, etc into logical collections. Those with lots of tests will be pleased to learn that the limits on the number of tests have been removed — everyone can have as many tests as they wish. This also simplifies the pricing for new and existing customers. There are numerous other enhancements too, like email services, a context filter, filter output in the preview, password protection, the ability to hide from the Dock, and much more. Read on for details.

Licensed Simon 3 users need to be aware that Simon 4 is a paid upgrade from previous versions. You will need to purchase an upgrade license. If you purchased Simon since November 1, 2014, you are eligible for a free upgrade; contact Dejal to receive your free license.

A new option is the Simon Service Plan subscription. Learn more about this below or on the Simon Support page.

Also note that Simon Express and Simon Free have been removed from the Mac App Store. Simon is a powerful and flexible tool, so they couldn't comply with the sandboxing requirements that Apple introduced. If you used one of these, please switch to the full version of Simon, and enjoy all the extra features. Your data will be automatically imported to version 4. Simon Express is automatically recognized as a version 3 license, so you only need an upgrade license.

Please also note that Simon 4 requires Mac OS X 10.10 (Yosemite) or later, as it leverages the latest technologies. If you're still using an older OS version, you can remain on version 3 until you upgrade your OS version. You are welcome to purchase a version 4 license; it will work in version 3 as a Platinum (unlimited) license.

Read on for a summary of some of the many enhancements in Simon 4.

Great New Simon Monitor Window Design

Simon's main window, the Simon Monitor window, has been significantly redesigned. It now uses a single-window approach to display the Tests, Services, Filters, Notifiers and Reports lists in this window, switching between them via mode buttons along the left edge.

Editing tests, services, etc is now done in this window as well, via an optional info pane to the right of the active list.

As in earlier versions, the logs are displayed in a pane at the bottom of the window. This pane can now also display the Preview; see below for more on this.

The lists or logs can be hidden by dragging the pane splitter, or Cmd-clicking on the selected mode button.

[Monitor window]
Attractive New List Layouts

The lists of Tests, Services, etc have been redesigned to use a custom layout inspired by Apple Mail and other modern apps.

The lists can be sorted via a menu above the list, or via the View menu. The choice of displaying absolute dates and times (like "2014-12-25 12:34", using your local date & time format) or relative times (like "5 mins, 25 secs ago") is also available in these menus.

The Tests list shows the unviewed flag, status icon, test name, next due date/time; the uptime, service, location, last check time, and last check duration. It can also optionally display information about the most recent change and failure: the last change and when it occurred; the last error, failure & recovery date/time. These can also be toggled via those menus.

Groups

Version 4 introduces a major popularly requested feature: groups in all lists. Groups can be added to help organize the tests, services, etc into logical collections, e.g. by server or kind; whatever makes sense.

In the list, the group displays a summary of its members, e.g. the most significant status and combined uptime, with the info summary showing common values.

The menubar status menu displays groups in sub-menus, with commands that can be applied to all group members.

[Tests list]
Redesigned editors

The editors have been completely redesigned to integrate them into the single-window approach. Selecting an item in the Tests, etc lists will now display a summary of the item in the handy new Info pane to the right of the list. An Edit button is included in the top-right of the Info pane. Click that to toggle into edit mode, where the item can be modified. The button changes to Done to switch out of editing mode. You can also click the headings on the summary to jump right to the related page in edit mode.

You can leave it in editing mode and switch between tests to quickly edit them; it will remain on the same page. Speaking of which, the page selectors have been redesigned, and a new Name page was added to edit the name and comments.

The test statistics have been moved to the test summary page for easy reference.

When multiple tests or no tests are selected, the summary page shows the values in common, and a combined view of the statistics for those tests.

Another nice subtle improvement is that the actions for the test Filters, Notifiers, Reports and Auto Pause can now be reordered, simply by dragging them.

Integrated Preview, Including Filter Output

The Preview function has been completely redesigned to integrate it into the single-window approach, and provide the ability to see the filter output in addition to the service output.

When a test is selected, the Preview feature can be displayed in place of the logs at the bottom of the window for a quick view of the test. The preview includes a web page on the left (for web-based tests), a selection list in the middle, and the service response, headers or filter output on the right. The selection list shows the status of the service or filter, and for filters, the sequence number and filter name, e.g. "#1: Block Output" for the output from a Block filter. The filter output is very useful, to see not only the result of the service, but also the result of each filter. This makes it easier than ever to build up multiple filters, taking the output from previous ones to hone in on the interesting values.

The Preview function is also available when displaying a Script-based service, filter or notifier, to run the script and see what it outputs while writing it, and to preview a report within Simon.

[Preview]
Enhancements to the Email Feature

The Email feature now also works as a service. Three service modes are supported: Email Send, Email Receive, and Email Cycle:

  • Email Send is basically the same as the Email notifier: sends a custom message via SMTP. Useful to "check in" or test that a mail server is working. It outputs the message, or an error if unsuccessful.
  • Email Receive fetches a list of messages from an IMAP server. It outputs the list of messages, or an error.
  • Email Cycle first sends a special message with a unique identifier to a SMTP server, then checks for that message arriving on an IMAP server. It cleans up after itself, and outputs the message and mailbox listing, or an error.

There are several other changes, including finally renaming the E-mail notifier as Email, adding a Transport Name field to the Email Transport Options panel, a new Email Account Options panel, and modernizing the framework used to send email. See the release notes for full details.

New Context Filter

Added a new Context filter feature, which takes the previous filter's input and some new match variables to output some context around the filter's output text. It includes controls to specify the number of characters before and/or after the match range, and/or a delimiter before and/or after the match range (e.g. you can show up to 50 characters, stopping at a line break). See the release notes for information about the new variables.

And Lots More Improvements

Too many things to list here! (See the release notes for the full list.) A few other highlights that might interest existing users include:

  • A great new app icon and window icons.
  • The ability to hide Simon from the Dock.
  • The ability to password protect access to the app.
  • The Web (HTTP) feature will now automatically follow a meta refresh (e.g. <meta http-equiv="refresh" content="0; url=http://www.dejal.com/">).
  • Added a FileShare menu and a share button in the window toolbar to share the selected item(s) with other apps.
  • No longer truncates the difference text to 400 characters, if it's longer than that.
  • The data is now saved in the background, for better performance.
  • Many changes to improve Yosemite compatibility.
Introducing the Simon Service Plan Subscription

Need more detailed or technical assistance? Introducing the Simon Service Plan, an annual subscription for heavy users or large organizations, or anyone who wants to get the most out of Simon.

The Simon Service Plan includes all app updates, including paid major upgrades like version 4.0 and any future updates within the subscription period, at no additional cost.

The Service Plan also includes two technical support incidents each subscription year. These give you top-of-the-queue direct access to the developer via email, and can be used to answer general questions, help configure Simon, and more.

Read more about this on the Simon Support page.

Try Simon 4

Ready to upgrade? Great! Purchase an upgrade license on the Dejal Store. Or subscribe to the Simon Service Plan, which includes the upgrade.

Still not sure? Try it for free!

Download Simon 4.0 now!

If you want to keep the old version around, just in case, you can rename it (e.g. to add the version number) rather than replacing it with the new version. That way they can both occupy the same folder without a file name conflict.

Simon 4 has eliminated the license levels. Now everyone can have as many tests as they want for the same price. New customers can purchase Simon for $99.00, and existing customers can upgrade for half that, just $49.00.

I hope you enjoy the many improvements in Simon 4!

Simon 4.0b9 released

Simon 4.0b9 is now available.

This should be the last beta; I'm preparing the site for the general release now. Thank you to everyone who has provided feedback for helping make Simon 4 a great release.

New default tests, services & filters

  • Fixed the new Dejal posts test so it doesn't have a failure if not logged in to the Dejal website.
  • Updated the new Singular or Plural filter to avoid including a linefeed after the text.

Fixes & optimizations in this beta

  • Fixed not respecting turning off the Show in Dock preference on launch (broken in the previous beta).
  • Fixed the Look for changes... checkbox on the Filter > Options page.
  • When changing the service type of a test and reloading the Preview, it now displays or hides the web view as appropriate.
  • Fixed the test Preview web view sometimes not appearing at all for new users.
  • Fixed some missing localization strings.
  • Updated the help book for version 4.

More in four: see the Simon What's New page for important information and details of the changes in version 4.

Download Simon 4.0b9 now!

Simon 4.0b8 released

Simon 4.0b8 is now available.

Added new default tests, services & filters

  • Added a new RSS service, which is basically just a Web (HTTP) service with a feed:// protocol, but also has different Preview behavior (see below).
  • Added a new Singular or Plural filter, which has fields for a singular or plural word, and outputs the appropriate one based on the numeric input (use other filters to provide a number).
  • Added a new Input filter, which just outputs its input, with change detection. Useful to output the the result of the service or an earlier filter after doing other filtering.
  • Added a new Apple hot news default test (for new users), that uses the RSS service and a bunch of filters to output the latest news from Apple.
  • Added a new Dejal posts default test as another demo of using filters to combine values. It's the one I use to watch for new forum posts on the Dejal site.
  • Removed the Twitter service, since it isn't supported anymore. If you want to watch for Twitter updates, you could use a Web (HTTP) service instead.

Fixes & optimizations in this beta

  • When using the new RSS service, or the existing FTP service, the Preview doesn't show the web view.
  • Changed the color of the Checks Log mode icon, to be more visible.
  • Fixed the History filter feature not being recognized.
  • Improved the data upgrade to support multiple items of the same kind.
  • Tweaked the trial expiry limits.

More in four: see the Simon What's New page for important information and details of the changes in version 4.

Download Simon 4.0b8 now!

Simon should be ready for general release very soon. Please let me know of any issues as soon as possible! Thank you for helping make Simon 4 a great release.

Introducing Pack for iPhone!

Just in time for your holiday travel!

Pack is a very simple packing list, so you can get packed quickly and easily.

There's no need to maintain separate lists for each trip. There's no need to guess and enter unnecessary details like weight or cost for each item. It has a clean and elegant appearance, without blinding you with wacky colors and images.

Pack comes with a catalog containing hundreds of items as a starting point. Quickly add, edit or delete them to make your own personalized list.

When preparing for a trip, simply skim through the list, checking or unchecking items as needed for this journey. When ready, flip over to start packing, crossing off items as you put them in your suitcase.

The Choose and Pack lists can be arranged by item name, category, or person name, and can be filtered to show only packed, packed at the end, or all.


Pack is free to use, and includes an optional one-time in-app purchase to unlock all of the app's premium features:

  • Add an unlimited number of items.
  • Add new categories.
  • Rename categories.
  • Delete unused categories.
  • Add multiple people.
  • Arrange items by person.

Purchasing also helps support further Pack development.

Learn more about Pack.
Syndicate content