Blogs

MacSanta continues till the end of the year

MacSantaThanks to everyone who purchased on my featured MacSanta day. It was a great success.

But it's not too late! This year MacSanta has an Extended Deals page where participating developers are offering 10% off for the rest of the month, using the coupon code MACSANTA07TEN.

I am rebelling against that a little, though: I'm offering the same great discounts as on the featured day for the rest of the year -- in fact many are more than 20%.

Visit the Dejal Store and enter the MACSANTA07TEN coupon (that link will automatically apply it) to take advantage of these special deals. But hurry -- they are only available till the end of 2007!

Thanks again to Paul Kafasis at Rogue Amoeba for organizing the promotion.

MacSanta is back!

MacSantaMacSanta is back with more big savings! For the month of December, many independent Mac software developers are offering great deals on their products, via the MacSanta site.

Each day, a few developers will be featured, with 20% off their products using the special coupon code MACSANTA07. You can still save 10% from developers from previous days via the Extended Deals page and the coupon code MACSANTA07TEN.

Dejal will be featured on the main page on Tuesday. The MACSANTA07 coupon is now active at the Dejal Store.

Thanks to Paul Kafasis at Rogue Amoeba for organizing the promotion again this year.

Having RSS issues

I'm having issues with my RSS feed. Sorry about that. I think I've fixed it, so this is a post to see if it's working now, as well as to apologize for the issues.

I think it happened as a result an update to the Drupal CMS I use.

BlogAssist 2.1.2 released

BlogAssist version 2.1.2 is now available.

BlogAssist is a helpful tool; it adds a system menu (on the right-hand-side of the menubar) with a list of operations that can be performed on text. You can copy some text, choose an operation, and paste -- the text will be marked up based on the chosen operation. The operations include HTML and forum markup. If you prefer, a floating palette is also available (to drag the text), or you can mark up inline by selecting text in your web browser or editor application, hitting Cmd->, and choosing the operation in a small window that appears, then click OK to substitute it right in the app.

Very handy... I use BlogAssist daily. For example, the product icon, release notes link, and download link in this blog post were generated very simply by BlogAssist.

Anyway, this update adds German localization, improves the French localization, plus a few other changes.

Download now!

Simon 2.3.5 released

Simon version 2.3.5 is now available.

This update includes lots of changes, as follows. I considered calling it version 2.4, but strictly speaking all of the changes are improvements or fixes, not new features, which is my rule for bumping the second digit:

  • Improved the notifications to avoid notifying again if the test is already failing; it used to notify again if the error was slightly different, but that's usually just annoying. You can turn off the "Only notify once for each failure" checkbox to get repeatedly notified until recovery.
  • Improved the SSH service to avoid protocol identification warnings in the Console.
  • Fixed an issue with the FTP service where it had the wrong default protocol, which caused the incorrect Edit Test view to be displayed.
  • Improved the FTP service to work with the Security section of the Edit Test window, allowing checking secure FTP sites (without having to prepend the username and password to the URL).
  • Fixed a bug with the Basic service plug-in where it would mistakenly look for cookies for FTP services, which while harmless most of the time, can cause crashes in some situations.
  • Fixed a bug in the MySQL notifier plug-in where the Password field wasn't enabled correctly when using notifier-specific authentication.
  • Fixed a minor typo in a couple of report templates.
  • Fixed the tooltip for the "keep backup" checkbox in the Advanced preferences.
  • Enhanced the URLs for the Help menu to better support localization.
  • Updated the built-in Kagi purchasing tool to the latest version, which fixes some issues with Leopard.
  • Updated the French localization.

Download now!

Black Friday specials

Dejal cornucopiaHere in the US it's Thanksgiving Day tomorrow, which is traditionally followed by "Black Friday", a day of big discounts at retail outlets.

In keeping with that tradition, I'd like to wish you all a happy Thanksgiving and offer my own discounts. Until the end of the weekend, you can get big discounts of all of my products via the Dejal Store - no coupon or special code needed.

Save up to $50 on a Simon license, and similar large discounts on the other products. Hurry, this offer expires on 2007-11-25!

Happy Thanksgiving!

Caboodle 1.1.3 released

Caboodle, the handy snippet keeper tool, is now at version 1.1.3.

This bug-fix update addresses a bug with opening attachments: if you happen to have two attachments in Caboodle entries with the same name, and open both of them, Caboodle might have opened the first file again instead of the second one, thinking it was the same file. This is because the attachments are saved to a hidden temporary folder before they are opened. Now, Caboodle saves each attachment in a unique sub-folder, ensuring that files with the same name are still treated as different.

