17 Jan 2012Here's one more post in my productivity serie. This one is about the Dropbox service.
What is Dropbox ?
In a nutshell, Dropbox is a private hosting service, based on a cloud infrastructure. Once you've installed the app, one of your folders (default to ~/Dropbox) became synchronized with your Dropbox account. Every document that you save in that folder, and any subfolder you create, will immediatly be saved online in your Dropbox account.
In the real world, it means that you can easily share one folder and all its documents easily between all your computers. If you don't want to install the app, you can simply log to dropbox.com and download/upload any file you want.
How I use it
There a few ways you can use Dropbox. Here are a few of mine, feel free to add yours in the comments.
As I used to work on Windows (and I still have to sometimes), I always had to install a bunch of apps on a brand new computer before being able to start working. This includes the traditional antivirus, browser, music player, IDE, etc. Instead of going through the laborious process of downloading all the installer on each of the websites, I've saved them in my Dropbox and I just have to install Dropbox, then install the apps I need.
Instead of a bunch of todo.txt files spread accross all your computers, wouldn't it be tidier to only have one, shared ?
The same goes for the KeePass file, so you can have an easy access to all your passwords.
I also use it to synchronize my Tomboy notes between my computers (I'll go into more details in another note).
It might be a bit excessive, but I personnally also share my icons, sounds, wallpapers and other customization stuff, so I won't feel lost on a new computer.
Thanks to the amazing Doxie scanner (more on that on another note), I'm now a scan junkie. I scan all the official paperwork I got in my physical mailbox and store it in the Dropbox.
Be it a bill or a banking receipt, I scan anything that looks like official and that I might need again one day. That way, I know I can always connect to dropbox.com and find any official document of the past 5 years in a matter of minutes. This saved my day quite a few time already !
Last words
Dropbox is a free service. You can have 2Go for free, or pay for a more space. I personnaly only use a fraction of that so I stay on the free plan. I haven't mentionned it because I don't use it, but you can also share some folders with other Dropbox users, which is a nice addition when working on the same project.
07 Jan 2012In a previous post, I bloggued about the way to emulate OOCSS behavior with multiple classes in IE6.
Today, I'll do a follow up and write about a possible gotcha involving the :visited pseudo class.
Following the previous example let's imagine you have a styling for your defauls links (a { color:blue; }), one for the default buttons (.button { ... } ) and one for a custom button that extend the .button (.customButton { ... })
Now, imagine that you'll want to style all :visited links the same way non- visited links are styled. You might write something like :
a, a:visited { color:blue; }
Unfortunatly, this will have some nasty side effects on your .button and .customButton rules because a:visited will have precedence over .button and .customButton
You can find more information about CSS specificity in this Star Wars post.
Your first solution could be to add even more specificity to your own rules, to override the a:visited one, like so :
.button, .button:visited { ... }
.customButton, .customButton:visited { ... }
This will work, of course, but you're only adding complexity to your specificities, and this get more and more tedious the more you add other customised buttons.
In fact, there is a much better way, one that you could throw in your reset.css if it isn't there already :
a:visited { color:inherit; }
That way, all your visited links will inherit their color from their non- visited version. This mean that visited .button will use the .button color, visited .customButton will use .customButton color and simple visited links will use the a color.
Of course, if you defined a background-color in your a, you should define a background-color:inherit in your a:visited too.
06 Jan 2012In a pure OOCSS style of writing CSS, let's imagine you created a css class of .button that visually turns a simple link into a button.
<a href="#" class="button">I'm a button</a>
Now, if you want to define a custom version of your button, let's say a button that will trigger a very dangerous action, you might want to style it differently, so our user will think twice before hitting it.
You got two ways of achieving this, depending if you still support IE6 or not.
Simple way for non-IE6
If you don't care about IE6 (and hell, it's 2012, you shouldn't), you just have to add a second class to your button/link :
<a href="#" class="button dangerous">I'm a dangerous button</a>
And in your CSS file, just define some special styles (like a red background) to your dangerous button.
.button.dangerous { ... }
Actually, that's the path followed by Bootstrap(among others). But it will not correctly work in IE6, because it does not understand multiple classes rules. Instead, IE6 will read .button.dangerous {} the same as .dangerous {}.
This will cause problems as soon as you'll use the .important class on something else than a .button : IE will apply the .button.dangerous rules to anything with the .dangerous class.
Other way, for IE6
The solution I personnaly use to fix IE6 is to use more explicit classes instead of using multiple ones. For example, instead of .button.dangerous {} I'll use .buttonDangerous {} and write my html like this :
<a href="#" class="button buttonDangerous">I'm a dangerous button, even on IE6</a>
That way, the link will have both the styles of .button and .buttonDangerous. This will assure cross compatibility with IE6, at the expense of a (arguably) less readable markup.
As of today, I hope that I'll never have to code for IE6 websites again, but if you ever need to, that's a little trick that can really help.
05 Jan 2012This post will be the first of what I hope will be a long serie of posts. I'll blog about some of the little tricks I've learn in the past years that make me go faster on my daily job.
I'll start with something I can no longer work without : my global hotkeys.
The concept is pretty simple, I've binded some keys combinations to launch specific applications or directories. It might not seem very important, but it does make you gain a tremendous amount of time for those apps you launch pretty often like browser, IDE, or project directory.
I used to work on Windows, and I then used a little script named AutoHotKey to bind my keys. The script even comes packaged with its own language if you ever want to script complicated stuff.
I'm now working under Ubuntu, and the global hotkeys can be defined directly from the System Settings (in 11.10 it's System Settings > Keyboard > Shortcuts > Custom Shortcuts)
Opening apps
I choose a key combination hard enough to type so I won't type it by mistake, but easy enough to remember that I could type it whenever I want.
For example, I binded all the app I use the most to a Ctrl+Win+{Letter} combination. Ctrl+Win+C opens Chromium, Ctrl+Win+F opens Firefox, Ctrl+Win+T opens Trillian, etc.
Opening folders
I used a close combination for opening directories : Ctrl+Win+Alt+{Letter}. Those three keys are side by side on most keyboards so pressing them is easy.
This time I used the letter H for my home folder, D for the Dropbox folder, W for /var/www, etc, etc.
I've tweaked my keyboard in a few other ways, but this will be the subject of another post. Hope this one gave you some ideas.
04 Jan 2012Yesterday, I've tried to install nodejs and the jshint package to add automatic jshint parsing to my vim.
Well, it wasn't so simple due to a bug in the npm version shipped with node.
Here are the complete commands to run to make it work, in case I had to do it again :
# Download and extract node
cd ~/local/src
wget http://nodejs.org/dist/v0.6.6/node-v0.6.6.tar.gz
tar xvzf node-v0.6.6.tar.gz
rm node-v0.6.6.tar.gz
# Compile and install
cd node-v0.6.6
./configure
make
sudo make install
# Update npm
sudo npm install npm@alpha -g
# (Optional) Clear npm cache
npm cache clean jshint
# Install jshint
sudo npm install jshint -g
Source : https://github.com/isaacs/npm/issues/1888