A brief survey of some of the task/to-do list managers for Mac OS X

A brief survey of some of the task/to-do list managers for Mac OS X (including some web-only products)…<p> Still considering:

  • OmniFocus - *** Worth doing a deeper dive ***. I can get it to show me home+any tasks at the same time. Has AppleScript support.
  • Taskpaper - *** Worth doing a deeper dive ***
  • The Hit List - *** Worth doing a deeper dive ***. I can get it to show me home+any tasks at the same time. Has AppleScript support. Sync is $20 per year.
  • ThinkingRock - *** Worth doing a deeper dive ***
  • Todo (Appigo) - *** Worth doing a deeper dive ***. Can't show @home+@any contexts simultaneously, but CAN show @home+@any TAGS simultaneously. Free sync via Dropbox. No AppleScript support. Sync is manually started. </ul>

    Rejected early:

    • Action Method - No offline Mac app. Web only.
    • Actiontastic - abandonware. No iPhone app.
    • Anxiety - No iPhone app.
    • Beeswax - Abandonware. No iPhone app.
    • Check Off - No iPhone app.
    • Circus Ponies Notebook - Great Mac app. No iPhone app.
    • Do It (http://www.jimmcgowan.net/) - No iPhone app.
    • Doit (https://www.doit.im/) - Has only a "mini" version for Mac.
    • Doomi - No iPhone app.
    • EasyTask - Can't show both @home and @any simultaneously. Sync is manual, and iPhone sync is via WiFi only, although the Mac edition can sync with web edition every 10 minutes. Simplistic.
    • Enleiten - Web only.
    • EtreTask - Abandonware. No iPhone app.
    • Frictionless - Fails to start with OS X Lion.
    • Goal Organizer - Web only.
    • GTDAgenda - No Mac desktop app. Free version of web app is too crippled.
    • Helium - Can't show both @home and @any simultaneously. No search. Has auto-sync, but it costs $5 per month.
    • iGTD - Can't find the download. Probably abandoned, since the developer went to work on Things.
    • Listappy - $20. No trial available.
    • Nirvana - Web only.
    • Nozbe - Web only.
    • Remember (by Lighthead) - No iPhone support.
    • Remember the Milk - Doesn't support moving tasks around in the list. I really want offline capability, and it relies on Google Gears which doesn't run on modern browsers.
    • SimpleTask - No tagging or contexts. Sync is manual, and requires action on both phone and desktop.
    • Smartsheet - Priced unreasonably for use as a task list manager.
    • Taskpad.jp - Web only. I don't see a way to persist data.
    • Taskmate - iPhone and Mac versions don't talk to each other at all.
    • TeuxDeux - Desktop is browser-based.
    • Things - It is very popular. I can't see a way to search for @home or @any. (i.e. I'm at home, and I want to see everything I could do there, including do-anywhere items too.) Has AppleScript support.
    • Todoist - "Mac app" is really just a SSB (site specific browser). Would have to use Web for iPhone.
    • todoTweet - Web only. Cute idea. Not useful for me.
    • Toodledo - Desktop is web only.
    • Trimpath Next Action - Web only (with offline access). No iPhone support.
    • Tracks - Web only.
    • Wrike - Not priced for use as a task manager.
    • Wunderlist - Too simplistic. No tags or contexts.
    • Yojimbo - No iPhone support. </ul>

Synchronize/Replicate/Push Browser Bookmarks to Pinboard Via Xmarks

I wanted to send all new bookmarks from my browser to pinboard/delicious. I wanted to be browser independent. I discovered that it is pretty easy to do this via Xmarks and a shell script. I run the following script from cron.
<pre> #!/bin/bash ########################################################

‘Synchronize’ xmarks to pinboard/delicious.

What it really does is to replicate NEW xmarks bookmarks to pinboard.

One-way – just adds.

The first time, it pushes nothing, and saves the current state, against which future deltas are measured.

#

I really wanted to synchronize my browser bookmarks to pinboard, but I couldn’t find

an easy API for pulling bookmarks from Chrome, so I went via xmarks.

#######################################################

Customize the following variables

XMARKS_RSS_FEED=http://share.xmarks.com/folder/rss/notmyrealcode EMAIL_ADDR=yourname@example.com PINBOARD_ID=YourPinboardUserName PINBOARD_PASSWORD=YourPassword SITE_NAME=pinboard.in #SITE_NAME=del.icio.us.com

######## END Customize ###############################

THIS_SCRIPT=basename $0 TEMP_SCRIPT=/tmp/$THIS_SCRIPT.phase2.sh DATA_DIR=~/.sync-xml2pin XMARKS_FILE=sorted-xmarks.txt

if ! [ -r $DATA_DIR ] ; then mkdir $DATA_DIR ; fi

#######################################################

Helper routine, for reading XML files.

####################################################### read_xml () { local IFS=> read -d < ENTITY CONTENT }

####################################################### ####################################################### fail () { printf “%s\n” “$1” exit 1 }

#######################################################

Fetch xmarks bookmarks and convert them to a line-oriented format.

####################################################### wget –user-agent=”$EMAIL_ADDR” -O- -o /tmp/wget.log
$XMARKS_RSS_FEED | while read_xml ; do if [ “$ENTITY” != title ] ; then continue ; fi TITLE=”$CONTENT”

    read_xml
    if [ "$ENTITY" != "/title" ] ; then fail "Fatal error in file structure. Expecting /title.  Found $ENTITY" ; fi

    read_xml
    if [ "$ENTITY" != link ] ; then fail "Fatal error in file structure. Expecting /title.  Found $ENTITY" ; fi
    LINK="$CONTENT"
    echo "TITLE='$TITLE'|LINK='$LINK'"

done |
sort -u > /tmp/$XMARKS_FILE

########################################################################## if ! [ -r $DATA_DIR/$XMARKS_FILE ] ; then cp /tmp/$XMARKS_FILE $DATA_DIR echo “Current state of xmarks captured. Nothing pushed to $SITE_NAME this time.” fail “If you wanted to push ALL your xmarks to pinboard instead, replace $DATA_DIR/$XMARKS_FILE with an empty file, and re-run.” fi

##########################################################################

Use ‘comm’ to show lines that only exist in second file (xmarks).

This ensures that we only deal in newly added xmarks.

#

Use sed to alter those lines to be more useful for posting to pinboard.

Write commands to insert new bookmarks to pinboard, into a shell script.

#

“sort -u” is there to prevent adding the same bookmark more than once,

if it got added to the browser more than once. This is actually common, since

I use FreshStart and frequently save sessions.

If I attempt to re-add a bookmark, it replaces the old one, so duplicate adds

just waste time; they don’t create duplicates.

########################################################################## comm -13 $DATA_DIR/$XMARKS_FILE /tmp/$XMARKS_FILE | sort -u | sed “ s/TITLE=’/description=/ s/’|LINK=’/\&url=/ s/’$// s/ /%20/g s/:/%3A/g s|/|%2F|g s/\?/%3F/g s/"/%22/g s/ /%20/g s/’/%27/g s/«/%AB/g s/»/%BB/g s/$/\&shared=no/ s/$/\&tags=xmarks_push/ “ | sed ‘s/”/%22/g’ | grep -v ‘url=javascript’ | while read LINE ; do if [[ $LINE =~ http ]] ; then URL=”https://${PINBOARD_ID}:${PINBOARD_PASSWORD}@api.pinboard.in/v1/posts/add?${LINE}” echo “wget –user-agent="${EMAIL_ADDR}" -O- -a /tmp/wget.log –no-check-certificate ‘$URL’ | grep ‘result code="done"’ > /dev/null” echo “ if [ $? != 0 ] ; then echo ‘FAILED: $LINE’ else echo ‘SUCCESS: $LINE’ fi sleep 2 “ fi done > $TEMP_SCRIPT cp /tmp/$XMARKS_FILE $DATA_DIR/$XMARKS_FILE </pre></code>

Piece of cake. It isn't elegant. There are definitely cases where I'll need to add additional sed edits. But it gets the job done.

Bookmarks

Bookmarks. I’ve got a lot of them. I’ve got a few I use often. Sometimes I think the chief value of bookmarks is that I can park something there and pretend like I’ll have it when I want it.<p> For the moment, I’ve signed up for a Pinboard account, and I loaded all my Google Chrome bookmarks into it. Now I’ve got to come up with a policy for what goes into Pinboard and what goes into my browser bookmarks.<p> I tried using a Chrome extension to synch Pinboard with Chrome bookmarks. It sounds like a good idea. The problem is that Chrome uses folders to organize, and Pinboard uses tags to organize. Pinboard synch takes a rational approach. It maps a folder to a tag, 1 for 1. So if you have a bookmark B, in folder F in Chrome, it lands in Pinboard as a bookmark B tagged with F. So far, so good.<p> But what happens when you tag B with F, G, and H? It winds up in Chrome in folder F, folder G, and folder H. Not so good, but tolerable.<p> But what happens if you have bookmark B, and it is stored in folder F, which is a sub-folder of G, which is a subfolder of H? i.e. H/G/F/B.

  • First it syncs to Pinboard with tags H, G, and F.
  • Then in syncs back to Chrome in folders H, G, and F.
  • Then you realize that it just flattened your folders into a single level, and you restore from your Xmarks backup. </ul> So here's how i'm going to decide what goes into Pinboard and what goes into Chrome.
    • If I use it frequently, it goes into Chrome.
    • If it is a bookmarklet, it goes into Chrome.
    • If it is something that applies only to the local compter (e.g. a file:// URL), it goes into Chrome.
    • Everything other than bookmarklets and local URLs goes into Pinboard. </ul> What I'd like is to have a way to replicate Chrome bookmarks into Pinboard, tagged as from-Chrome, and if I delete a bookmark in Chrome which is tagged solely as from-Chrome, the delete gets replicated too. I'd happily settle for replicating new/changed bookmarks to Pinboard. (I can live with deletes that didn't happen.)

      I don't see how to make that happen using off-the-shelf tools. I could cobble together something -- perhaps a Perl script run from cron to download from Xmarks and push to Pinboard (without creating duplicates).

      While Xmarks doesn't offer a proper API, you can get an RSS feed by selecting "Classic View" (not "Grid View"), selecting your top-level Bookmarks folder, and clicking "Share" on the toolbar.

How I Rip CDs on My Mac

Rip CDs with Exact Audio Copy - 2017 Edition - I’m Just Ripping to FLAC

Getting Started

  • Note: The LiteOn USB drive and the Dell USB drive are similar in features/speed. I’m using the Dell with a WinXP VM and the LiteOn with a Win10 VM.
  • If using VM, connect the CD drive to the VM.
  • Tap Windows key, type “windows features”, enable .net 3.5
  • Install EAC 1.3 into Windows 10 VM.
    • Accept defaults, except do not launch EAC.

Configure EAC

  • After the install completes, then launch EAC.
  • Load my old EACProfile.cfg. (It contains my naming convention.)
  • Run the config wizard and select:
    • Accurate Results
    • FLAC
    • Set up freedb with freedb@kleinfelter.com
    • Leave naming scheme unchanged (because I loaded it from .cfg)
    • I am an expert.
  • Go to EAC options and Filename and confirm:
    • %albumartist%\%albumtitle%\%albumartist%~%albumtitle%~%tracknr2%~%title%~%genre%
  • Go to Metadata options and set metadata to freedb
  • Note: Do not USE “built-in freedb” for metadata. That won’t download album art. Use “freedb Metadata Plugin”.
  • Quit EAC

To rip:

  • Start EAC
  • Insert CD
  • Press Alt-G to load metadata
  • Choose Medium Images and double-click the right cover art.
  • Correct Album Title (if needed)
  • Rename artist to Lastname, Firstname
  • Press the CMP button
  • Select a destination folder
    • e.g. Music, and it will write to the artist-name sub-folder. A local folder is faster than a network folder because it will write a .WAV, then read it back and compress it with FLAC.
    • If you get “The external compressor returned an error”, chose a destination folder which has a simpler path name. Do NOT rip to a UNC name.

—– Obsolete Content Follows —–

I always purchase my music (unless I get it free, legitimately). Once in a while, I purchase it on a physical CD. Here’s how I rip CDs on my MacBook. Note that I rip to FLAC, and then generate MP3 files from FLAC for use in portable devices and in iTunes.

Here are some things I tried and didn't like:

  • I tried and didn't like xACT. It doesn't name tracks the way I want them named, and it takes way too long to rip.
  • I tried Exact Audio Copy under WINE, and found it way way too fiddly.
  • I tried dBpowerAmp under WINE, and found it too fiddly. </ul> So I threw in the towel, and went with a mix of Mac and Parallels. To get started, I installed a bunch of programs. I didn't end up using them all.
    • Parallels: Installed Exact Audio Copy v1.0 beta 3
    • Parallels: Installed dBpowerAmp r13 with PowerPack. I told it to add the FLAC codec. I told it to add DSP Effects.
    • Parallels: Installed MP3Tag ( http://www.mp3tag.de/en/download.html )
    • Mac: Install Tag ( http://www.macupdate.com/app/mac/21641/tag )
    • Mac: Install Max ( http://www.macupdate.com/app/mac/19873/max ) </ul> Then, when I'm ready to rip:
      • Parallels: Use EAC to rip to [mac-desktop]/album-name as WAV files.
      • Mac: Start Max
        • Menu: File/Convert_Files
        • Select and Open your WAV files
        • Menu: Tools/Convert
        • Exit Max </ul>
        • Parallels
          • Select all the FLAC files
          • Right-click, and select MP3Tag
          • In MP3Tag, select all the files
          • Drag and drop the album art into MP3Tag's window.
          • Click the Save button </ul>
          • Mac: Start Tag
            • Menu: File/Open
            • Select and Open your FLAC files
            • Use Tools/Guess_Tags, with {artist}~{album}~{trackNumber}~{title}~{genre}
            • File/Save
            • Exit Tag </ul>
            • Parallels: Select the FLAC files, right click,
            • Parallels: Select the FLAC files, right-click, choose Convert, and convert them to MP3 (VBR, 190 KBS) </ul>

Git Crash Course and Cheat Sheet

I’m going to ignore most distributed aspects of git in this posting. This content addresses solo developer projects. Note that CWD is an abbreviation for your current working directory.

I use git on my laptop for most work, and when I have a 'milestone product,' I push that to my server.

To Do ThisType This
Create a repo in CWDgit init
Add content of CWD to git's tracking (if CWD is repo root or descendant)git add .
Put all tracked content of CWD and below into repogit commit
Put and track content of updated/new files in CWD and below into repo (combines add and commit)git commit -a
Statusgit status
Copy a project from a master repogit clone url_goes_here
Put your changes back in the mastergit push
Discover what you SHOULD have addedgit diff
Show what will get committedgit diff --cached
Show what will get commited (alt.)git status
Abandon (completely destroy) a branchgit branch -D branch_name
Show commit history [with metrics]git log [--stat]
Compare two branchesgit diff master..my_branch
Compare CWD with a versiongit diff some_branch
Show what changed in this_dir since last commitgit diff HEAD -- ./this_dir
Do a file system based clonegit clone /path/to/master/for/project myrepo_dir
Push a local repo to a NEW remote 'master' repogit clone --bare repo_original repo_bare

  • In your commit message, the first line MUST be a summary line.
  • One-time tasks, after you install git, before you use it for the first time
    • git config --global user.name "Your Name"
    • git config --global user.email "your_mailbox@example.com" </ul>
    • Note that adding a file is not permanent. If you add+edit+commit+edit2+commit2, your file won't be included in commit2 (unless you do a "commit -a" to add+commit). </ul>

      Basic workflow. Suppose you're about to implement a feature you'll call Feature-X:

      • cd somewhere_in_your_git-enabled_project
      • git branch Feature-X
        • This creates the branch, but does not make it your active branch. </ul>
        • git checkout Feature-X
          • This makes Feature-X your active branch. </ul>
          • Lotsa editing
          • git commit -a
          • test and edit some more
          • git commit-a
          • git checkout master
            • Makes 'master' your active branch. </ul>
            • git merge Feature-X
            • If the merge doensn't go smoothly:
              • git diff
              • More editing
              • git commit -a </ul>
              • Regression testing, and maybe more commits.
              • git branch -d Feature-X </ul>

MacBook Keyboard and Windows Keystrokes In Parallels

Had a devil of a time finding some of these. Windows key listed first, followed by Mac keystrokes. All of this is on an early 2011 aluminum unibody MacBook Pro, with Lion, Parallels 7, and Windows XP. Some of these probably apply to Vista, Windows 7, and Linux:

  • Insert = Fn + Enter
  • Home = Fn + Left (arrow)
  • End = Fn + Right
  • PgUp = Fn + Up
  • PgDn = Fn + Down
  • Break = Can't be done. See note on Break below.
  • Print Screen =
  • Scroll Lock =
  • Num Lock =
  • Context Menu (the keyboard equivalent of right-click) =
  • The RIGHT-SIDE Control Key = </ul> Note that if all else fails, run osk.exe and you can mouse-click on the key you want to send. It is awkward, but awkward beats "can't be done." Parallels does not support mapping a key to Break (or Control-Break) per http://kb.parallels.com/en/112637 . You can also use Autohotkey to map an alternative keystroke to the key you want. I've been using Control-F12 as a substitute for Control-Break, but that will break when I need to use Control-F12 for real. (I chose F12 because it is pretty close to where the Break key lives on my Windows keyboard.) To make this work, you have to tell Parallels preferences to map F12 to Pause, and then use the following Autohotkey script:
    #persistent
    ^Pause::Send {CtrlBreak} 
    
    To save you the trouble of installing Autohotkey, I've generated an .exe file that maps Control-Pause to Control-Break. It is attached to this blog post.

Browse Amazon's Free-to-borrow Kindle Book List

I wanted to see the list of Amazon’s new “Lending Library” books in a web browser, instead of on my Kindle.

This will do it, pretty close: http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords=&x=15&y=25#/ref=sr_nr_p_85_0?rh=n%3A283155%2Cp_n_feature_browse-bin%3A618073011%2Cp_85%3A2470955011&bbn=283155&ie=UTF8&qid=1320366825&rnid=2470954011

It will also pick up Kindle books that have a special discount for Prime subscribers, even if that discount is not all the way to $0.

BTW - To return one of these books, visit “Manage Your Kindle” -> “Your Kindle Library”. This gets me there: https://www.amazon.com/gp/digital/fiona/manage?ie=UTF8&ref_=kinw_myk_surl_2&#Books

File Synch (Dropbox and Friends)

I’d like to use a file synch tool that supports:

  • IOS 4
  • Ubuntu 11
  • Windows XP and Windows 7
  • Mac OS X Lion
  • Web Browser </ul> In general, I want access to my files, regardless of the device I'm using.

    I also want:

    • Files on their server can't be accessed by anyone but me (including rogue employees or SNAFUs like when Dropbox dropped the requirement to login).
    • Access to ALL of my files. </ul> The short form: It comes down to Dropbox convenience versus SpiderOak's security. SpiderOak does NOT have Dropbox's Mac-like simplicity. Dropbox doesn't have SpiderOak's "zero-knowledge" strength of data protection. Wuala stores files in a weird virtual drive. I'm looking to *simplify*, and none of these services provides simplicity with security. I'm going to use Dropbox and I'm not going to sync my private stuff. If you decide to sign up for Dropbox, please use my referral link, so you get bonus storage and I get bonus storage. Click here to register for Dropbox + 250 MB extra free space.

      Candidates include:

      • Dropbox
        • They're the market leader and the 'default' choice for many.
        • Sync across a LAN is near-instantaneous.
        • Down-side is that they don't store the files securely. Employees can decrypt. Since the files aren't stored encrypted, when they messed up their login process, ANYONE who knew my email address could access the files.
        • Available on OS X, IOS, Ubuntu, Web. The IOS version works pretty much like you'd expect.
        • 2 GB free
        • 50 GB for $120 per year </ul>
        • SpiderOak
          • Available on Windows, Ubuntu, Mac, IOS, Web
          • Versioning of files
          • Files stored encrypted.
          • You can "access" files from IOS, but it doesn't do Dropbox-like sync to IOS.
          • Sync takes a few minutes for trivial files. No local-LAN sync.
          • 2 GB free. I started with 6 GB, due to promotions.
          • $100 per 100 GB per year </ul>
          • Wuala
            • Supports Windows, Linux, Mac, IOS, Web
            • Stored encrypted
            • Versioning
            • 2 GB free. I started with 3 by using a referral link.
            • They make you enter the referral code by hand (can't paste) and it is case sensitive!
            • It uses FUSE on Mac to access a virtual drive.
            • Files in Wuala no longer exist AS FILES on your drive. You move them to their virtual drive, and they get stored inside Wuala data stores, so if you decide to stop using Wuala (or if it stops working when you upgrade your OS), you'd best copy those files back to your normal drive beforehand.
            • $129 for 100 GB per year. </ul>
            • MobileMe
              • Isn't ever going to really support Windows and Linux. </ul>
              • Tonido
                • Available on Windows, Ubuntu, Mac, Web
                • Somewhat available on IOS.
                • Sync will cost you $50 per year for 50 GB. Paying a yearly license to store data on my own server galls me.
                • I'd be willing to consider Tonido for a one-time fee, or if they offered a free option to synch without routing through their servers. </ul>
                • Sparkleshare.
                  • Not available on IOS or Windows.
                  • Web access is "roll your own."
                  • Stores data on MY servers.
                  • Unlimited storage quota free. </ul>
                  • SugarSync
                    • 60 GB for $100 per year.
                    • Down-side is that they don't store the files securely. Employees can decrypt.
                    • Other advantages/disadvantages? </ul>
                    • Box.net
                      • 5GB limit, but 25 MB per file on the free account. 25MB covers most of my files, but I've got enough ebooks, videos, program-installs that exceed 25 MB to make this a non-simple solution.
                      • $10 per month gets you $25 GB storage with 1 GB per file.
                      • $45 (minimum) per month for 500 GB limit with 2 GB per file. (Business account: $15 per user with a minimum of 3 users.)
                      • Encrypted storage is only available on "Enterprise" accounts (mega-$). </ul> </ul>

                        See also: http://lifehacker.com/5818908/dropbox-vs-the-alternatives-which-online-syncing-service-is-right-for-you

Problems With Unison

I set up a new Unison job on a Windows 7 machine, replicating to an Ubuntu server. But I was getting:

[root 1]: Error in scanning directory:
Permission denied [opendir()]
No updates to propagate

So I did a song and dance with chmod and File/Properties/Security and gave the world full permissions to everything. All to no avail.

It turns out that Unison can give this error if one of the directories to sync does not exist. For example, if you've got C:\Foo\bar and you're synchronizing it with a remote /bleah/bar, but the remote has only /bleah, Unison won't create /bleah/bar. It just throws the error.

Learning: When Unison says "permission denied [opendir()]", what it really means is something like, "I'm having a problem with one of your directories that may or may not have anything to do with permissions."

My personal "best practice" is that when you're going to do your first sync with Unison, you should use your ordinary "copy" or "cp" or "teracopy" command to start with both sides in perfect alignment. Teracopy (or similar) is much faster than doing an initial sync of a full directory with an empty peer anyhow.