This update also adds German localization, kindly done by Ulf Dunkel of DSD.net, along with a few minor tweaks that came up during localization. Ulf will act as a reseller of Caboodle for German-speaking customers. Please purchase via his store to give him a cut of the proceeds.

This version is (as far as I can tell!) fully compatible with Leopard, and back to 10.3.9.

Download now!

Cocoa: custom attachment in a text view

I recently posted a query to CocoaDev asking for help with inserting a custom attachment cell into a text view. I had spent quite some time investigating and experimenting, and searches showed several people who had the same question, but no satisfactory answers. Some comments I read suggested subclassing NSTextView, which I tried, but not very satisfactorily.

Fortunately, Douglas Davidson was kind enough to point me in the right direction, combined with helpful off-list discussion with another developer who was working on much the same problem.

I thought I'd share my solution here, in case it helps anyone else. It turned out to be easier than I'd expected. Note: this is written for Leopard with Garbage Collection, so doesn't have releases etc.

Firstly, a file wrapper is used to create a placeholder TIFF with a special "sub-extension" to identify it. I could store any kind of data, but I use a placeholder image so if the user pastes the text into another app, it shows up as something nicer than a generic document icon. The identifier is a unique reference to the data that the attachment represents:

- (NSFileWrapper *)fileWrapperWithIdentifier:(NSString *)identifier;
{
    NSString *wrapName = [[identifier stringByAppendingPathExtension:@"myspecialmarker"] stringByAppendingPathExtension:@"tiff"];
    NSSize size = {100, 18};
    NSData *data = [[NSImage imageNamed:@"AttachmentPlaceholder"] TIFFRepresentation];
    NSFileWrapper *wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:data];
   
    [wrapper setFilename:wrapName];
    [wrapper setPreferredFilename:wrapName];
   
    return wrapper;
}

This method inserts the attachment with the above wrapper and my custom cell:

- (void)insertMarkerWithIdentifier:(NSString *)identifier;
{
   NSFileWrapper *wrapper = [self fileWrapperWithIdentifier:identifier];
   NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:wrapper];
   MyAttachmentCell *cell = [MyAttachmentCell new];

   cell.identifier = identifier;
   [attachment setAttachmentCell:cell];

   [[myTextView textStorage] appendAttributedString:[NSAttributedString attributedStringWithAttachment:attachment]];
}

I use a couple of text view delegate methods to write the cell's file wrapper to the pasteboard as file contents, allowing it to be copied, dragged, and saved to disk with the text:

- (NSArray *)textView:(NSTextView *)aTextView writablePasteboardTypesForCell:(id <NSTextAttachmentCell>)cell
             atIndex:(NSUInteger)charIndex;
{
   return [NSArray arrayWithObject:NSFileContentsPboardType];
}

- (BOOL)textView:(NSTextView *)aTextView
       writeCell:(id <NSTextAttachmentCell>)cell
         atIndex:(NSUInteger)charIndex
    toPasteboard:(NSPasteboard *)pboard type:(NSString *)type;
{
   if (type == NSFileContentsPboardType)
       [pboard writeFileWrapper:[[cell attachment] fileWrapper]];

   return YES;
}

And to convert the attachment back to my custom cell after pasting/dragging/loading it, the text storage delegate (which is set via [[myTextView textStorage] setDelegate:self];). It looks for TIFF attachments that have my special marker "sub-extension" but aren't using my custom cell, and replaces their cell with my custom one:

- (void)textStorageWillProcessEditing:(NSNotification *)note;
{
   NSAttributedString *text = [myTextView textStorage];

   if ([note object] != text)
       return;

   NSUInteger length = [text length];
   NSRange effectiveRange = NSMakeRange(0, 0);
   id attachment;

   while (NSMaxRange(effectiveRange) < length)
   {
       attachment = [text attribute:NSAttachmentAttributeName atIndex:NSMaxRange(effectiveRange) effectiveRange:&effectiveRange];

       if (attachment)
       {
           if ([attachment isKindOfClass:[NSTextAttachment class]] &&
               ![[attachment attachmentCell] isKindOfClass:[MyAttachmentCell class]] &&
               [[[[attachment fileWrapper] preferredFilename] pathExtension] isEqualToString:@"tiff"] &&
               [[[[[attachment fileWrapper] preferredFilename] stringByDeletingPathExtension] pathExtension] isEqualToString:@"myspecialmarker"])
           {
               MyAttachmentCell *cell = [MyAttachmentCell new];
               [cell setIdentifier:[[[[attachment fileWrapper] preferredFilename] stringByDeletingPathExtension] stringByDeletingPathExtension]];
               [attachment setAttachmentCell:cell];
           }
       }
   }
}

