Home

Update to the List of Critical iPhone Apps

  • Jul. 5th, 2009 at 12:29 PM
z_default
I've had my iPhone for a few weeks now, and I really do love it and depend on it as much as I thought I would.

Remember that I made a list of things I thought I'd want with the iPhone before I actually got it?  I went back to that list, and added to  it the list of apps that I really got. (Complete with screenshots.)  Let's go see how close to reality I was: Go check it out.

Have I got a deal for you!

  • Jun. 29th, 2009 at 3:16 PM
z_default
Poll #1422991 Distribution of $10.00
Open to: All, detailed results viewable to: All

You may split $10.00 with an anonymous stranger if he accepts your one-time offer of a split. If he accepts your one-time offer, you both get your cut. If he doesn't, neither of you get any money. What do you offer?

View Answers

I keep $10.00. He gets nothing.
0 (0.0%)

I keep $9.00. He gets $1.00.
1 (11.1%)

I keep $8.00. He gets $2.00.
0 (0.0%)

I keep $7.00. He gets $3.00.
0 (0.0%)

I keep $6.00. He gets $4.00.
2 (22.2%)

I keep $5.00. He gets $5.00.
6 (66.7%)

I keep $4.00. He gets $6.00.
0 (0.0%)

I keep $3.00. He gets $7.00.
0 (0.0%)

I keep $2.00. He gets $8.00.
0 (0.0%)

I keep $1.00. He gets $9.00.
0 (0.0%)

I keep nothing. He gets $10.00.
0 (0.0%)

An anonymous stranger is told he could split $10.00 with you. If you accept his one-time offer, you both get your cut. If you don't, neither of you get any money. He offered you $2.00, and wants to keep $8.00. Do you accept?

View Answers

I accept.
8 (80.0%)

I refuse.
2 (20.0%)



The source of this poll comes from a study in Sway. Highly recommended.

The Ultimate List of Critical iPhone Apps

  • Jun. 15th, 2009 at 7:22 PM
z_default
What makes this list of critical iPhone apps the ultimate?  I've never opened the App Store and I don't have an iPhone!  It's the "ultimate" in the sense that it's being posted before the start of my iPhone experience.

In a few days, I'll have an iPhone.  I think it'll be fun to post what I currently think I'll need to download, and then revisit this post in a few weeks and update it when reality hits and admit to what I really downloaded and what I actually use.

What I Think I'll Download [Original post on June 15th]

  • SplashID : This is the most critical application I currently have on my Treo.
  • Some battery saving utilities.  Hopefully something that turns on BlueTooth only when it's time for me to drive.
  • An awesome Google application that removes a little of the chrome from GMail, Maps, etc.
  • Maybe a Plurk / Twitter / Micro-blogging-and-geolocating-service client.
  • Some organizational utility that hides things I don't use and presents things I do with fewer swipes.
  • Maybe some silly tech-demo to show off the accelerometer or a game.  I dunno.

What I really Downloaded [Edited later on July 4th]

I'm back, and I've had the iPhone for a few weeks now.  How did I live without the it? Let's accompany this with screen captures.

First, the "Main Page with Utilities"

I removed some standard apps from the main page, and replaced them with ones I deem worthy of being on the Main Utilities page.

I added TripIt, which I'd already fallen in love with, simply because if its webpage.  The iPhone app was just icing on the cake.  If you travel and you're not using TripIt, go check it out.

I added SpashID.  I was already using it on my Treo, so it was a no-brainer to continue using it on the iPhone.  There may be better alternatives, but I'd already paid for mine.

I also added Sketches, because a man needs to doodle.

Finally, and this is tentative, Pandora made the cut.  I haven't been able to make all the Pandora stations I really need, but I'm willing to give it some time.  If iTunes can finally come around and offer a good JPop selection, then hopefully Pandora can too.  Here's hoping for a Namie Amuro station.

Second, the "Social Apps and Games page."


I added the following Social Network Apps:  Plurk, Facebook and Twitterific.  Plurk and Facebook were no-brainers.  There are a million Twitter apps, and I'm not interested in assessing all of them before I commit.  I might change it if another one come up and bites me on the ankle.

I'm wildly in love with Shazam, which has worked for me on multiple occasions.  I can't tell you how wonderful it was to have it recognize a song for me (that was playing at a restaurant), and make a note of it.  What an awesome app.

