Code by Kevin, Programming, code, business, and other pursuits
Kevin Walzer, software developer.
Subscribe to RSS Feed
Get a syndicated feed of my weblog.
Site design: Skeleton
I've released verison 7.7 of PortAuthority, my GUI for the MacPorts software management system for macOS. This release is primarily for stability and refinement on 10.13/High Sierra, which is now the minimum supported OS version. User reports and developer observation of crashes in PortAuthority led to a great deal of bug fixing work in the underlying Tcl/Tk libraries, which is now complete.
As always, this release is free to registered users, and I encourage all users of MacPorts to give it a try. PortAuthority is the oldest, longest-developed GUI for MacPorts. If you want to look at the source code, it is available from https://fossil.codebykevin.com/fossil.cgi/portauthority/timeline under the MIT license.Sat, 23 Sep 2017
I've released version 1.1 of Stringscan, my text search tool for Mac and Windows. This release includes a number of UI enhancements to make using it more intuitive and simple. As always, updates are free to registered users.Wed, 12 Jul 2017
I'm pleased to announce the release of Stringscan 1.0, a text search tool for Mac and Windows. Stringscan offers functionality similar to the Unix "grep" command: it recursively searches files in a directory for a string of text. I wrote it because I wanted a GUI tool that could do more than just retrieve a list of files; Stringscan currently lists files and displays their content in the main window, and eventually I plan to enhance its functionality further.
Stringscan also interesting because it is written in the Ruby programming language. Like my other applications, its UI is based on Tk, but Ruby is somewhat different than the other programming languages I've worked with; it combines the terseness and power of with a cleaner style that is closer to Python. Ruby was once considered a language of great promise for desktop application development, but seems to have lost momentum in that domain in favor of web development. Nonetheless, Ruby is quite useful on the desktop; its standard library and "gem" extension packages provided all the tools I needed to implement a file and text search function.
Regarding deployment, the Mac version of Stringscan was built using ruby2app, the tool I developed a couple of years ago to bundle a standalone Ruby-Tk application on macOS. The Windows version is deployed in a manner similar to my other Windows applications, with a C executable linked to the Ruby libraries.
Stringscan is priced at $29.99 and, as always, upgrades will be free to registered users for life. I encourage you to give it a try if you want a richer tool for searching for text in a directory.Tue, 25 Apr 2017
I've posted updates to all my apps, fixing UI and security bugs on macOS and fixing a security issue on Windows. As always, upgrades are free to registered users.Sat, 25 Mar 2017
I've released version 3.1 of TextSweep, my search and replace tool for OS X and Windows. As with my other recent releases, this version increases security on app updates and includes minor UI refinements. As always, updates are free to registered users.Fri, 03 Mar 2017
I've released version 6.1 of QuickWho, my whois client for macOS and Windows. This release includes UI enhancements and a transition to a more secure update mechanism. As with my other apps, updates are free to registered users.Sun, 29 Jan 2017
These releases focus on minor UI updates and the major upgrades to the application update mechanism, switching to a more secure download method.
Both releases are free to registered users, and $29,95 to new users.Tue, 17 Jan 2017
As with all my apps, this version is a free update for registered users.Sun, 15 Jan 2017
I'm working on a round of application updates that are focused on (yet another) re-work of their application update mechanism.
This change has been driven by three factors: the recent upgrade of my websites to support encryption via Let's Encrypt; changes in Apple's API's in macOS Sierra to require encryption in web connections, and in how app updates can be installed on the system through a mechanism called App Translocation; and a desire to simplify the code of my app updates mechanism.
Let me address each of these in turn.
Encryption: This one is pretty easy. It just requires the addition of a Tcl library, TLS, to support encrypted web traffic. In addition to including the library, it requires a few lines of Tcl code, and then everything Just Works.
Apple's API's. The encryption part is simple, as discussed above. The "app translocation" API has taken me a bit more time to figure out and test; the only file format that Apple will allow to avoid app translocation (in the name of system security) is a signed disk image, or DMG. Zip files, tar files, and other formats don't get that benefit. (In app translocation, an affect application is copied to a hidden read-only format and then launched, to avoid injection of malicious code in the process; it also means the app cannot be updated or otherwise modified while it is running, which makes updates that Mac users expect impossible.) Using signed disk images instead of zip or tar formats is simple enough, and I've gotten it working after some trial and error.
Dissatisfaction with my code. For years I've tried to emulate the popular Sparkle app update mechanism in my apps. First I tried a basic imitation; then I tried to actually integrate Sparkle into my work; then I tried to use many of Sparkle's mechanisms under the hood and layer my own implementation on top of it; and, now, I'm back to doing a basic imitation. The reason for this is that I've never been able to cleanly integrate Sparkle itself into my work; it integrates perfectly with applications written in Objective-C, but I've never been able to figure out how to call it directly from Tcl, even if there is a C layer between. Later I used Sparkle's XML "appcast" mechanism under the hood, but this added a lot of complexity; Tcl's XML-parsing libraries don't play well with other scripting languages, which meant that I had to write additional code to parse the appcast if the application was written in, say, Perl. Additionally, my Tk-based knockoff of Sparkle's UI was just plain ugly.
So I'm back to a basic Tcl implementation that more or less follows Sparkle's example, using the following steps:
This format works pretty identically to Sparkle, at least in its basic moves; it's much simpler to maintain; and it will be portable to another platform, specifically Windows, whereas Sparkle is Mac only. Some Windows-specific code will be necessary to accommodate the differences in Mac and Windows installers, but apart from that, it will be identical.
I'll begin rolling this new update mechanism out in my apps in the near future.