The custom attachment cell is a subclass of NSTextAttachmentCell, to simply draw in a custom way.

I hope this is helpful to others.

Dejal and Leopard

LeopardAll the cool kids are doing it, so it must be my turn....

Mac OS X 10.5 "Leopard" is available tomorrow. It's a great update, that I've mostly enjoyed using for the past few months, so I highly recommend it to everyone. But an important consideration is always: will my existing software run on the new OS version? So here's a summary of the Leopard compatibility status of Dejal products, as far as I'm aware.

I should point out that this is based on a recent seed (pre-release version): Mac developers don't get the final version of Leopard any sooner than you do... and in fact get it later if they wait for the copy Apple sends as part of the Apple Developer Connection membership. There's been a bit of an uproar about that, but it was the same with Tiger, and will probably be the same again with the next big cat. Such is life.

Simon: My website and server monitoring tool runs fine under Leopard. It has been updated to use Leopard's window style for the Monitor window when running under 10.5, or the custom window style under 10.4 or 10.3.9. I plan on making several more Leopard improvements in a future version.

Time Out: Version 1.5 of this break reminder app was released not long ago, which added Leopard compatibility. It has no known issues with 10.5. Work on version 2 is underway (though currently paused); you can expect that in Q1 2008. It will require a minimum of 10.5, as it leverages several Leopard technologies.

Caboodle: This handy snippet-keeper app is also Leopard-ready as of the current release, version 1.1.2. I have big plans for Caboodle over the coming year, once I've done the other updates.

Narrator: My fun speech synthesis app hasn't been updated for a number of years, but appears to run okay under Leopard. I am currently working on a long-overdue new version of it -- actually a complete rewrite. The new version requires a minimum of Leopard. Watch the Dejal blog for more information about that as it progresses.

BlogAssist: This useful HTML markup tool is Leopard-ready as of the current release, version 2.1.1. It will also see some improvements in 2008, using technology being developed for Time Out.

Macfilink: My affiliate link cloaking app hasn't had an update for Leopard yet, but it seems to work okay. I haven't decided what to do for its next update, but it's possible I'll replace the data storage with Core Data for the Leopard update. It's the lowest priority, as this app does one job and does it very well as-is, so it doesn't need much tinkering.

So there you go. I hope you enjoy Leopard as much as I do. Please let me know if you discover any compatibility issues, but as far as Dejal products are concerned, you should be good to go!

Possible Dejal site downtime this week

The Dejal site will be moving to a new server at a new data center sometime this week, as part of a planned migration that my web host is performing. Hopefully this will result in improved reliability and performance of the server. But in the meantime, the site may be offline for a while.

They assure me that there shouldn't be any noticeable downtime, or only for a few minutes. But you never know with such operations, so I thought I'd provide warning here. Apologies in advance if you try to access the Dejal site and get an error. Please just try again later if you do.

Rest assured that I will be closely monitoring the situation (via Dejal Simon, of course!), and will do what I can to minimize any downtime.

Simon 2.3.4 released

Just a couple of days after version 2.3.3, here's another bug-fix update for Simon.

I really don't like doing releases so close together, and apologize for any inconvenience... but I figured that it was soon enough that many people wouldn't have got the weekly update notification yet. And the issue this update fixes affected a reasonable number of people, so was important to address quickly.

The main point of this update is to fix Mac OS X 10.3.9 compatibility, which was broken in the 2.3.3 release. It also fixes a minor bug with the status menu, that nobody has reported (or probably noticed), but was worth fixing regardless.

So, how was 10.3.9 compatibility broken, you may ask? Well, I develop on my MacBook Pro under Leopard, but it doesn't have the compiler for 10.3.9 installed. So to do a release I open the project on my PowerMac G5 running Tiger, do a clean build there, plus update the localization, then package the release up in a disk image and upload it back on the MBP. It's a little convoluted, but doesn't really take much longer than just using one machine, since both computers are on my desk, and I can open the project via file sharing.

Anyway, the important part there is a "clean" build -- if I forget to clean the code (i.e. throw away already-compiled binaries and re-compile it), the app won't work on 10.3.9. This has bitten me a few times, though I usually catch it quickly.

Of course, this issue will go away in due course, as each app is upgraded to require a minimum of Leopard -- which will happen over the next year or so.