Now Playing and Coffee Finder are both awesome location aware apps.  Coffee Finder finds a Starbucks near you, and Now Playing tells you what's playing at the theaters near you.  It allows you to choose the reviews it displays, and I've chosen Rotten Tomatoes.

Planets is handy for having at hand when I'm outside with the kids at night.

All the others are the sort of games that I like to play myself.  Make of that what you will.

Third, the "Rarely used, Games for Children, and Emergency Apps Page."


This is the garbage bin, full of utilities, tech demos, and games that don't interest me, but interest my children. 

The following two utilites almost made it to my front page, though: Phone Flicks, for NetFlix queue management, and TouchTerm, for emergency ssh.

You can see I relegated what I consider to be nearly useless standard utilites here: Compass, Stocks, Messages, iTunes, Voice Memos and YouTube.  Meh on all of 'em.

Flixter is a sanity check against Now Playing, as iSSH is being evaluated against TouchTerm.

Why my kids enjoy SmackTalk so much, I'll never know.  But they do, and so I keep it for them.

Notably Missing

  • I never got that BlueTooth enabling app.  Shame.  On the iPhone, you really have to burrow too deeply to enable and disable BlueTooth.  What a pain.
  • I also don't have an excellent RottenTomatos or IMDB app for strolling around in a brick-and-mortar video rental store.
  • There's no app for efficiently browsing your LJ friends page.
  • I never needed the Google app I thought I'd download.  Integrating GMail with Mail on the iPhone is easy, and GMail's site itself is optimized for iPhone clients, anyway.

The HeisenTwitter Uncertainty Principle

  • Jun. 11th, 2009 at 9:49 PM
z_default
On Twitter, we'd all better second-guess what we see in our friends list of tweets.  Even if you want your public replies to be visible, be aware:

Your friends won't see your public replies to other friends anymore.
Or, when they can, they can't tell to which tweet you replied.

That's a lot like the Heisenberg Uncertainty Principle. That's where you can't precisely know a particle's position and momentum at the same time. You can know either one with high precision, but not both.

At Twitter, you can either see your friends' replies, or know which tweet they were replying to. But not both.

It didn't used to be like that. If we wanted to see our friends' replies, they'd simply show up in our list of tweets, with a handy link to the tweet it's a reply to. You'd see your friends' replies, and you could click-through to see what they were replying to.

The Good Old Days
The Good Old Days - See replies and know what they replied to.


That was nice. Twitter changed that. Now, the only tweets that show up in your list of friends' tweets don't have that handy link. So you can see that they replied to something, but you can't know for sure which tweet they replied to.


