Friday, October 14, 2011

Hitched

photo:  Alan Harris

Wow.  It really happened!  I put in my share of time and effort, but really Vicki gets all the credit.  Somehow we managed to pull it off in these past three months.

I'd like to give a very heartfelt thanks to everyone who went out of their way to attend.  If it wasn't the most complicated ceremony/reception arrangement possible, it must have been close to it.  It meant so much to us to be able to see all of your faces.  Friends and family came from as far north as Seattle, as far south as Texas, as far west as Taiwan, and as far east as France.  As much as Vicki and I dislike being the center of attention, we are so moved by the love and support you all have shown us.

And as if coming out all that way wasn't enough, everyone gave us so much!  Thank you all for your kind generosity.

It would be impossible to adequately thank everyone who helped make this happen.  We definitely could not have done it without the help of: Vicki's mom, aunts and uncles; her sisters Karen, Mimi, and Betty; and her bridesmaids Joanne and Ann.  A special thanks to groomsmen Ben and Joel (and their wives, Claire and Joanne) for throwing me a blast of a party and as well as staying so on top of things throughout the entire marathon of a day.

And a heartfelt apology to all those we couldn't invite.  Hopefully we will get to see all of you in the near future.

Thanks again, everyone!

P.S. I also deeply apologize for the band at the reception.  Yikes.

Sunday, September 4, 2011

CloudDiff Chrome Extension


CloudDiff - Compare versions of your Dropbox or pCloud text files in-browser or using your configured diff tool.

Updates


2021-06-28 update (version 1.0.2.28) - Handle Dropbox failure earlier.  Button to clear Dropbox token.


I've written CloudDiff, a Chrome extension which allows you to compare different versions of text files you have on Dropbox or pCloud.  It can perform the diff in-browser, or trigger a diff tool you have installed on your local machine already, which you must configure.
  1. On the Dropbox website, browse to the "Version history" page of any text file.
  2. On the pCloud website, browse to the "Revisions" page of any text file.
  3. A "Diff" column has been added where you can select which two versions to compare.
  4. To trigger your already-installed diff tool, click the "Diff" button.
    1. If a diff tool is not yet configured, the Options page opens where you can specify one. If you don't have one installed already, one option is KDiff3. The setting is accessible from Tools > Extensions > CloudDiff > Options.
    2. An additional executable must be installed, CloudDiff Helper, in order to trigger your diff tool.  Follow the instructions to install.
    3. If configured correctly, your diff tool should open.
    4. To perform the diff in-browser, click the "Inline" button.
This should run on Windows, Mac, and Linux.  Note that the combined file-size limit in any comparison is 4GB.  Please let me know if any issues come up.

Get CloudDiff.

Privacy Policy


Release History


2020-06-01 update (version 1.0.2.27) - Upgrade to jQuery 3.5.1, CodeMirror 5.54.0.  Handle OAuth token expiration.  Fix pCloud caching behavior.

2020-05-08 update (version 1.0.2.26) - (never approved) Use Dropbox API to circumvent CORB issue; use the chrome.storage API to store OAuth access token.

2018-02-01 update (version 1.0.2.25) - Rename to "CloudDiff" (formerly "DropboxDiff") with a new Chrome Web Store extension ID -- be sure to update to latest CloudDiff HelperpCloud support.  Switch from jsdifflib to CodeMirror for inline diff.

2017-04-18 update (version 1.0.2.23) - Update to match latest Dropbox format change.

2017-03-13 update (versions 1.0.2.21-22) - Bug fix for diffing non-text files, and files larger than 4K; please get latest "CloudDiff Helper".

2017-01-26 update (version 1.0.2.20) - Implement "Ignore exit status" option.

2017-01-24 update (versions 1.0.2.17-19) - Updated installation instructions for Mac/Linux; bug fixes.

2017-01-21 update (version 1.0.2.16) - Support "Load older versions".


...

Thursday, September 1, 2011

Blame it on the Tron

I watched old school Tron the other night. So much awesome kitch in that movie, I couldn't stop grinning during the whole thing.

Some things I noticed, since last time I watched it, a few decades ago:

The "Watseka" street sign sounded really familiar. Lo and behold:


View Larger Map

I live within 10 miles of Flynn's! We'll have to pay homage some time. Here's the wider shot.

I don't think they used the same spot for Tron: Legacy, though.

I also don't remember this blatant Easter egg:

They even sampled the Pac-Man sound effects. I remember Pac-Man being such an incredible craze at the time (we sang the "Pac-Man Fever" song in school once, badly), but somehow I never caught it here.

The Messianic overtones of the movie were pretty interesting too — Flynn being the User/god, come to inhabit the world of programs in order to save them. I certainly didn't pick that up as an 8-year old. Then again, it's only these days that I spend any time wondering whether our reality is just a computer simulation.

Here's a bit of dialogue I liked quite a bit.  Flynn has just revealed to Tron that he is actually a User, and not just a program, like the rest of them.
Tron: "If you are a User, then everything you've done has been according to a plan, right?
Flynn: "You wish! You guys know what it's like; you just keep doing what it looks like you're supposed to be doing, no matter how crazy it seems."
Tron: "That's the way it is with programs, yes..."
Flynn: "I hate to disappoint you pal, but most of the time that's the way it is for Users, too."
Tron: "Stranger and stranger."
Wise words.

Sunday, July 10, 2011

Facebook Dis

Have you ever been alone, minding your own business, and suddenly realize that someone has been following you, watching your every move, for the past two hours?

That's what it feels like when I'm visiting different websites and I suddenly see:


"[various friends] like this."

The scary thing is that the stalker metaphor is quite appropriate – Facebook really is stalking you, keeping track of wherever you go whenever you see one of these.

So I really liked a Chrome extension called Facebook Disconnect.  Unfortunately, it tends to break some sites (Scrabble, in particular).  So I extended the extension to allow whitelisting certain sites.

Presenting:  Facebook Dis.

If you really want to get fancy you can read the whitelist from a specific URL, say a website or public Dropbox file.  This lets you to configure several installations of Facebook Dis in a single place; all instances will stay up to date automatically the next time you open your browser or click "refresh" from the options page.

Thanks to Brian Kennish for the original Facebook Disconnect.

Thursday, March 31, 2011

Fast Make for Vim

2019-02-12 update - Added g:Make_quickfix_always_open option.

2014-05-18 update - This is now vim-make on GitHub.

I wasn't really satisfied with Vim's :make behavior so I wrote a script to do what I wanted.
  • Saves buffer first
  • If there are errors, show them in the quickfix window
  • Success is reported in the status bar
  • Saves some keystrokes, especially if mapped to F5
Here it is. You can put it in ~/.vim/plugin/Make.vim, or if you are using pathogen, ~/.vim/bundle/Make/plugin/Make.vim.

This is basically my first Vim plugin so please let me know if there are things I could improve.

"=============================================================================
" File: Make.vim
" Author: Victor Shih <victor.shih@gmail.com>
" Last Change: 2/11/2019
" Version: 0.02
" WebPage: http://blog.vicshih.com/2011/03/fast-make-for-vim.html
" Description: Modestly enhanced `make` for Vim.
"

function! Make(args)
  " Compile arguments.
  let l:args = strlen(a:args) ? ' ' . a:args : ''
  let l:title = expand('%') . ' - Make' . l:args

  " Force write.
  silent update!

  " Find the closest directory to the current file with a [Mm]akefile.
  let l:makefile_dir = s:find_makefile_dir()

  " Move to that directory and make.
  let l:out = split(system('cd ' . l:makefile_dir . ' && make' . l:args)"\n")
  let l:len = len(l:out)

  " Output to quickfix.
  cgetexpr l:out
  let w:quickfix_title = l:title

  if g:Make_quickfix_always_open == 1 || l:len > 1
    copen
    cc 1
  elseif l:len == 0
    " No output; just report success.
    cclose
    redraw
    echo l:title . ' succeeded'
  else
    " Output is a single line; echo it.
    cclose
    cc 1
    redraw
    echo l:out[0]
  endif
endfunction


function s:find_makefile_dir()
  let l:dir = expand('%:p:h')

  while 1
    " Ensure we have only one '/'.
    if !empty(glob(substitute(l:dir, '/$''''') . '/[Mm]akefile'))
      return l:dir
    else
      let l:parent = fnamemodify(l:dir, ':h')
      if l:parent ==# l:dir
        " We reached the root but didn't find a Makefile.
        return '.'
      endif

      let l:dir = l:parent
    endif
  endwhile
endfunction


" Register command.
command-nargs=? Make call Make("<args>")

let g:Make_quickfix_always_open = get(g:, 'Make_quickfix_always_open''0')
let g:Make_loaded = 1