So, sorry again if you upgraded to Simon 2.3.3 and have to upgrade again. Only about 5% of Simon customers are using 10.3.9 still, but that's enough people to make this quick update worth doing. If you are using Tiger or Leopard, you could skip this update... but there's no harm in updating, too, especially if you didn't already update to 2.3.3.

Download now!

Simon 2.3.3 released

Version 2.3.3 of Simon, the website and server monitoring tool, has now been released.

It is an important update, recommended for all Simon customers. Apart from some minor updates to the German localization and Growl support, it also includes three important changes:

Firstly, the way the test scheduling works has changed. In recent previous versions, I had added a "secret" preference called overlap prevention, which was on by default. This prevented more than one test from being automatically checked at once, as a way to reduce the load on the machine and ensure accurate checking times. The problem with this, though, is it could cause some tests to never get checked if the tests table is sorted by Next Check date and there are lots of tests, as they become queued but are never reached. This was because it scans for candidates to start in the sort order, and always found another queued one before the earlier queued one. Kinda convoluted, and only affecting a few people, but there it is.

This release goes back to allowing multiple tests to be checked at once, but changes things so they are started at least one second apart, even if they fall due at the same time. It uses the same checking interval as set in the Advanced preferences for checking all or multiple selected tests. It still scans in sort order, but it adds all due tests to a queue and starts them one second apart, ensuring that the computer isn't overloaded.

Another important change is to fix a bug in the Edit Test window. I spent a couple of vexing days tracing this, with the most valuable help of a customer. The mystery was that Simon seemed to be forgetting about notifiers assigned to tests in some random conditions. I couldn't recreate it, and added logging to trace what was happening to the data, and nothing seemed missing. Yet when the customer viewed the test configs, sometimes it'd only list one notifier when there should be three or so assigned to the test. Yet if he added the notifiers back, the next time he checked the missing ones would be back, along with the new ones. Wacky!

It turned out that this mysterious situation was just a cosmetic issue. No notifiers were being lost. What was happening was the disclosure triangles were interfering with the loading of the lists of notifiers (and auto-pause and reports). If the disclosure was in a collapsed state when the window was opened, the notifiers list UI wouldn't be visible, so wouldn't be resized to show more than one notifier. If it was in an expanded state, all worked as expected. So the fix was simply to set the disclosure triangle state (and thus UI visibility) after loading the lists, rather than before. An easy oversight, but and important one!

Lastly, this update has several report enhancements. One is to allow digits in test short names (as used for URLs in reports), to allow for people who name tests like "UL102", "UL104", etc, i.e. differing only by digits. Another report change is to handle the file:// protocol better. When saving a report locally to the Desktop or some other location that isn't in the global or user-specific web sharing folders, the report is accessed via the file:// protocol rather than http://. That's all fine and dandy, but several report templates use directories for detail pages to provide tidy URLs, which doesn't work so well with the file:// protocol, as it opens directories as folders in the Finder. So this version solves that by adding the detail page (e.g. index.html) to the end of the URL. As part of that, it also adds a new report variable, SummaryPath, which is like BasePath but includes the index in the URL of the Summary page when saving to a file:// URL - useful for links from the detail pages back to the summary page.

Lots of good fixes and improvements. Download now!

I'm the MacTech Spotlight for October 2007

MacTech magazine has a monthly feature at the back of each recent issue called "MacTech Spotlight", where they devote a page to Q&As with a developer or other personality in the Mac community. They've talked with Paul Kafasis of Rogue Amoeba, Wolf Rentszch of Red Shed, and several others.

This month was my turn.

I haven't seen how the article turned out yet (my copy's in the mail), but hopefully it'll be okay. :) I talked about how I originally got into computers and programming, how Dejal got started, what I like about Apple and Mac OS X, how I come up with product ideas, and more.

For those interested, MacTech offers discounts on subscriptions - 60% off the cover price, or a limited-time offer of a six-month sub for only $9.95.

Simon tip: automatic offline support

One "hidden" feature of Simon is how it handles the situation when your computer loses its internet connection.

People sometimes ask me what Simon does in this situation, concerned that it would count as a failure for tests. Simon is smarter than that, though. Every time it starts a check, it first checks if the computer has a current internet connection, and only then performs the check.

If it determines that your internet connection has been disrupted, it places the test in an "offline" state, where it shows a blinking "lightning bolt" for the status icon until the connection is restored. This offline state doesn't count as a failure (or success).