Keep that in mind when you want to reply to a tweet. You have a choice to make. If you want your friends to see your reply (isn't that the point of Twitter?), then you'd better type "@username" instead of click the reply-button under the star. Or, if you want your reply to be linked to the tweet it's a reply to, you should click on the reply-button under the star.  You can't have both.


Having to make that choice sucks. Welcome to the HeisenTwitter Uncertainty Principle. This is why I like Plurk.

z_default
I haven't really seen this spelled out in a really clear manner on the web, so let me help out. YouTube's got useful programmatic feeds. You can specify a feed for a user's videos like:

http://gdata.youtube.com/feeds/base/users/communitychannel/uploads

You can also specify the order in which you want the videos.  Note the "orderedby" parameter in the urls that follow:

http://gdata.youtube.com/feeds/base/users/communitychannel/uploads?orderby=updated
http://gdata.youtube.com/feeds/base/users/communitychannel/uploads?orderby=published

So far, so great. Now, suppose you want to make a lifestream, and you want to include the videos that you've favorited. They've got a feed for that, too:

http://gdata.youtube.com/feeds/api/users/davidblume/favorites

But it's not right.  If you look at the data you get back, you see that it's not what you wanted. Those videos are going to be associated with the timestamp with which they were updated or published, not the time that you favorited them. And that's the time that matters to your lifestream! Given the way the programmatic feeds are organized, you'd think that there's a way to specify that, and that feed would be as follows, right? --

http://gdata.youtube.com/feeds/api/users/davidblume/favorites?orderby=favorited

Nope. After living with a workaround in my lifestream for months, only today do I learn that YouTube did create the feed I needed, but calls it this: v=2. Yeah, like that jibes with their feed explanation.

Lifestream writers, the favorites feed (ordered by time favorited) that you want is constructed like this:

http://gdata.youtube.com/feeds/api/users/username/favorites?v=2

(Replace "username" with your username, of course.)  Now I can go delete my workaround.

Mind-Blowingly Old

  • May. 21st, 2009 at 10:00 PM
z_default
Ten years?  Really, LiveJournal?  Wow.  You're old as dirt.  Congrats, that's quite an accomplishment for a web service. Honestly, I don't know how much more you have in you, but your endurance in the face of vox, deadjournal and dreamwidth and all the others really speaks to the power of community.

Services thrive when they grow and maintain a community around them. Otherwise, they fail, even if they're better.

Five years?  Well, nearly.  In a couple of months, I'll have been here five years. Wow, I've been friends with you guys for that much of my life. Practically as long as my son has been alive. In a way, you're all a significant part of my life's experience, and I care about you. I worry about you when you're troubled, I laugh with you when you joke, and I find peace with you when you share koans and zen thoughts.

I'm concerned, though.  We really are plurking and tweeting more than we blog nowadays.  I've long complained about twitter's damaging effect[info]halophoenix has written about the state of blogging in the age of twitter.  (Even if you don't read it, scroll down to the bottom and read the first two comments, between 'Phoenix and I.)

For those of you reading this:  ::hug::, ::fist-bump::, Sláinte and Kanpai!

z_default
I must be in a wistful mood. Some of the songs making it into my frequently played lists are various openings and endings to dorama and anime. I've long acknowledged how effective the associate between a much-loved show and a much-loved song can be. Here's what I've been listening to...

four embedded videos after the cut... )
And for search engines and those who can't be bothered to dive into the cut, that was Sowelu's Mamoru Beki Mono, Bonnie Pink's Water Me, Ai Otsuka's Planetarium, and Namie Amuro's Can You Celebrate.

I think I just lost all my manly-man cred. Did I ever have any?

Tags:

Anniversary Weekend (with Recommendations)

  • May. 17th, 2009 at 9:37 PM
z_default
Bay-To-Breakers weekend is our wedding anniversary weekend.  Our kids are a little too young to join us in the race, so we didn't do it.  (But we think that that would be an awesome way to celebrate.)  Instead, we had a relatively low-key weekend, but one that we both thoroughly enjoyed.  Some highlights:

  • Nothing But the Truth :  Lillian rented this on a whim.  When I found out, I was a little resentful because it was a standard definition DVD, but it had Kate Beckinsale in it, so I gave it a chance.  I was pleasantly surprised, it kept me engaged.  We both liked it.  I recommend it.
  • The Dead and the Dying : I just finished the third Criminal trade by Ed Brubaker and Sean Phillips.  It stands up to the first two.  I'm looking forward to Bad Night.  Highly recommended.
  • Wicked : We went to Wicked for our Anniversary date.  We were pleasantly surprised to see that Patty Duke and David Garrison (the neighbor on "Married with Children") were in the cast.  We didn't really know anything about the play before we saw it, and were better off for it.  It had some really cute numbers that we'll be referencing for a month.  (Sort of like Avenue Q, that way.)
  • Roy's : San Francisco's "Roy's" rocks.  We're increasingly choosing to go here for special grown-ups-only dinners.  We really love it, and always gravitate to their Prix Fixe menus.  Yum.  I'm full now, but want to go back already.
I didn't get any domestic chores done that I'd wanted to this weekend, but I guess I'll give myself a "pass" for Anniversary Weekend. :)

Black Lagoon's Anime OP

  • May. 3rd, 2009 at 1:42 AM
z_default
As a matter of rule, I don't watch the opening or closing credits for anime on DVD.  I'll watch them once to see how they look, but unless their soundtrack is composed by Yoko Kanno or something, I don't need to watch them again.  That's time that could better be spent watching the show itself.

But every once in a while, there's an exception.  I found myself sitting through the opening credits of Black Lagoon for this one frame.


It's pretty compelling.  The character is Remy, a broken sociopathic murderer.  She is often disenfranchised, stoic or bitter.  Rarely, and usually when it precedes murderous violence, she'll be happy.

