Occasionally, my home Internet speed slows to a crawl, and I was curious to get some more insight into whether there’s a pattern, and to have data to show my ISP if needed.
(These instructions presume you’re using macOS)
I wrote some scripts to streamline the process of creating heatmaps from geotagged photos. All you need to run it is Docker, a Google Maps JS API key, and some images.
My girlfriend and I recently spent a week in Greece. Our original plan was to spend a week on the island of Corfu, part of the Ionian Islands off the Western coast.
On Saturday, a group of friends and I went on a 9-mile trek along the abandoned Tillamook Railroad about 35 miles west of Portland. This railroad was originally constructed in 1906, but was damaged by storms in 1996 and subsequently fell into disrepair. It made for a nice, easy fall hike because of the fall colors, sun, and minimal elevation gain.
This route seemed to be the most popular, based on what I’d read, so we opted for that: http://www.oregonhikers.org/field_guide/Wolf_Creek_Trestle_Hike
A motley crew of 10 friends and I spent last weekend backpacking Indian Heaven Wilderness, in southern WA.
My girlfriend and a couple friends of ours went wine tasting this weekend. And, naturally, I brought a drone.
There are dozens of vineyards in the Columbia Gorge near Hood River. If you’re interested in visiting yourself, here’s a map of them: WINERIES/VINEYARDS | Columbia Gorge Wine Country. We were totally overwhelmed with all of the choices, so we pooled our money and hired a tour guide. We went with Martin’s Gorge Tours, and were really happy with them. Plus, none of us were driving, so we could enjoy all the wine we wanted.
This particular flight was over the last vineyard we visited, Garnier.
As a QA engineer, there are often times when I’ll be working with dynamic elements on a page that disappear on mouse out. This can be extremely tedious to try to inspect these transient elements, and the only solution is to freeze the page. This can be done as follows:
- I purchased an Amazon Echo recently and am writing this post to catalog useful features I’ve discovered with it.
This is another concept I came across in Joshua Bloch’s “Effective Java.” According to Wikipedia, “Reification is the process by which an abstract idea about a computer program is turned into an explicit data model or other object created in a programming language.”
(spoiler alert: the rock pile won)
The following is a generic method for filtering lists with the Google Guava library that uses Predicates.
In OSX Yosemite, for security reasons, Apple disabled the ability to set environment variables from the /etc/launchd.conf file. But never fear, you can still set them with a LaunchAgent.
By default, jQuery selectors operate on all items in the DOM. There is an overloaded search function, however, that allows the creation of selectors based on a subtree.
I recently read Head First Design Patterns, and they had a handy set of Object-Oriented design principles that were repeated throughout the book that I wanted to document for reference.
If you’re in a position where you need to construct HTML entities using jQuery, and you want it to be readable, you can make use of arrays to do this. For example:
I wanted a Bash alias that would output the time remaining until the next Eastbound train at the stop near my apartment. I created a Python class to get this data that I could implement in a script. This class takes as parameters your TriMet API key and the ID of the stop. To obtain a TriMet API key, visit http://developer.trimet.org/.
For Chrome extension development, if you need to reference an image or other asset for your Chrome extension in CSS that’s stored in the extension folder, just place this in your CSS selectors:
“Don’t ever make the mistake [of thinking] that you can design something better than what you get from ruthless massively parallel trial-and-error with a feedback cycle. That’s giving your intelligence much too much credit.” –Linus Torvalds
An immutable object is one whose state or data cannot change after construction. Common immutable objects from the JDK include Strings and Integers.
One of my coworkers recently discovered a trick to remove fisheye distortion on GoPro images using ImageMagick. This command does the trick:
From the Java API Docs:
If there is no sudo group on your system, add one.
Found this on Wikipedia today. Pretty interesting.
I’m a frequent user of OSX’s HotCorners feature. It allows me to put my display to sleep with a simple swipe of the mouse to the bottom-right corner of the screen. This is handy when I’m stepping away from my computer in order to keep coworkers from status-bombing me in our internal social network. Recently, I thought it would be cool to run a script when I stepped away from my computer, particularly to set my chat status to “away.” I realized that this wasn’t possible with the vanilla HotCorners, so I looked around for other options. I came across CornerClick. It’s an older project, but still works well. I’m currently running Maverick’s on my machine and it’s been fine. I definitely recommend this for anyone looking to add more functionality than comes with HotCorners out of the box.
Search everywhere: Shift + Shift Find in Project: Cmd + Shift + F Add a breakpoint: Cmd + F8 Duplicate a line: Cmd + D Run in debug mode: Shift + F9 Run: Shift + F10 Stop Run/Debug Session: Cmd + F2 Pop open the terminal: Alt + F12 Find usages of a method or variable: Option + F7 Show currently-executing line: Option + F10 Tab to autocomplete: One annoyance with IntelliJ is that autocompletion doesn’t account for a token already being present before it inserts. So you end up having to delete text if you’re already in the middle of a method name and do autocomplete, for example. A way around this is to hit the Tab key instead of the return key when doing autocomplete. This will then autocomplete in the way that you’d expect.
(And by “Robot,” I mean the Robot Framework)
Java has some nice classes that wrap Primitives (Integer, Boolean, etc). In recent versions of Java, these classes can be used interchangeably with Primitives. So why use Primitives at all, ever? One of my coworkers recently told me that he makes use of Primitives as much as possible because they’re never allowed to be null. Since the Java wrappers for Primitives are references to objects, it is in fact possible for them to be null. As I’ve written before, it’s best practice to avoid null wherever possible.
I’d come across an obscure reference to port knocking in a security book and was curious to try it out. Essentially, port knocking is a way of firewalling connections to certain ports (such as SSH) pending a predefined “knock” sequence of TCP connections. This acts like a sort of “open sesame”-esque password and can be very secure if used in conjunction with other forms of authentication, such as SSH keys. Any scans by an attacker will reveal all ports closed. Your legitimate users, knowing the predefined knock sequence, will be able to get the server to open up your protected service to them.
Here’s a list of plugins I’ve found useful in writing automated Selenium tests for Chrome:
Just got the news about this recently. Launching in Summer 2015. Very cool. https://www.eff.org/deeplinks/2014/11/certificate-authority-encrypt-entire-web
Note: usually, it’s better to use an asynchronous function, like setTimeout(), because this function blocks execution until it’s finished. That being said, sometimes you need to add a busy wait loop into your scripts. And this is how:
The “⌘” symbol (the “Looped square”) was chosen after Steve Jobs decided that the use of the Apple logo in the menu system (where the keyboard shortcuts are displayed) would be an over-use of the logo. Apple’s adaptation of the symbol—encoded in Unicode (and HTML) at U+2318 ⌘ (HTML: ⌘)—was derived in part from its use in Scandinavian countries to denote places of interest. The symbol is known by various other names, including “Saint John’s Arms” and “Bowen knot”.
I’ve been writing Selenium tests for work lately and got tripped up recently on an element that had id “#1_ul.” Selenium kept throwing an error that the selector was invalid. I used FireFinder to generate a unique CSS selector for the element, and it returned “#\\31_ ul”. This puzzled me, until I came across this post on CSS selector escape sequences. It turns out that I needed to escape the leading digit in the selector. The way that CSS selectors work, to escape any numeric character, just prefix it with \3 and append a space character. This has to do with Unicode.
I discovered a handy git command on accident recently that allows you to cherry-pick the most recent commit to a repo. It’s as easy as:
This is a pretty funny/interesting story that I heard on the Security Now podcast earlier today. This wannabe vigilante drove around for 2 years on the highways in Florida with a cell phone signal jammer in his SUV, which is VERY illegal because it blocks emergency services. Cell networks are designed in a way that makes it easy to detect interference (MetroPCS noticed that their signals were regularly flatlining on the same stretch of highway twice a day), but it took awhile to track this guy down. When the police pulled him over to arrest him, they noticed that their radios had lost all contact with dispatch. He’s not facing any jail time, but IS looking at a $48,000 penalty from the FCC for his antics. http://www.theverge.com/2014/5/1/5672762/man-faces-48000-fine-for-driving-with-cellphone-jammer
I was in need of a tool to test out some XPath selectors for the Selenium framework I’m using as part of a project I’m working on, when I stumbled upon FireFinder. This is an add-on for Firebug, so it’s only compatible with Firefox. It’s extremely useful, though, for testing out XPath selectors. Definitely recommend it for web developers.
We use a lot of abbreviations in this field. I’ve started this post as a way of keeping track of all of them.
You can use the terminal on OSX to generate a pop-up alert. Simply enter:
There are several things you can do with iTunes in the OSX terminal.
You can add a custom search engine to Chrome that you can activate with a keyword. Just replace the query string parameter in the URL with “\%s” and Chrome will substitute it in when you do the search.
You can search by parameter in the OSX Finder’s Spotlight Search.
Sometimes I go to share a link on Facebook from my website, and Facebook has an older image in its cache that it uses for the preview. I found out recently that you can force Facebook to update its cache of your link by visiting the Debugger at https://developers.facebook.com/tools/debug/. Simply go here, paste in your link, and click “Fetch new scrape information.”
Did your terminal lose color after changing the color scheme? Add it back with these two lines in ~/.bash_profile.
If you have an unwanted file that is staged for commit, but you want to preserve your changes to it for committing later, execute this command:
CSS3 filters work in most browsers and allow web developers to add interesting effects to photos, including converting them to grayscale.
I had to clean up a Mac with some browser hijacker malware recently. This tool proved to be the most effective.
Want to log in to your Linux server without using your password AND be more secure? You can do this with SSH keys.
I’ve been doing a lot with reverse SSH tunnels for remote support lately, and wanted to make sure that my VPS was locked down. Here are the steps I took to make that happen.
EXIF (Exchangeable image file format) is a standard that specifies metadata for images. This allows digital cameras and phones to embed GPS coordinates, camera type, resolution, timestamps, and much more into the image file.
“Marquee” is a somewhat esoteric HTML tag introduced in Internet Explorer 3 that is used to create a scrolling area of text. It has a direction attribute that specifies the direction that the text should move in. The text can also be set to bounce around when it hits the end of its scroll area.
The HTTP Referer (originally a misspelling of “referrer”) header field identifies the address of a web page that linked to the resource being requested. It is a widely-used feature around the Web that is often used for analytics (in particular, identifying where a website’s traffic has come from).
I wrote a quick little shell script this morning using the YAHOO Finance API to show the stock price of my company in the terminal. This works for any company that’s publicly traded. Just change “JIVE” to your desired company’s stock ticker code.
I use the Dvorak keyboard layout, which is great but problematic when, for example, I have a coworker who needs to type something on my machine. It got tedious clicking through options to change the keyboard layout, so I created a hotkey to do this. Go to System Preferences -> Keyboard -> Shortcuts. Select “Input Sources” from the menu, then check the “Select the previous input source” box. For some reason, it defaults to Cmd + Space, which is the same hotkey that Spotlight uses. I use Alfred, which activates with Option + Space, so it wasn’t a problem for me to just disable Spotlight’s hotkey. If you do use Spotlight, you can customize the hotkey in the same window.
Code Introspection is the ability to inspect the code in a system and to see object types. Reflection is the ability to make use of code introspection to modify classes at runtime.
I found a handy git command autocompletion script recently. It does tab-completion of various git commands, as well as branches. It’s very simple to install. Just follow the guide at: http://code-worrier.com/blog/autocomplete-git/.
I spent yesterday hiking near Warm Springs with some fellow Jivers. Toward the end of the hike, a herd of wild horses galloped over one of the ridges and ran past us. It was surreal.
In Java 7, an implicit finally block will automatically close an output stream. Meaning that, instead of all this:
Sometimes, you may find yourself in a position where you need to securely copy some files through an SSH tunnel that spans multiple hops. Never fear, because it’s just as easy as a couple of terminal commands.
I finally got a chance to stitch together the biggest panorama I took this summer. This was taken during the last sunset I spent at Cloudy Pass. It’s difficult to describe the breathtaking beauty and magnitude of this place. These mountains surround you and are all that you can see for miles. A picture may be worth a thousand words, but there is really only one word necessary. Awe.
I like to use hotkeys for frequent tasks whenever possible. With that in mind, I created a hotkey to toggle applications as fullscreen in OSX. This is an easy process. Simply go to System Preferences -> Keyboard, click the “Shortcuts” tab, and go to App Shortcuts. Click the “+” button to add a new shortcut. For the “Menu Title,” enter “Enter Full Screen.” Then assign the shortcut by pressing the keys you want (I set mine to command + esc). Click “Add,” and your shortcut will be assigned. I added another shortcut for “Exit Fullscreen” and assigned it to the same shortcut. That way, the hotkey acts like a toggle for that functionality.
Are you annoyed by setting up VPNs?
In Java, sometimes it can be useful to have exactly one instance of a class. This is known as a Singleton pattern. A logger, print spooler, or window manager would be potential uses for this.
I was writing some Python code for a project and needed a class to hold constants. Unfortunately, Python doesn’t natively support constants or static classes. After trying several different methods of implementing a constants class in this language, I decided to use a meta class. The code looks like this:
I was writing a class to construct CURL requests in Python. I decided to experiment with making one of the methods static. To do this, simply place a [email protected] decorator before the method declaration.
A NullPointerException in Java is thrown when an object is expected as a parameter, but null is passed instead. To avoid this when doing String comparisons, use Object.equals instead.
I spent the weekend camping at Buck Lake. It’s a serene alpine lake in the middle of the Mt. Hood National Forest and the camping spots are an easy, mile-long hike from the parking lot. The fall colors were gorgeous.
My recent move to Portland precipitated (pun intended) an upgrade of my iPhone armband. In college, I used a plastic bag and a Belkin armband on rainy days. I’m running further than I was then, and prefer to save the plastic. So I shopped around on Amazon and picked up two cases to test.
I was looking for a guide on how to do this, and the one that finally worked for me was found here. I copied it for reference and made a few minor corrections.
I’m on a budget, and needed a NAS for Time Machine backups. I happened to have 8GB of RAM, an old AMD Athlon X2 machine, and 7 Western Digital Caviar Green 1 TB drives to spare. I did not, however, have a CD drive, so I was stuck installing purely using the ISO and USB drives. After I assembled the machine, I ran into many headaches getting FreeNAS to actually install.
My uncle went paragliding recently in Tillamook. I cut this video together out of the 15 minutes of footage he recorded on his GoPro. He went with Max Rock Paragliding, and said it was an amazing experience.
This summer was a very unique time to be in Holden Village. Rio Tinto’s $200+ million mine remediation project was running full-throttle and extensive infrastructure projects were undertaken in the absence of guests. The following is a list of some of the major happenings of the summer.
Portland’s Forest Park has some excellent mountain biking trails that I’m just starting to explore. Most of the park, including the Wildwood Trail, restricts access to hikers only. However, there are several fire lane entrances and trails that permit bikes. These include:
I went on a ride last night with my uncle and his friend from the Portland Zoo to the waterfront, passing through Washington Park and the Pearl District on the way. It’s a fun route, and I’m looking forward to biking more in that area. (Disclaimer: Watch this video on small–I stabilized it but it’s still a little nauseating full screen.)
During a recent hike to Broken Top, I took a few shots of my parents’ dog, Cody, catching snowballs. I used my Canon SL1 on Time-Value mode with a shutter speed of 1/1250, an F-Stop of 7.1, and ISO 100. I was fortunate to have a highly luminescent scene, because a shutter speed that high significantly cuts the amount of light that hits the image sensor. In retrospect, I probably could have increased the ISO to 1600 without introducing too much noise. This would have bought me up to 4 stops of increased shutter speed for more motion-stopping power.
The “find” command is very flexible, powerful, and worth knowing whether you administer UNIX-based systems or are just a power user.
On Friday, I hiked from Todd Lake to Broken Top with my sister. We’d read about the hike in Virginia Meissner’s Central Oregon hiking guidebook, and thought it looked scenic. It certainly did not disappoint. For most of the first and last 6 miles, there is a great view of Mt. Bachelor. At the turnaround point, there is a gorgeous glacial lake and a ridge that provides incredible views of the Three Sisters mountains as well as Mt. Jefferson and Mt. Hood. If you start at Todd Lake, the hike is 14 miles round trip with just over 700 feet of elevation gain. The distance can be shortened by driving on a rough road to the Broken Top crater trailhead. The clearance on our car was minimal, so we took the longer route. The hike has become more popular due to an article in the newspaper recently, so expect to see several people on the trails.
Sometimes, after doing a Photomerge in Photoshop (File -> Automate -> Photomerge), you end up with a panorama that looks like this:
I recently wrote a multithreaded download queue manager in Python. I had the actual file downloads running in its own thread. I only wanted the program to download during certain times of day, and decided to implement this functionality using thread events. I set up my threaded class method for downloading to accept a “stop_event” parameter.
My coworker was configuring a Windows Update server recently, and the domain was being blocked. We realized that there was a DNS entry that redirected Windows Update traffic to a local server. The way that we discovered this was with the Unix “dig” command.
I borrowed a friend’s old GPSmap 60CSx to build an elevation profile of a hike that we had gone on. The device was purchased in 2006 and not supported out-of-the-box by any Garmin software I could find. After trying out several programs to import data, EasyGPS for Windows worked the best. I ran it in a VM on my Mac. After I installed the USB drivers for the GPSmap, it was able to import all the tracks and waypoints from the device.
It’s pretty straightforward to daemonize and communicate with a Python script using the PYRO (Python Remoting Objects) library. I found this example on StackOverflow recently and it worked for my purposes.
I spun up a VPS recently and needed to pull files down via SFTP. I automated this process by using SSH keys and a BASH script.
I ran out of space on a VirtualBox Windows VM recently and needed to resize the virtual hard disk. I searched around and these are the steps that ultimately worked for me.
I’ve spent this summer working as an IT systems administrator Holden Village in the North Cascades. The following is a list of gear I picked up to prepare for my mountain adventures, as well as a few items that are on my wish list.
The following is a collection of some of my favorite quotes. I’m working on getting accurate citations for some of them.
The following is a collection of my favorite quotes related to the outdoors.
I’ve been using the iOS 8 beta for the past few days. Here’s a compilation of the weirdest and funniest contextual text message suggestions I’ve gotten from it.
The FCC is meeting tomorrow to discuss the new rules on Net neutrality. Here’s a brief explanation of the debate. Please take a few minutes to get familiar with the issue and make your voice heard; as a citizen of the Internet, this affects you.
Sure, more and more WiFi-connected home automation gadgets are being released on the market. But most of them are prohibitively expensive, and it’s still very early in the Internet of Things era. Who knows how the market will shape up in the next decade; New protocols will be developed, better products will be released, prices will drop. Why waste hundreds of dollars speculating on the technology of tomorrow when the technology of yesterday works just as well, and is cheaper?
After using my roommate’s new late 2013 MacBook Pro and seeing the performance he was getting with his SSD, I decided to upgrade mine. I own a mid-2012 13″ model, but this upgrade should be compatible with most unibody MacBook Pros from the past few years.
Last semester, I had the incredible opportunity to meet Alexis Ohanian, the co-founder of Reddit. He visited Oregon State University as part of his “Be Awesome Without Their Permission” tour, and gave an inspiring and humorous presentation about entrepreneurship in the digital age. I’m very much looking forward to reading his book, “Without Their Permission: How the 21st Century will be Made, not Managed.”
1. Pop up a message in the Finder
spent most of my weekends this summer exploring the Columbia River Gorge. Here are some of my favorite places I visited.
As a kid, I thought it would be awesome to own a smart home. In 2009, I decided to make that dream a reality and started on the project. For the past three years, I have built on it and I now present a comprehensive guide to automating your home on the cheap. I call my system HAL, after the evil computer from “2001: A Space Odyssey,” and as an abbreviation for Home Automation with Linux.
I recently converted my old desk into a standing desk. I did this because of back pain from sitting for long hours studying, because I felt that it would make me more productive, and because recent studies have shown the harmful effects of sitting for extended periods of time.
I attended an excellent webinar on Google Analytics the other day hosted by Niel Robertson and Anna Sawyer from Trada. I’ve been using some metrics in my custom reports similar to theirs for a couple of my clients, but they had a few very insightful ones that I jotted down and implemented immediately. The combined list is as follows:
I was looking for a new apartment for when I go back to school, and wanted a listing of all apartments in the area. Thankfully, someone had already mapped out every apartment complex in a Google Map. Unfortunately, however, I also wanted the prices associated with those, but was not able to edit the listings to include them. I worked around this by downloading the map data and uploading it into my account, essentially making a copy of the public map that I could edit. Here’s how to do this:
With prices falling on hosting costs and Google placing more SEO value on site load speed, Content Distribution Networks (CDNs) are rapidly becoming more relevant and practical. In this article, I’ll show you how to leverage Google’s App Engine servers into your own free CDN!
I love Adwords Editor, but I hate logging in every time I use it because my password is so long that I have to open a browser, log in to Lastpass, copy my password, and then paste it into the login box. I can understand the security considerations by Google, but still prefer to avoid tediousness and repetition when I’m trying to get work done. Here’s my solution:
Original Problem: My ISP is fast but they limit my monthly bandwidth.
Thanks to an excellent post on Digital Inspiration, dozens of people (myself included) have set up proxy servers on their Google Apps developer accounts that you can now access freely and easily, as most of them didn’t think to tweak their security settings to protect from getting indexed in Google’s search results: http://goo.gl/pDR4.
As we’re all painfully aware, IVR (Interactive Voice Response) systems are overused as a bad substitute for real customer service. Here are two simple ways to get around most of the ones you’ll ever encounter:
Yahoo Pipes is the Swiss-army chainsaw of remixing the web. It pulls in data from any web pages, spreadsheets, or RSS feeds that you choose and can filter, extract information (like prices or e-mail addresses), overlay it on a map, and much more. I’ve used it to:
I recommend setting up a local WordPress installation to test any new plugins before you install them on your live site because I’m a firm believer in Murphy’s law. I can’t say how many times I’ve run into embarrassing, unexpected compatibility issues with older WordPress versions or other plugins that took my site offline. It’s easy to repair a damaged local site, but not so easy to repair a bigger site with more traffic while it’s live. You would think that this would be a straightforward process given the millions of blogs on the internet there using WordPress, but I’ve found that most of the time it’s a pain.
Real-time data is the future of the web. Unfortunately, this future is far from evenly-distributed, and many times you’re not able to make use of information because of this. Consider the following scenarios:
- You’re looking for a new place to live and aren’t having luck with Craigslist. You find several local real estate brokerage sites but none of them have RSS feeds, leaving you with a nagging suspicion that there are better deals out there that you’re not equipped to take advantage of.
- You want to track updates in a timely manner to a job listing site that doesn’t have an RSS feed.
- You want to track updates on a Wikipedia article about a topic you’re interested in.
- You want to find out any updates about an obscure news story on a site that doesn’t have a feed. The following resources are ones that I’ve personally tested for turning static pages into dynamic content. This is the foundation for much more exciting, innovative, useful, and, above all, easily do-able projects that I’ll discuss in future articles.
- Documents/Calendar/E-mail: Google Apps Standard Edition. Google Apps provides Gmail, Calendar, and Google Docs by default and hundreds of optional applications in their Apps Marketplace. I recently moved my e-mail accounts to Google (though this site is still hosted with HostGator) and it was a relatively painless process. Google provides 7GB of storage space shared between Gmail, Calendar, and Docs as well as an Exchange Server for syncing with your iPhone or Blackberry. In a later post, I’ll talk about setting up a VPN for securely sharing files and more using Google Apps.
- Video Conferencing: Skype. Disclaimer: I haven’t had a chance to try this out yet and it’s still in beta with mixed reviews from testers. That being said, Skype is a popular, profitable, reliable company whose service I’ve used as my personal phone for over a year, so, even if the service has a few kinks at the moment, it’s not going anywhere. I’ll post a proper review later once I’ve test-driven it myself. For now, other alternatives include ooVoo and VoxOx.
- Conference Calls: Freeconferencecall.com. I had a short and unprofitable (to put it euphemistically) stint doing multilevel marketing at one point in my life. The one thing I learned, however, (aside from how to lose money while straining relationships with friends and family) was how to host conference calls for free. I can’t say enough about this service; they provide not only high-capacity conference calls but the ability to moderate and record the calls–it’s incredible that they’re able to have a sustainable business by giving away so much functionality for free.
- Invoicing: Freshbooks.com. I use this service for my personal clients and it’s made my life so much easier. The free plan limits you to 3 clients but gives you the full functionality of the service including project management, tracking time (for you and employees), automatic invoice e-mailing, and an optional client login page that allows them to pay you through PayPal. They even have an iPhone app.
- Backup: Backupify.com. The free version of Backupify gives you 2GB of storage for backing up cloud services from Delicous.com to Twitter to Google Apps. Backups are automatic and can be set up to be e-mailed to you. I just started using this service in mid-May and it’s very easy to set up.
- E-mail Alerts and Filtering: Syphir.com. This one isn’t a standalone app (it requires Gmail), but it’s so useful that I had to include it. Syphir adds more complex filters for Gmail and even allows you to send notifications to it’s $2.99 iPhone app. I use it to notify me whenever a client sends an e-mail or leaves a voicemail on Google Voice. As opposed to being notified of every e-mail on my iPhone, Syphir is very convenient.
- CRM: SugarCRM. The free, open-source (PHP-based) version of Sugar isn’t hosted (you have to download it and host it on your own domain) but I recommend it because I haven’t found anything better yet available for free. I set it up in March for a client and it’s allowed us to segment our sales team so each member can only see and update accounts that they’ve created. Other useful functionality includes website integration for capturing leads.
- Tech Support: LogMeIn. After a set of unnecessarily long and frustrating tech support phone calls with friends, family, and clients I discovered this service and breathed a huge sigh of relief. The free version is Mac- and Windows-compatible allows secure, remote control of up to 16 different computers (with their owners’ permission, of course) through a web browser. Even if you’re not in IT (I’m definitely not), this service is very helpful. You can turn your mouse into a laser-pointer and point out where whoever you’re helping should click, show powerpoint presentations, magnify items on the screen, and it even supports computers with multiple monitors.