Simon works out if you have a connection by seeing if it can resolve one of two popular domain names; if either work, your connection is probably fine, but if both fail, it is likely disconnected. Using two domains avoids a temporary outage of either one.

From version 2.3 onwards, you can disable this internet connection check on a per-test basis via the new Can check when offline checkbox in the Edit Test Checking Options. This is useful if you want to create a test to notify you when your connection goes down, or for tests that don't require an internet connection (e.g. using the Application or Script service plug-ins).

Test Options

Caboodle tip: alias a file instead of copy it

A quick tip for Caboodle, from the FAQ:

Normally when you drag a file into a Caboodle entry it copies it, allowing you to delete the original. But often you want to keep the original in place too, and want to avoid bloating Caboodle's data with large files (or folders).

The solution is to hold down the Control () key when dragging the file or folder to the Caboodle entry: the mouse pointer will change to include an alias symbol instead of the green plus. It will then make an alias (link) to the original. Then when you double-click on the file (or view it inline for images and PDFs), the original will open. Of course, in this case you shouldn't move or delete the original file.

Piwhacket: 1994 - 2007

Piwhacket, our beloved cat of about 13 years, passed away early this morning, following a week of veterinary treatment, due to kidney and heart troubles.

My wife and I got Pi as a kitten, shortly before we got married. She was named after a cat in the movie "Bell Book & Candle".

Pi was a great kitty, who enjoyed sitting on my lap while I work, despite bad eyesight making it harder for her to jump up. She had a cute "quack" sound she'd make when she wanted attention. When we were sick, she was always there to comfort us. She was our pretty princess. She is greatly missed.

Piwhacket

Piwhacket's opal eyes

Internet people commenting on the universe

A clip show! Here are three fun videos I saw in the last week or two. You may have already seen them, but they're enjoyable to watch again if so.

Firstly, Internet People, a fun song featuring lots of popular names in the blogosphere. I think I recognize most of these, though there are a few I don't. (Via WebbAlert - see that link for a list of everyone mentioned in the video.)

Next, a hilarious video on what a business meeting would be like in the style of web commenters... less well behaved ones than on Dejal, anyway! Warning: not suitable for work (NSFW):

Don't miss the followup from the same people, which is perhaps even funnier (and also NSFW).

Finally, an impressive video that starts out with an aerial view of a picnicking couple, then slowly zooms all the way out to 100 million light years from them... then back in again down to a microscopic level. Along the way, it includes an indication of the scale in powers of ten. Very impressive. (Via Dark Roasted Blend, a great site of interesting images and videos.)

And here's a similar scale-of-things site, as a clickable animation.

Enjoy!

Simon tip: shortcut for entering test URLs

The Web (HTTP) service is the most popular one for tests. So I thought I'd share a helpful tip with adding them.

When entering the URL, you can use very minimal text, and Simon will fill in the remainder when you click OK. It automatically adds the default protocol ("http://") and the "www." and ".com" if necessary.

For example, if you type "apple" (without the quotes), it will be saved as "http://www.apple.com/". Similarly, entering "dejal/simon" will end up as "http://www.dejal.com/simon/".

Web (HTTP) test

Happy anniversary, Dejal

Dejal anniversary

Today is the 16th anniversary of founding my company. 16 years ago today, on September 20, 1991, I started Dejal, with an aim to produce high quality Mac software. Actually, the exact date could be argued: I had used the Dejal name informally for years before that, as a kind of nickname for myself, and the company grew organically over time, with things like getting a commercial bank account and registering the name at different times during the growth. But September 20th was when historic evidence points to me having started treating my programming hobby as a business.

I had produced a bunch of freeware products beforehand, but my first shareware product was called SndPlayer, a Classic Mac app to play a bunch of sounds easily. It was started on October 24, 1991, and first released on February 24, 1992. It's still available on my site (now freeware), too.

Thanks to everyone who's purchased products or offered congratulations this week. You've still got a couple of days to take advantage of the anniversary specials:

Buy now with the anniversary discounts!

Be quick — these specials expire on Sunday, September 23, 2007.

Dejal's sweet 16!

Dejal anniversary

I first started selling Mac software under the Dejal name in September 1991... which makes this Thursday the 16th anniversary of the founding of the company. Wow... it's certainly been a while!

As a celebration of this event, I'm offering discounts on all of my products from today till the end of the week. No special codes or coupons required, but you need to use the online store, not the in-app purchasing tool, to take advantage of these low prices.

Buy now with the anniversary discounts!

Be quick — these specials expire on Sunday, September 23, 2007.

Syndicate content