That's part of the thing that gets me about the frame.  She's deceptively cute in the still, because her character isn't developed to be cute at all.  My attention always starts with her eyes, smile, and scrawl on her cheek.  But right after that, I become aware of the clues to her menace and strength:  Her two guns strapped to her shoulder harness and the tribal tattoo going down her right arm.  Only then do I realize: "Wait.  Is she reaching for a weapon?"

BTW, I'm done with Black Lagoon now, and am moving on to Flag.

Fixing DQSD Definition Search (Again)

  • May. 2nd, 2009 at 11:00 AM
z_default

(the new "df" search)

A couple of years ago, I'd already claimed to be a long-time fan of Dave's Quick Search Deskbar, especially because of its popup dictionary search.

Since then, though, Merriam-Webster has changed the layout of their site so much, that they made maintaining the DQSD mwd.xml prohibitively expensive. I needed to create a new search, and I did. (The definitions aren't as good as Merriam-Webster's, but at least they work.)

Here's what you do, if you already have DQSD installed:
  1. Download df.zip (2 kb), and extract df.xml into C:\Program Files\Quick Search Deskbar\searches.
  2. Modify localaliases.txt to include the following line:
      :|df

And now, you can have an easy, non-intrusive, dictionary lookup available anytime again.  Just type the word to lookup with a colon after it, and the definition will appear in a popup window that gets dismissed when focus changes elsewhere.  (I mention a shortcut key recipe I use for looking up words.)

In case you didn't already know, DQSD excels at many other searches, too.  It defaults to Google, but I use it for Wikipedia, image, maps, the imdb, and a calculator quite often, too.  It's just the popup definition lookup that needed my TLC.

The Tenth Life Lesson from Rock Climbing

  • May. 1st, 2009 at 4:03 PM
z_default
I think there's a tenth lesson we get from rock climbing.  It means enough to me that I wrote it up over at david.dlma.com instead of here.  But I have at least one sometimes-rock-climbs friend here ([info]megami !) , so I've mentioned it here for those of you who don't follow me elsewhere.

All the rock-climbing life lessons are good, and the video is short, compared to the other TED videos I've seen.

Totally Unnecessary

  • May. 1st, 2009 at 12:04 AM
z_default
Rabbit, rabbit.

Yeah, I have this month covered already elsewhere.  But why not give LJ a little Leporidae leporidae love too?

Three Things TODO After Vacation

  • Apr. 16th, 2009 at 12:14 PM
z_default
Gah! There's way too much to do, and so little time. All I can do at the moment is document what I need to get done before vacation. And even then, I was torn between documenting it here, or at my new experimental Habari blog at david.dlma.com. What am I going to do with that blog? (I treat it like some people treat their Moleskines. It's too special to write on. That domain name is the most me, so I've been protecting it.)

Anyway, in no particular order, here's what I want to get done:

  • Customize Twitter Friends Feed: I need to customize my twitter friends feed so that it won't spam my feed reader with @replies I don't care about. I need to set my preferences on a per-twitterer basis. I really enjoy all @replies from some of my friends, but not all.  Maybe I'll break down and find an app that already has the feature, but I prefer having just one place aggregate all the feed activity I'm interested in. [Edit: Biz is going to do this himself!]
  • Make a Dictionary Popup: I loved the DQSD mwd popup definition result. But merriam-webster.com has a history of changing the layout of their page so that maintaining the mwd.xml search became onerous. It's time to replace that popup definition with one from aonaware. Here's the API call I'm most interested in: DefineInDict, with "gcide" for the dictId. [Edit: Completed!]
  • iTunes library rsync with OpenTape: As originally hinted.

z_default
You've all certainly seen these before. Even if it's just for my own sake, below the cut are three videos that I simply adore.

They're "Bathtub IV" by Keith Loutit, "Marry Me" a YouTube video by TROPFEST, and "World Builder" by Bruce Branit. If you've got the time or the bandwidth, watch them in HD, it's worth it.

Click through to view them... )

Tags:

HP Mini 2140, Dell Mini 12, iPhone or Pre?

  • Apr. 4th, 2009 at 10:05 AM
z_default
We're continuously fighting over the computers in my household, so the time seems ripe for another one. And I want it to be a netbook, an iPhone, or a Palm Pre. My hands are too big for the smallest Eee PCs, so I won't even go there. So here's what I've been doing.

