Just a quick note to mention that Find It! Keep It! is not compatible with Safari 4.0. When you install Safari 4.0, it updates WebKit in a manner that breaks Find It! Keep It!. I will fix this but given my current workload, it may take me a few months.
Archive for the 'findit-keepit' Category
I stumbled upon the the news that the Clean compiler will support Haskell. While Haskell is not in the Beta version of Find It! Keep It!, it will be after 1.0 (see The Haskell Communities and Activities Report).
Why am I excited? Clean’s compiler produces faster code than GHC making it real competition. But in the longer term, because I personally still feel IO is an unresolved problem in Pure Lazy Functional Languages:
- In the early days of Haskell everyone (including me) used continuation style: Every function doing IO needs to be passed the next function to perform, and some functions “magically” have side effects. Because Haskell is lazy, this was very painful in practice as you had to know what would be evaluated when: there was no guaranteed order in which I/O would occur.
- Monads rescued Haskell with a much more imperative notation: do this, then that. They guarantee ordering by restricting the ways in which you can use them, and hide all the nasty side effects (I/O) under the covers. While less painful than continuations, you end up with different domains for each monad you use and another domain for purely-functional code. Mixing code from different domains requires paying a Monad Tax: for Monads, managing a Monad Transformer Stack (I wish I was kidding) and for purely-functional code, sometimes having to change its signature and rewriting it in terms of monads instead. (see SPJ’s slides)
- Clean solved the problem with Uniqueness Typing: you pass the world around as an object, and do things to it. Uniqueness Typing guarantees there is only one order in which I/O will occur, but retains the standard functional way of writing code.
I don’t really like using Monads. I’m hoping that making Clean & Haskell linkable will lead to advances in this area. Perhaps some combination of Monads for some problems, and Uniqueness Typing and Implicit Parameters for other problems, will improve the situation.
When I was a child, my father would quote the Victorian era expression “Small children should be seen, not heard” when I became overly boisterous. At that time I was not sure whether or not he meant it. I do however believe it should apply to computers…
Don’t put words in other people’s mouths!
Safari’s URL and form autocompletion really irritate me: they always add their guess to the end of what I’m typing a third of a second later. That means I press enter, only to find incorrect data was added to the field, and then submitted. Others have the same complaint. Nevertheless people do want some form of autocompletion.
For Find It! Keep It! I added an almost identical interface: the same popup window, the same use of up and down keys to choose, the same ability to click or double click on a choice, but crucially, you’re always in control. Nothing is added behind your cursor until you use the up and down keys to choose a selection. Type a new character in, and your selection is cleared.
Don’t just grab something that I was about to use!
Spotlight invariably updates its window the instant before I click the file I want to open, causing me to open the wrong thing.
A different solution is to use colour to show which page contain the search term. Although it does mean more information on the screen, it lets users click on pages as soon as the search term is found. That’s what I’m doing in Find It! Keep It! when searching pages by content.
Don’t jump up and down to get attention!
An application’s icon will bounce automatically when the application opens a modal panel if it is running in the background. It is possible for each application to remove this effect on a per-application basis. The problem then is that either one has to set a preference in each app to override default behaviour, or apps behave inconsistently. Apple could system wide preference for this to alleviate the problem.
Delay informing people about things until it’s relevant!
Software Updaters are another source of interruption that I don’t believe is necessary: as long as I don’t adversely notice the change when I use the tool, I don’t need to know that it’s updated the moment I use it. Web applications change constantly, but no one complains unless they stop working. Desktop applications will, I believe, adopt a similar model. How then, will the user know about the latest improvements? By email! People are in the mood for reading things when reading their email, not when working. Apple’s Software Updater is the worst in this category: it interrupts you and then asks you to drop everything and restart your computer.
Software should not behave like 3 year old children
It is difficult to hold a conversation when someone continually interrupts: one can’t organize one’s thoughts while being bombarded with new information. Using a computer is a similar situation. When the user talks, the computer should just listen.
What I don’t like about the current solution
Don’t interrupt me!
Sparkle asks whether you want to update the app when you start it. When someone opens his mouth, it’s not a good time to ask him something: he’s about to say something. Starting an app is the same.
Sparkle can also ask you whether you want to update the app when it’s running. That’s just plain rude: it could be interrupting the user’s thought process, especially as, IIRC, it causes the application’s icon to bounce if you’re using another app.
How am I supposed to know?
There is no way the user can know whether an upgrade will improve his experience, or waste time as he tries to recover his mistake. Asking can only make people feel stupid. Web Applications don’t ask. You get the upgrade, and you may not even notice.
Automatically upgrading software on other people’s computers could be a support nightmare, so it must be very easy to go back to where you were. Sparkle currently doesn’t provide a downgrade path.
Don’t make me wait!
Sparkle downloads the whole app on each update. For people on slower connections it’s noticeable and irritating. It would be better if the user didn’t notice it.
About 60% of my users seem to have disabled Sparkle. That’s a lot given that during the beta-test cycle, upgrades are not optional.
Updates are small bidirectional binary diffs (created using bsdiff for example) that are downloaded in the background. To minimize user visible lag, they could be downloaded in small sections.
By default upgrades are applied silently at application startup, but the user can require a confirmation step using the Application’s Preference Panel.
In built version selector
The Application’s Preference Panel easily lets users switch back to an older version. It shows the version information for each version that Sparkle currently only shows when checking for a new update. Because each downloaded upgrade is a bidirectional diff, one can always downgrade.
The Appcast Sparkle currently uses to inform the Application that an upgrade is available is enhanced so that a developer can correct an “Oops” by retracting a faulty upgrade. Adding this to the appcast protocol would be easy.
A small unchangeable harness is used to launch and monitor the App. If the app crashes on startup before the user could access the preference panel, it retracts any recent unproven upgrades and sends crash logs to the developer, after asking the user. Using a process to monitor another is extensively used for high reliability Telecom Systems: nine nines reliability (that’s 30ms downtime a year).
Growl and Email
If Growl is installed, it can be used to inform the user of the upgrade.
Generally however I think email is the most appropriate forum to inform the user of updates: one is more inclined to read information if one is not busy doing something else. Notice that even users who worry about providing their email addresses to the software developer can be catered for: the app itself can email the user with the information currently in the appcast when an upgrade has been downloaded.
Why I’m hoping Sparkle will implement this
Google has just released a new API called Google Gears. It will allow web applications to work even if you’re disconnected from the internet for a period of time. And it will let them install their files onto your harddrive so that they can be run “locally”, by using a small “local server” that’s loaded into your application as an Internet Plugin (much likef Flash).
It’s New BSD licensed which means the source code is available and people will be able to make sure it doesn’t do anything dubious. Currently it’s Firefox only, but there’s source code for Safari, which when it’s released should theoretically also work with Find It! Keep It!.
Google Gears is providing a solution to a real problem without requiring a whole new programming paradigm as Adobe’s Apollo and Microsoft’s Silverlight do. It maintains the AJAX promise (runs everywhere) while providing a benefit should you choose to install it (faster and more resilient applications). Also, it’s open source which means other application providers can use it. I think in this case Google have a winning solution.
Update Dojo Offline now supports Google Gears.
The Tag Palette was requested by a user. It’s invoked by a click on the tag palette icon on the toolbar. Floating over the main window, it lets you quickly select the tags you would like a page to have, rather than type them in. Because it shows you every tag, you won’t end up with duplicate tags (such as ai and artificial-intelligence). Of course it lets you add new tags, or delete ones. Deleted tags are crossed out so that you can undelete them, if you made a mistake.
The user experience
I like Google’s tools. I use GMail and google. My Find It! Keep It! tool provides shortcuts to Google’s web, book, froogle, news and scientific paper searches. So I downloaded Google’s desktop mac hoping for a faster Spotlight.
Like the folks at TidBits, I found it slowed down my computer significantly when indexing my drive. However one can turn it off using the System Preferences panel it installs. Like that I can let it index stuff at night.
Press Command twice and a search panel shows up, which will show the first 10 results. To see more, your browser will be opened to display the results as page that looks like google’s generic search page, so it’s running a small web server.
It runs as root, and does not respect your update statistics settings
Google Desktop installs itself as root: the index is at /Library/Google/Google Desktop/Index/(some directory which only root can access). This means it can access anything on your machine and do anything it likes. It doesn’t need to and on a first date, I don’t trust anything that much. Every user on the machine will have their content indexed, even if they don’t agree. You could say that Spotlight also runs as root, but people using an operating system written by Apple do have to trust Apple.
If you choose to enable Usage Statistics on Google Desktop, it allows Google Desktop to send crash reports and to collect a limited amount of non-personal information from your computer and send it to Google. This includes summary information, such as the number of searches you do and the time it takes for you to see your results, and application reports we’ll use to make the program better.
Well I didn’t, but Little Snitch tells me that a program called StatsUploader wants to talk to dc-in-f99.google.com every 30 odd minutes so. I happen to trust Little Snitch as I used it to help me make sure that Find It! Keep It! wasn’t loading anything from the Internet (unlike most other “internet page saving solutions”, such as those that use WebArchives).
It silently installs an Input Manager
Find It! Keep It! crashed, and the crash started neither Apple’s CrashReporter nor my built in CrashReporter which is extremely odd. Given my past bad experience with Input Managers, I used Find It! Keep It!’s input manager panel to see whether I had acquired a new one. Indeed I had. It lurks in /Library/InputManagers/GoogleModLoader.
Now this bothers me. I did NOT agree to have an InputManager installed. InputManagers in /Library/InputManagers are loaded into EVERY application running on the computer for every user. So what the #!$! does it do? Simply running
in the Terminal tells us that it loads modules.
Further investigation using OTX shows that indeed it crawls a Google/Mods directory and loads modifier bundles into the applications specified by the key GoogleModTargetApplications in some dictionary somewhere. It also appears to do a fair amount of stderr, debugging, pthread and system logging.
If you attach gdb to a running copy of Safari, you can see that SafariSearchResults.gmod and SafariWebHistory.gmod from /Library/Application Support/Google/Mods/ are now loaded by typing info sharedl. One thing they do is to add a new item to your google searches: “About 34 results stored on your computer”. I’m guessing that SafariWebHistory allows pages you just visited to be found with google desktop.
Nevertheless, Input Managers should not be installed silently. They can easily cause system instabilities and this particular mechanism could be diverted by third parties to install unauthorized gmods in a place no one knows about: a big security risk. Given the furore over Unsanity’s Smart Crash Reporter, I’m surprised Google installs this. It’s not like anybody worries about Unsanity’s secret plans of world domination.
It also installs a Kernel Extension
John Gruber over at Daring Fireball found where the injected code lives and noticed that they’re also installing a kernel extension!
Again kernel extensions aren’t something that should be installed silently as they could very easily impact the system’s stability.
For instance, it includes the nice message “socred_fini() failed, which is a known bug with Apple’s socket filters. Sorry but you have to reboot”.
cd /Library/Google/Google\ Desktop/GoogleDesktopDaemon.bundle/Contents/Resources
sudo strings GDFSNotifications.kext/Contents/MacOS/GDFSNotifications
I’m have no idea what its doing with the sockets, but a guess would be that they might need something like that to inform Google Desktop when a file changes to reindex it or for their snapshot capability.
Hopefully future versions of Google Desktop will respect user preferences, clearly request the right to install any Input Managers and allow paranoid people like me to give it limited permissions (eg: a single user’s permissions). Alternatively they could release its source code, as they have done with MacFUSE so that we know what it’s doing. In the mean time, I’m uninstalling it.
Hopefully Leopard will draw attention to Input Managers which will prevent nasty surprises. That’s not to say they’re all bad. They just shouldn’t be installed without a user’s consent.
Changed on Thursday 5 April to add some more information, and clarify it
You’ve saved a page containing audio or video with Find It! Keep It!
Now you want to take the audio or video with you on your Ipod.
It’s easy! Go to any page you’ve saved with Find It! Keep It!.
Click “Export Audio from Kept Page” or “Export Video from Kept Page” from the “File Menu”.
Itunes will pop open with the videos and audio clips found on the page.
You can export audio from many pages you have saved that use flash to play audio. Examples include:
- Blog Musik
- Last FM
- Music on the my space player
- Radio Blog Club
- Books as read by Scribd
- … etc …
You can export audio or video from most flash videos that could be saved, including those that use the VP6 flash codec. Sites that work include:
- Daily Motion
- Expert Village
- Google Video
- Live Video
- My Space
- You Tube
- Zippy Videos
- … etc …
Plenty to keep your Ipod happy…
It looks like the next beta will be the last, so get your bug reports in!
Those of you who reported bugs will be getting trial licenses to test the premium features soon. I’m building a license management tool to help me process orders quickly and to test it I’ll send you the licenses using it.
I promised that during the beta trial period the purchase price would be lower. Setting up a shop is taking orders of magnitude longer than I anticipated: resellers answer questions slowly if at all. Many of them expect a license key, not the license file I’ve implemented.
The first bug I got back from Beta 2 showed that the new Crash Reporter functionality wasn’t always started up correctly… despite my testing for that case. Turns out that what I thought was memory given to me by Python was in fact garbage collected (and therefore … disappears after an indeterminate amount of time). Since the Crash Reporter is the means for users to signal bugs, I’ve had to rush the third beta.