Safari Link Exposer
For quicker referral skimming, Daniel Jalkut uses FastScripts to run an AppleScript that runs a JavaScript that tells Safari to highlight links in the current window that point to his Web site.
Tuesday, May 13, 2008
For quicker referral skimming, Daniel Jalkut uses FastScripts to run an AppleScript that runs a JavaScript that tells Safari to highlight links in the current window that point to his Web site.
Almost two years ago, back at WWDC in August 2006, the MacBU announced that Office 2008 would not have support for Visual Basic. I blogged about it at the time, and that one post has proven to be my 15 minutes of Internet fame. It continues to be the most popular post on my site — 21 months later, it still accounts for almost half of all the hits I get each week. A section of the Mac community spoke out very vocally against our decision, and I still hear echos of it to this day.
This isn’t a done deed yet, but I’ve got a new commitment for you.…VB is (well, will be) back, baby! When we came to the realization in 2006 that there was no way for us to keep VB in the product and still ship Office 2008 on any semblance of the schedule we wanted, we announced its removal, but kept looking at how to bring it back into the suite even before we shipped. Many of the technical challenges I wrote about then still remain, but for a while now I and several others have been working with a group of people who know a heck of a lot about the internals of VB, and once we determined that we could achieve the revival VB in the new schedule for the next version of Mac Office, we locked it into place on the feature list.
Update: Office 2008 SP1 is now available, and it has release notes.
Monday, May 12, 2008
Steve Yegge gave a talk at Stanford with lots of interesting information and links about dynamic languages and performance:
Java inlines polymorphic methods! Now the simplest way to do it was actually invented here at Stanford by Googler Urs Hoelzle, who’s, you know, like VP and Fellow there, and it’s called, it’s now called Polymorphic Inline Caching. He called it, uh, type-feedback compilation, I believe is what he called it. Great paper. And it scared everybody, apparently. The rumors on the mailing lists were that people were terrified of it, I mean it seems too hard. And if you look at it now, you’re like, dang, that was a good idea.
So when we talk about performance, it’s all crap. The most important thing is that you have a small system. And then the performance will just fall out of it naturally.
What’s happening is: as of this Ajax revolution, the industry shifted to trying to optimize JavaScript. And that has triggered what is going to be a landslide of research in optimizing dynamic languages.
Update: Avi Bryant responds:
The following two statements are true:
- Strongtalk has an optional static type system.
- Strongtalk is 15-20x faster than most other Smalltalk systems.
What’s false is the causal link Steve is claiming between them.
Saturday, May 3, 2008
[SAGE] is basically a wrapper around Python with tons of scientific packages added, all nicely pre-compiled into tasty binaries just for you by very nice people (which involves tons of work, not as simple as it sounds). These goodies come in gzipped tarballs that you dump into your $HOME. You can then launch the sage program, which handles regular Python just fine and includes all the modules I was longing for: NumPy (easy, efficient handling of huge numerical array with slicing and dicing), SciPy (input/output and scientific functions), Matplotlib (lots of plotting tools with lickable, anti-aliased output and a syntax almost identical to Matlab)! Even IPython is there, meaning you get a comfortable interactive experience with tab completion on files, objects, dictionaries and tons of other niceties!…Matlab without Matlab.
Friday, May 2, 2008
I’ve chatted with other developers, and we’ve all come to some similar private conclusions about Subversion’s future. First, we think that this will probably be the “final” centralized system that gets written in the open source world — it represents the end-of-the-line for this model of code collaboration. It will continue to be used for many years, but specifically it will gain huge mindshare in the corporate world, while (eventually) losing mindshare to distributed systems in the open-source arena.
The thing is, DVCSs can be preferable to Subversion, even when used in a centralized style. That’s mostly how I use Git, but I appreciate its speed, the efficiency of its disk use (much less space used and many fewer files, which really matter for multi-gigabyte repositories), merging, and not having to worry about .svn folders getting clobbered or moved to the wrong place when I reorganize. Subversion works well, and there are a lot of tools that integrate with it, but as the ecosystems for the DVCSs improve, I can’t see why they wouldn’t start to gain mindshare and marketshare, even outside the open-source world.
Secondly, I don’t really see why Collins-Sussman thinks that Subversion’s advantage is with large projects. I think it’s the opposite.
Thursday, May 1, 2008
The May issue of ATPM is out:
Wednesday, April 30, 2008
In the last weeks something remarkable happened in the Python3 sources: self kinda became implicit. Not in function definitions, but in super calls. But not only self: also the class passed to
super. That’s remarkable because it means that the language shifts into a completely different direction.
I’m generally not a fan of magic, but I don’t really see the problem with adding an abbreviated form for the most common uses of super. That it was so verbose before always seemed to me to be a wart on an otherwise clean language.
I spent a lot of time this week and then all this morning playing with different toolbar placements and options. I appreciate all the feedback, but I’ve just decided that for 2.0 the placement will stay at the bottom.
Tuesday, April 29, 2008
Dave Dribin has written an Objective-C wrapper for getopt_long.
Sunday, April 27, 2008
I realised I was at the point where I was using FogBugz as little more than the world’s worst email client. From now on, I’ll keep tickets and customer support better separated, so that a better job can be done on each.
InformIT interviews Donald Knuth:
From a scheduling standpoint, all I know at present is that I must someday digest a huge amount of material that I’ve been collecting and filing for 45 years. I gain important time by working in batch mode: I don’t read a paper in depth until I can deal with dozens of others on the same topic during the same week. When I finally am ready to read what has been collected about a topic, I might find out that I can zoom ahead because most of it is eminently forgettable for my purposes. On the other hand, I might discover that it’s fundamental and deserves weeks of study; then I’d have to edit my website and push that number 2015 closer to infinity.
Friday, April 25, 2008
For several years I’ve kept the bulk of my home directory in a revision control system. This allows me to synchronize my files across the two machines I use commonly, keep a backup on my home NAS box, and have complete revision history of files.
There’s a price, however: the SCM keeps metadata on my machines, and this can add up. Plus there’s the time needed to commit files. When it became clear I needed to switch away from Subversion because it doesn’t cooperate with iWork files, I decided to look into alternatives.
This type of setup is much easier when the VCS doesn’t litter the filesystem with invisible folders. git gc is usually overkill; I would have liked to see numbers for git repack; git prune.
Wednesday, April 23, 2008
TransactionKit, from the developer of RegexKit, provides a thread-safe, lock-free replacement for NSDictionary/NSMutableDictionary. The design uses multi-version concurrency control—transaction numbers, essentially—to allow concurrent read and write access with better multi-threaded performance than using locks. Unlike NSDictionary, TransactionKit uses chaining, so it likely uses more memory and is not as cache-friendly. Chaining works nicely with atomic compare-and-swap operations, so it’s common in lock-free data structures, however open addressing can also be made lock-free. For example, Cliff Click implemented a very efficient closed hash table (with linear probing) in Java that outperforms ConcurrentHashMap (which uses lock striping). Note that TransactionKit is incompatible with Objective-C garbage collection, which the developer regards as flawed.
Microsoft’s decision to turn off the MSN Music authorization servers serves as a painful reminder that DRM ultimately severely limits your rights. Companies that control various DRM schemes, as well as the content providers themselves, can yank your ability to play the content which you lawfully purchased (and now, videos) at any moment—no matter what your expectation was when you bought it.
Monday, April 21, 2008
Encyclopædia Britannica (via Jason Kottke):
If you’re a Web publisher—a blogger, webmaster, or writer—you can get complimentary access to the complete Encyclopædia Britannica online.…and, if you like, an easy way to give your readers background on the topics you write about with links to complete Britannica articles.
But NAT isn’t a brick wall, even though it’s often called a passive firewall. Most NAT-capable routers also include one of two standard methods of allowing software running on a computer with a private address to ask the router to open up a limited form of incoming access. Automatic port mapping protocols on the router open one or more ports—a kind of numbered slot that can be attached to an IP address—and hand the port number or numbers back to the requesting software. As long as the router itself has a publicly routable IP address that can be reached via the Internet, port-mapped applications can now be reached as well.
Peter Bright (via Buzz Andersen):
This approach—forced on it due to screwing up the Copland project—put Apple in a strong position. The new OS was free of many of the legacy constraints that the Copland approach would have caused; the clumsy old APIs were restricted to the Classic environment, and they didn’t form a part of the modern OS core. Although the new APIs were not entirely new—the Obj-C Cocoa API was based on the NeXTstep API, and Carbon was similar to the old Mac OS API—they were cleaned up, allowing bad decisions of the past to be fixed.
[…]
Win16 was never well-designed in the first place, and Win32 has replicated poor decisions in abundance. Win32 is a big API; it’s really huge, many thousands of API calls, and it’s totally inconsistent. It’s inconsistent in every way imaginable.
I imagine this is improved in .NET, though.
Update: Part II addresses .NET.
Jake Voytko shows how to derive big-O estimates of algorithmic complexity using integration. The normal CS way is to solve recurrences, which can be more precise than necessary and may be more difficult (or, at least, less familiar).
Thursday, April 17, 2008
Cathy Shive and Jonathan Dann:
…we now have two new abstract super-classes for our controllers, XSWindowController and XSViewController. When we subclass them to build our UIs, we get the controller architecture that we illustrated at the beginning of the post and the following features built in to our view controller:
- Automatic memory management!
- Automatic inclusion in the responder chain!!!
- A designated method for removing observations or bindings!
- A relationship with the window controller and document!
Tuesday, April 8, 2008
Backup is not something I can afford to screw around with. If there’s any possible point of failure, it’s unacceptable. So, I decided to drop this “unsupported” configuration and picked up a 1 TB Time Capsule. The situation has not improved.
The thing about Git is that it’s oddly liberal with how and when you use it. Version control systems have traditionally required a lot of up-front planning followed by constant interaction to get changes to the right place at the right time and in the right order. And whoa unto thee if a rule is broken somewhere along the way, or you change your mind about something, or you just want to fix this one thing real quick before having to commit all the other crap in your working copy.…Git is quite different in this regard.
I like git add –patch and git commit –amend.
Borrowing ideas is fair game, but copying an entire app is wrong. And it’s creepy, in a Microsoft-of-the-’90s way, when it’s a $150 billion company cloning an app from a 10-person company.
Google App Engine looks interesting, though.
Saturday, April 5, 2008
The main reason I switched from Safari to Firefox in the first place was memory consumption on my PowerBook G4—after just a few hours of my use, Safari 3 inevitably consumes at least 300 MB, often more, of private memory. In the same usage, Firefox 3 never seemed to use more than 90 MB, even after a few days.
But for this I really, really like Safari.
Friday, April 4, 2008
From time to time, someone I know asks me an ordinary and reasonable question: “What’s your iChat (or Skype) ID?” My usual reply is to give them the information along with a big disclaimer: I’m almost never logged in. In fact, let me be completely honest and say I thoroughly dislike instant messaging (IM) except in a few specific situations. For months, I’ve been thinking about why this is—both the technological and psychological aspects—along with whether it somehow exposes a fundamental character flaw, and whether it’s something I should attempt to change. Having experimented with a variety of approaches to instant messaging (as well as its close relative Twitter) and having done a considerable amount of introspection, I’m inclined to think that my personality type is fundamentally ill-suited to instant messaging.
As another introvert who doesn’t like IM, I find the multitasking aspect most bothersome.
Thursday, April 3, 2008
I think they’re going to get it. Killer apps makes or breaks any platform. With Github, I think the Git hub just scored one. Rails is going to be hosted there for the launch. Capistrano, Prototype, and Scriptaculous already moved there.
I hope so. Git is great. It can speak Subversion, so that’s not a problem, but I don’t want to have to install and learn all the other DVCSs.
The April issue of ATPM is out:
As soon as we got the news in June, we began adjusting our product development plans. No one has ever ported an application the size of Photoshop from Carbon to Cocoa (as I mentioned earlier, after 9 years as an Apple product Final Cut Pro remains Carbon-based), so we’re dealing with unknown territory. We began training our engineers to rewrite code in Objective C (instead of C++), and they began prototyping select areas to get a better view of the overall effort.
In the end, both Apple and Adobe chose not to mitigate their risks with expensive long-term projects. Adobe believed its investment in Carbon would be protected. Just as Apple created Carbon in the first place to help Adobe, so too would it stand by its friend by bringing the framework into the 64-bit era. And Apple, for its part, continued to believe that its gentle persuasion would eventually bring Adobe around to the Cocoa side of the fence. For all the bad blood and unfortunate consequences, it’s somewhat heartening to realize that the two companies’ faith in each other so thoroughly informed their decisions.
The uncomfortable truth is that the fastest way to run Photoshop CS4 on a Mac will be to run it under Windows. It’ll be particularly interesting to see benchmarks comparing 64-bit Photoshop on Mac OS X using VMware or Parallels against the native 32-bit Mac version.
Anyway, for a high-profile, award-winning app from one of the biggest software companies out there, the out-of-the-box experience for the new Elements is crappy. Really, it’s the worst I’ve seen in ages. So I had to write this post to complain about it, of course. And it got longer than I expected it to. And rantier.
I had a similar reaction when installing it yesterday. Chris Turner says it took more than 24 minutes to install it. I plan to do as much work as possible in Acorn and use Photoshop only when necessary, e.g. to convert images into small PNG or JPEG files.
Ars Technica reports that Apple’s iTunes store is now the largest seller of music in the US. I think I know how Pauline Kael felt in 1972.
Wednesday, April 2, 2008
By eschewing the concept of a flash based word processor, Google is leaving itself vulnerable to Adobe. Adobe has acquired, and I would imagine is now heavily investing in the first web based word processor with true pixel level type control, called BuzzWord. Adobe has better distribution than any other company on the Internet, and Adobe has the best web client technology, and adobe owns PDF. As I see it, Adobe is well poised to beat Google at being *the* web document company, just as they are *the* print document company.
He also has a follow-up.
Tuesday, April 1, 2008
Seth Dillingham tells how he got started writing BBEdit language modules. (Don’t miss the Steve Yegge article that he links to.) I don’t do much with JavaScript, but I use his Python and Strings modules every day. The Python one is a huge improvement over the previous version. I’d like to see a module for reStructuredText.
Monday, March 24, 2008
RegexKitLite, from the developer of RegexKit, uses the ICU engine instead of PCRE and has a highly simplified API. This makes it very small (since ICU is built into Mac OS X) and gives it better support for Unicode. It’s also potentially more efficient, since ICU can often use an NSString’s UTF-16 buffer rather than creating a separate UTF-8 buffer, as would be required for PCRE. ICU’s regular expression syntax is not as rich as PCRE’s, however.
Friday, March 21, 2008
Regression: This ability has never existed, but ever since the arrival of virtual machines in Mac OS X, developers have dreamt of being able to do this.
Thursday, March 20, 2008
The engineer in me says that the page is already in the browser-window box—another box is just not needed, it’s waste.
And the designer in me would rather see an aesthetic that embraces the reality that it’s all lights and pixels on a flat screen. It’s not the real world or even the printed page. Why pretend it is? Isn’t there something to be gained by going with what-it-is rather than fighting it?
Monday, March 17, 2008
There can be a file in your top-level Library’s Preferences folder called com.apple.SystemLoginItems.plist. This mechanism is used by a very few specialized applications that launch on a per-user basis and want access to the Window Server, but need to launch before the user actually logs in. (Timbuktu is an example of such an application.) It is deprecated in Leopard, where you’re supposed to use a LaunchAgent instead; but some older programs still use it.
Thursday, March 13, 2008
Microsoft’s Jensen Harris presents a session about the design process for Office 2007’s user interface(via Jesper).
Tuesday, March 11, 2008
Ars Technica has a good review of Aperture 2.0:
The Color Vibrancy is genuinely great at doing what it is designed for: “selectively boosting saturation without adversely affecting skin tones.” […] It’s definitely effective, and I can’t quite figure out what it’s doing, which (as a retoucher) is driving me a little crazy. Local contrast definition, on the other hand, looks a little more familiar. Advertised as “offering local contrast for adding clarity to images,” the Definition adjustment looks a lot like unsharp masking with a really wide pixel radius.
Friday, March 7, 2008
Code signing itself is a neutral technology, but it gives incredible power to the system vendor, and that power is just waiting to be exercised and abused. I believe that the iPhone is serving as a testbed to see how users and developers will react to an environment with ubiquitous code signing and control. If it goes well I think we can expect to see our desktop Macs gradually move in this direction as well.
Overall, I like what Apple announced. I don’t mean to take away anything from what looks like great work they’ve done. However, I do want to point out that the spin was a bit much:
As with the original sweet SDK, Apple has made entirely reasonable business and technical decisions, but they chose to spin them unnecessarily.