I've been Osborning for the HD HP Mini 2140. (If you didn't click that "Osborning" link, it doesn't mean I've been biting the heads off of bats, it means I've been delaying purchasing products based on the promise of a future release.)

Looking into the HP Minis revealed something surprising to me. The Mini 1000 and 2140 are similar in many ways, but the unintuitive bit was this: The tinier 8.9" screen's resolution is 1024 x 600, but the larger 10.1" screen's resolution is only 1024 x 576.

What the hey? Based on what I saw at the store, I almost bought the one with the bigger screen! Because a bigger screen means a bigger screen, right? Not in this case.  That's why I was so happy to hear the rumor of the bigger screen on the HD HP Mini 2140, that puts that particular netbook back in the running.

In my despair, I began to look seriously at the Dell Inspiron Mini 12. (Larger than I'd want to carry around, but the bigger keyboard and screen would be appreciated.)

But then again, if I had a Palm Pre or an iPhone, I'd have a rich interface to the internet with me at all times. (Except I don't want to pay for their data plans or have to change carriers.)

Anyway, only a couple of days until I find out of the HD HP Mini 2140 is going to be real. But if I get it, would it arrive in time for my vacation?

Choices, choices.

  • HD HP Mini 2140 - PRO: size, just right.  CON: sorta expensive
  • Dell Mini 12 - PRO: size when considering screen and keyboard CON: size when considering storage, carrying
  • Apple iPhone - PRO: ubiquity (good for software selection), same carrier. CON: data plan expense
  • Palm Pre - PRO: keyboard, access to my favorite Palm apps.  CON: different carrier

Stack Overflow, Hunch and Wikipedia

  • Apr. 4th, 2009 at 9:52 AM
z_default
Just wanted to express online my long-going contempt for experts-exchange.com for clogging up Google's search results with so much useless noise.

And I wanted to express my delight with stackoverflow.com, which has proven its worth and demonstrates it readily. I'm also delighted with the promise of hunch.com. It takes a little diving into at this early stage to really understand it, but it's apparent that it's an experiment worth trying. (This is how wikipedia felt way back when. I wasn't sure it'd really work, but I was glad somebody was giving it an honest effort.)

Yay for people helping people.

z_default
Hypothetically speaking (again), suppose you bought Bonnie Pink's beautiful ballad "Water Me" on iTunes.  No, wait, scratch that.  At Amazon.  No, wait, scratch that, too.  Neither place sells it.  Story of my life.

So you fly to Japan, buy a digital copy, and fly back.

They you decide that you want to sync your iTunes library with your OpenTape playlists -- Only to discover that OpenTape only plays the first few seconds then fails over to the next track.

Then, hypothetically, you'd transcode it in LAME (maybe in the Audacity GUI) form the original MP3 to another (arbitrarily lower bitrate) MP3.  You'd try the newly created file in OpenTape, and discover that it now works as expected.

Thank you, LAME!

Then, hypothetically, you'd also have to start looking into the best python-friendly way to manipulate tags (really, just copy them from the original to the transcoded one).  Maybe pytagger or pyid3lib?

z_default
Did I really not post this before? I've had to set this up multiple times, and it bites me every time.

In my household, the four of us share some computers, and we all have our own accounts on them. Some of us use Gmail and the Gmail notifier, and some of us don't.

The problem: Gmail notifier installs for all users, no exceptions. So the accounts that don't use Gmail still get the annoying login screen every time the computer boots up. No one should ever have to deal with a modal dialog that doesn't enrich their lives.

My workaround is this: Use RegEdit to tweak the GMail startup behavior.

Remove the individual value from HKLM's Run:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"{<GMAIL'S GUID>}="C:\\Program Files\\Google\\Gmail Notifier\\gnotify.exe"


And for every user that wants it, add it to their particular HKCU's Run:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"{<GMAIL'S GUID>}="C:\\Program Files\\Google\\Gmail Notifier\\gnotify.exe"

That should now disable the Gmail Notifier on the accounts that don't want it.

Tags:

z_default
I've got an old home WDS system set up made up of two Linksys WRT54G gateways. It's awesome. I love Linksys for allowing the WRT54G to be "the first consumer-level network device that had its firmware source code released to satisfy the obligations of the GNU GPL."

The WRT54G wasn't configured to build a Wireless Distribution System, but the hardware was capable of it. I installed DD-WRT and followed an online recipe that gave me the configuration I needed:

  • One gateway in the office upstairs for all the local devices and the wi-fi devices.
  • One access point in the family room downstairs to extend the range of the network and for local (media) devices to speak to each other at high speed directly across the local switch, while still getting out to the internet when necessary.
This all worked great with my old DSL connection. But recently, we migrated from DSL to cable modem, and the new provider was Comcast. The Comcast technician came over to hook us up, but had a little trouble getting the computer online.

I had a sinking feeling that it was the WDS system I had in place. After a few early attempts, the service guy listened to me, and removed the WRT54G from the equation. Sure enough, when the cable modem was connected directly to the computer, the computer found the internet right away.

I was pretty upset that my WDS might not work anymore. I searched the web for terms that included DD-WRT and Arris and Comcast. Sure enough, half the hits I found indicated that the devices were simply incompatible. Wouldn't work.

But a few of the others suggested I set the local gateway to clone the computer's MAC address. That seemed like an advanced and bad thing to do, but if they were right, and Comcast had blacklisted the default MAC address that  DD-WRT uses, it was worth a try.

I navigate to the gateway's administration page expecting to have a lot of trouble, but it turns out to be really easy!


So I told the gateway to clone the PC's MAC address, crossed my fingers, and ... it worked!  It turns out Comcast was blacklisting the default MAC address the gateway uses!  W00T!  My home network is back in business.

... Until I upgrade to 802.11n.

(This is posted to add just another reference page on the net where a fix was found.  Hope it helps somebody.)

Tags:

Our Three Greatest Fears

  • Jan. 26th, 2009 at 4:23 PM
z_default
I've heard it said that a study was done to catalogue our greatest fears, and that the second greatest fear we have is death, while the greatest fear we have is speaking in public.

Let my experience this past weekend add a little colour to that.  I'd suggest that our modern three greatest fears may well be:

  1. Speaking in public
  2. Death
  3. Loss of connectivity to the internet
This weekend we went down to Pasadena for a memorial for my Mother, who passed away last month.  (While it's imperative for a funeral to occur within a few days of the death, a memorial like this can occur later, to give family and friends a better chance to get together.)

The memorial was held in a church, and the opening words were provided by an Associate Minister.  I was responsible for the opening of the Community Eulogy.  (I write it in caps because that's how it felt.  Imposing.)

I'm not a public speaker.  I'm a typically introverted software developer.  So this wasn't to be an easy thing for me.  While I was wrestling with the way funerals and memorials manage to combine these two all-time favorite pastimes, death and public speaking, Charter Communication suffered an internet blackout for nearly the entire weekend.

Oh.  My.  God.

We were right in the middle of review cycles of my Mom's memorial program and music arrangements.  Staff from the church had been sending email back and forth with us, and they had the wrong phone number for dad.  We sent a correction just before we lost connectivity.  We weren't sure our outgoing email got through.

I was freaking out, thinking I'd broken my dad's computer, and I had precious little time to restore it.  I kept calling Charter every two hours the entire weekend, and the reply I always got was, "We can't help you until the outage that we are aware of in your area has been cleared."  So I really didn't know if the Charter blackout was the only problem, or if there was a problem local to dad's computer.

And how was I going to provide remote tech support to my dad if he can't get online before I go home?  I can't VNC in.  I'd have to walk him through everything blind, on the phone.  "The cable modem is the box with hopefully some green LEDs on it.  See a box like that?  Feel around behind it for a power swich, and if you don't feel that, try to determine which cable is the power cable.  Ready?..."  The prospect of having to do that was terrifying.

Sunday was to be a make-it-or-break-it day.  We were flying back on the last flight that night, after the memorial.

Everything came together.  The flower arrangements arrived where they were supposed to, when they were supposed to.  So did the food and wine.  The music was beautiful.  The memorial would have made Mom proud.  When we got back to Dad's apartment, the internet connection was back up.  Icing on the cake was that I even discovered how to open a safe that Mom had locked, and to which nobody knew the combination.

And the next day was Chinese New Year's.   We'd gotten all that accomplished before the end of the previous year.

Gung Hay Fot Choy!

Phew!

Tags: