• Home
  • Blogger
  • Github
  • Travel
  • The Tank Project
skip to main | skip to sidebar

Steven Occhipinti

A braindump.

A few photography tips

A little while ago, my brother got me a photography course as a gift, so I asked a friend of mine, Amy, to join me and last Thursday night we attended the course. The course was a "Night Landscape" tutorial where we all brought our own cameras and a professional photographer guides us through how to take photos at night. The class was quite small, it consisted of Amy and I with one other student.

The course started out quite basic and we went though some fundamental theory, a lot of which Amy and I already knew, but the other student was a little less experienced so the photographer needed to cater for all of us.
Luckily it was just a small class, because instead of following the standard course structure, the photographer spent more time in conversations with us, answering all our specific questions.

Being self-taught, I am grateful for that, because these conversations were what lead me to learn a few new things that I hadn't picked up in my own research so far. Here is a quick summary of the things I learned:


1. Blowing out the sky, intentionally

The first new tip I learned was a trick the photographer used when the scene has an unusable sky, such as a dull cloud cover (like last night in the rain). He would take another photo that was intentionally over-exposed so the sky was as white as possible. By doing this, afterwards in Photoshop a pure white sky is very easy to select, even through the leaves of a tree or someone's hair using tools like the magic wand, or a color-based selection and can be replaced with a more dramatic sky from another shoot.


2. Hand-holding at night

At night, it is normally quite hard to take photos without blurring the shot unless you have a tripod, but there is a simple rule of thumb that can help with selecting an appropriate shutter speed:
"Make the denominator of the shutter speed match the focal length"
So if you are shooting at a 20mm focal length, the shutter speed should be about 1/20. Of course, this isn't a perfect rule, but it is a great place to start and you can adjust from there.


3. Freezing human motion

So the previous tip will make it easy to minimize any blur from yourself when holding the camera, but that wont help with people in your shot moving around. Well this photographer recommends a shutter speed of 1/125 as a baseline to freeze human motion. It turns out that most movement from people is slow enough for this shutter speed to capture it sharply, and of course you can adjust as necessary.


4. Filters to allow for more creativity

So far the only filters I have used are a "Circular Polariser" to enhance sky's, cut out reflections, etc. and a "UV" filter to protect the lens. Our photographer had quite an impressive set of filters and gave us a demo of his "Neutral Density" (or "ND") filter and a "Graduated Blue-Yellow" filter.
Long exposures can look really good at night, but they are normally impossible during the day, but with the ND filter, not much light gets through, so long exposures are needed even during the day. Our photographer had a street art photo with blurred clouds and deep dark colors in the middle of the day - it looked fantastic!
The "Graduated Blue-Yellow" filter changes the color of the light that comes through, and in this case, it enhances the blue colors of a sky at the top of the shot and the earthy yellow tones of the ground on the bottom of the shot. I had only ever known these colors to be improved like this with the use of software, but these filters had a great effect straight from the camera.


So at the end of the day, the course was quite basic, but in our tangential conversations I gained some pretty cool tips and tricks.
I think the most valuable aspect of a course like this is not so much the material presented, but just to experience another photographers style. It's always interesting to see how everyone thinks about things in their own unique way, and going through other peoples photos with a conversation is really intriguing.

Thanks to Rob and Sarah for the gift and Amy for keeping me company!
Posted by Steve at 00:44 0 comments
Labels: photography Email This BlogThis! Share to X Share to Facebook

Bluetooth audio streaming from phone to Ubuntu

I was toying with the idea of making my own "Car Computer" and one of the crucial parts is a Bluetooth connection, but not for P2P file transfer (although that could be useful), I would want this computer to appear the same way a Bluetooth stereo or headset does, so once connected it will stream the audio from my phone through the car speakers. Turns out it's quite easy with Ubuntu :)

PulseAudio is pretty awesome!
First step is ensure Pulse has the Bluetooth module loaded (mine did by default), you can check this by looking at this file /etc/pulse/default.pa

The next step is to configure the Bluetooth daemon to enable "Source" (and/or "Gateway" mode).
To do this, I added the following line to /etc/bluetooth/audio.conf:

Enable=Gateway,Source,Socket

Then restart the Bluetooth daemon:
$> sudo service bluetooth restart


Now you'll have to pair the computer with the phone as per normal.

Once the devices are paired, an "Audio Source" connection needs to be created.
For this, the easiest way is via DBus, but so we don't have to write a script and easy way to test this in an ad-hoc manner is to use a tool called 'd-feet', which is available in the Ubuntu repos.
$> sudo apt-get install d-feet

Using d-feet, navigate to the system bus and find the org.bluez key.
In here, there will be another key that has a device number in it. (for me this was /org/bluez/1002/hci0/dev_xx_xx_xx_xx_xx_xx)
Under this key, execute org.bluez.AudioSource > methods > Connect() without any parameters and your phone should now indicate that it is connected to the computer as an audio device.

At this point, I started playing some music so I could tell when it was working, but you probably won't be able to hear anything just yet.
That is because Pulse does not automatically send every source to every output - that could get messy!
To configure pulse to send the audio from the Bluetooth connection to your speakers you need to determine the name of the audio source and the name of the "sink" (or output) and join them together.
You can do this with the PulseAudio shell like this:

$> pacmd
>>> list-sources
>>> list-sinks
>>> load-module module-loopback source=bluez_source.xxxx sink=alsa_output.pci-xxxx

(Replace the underlined parts with the names from the preceding two commands)

Now all audio from your phone should be streaming through your computer.
DBus makes it really simple to do this programmatically, so it could easily be (mostly) automated and even controlled by a nice touch friendly GUI to pick the source device, etc..

I thought I would write up a quick post on this because when I finally got my music streaming through my laptop, it was exciting to know that I could actually use this to make a car computer with bluetooth functionality quite easily.
I used "AudioSource" in this example, but the other fun option is the "HandsFreeGateway", where instead of streaming stereo sound for music, it will also connect the microphone from the computer to the phone to be used in-call, etc.

The resources that helped me with this where:
http://jprvita.wordpress.com/2009/
http://ubuntuforums.org/showthread.php?t=1464189
http://ubuntuforums.org/showthread.php?t=1904447
Posted by Steve at 22:27 5 comments
Email This BlogThis! Share to X Share to Facebook

Changing the default boot option with GRUB2

Gone are the days of the nice /boot/grub/menu.lst file, but with new tools comes new features.


Changing the default boot item

In Grub2 you can change the default boot entry by editing the /etc/default/grub file.
In this file you'll see something like this near the top:
GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

The first line above tells Grub to boot the first boot entry by default (menu item with index 0).
You can simply change this to menu entry you prefer, but whenever you make any change to this file you need to run the following command to make the changes take effect:
$> sudo update-grub

Changing the default boot entry from the command line

A new feature that Grub2 provides is to change this option dynamically from the command-line.
In order for this to work, instead of setting the GRUB_DEFAULT option to the desired index, set it to 'saved' instead, like this:
GRUB_DEFAULT=saved

And run update-grub to make the changes take effect:
$> sudo update-grub

Now you can use the grub-set-default and the grub-reboot commands.
Both commands take the index of the boot entry you want as a command line argument:

$> grub-set-default <entry>
This command will permanently set the default boot entry to the index specified on the command line, useful if you tend to change the default regularly.

$> grub-reboot <entry>
This command will reboot the machine and boot into the specified boot entry, but only that once. The following boot will use the default.
Posted by Steve at 21:33 2 comments
Labels: linux , ubuntu Email This BlogThis! Share to X Share to Facebook

Getting started with Ruby on Rails

I've been using Ruby on Rails for about a year and half now and I'm really enjoying it! At the time of writing (at least in Melbourne) there is lots of demand for Rubyist's, so it's great time to get involved.
I have a couple of friends who are interested in making the switch from Java to Ruby so I wrote them an email with some pointers on how to get started and then realized it would make a good blog post :)

Join the community!

Ruby and Rails are quite well known for their excellent communities, so the first step is to join your local group. For us in Australia, that group is "Ruby On Rails Oceania" (aka RORO).
They have meetups on the last Thursday of every month in Melbourne and a pretty active mailing list:
  • Ruby On Rails Oceania Mailing List
  • Ruby.org.au

Ruby and Rails resources:
  • Rails Guides - I use these almost everyday!
  • ApiDock - API's for Ruby, Rails and RSpec in one place
  • Rails For Zombies - A great beginners tutorial for rails
  • Rails Casts - Regular video podcast all about rails
  • Ruby5 - Regular 5 minute audio podcast on the latest news
  • ... a plethora of good books, such as "The RSpec Book", "Design Patterns in Ruby", etc. (alot of which I still need to read)

Getting started:

To get started you'll need to set up your development environment, here's what I use:
  • Vim... of course... although there are lots of alternatives, the most popular ones would probably be:
    • RubyMine (IDE) - used alot at work (commercial software)
    • Sublime Text 2 (Text editor)
    • TextMate (Text editor)
  • RVM (Ruby Version Manager)
    • Get from here: https://rvm.io
    • Follow the instructions to configure your shell to use RVM
    • Use RVM to install the latest ruby
      • $> rvm install 1.9.3
    • A newer alternative to RVM is RBenv
  • Once you have ruby installed, you will have the 'gem' command available
    • Gems are roughly equivalent to jars in the Java world
    • Use gem to install the latest rails
      • $> gem install rails
  • Once you have rails installed, you will have the 'rails' command available
    • Use the rails command to start a new project
      • $> rails new todolist
      • $> rails server
      • browse to http://localhost:3000
  • Now you can read the readme, the rails guides and make a simple app with scaffolding!

Things to keep in mind for RoR dev:
  • Rails is just a framework written in Ruby, so it will help to learn some straight Ruby too.
    • ruby-lang.org is a good place to start
  • Ruby on Rails strongly supports DRY principles, don't reinvent the wheel, theres problably a gem that already does what you want.
    • To find gems, good places to look are:
      • Ruby-Toolbox.com
      • RailsCasts.com
      • RubyGems.org
      • GitHub.com
  • The majority of Ruby projects are:
    • Developed using TDD/BDD, so you'll need to learn the testing frameworks:
      • Test::Unit (default with rails)
      • RSpec (a popular replacement for Test::Unit)
      • Cucumber (BDD)
    • Developed on MacOSX - for new comers (like myself) some essentials are:
      • brew - a mac package manager (like apt or yum)
      • iterm2 - really good terminal emulator
    • Deployed on Linux
      • Basic Linux foo is really useful
    • Version controlled with git
      • If you need to learn git, I highly recommend Pro git

That's a quick overview of what I can recommend to get going based on my own experience, things will obviously change over time, and others may have other opinions, if so feel free to leave comments below.
Posted by Steve at 23:29 0 comments
Labels: programming , rails , ruby Email This BlogThis! Share to X Share to Facebook

Samsung Galaxy S3

At the end of June this year, I upgraded from a HTC Desire HD to a Samsung Galaxy S3, so I thought after a couple of months of having my new phone I should write up a (really long) post on what stood out for me.


The positive

The screen and form factor is awesome! Due to the plastic body and the thin shape, this phone is really light and slips into your pocket nicely. The massive 4.8" screen really shines when watching videos and browsing the web. I regularly watch screencasts on my phone and the 1280x720 resolution gives me plenty of detail. The colour contrast is a lot higher than my previous phone, which makes the blacks look really deep and videos stand out nicely. The marketing video that the phone comes with does demo it off quite well!

The battery is fairly good. My requirement for battery life is that I can use it all day and by the time I get home / go to bed, it hasn't died. Not a high expectation, I know, but these days its hard to expect more. This phone meets that requirement quite easily. On the days I don't use my phone much, I get home after a days work with more than 50% remaining (which is huge compared to my last phone!) and on the days I use it quite heavily, I get home to about 30%-40% which easily lasts me the rest of the night. My usage generally includes syncing gmail, facebook, twitter, weather, RSS reader, work email (during peak hours), I am generally connected to wifi most of the time and I regularly browse the web and watch videos / listen to podcasts during my commute.

The general responsiveness is miles ahead of my last phone too! Day-to-day usage is smooth and rarely experience any lag. This will be improved even more when Jellybean is released (rumoured to be soon!).

"Smart Stay" is a new innovative feature from Samsung where just before the screen is about to timeout and turn off, the phone will take a photo of you with the front-facing camera and use face (or eye) detection to work out if you're still looking at it. If you are, it will keep it on for another minute or so, if you're not, then it will dim the screen and check again soon after, which then will actually turn it off.
This is to avoid that randomly-scrolling-to-avoid-the-screen-turning-off trick that most people will do when reading a long article. Thankfully, this feature is quite effective and I haven't needed to do that for a while, although it doesn't work very well in the dark!

In the settings, there is a section called "Motion". I won't go through all of the options, as there are about 10 different ones, but some are quite handy. By far the best one IMHO is "Direct call", which lets you directly call a contact whose call log details, contact details or message details are displayed on the screen by simply putting the phone to your ear from that screen. Feels very natural.
Another nice one is "Smart alert", which will give a little vibration when you pick it up from a stationary location if you have a missed call or sms.

The camera on this phone is not too bad either. Obviously it will never replace my dSLR, but it has some nice features that even my dSLR doesn't have. The burst fire mode is really quick, but Samsung have introduced a feature called "best shot", which will analyse each of the photos you took in the burst and pick the ones it thinks turned out the best, based on focus and face detection. You can adjust what was picked, and then the others are automatically discarded (saves you having to go through the 14 bad ones and delete them later).
The camera has a built-in HDR mode which works quite well too and the photo editor provides heaps of enhancements and corrections, including red-eye reduction, color balance, cropping, etc.

Another nice feature is found in the video player, it has a "pop-out" button! This means that if you're in the middle of a video and you wanted to quickly google something, or reply to an sms, you can just pop out the video, which turns the full screen player into a small, floating, always on top window that you can drag around, do what you need to do, and then make it full screen again. Not something that I've needed to use very often, but on the rare occasion I have, it's been quite nice.

I use my calendar religiously and on my older HTC, the default app looked nice, but didn't have many features. I ended up swapping it out for Business Calendar Free just so I could get a month view with text, instead of indicators.
The stock Samsung calendar, S Planner, however is not too bad! It integrates with their S Memo, which I don't use, but comes with a good number of viewing options, my favourites being their month view and analogue week view. It also has a nice "Quick add" feature that lets you enter "Dinner at Nandos tomorrow 7:30pm" and it does what you'd expect. This doesn't support anywhere near as much as Google Calendar does, but its better than nothing!

I lashed out and bought an official Samsung Desktop Dock, and comparing this to my cheap eBay special I bought for my HTC, not only does it look quite nice, but it automatically launches the desktop clock app when I dock it and after 5 minutes it dims the screen and hides the other UI elements other than the clock. I like this feature a lot because I otherwise don't have a clock in my room, so its really handy for me!


As with all things, there are pro's and con's. Here are some of the things I don't like.


The negative

Android have decided to remove USB Mass Storage mode (my biggest pet hate with Android right now!) This leaves you with 3 alternative options for copying files to and from the device: Media Transfer Protocol (MTP), Camera mode or using an app such as Kies Air or File Expert.
MTP and Camera mode both don't give you access to all the directories on the phone, but for just transferring media it should be ok. Note that MTP will work out of the box with Windows, but if you run Mac or Linux like me, you will need to install software to get it to work (and Linux is a pain for this!).
The reason for this change is because USB Mass Storage mode will mean you have to unmount the partition from the system in order to mount it to the computer, whereas MTP will allow you to access it in both places at once, but its slower and requires software.
For phones like the Galaxy Nexus, this makes sense as there is only one partition, but with the S3, I would like to see the option of just unmounting the memory card (with is separate from the system storage) and allow that to work with USB Mass Storage mode.

Another annoying thing I have found with this phone is sometimes the home screen will randomly die. This causes lag while all the widgets reinitialise themselves. It doesn't happen often, but when it does, its annoying considering its a simple software issue. Hopefully this is fixed with Jellybean release!

On a related note, I find the random delay between pressing the unlock button and the screen actually turning on to be annoying too, considering my older HTC was basically instantaneous everytime, this phone seems to vary quite a lot. I find myself pressing the button while its still in my pocket, just so by the time I have it in front of me, the screen is ready.

A couple of other minor things include the notification LED being really bright, which is ok, but while the phone is docked my bedside, it will light up the entire room quite easily. This is kind of funny considering "smart stay" doesn't work well at night. Maybe instead of just green and red, the LED should have also included an IR LED for that.
Not only is the LED really bright, but when the battery becomes fully charged, it will turn on the screen and popup a notification, which is also not very nice when I'm trying to sleep.
I know most of you are probably thinking a solution would be to turn it off at night, but I scheduled my phone to download podcasts during these hours with BeyondPod - I think the pro's outweigh the con's in this situation.

Also minor, but there is no stock flashlight app, which I wanted to put in the lock screen shortcuts. It does come with a 2x1 widget, but to get a shortcut on the lock screen, I ended up downloading one of the million flashlight apps out there.

Speaking of widgets, the HTC widgets were really nice, but I find the widgets that came with the Samsung are not quite as useful, luckily they are in abundance on the play store too!


The other stuff

Here are some other noteworthy things which I haven't really made up my mind if I like yet or not.

The music player has a feature called "Music Square" and I love the idea of it, but I'm not sure how effective it is. Basically you index your music library and it categorises each of your songs into 2 scales: 'Exciting to Calm' and 'Passionate to Joyful'. These two scales make up the axes of the music square and by tapping where your mood is will play those types of songs. It's a great idea and I need to experiment with it more to see how effective it is.

A lot of the features in the phone are voice activated. For example, you can say 'answer' or 'reject' when it is ringing (as long as the ringtone isn't too loud); 'snooze' or 'stop' when the alarm is going off (as long as thats not too loud); 'smile', 'cheese', 'capture' or 'shoot' to take a photo (as long as your close enough for the phone to hear you); 'next', 'previous', 'pause', 'play', 'volume', etc. to control your music or the radio (as long as thats not too loud either).
As you can see, the usefulness of these features are dependant on the environment.

S Voice is Samsung's answer to Siri, and even the UI's look similar, but while its great in theory, I think the most useful thing about Siri on the iPhone or S Voice on the Galaxy would be SMS/email dictation, but that is the one thing these features don't work that well for, at least for me anyway - maybe its just my voice!


The conclusion

In the end I am very happy with my new phone, it is leaps and bounds above my old phone, its really responsive other than the random home screen lag and unlock button delay, it has some nice new innovative features and is a joy to use.
Also, with the Jellybean release (hopefully) around the corner, it can only get better.
Posted by Steve at 22:50 4 comments
Labels: android , review , Samsung Galaxy S3 Email This BlogThis! Share to X Share to Facebook

Adding a network printer in Ubuntu 12.04

In the old days, printing was really hard in linux. It was one of the things that was a deal breaker when trying to switch from Windows for a lot of people, but when I first tried Ubuntu (probably around 2006-2007) it made all that pain go away! It was easy! A couple of clicks and you could set up a network printer and its been that easy ever since.

Recently Ubuntu have tried to make their settings screen a bit like a Mac, and to simplify everything they seem to be using a simplified user interface for the printer configuration too:

New Setting user interface

New Printing user interface

Well this new interface doesn't work for me, when I try to add a network printer, I get the error message:

'FirewallD is not running. Network printer detection needs services mdns, ipp, ipp-client and samba-client enabled on firewall.'

The error that stops me from finding my network printer

Well no matter what I did, I couldn't add my printer. After some googling around, I found how to get to the old user interface... which actually works!
Just type this into a terminal:

$> sudo system-config-printer

And you will be given this old familiar screen:

The classic printing user interface... the one that works!

Clicking the big "Add" button in this screen and following the steps worked great for me. Another alternative is to use the CUPS web interface on http://localhost:631 but that can be a little more complicated.
Posted by Steve at 14:11 12 comments
Labels: howto , linux , printer , ubuntu Email This BlogThis! Share to X Share to Facebook

Arduino Web Server with SD card reader

I've had an interest in electronics since a very young age, but I never really went further than building simple circuits as a kid and learning the theory and following diagrams through school.
There's always the odd repair job, and plenty of theoretical knowledge from family, friends and university, but I wouldn't be able to design the electronics of anything complex.

A little while back, a friend of mine got an email from meetup.com with suggested meetups. One of them was the Melbourne Hackduino meetup.
So he forwarded it on to our group of friends and a few of us went along to check it out. I've always wanted to play with a microprocessor, but never really put the time aside for it. Being a software developer there was always this barrier between the programs I write and making them do something in the real world.

Well, in the last week that barrier has been lifted! The meetup was great and hearing about other people's hobbies and projects provides plenty of motivation! We heard stories about everything from people trying to optimize solar hot water systems to building full size mechanical avatars. It was a lot of fun!

Mark Butt, the organiser of the event gave us a presentation of some of the cool things he has done in the past, such as an arduino powered bar counter top that detects what drink you put on it and a run down of some of the things he plans on doing in the future, all very cool!

One really nice bonus was the generous offering from Freetronics. There were a few people from Freetronics at the event and other than being very knowledgeable, they brought a big bunch of assorted hardware to give away! They had everything from RGB LEDs to full blown Arduino boards. I was lucky enough to score an EtherMega 2650, which from what I can tell is a beefed up Arduino with an Ethernet port (with power over Ethernet) and a MicroSD card reader. Some of my friends got a LCD shield that can display 2 rows of 16 characters and has a few buttons on board. For those that aren't up with the lingo, a shield is an attachment for a standard Arduino board to add functionality.

Together we had enough hardware to be able to make something cool! :-)
Needless to say after some great conversations about hardware hacking and being given some gear to get going, we were all pretty keen to get started hacking, so on the following Saturday three of us got together for a hack night.
The guys came around that night, we ordered pizzas and worked through the night till about 5:30 AM! We had one experienced hardware guy, Anthony, but the other two of us, Michael and I, were completely new to this, but between Anthony, the sample code that comes with the IDE and the Internet we picked it up pretty fast!
By the end of the night we had the first version of CarDuino!

CarDuino is a simple game where you hold the screen in portrait orientation and move your car from side to side to avoid obstacles. It's a very simple game, and we have plenty more features in mind for the future, but it was a great first project!


After sleeping in till about lunch time there next day, I wanted to put my EtherMega to use, so I spent the rest of the day fiddling with that. With network access, power over Ethernet and a card reader, this is a perfect platform for controlling things via a web interface. As my background is web development, this was right up my alley! Using various sample code, I put together a really basic web server that can respond to different requests and serve files from its built in memory card reader.

My Freetronics EtherMega 2560 serving files from the memory card on a webserver!

In just a few days, we went from no Arduino experience to a working project (or two). Especially with basic programming experience, the entry level for getting into Arduino is really low. When you buy (or build) a board and download the software, you have enough sample code with the IDE to make things happen, and you can get a lot done by simply copying and pasting!

 I recommend having a play with this stuff, its really fun and more than likely, one day you will come across a problem that you will be able to solve with an Arduino!
Posted by Steve at 12:47 0 comments
Labels: arduino , hardware Email This BlogThis! Share to X Share to Facebook

Google Calendar - Repeating an event on the last <weekday> of the month

I regularly attend RORO - The Ruby on Rails Oceania meetups.
They currently occur on the last Thursday of every month and so naturally I put the event in my calendar. I added the usual details and then selected the "repeat" option and set it to repeat monthly by the day of the week.

This worked well for a while, until one day when I rocked up and it wasn't on.
A later realised that in that particular month there were 5 Thursdays instead of 4 and my calendar event was actually set to repeat "Monthly on the fourth Thursday".
It turns out that the interface Google provide to set recurring events does not allow you to change this.. or at least not intuitively.

After some searching around I found a few solutions:


Use English!

The simplest way is to just write out the event in plain English. For example:
RORO at Inspire9, Richmond on the last Thursday of every month
This will create an event called "RORO at Inspire9, Richmond", with the location field set to "Inspire9, Richmond" and the repetition set to "Monthly on the last Thursday".


Start repeating from an appropriate month

Another fairly easy way is to find a month that actually has 5 Thursdays and make the event start from there. This will set the recurrence to repeat "Monthly on the last Thursday", instead of "Monthly on the fourth Thursday".


Hack the ICS

This solution is probably the hardest, but because the iCalendar format does support this, you could write the code manually. To do this you would have to export the calendar to a file, hack it and import it back.
While it's nice to know this, seems like more effort that just typing what you want in English!


A better solution

.. would be if Google provided an additional option in the little "repeat" popup to allow this!

Or maybe the RORO organiser should maintain there own calendar feed that we could all subscribe to. This would also mean that if a particular meetup was moved or cancelled, all the subscribers calendars would automatically be updated!
Posted by Steve at 22:19 2 comments
Labels: calendar , Google Email This BlogThis! Share to X Share to Facebook

Password management

Password management is one of those things that can always be improved. If anyone is using a single password for all their accounts in this day and age they are most likely going to experience trouble at some stage! This post is to outline my progression through some approaches I've tried starting from a very young age to present day.


Attempt #1: A tiered approach

For me, the natural progression from a single password (back in primary school) was to go with a tiered approach. I used one password for for the basic sites, spam, etc. - the stuff I don't really care about very much. I used another password for the important stuff, like Facebook, Twitter, etc. and this password was a lot stronger than the last. I had a unique and strong password for my email, as someone with access to that would most likely have the power to reset any of my other passwords. And finally I had a completely separate password for banking.

While this system is ok, it's not the best! Once upon a time, way back before I could touch type, I came to a password prompt, so I looked down at the keyboard, typed out my password, pressed enter and looked back up at the screen. In that time a friend had sent me an IM on MSN messenger (I know, old school!) and the chat window had stolen focus, so I sent my password to him. While I (mostly) trust my friend, in a panic, I frantically raced around to as many sites as I could to change the password to something else.

If I had a different password for each site, this wouldn't have been a problem. Now obviously most people wouldn't IM their passwords to their friends, but there are lots of other ways for your passwords to get out. A few simple examples are the "Anonymous" attacks on large systems like the PSN, keyloggers, people looking over your shoulder, phishing attacks and even stupid websites making dumb mistakes! Of course, this isn't even thinking about what would happen if you were the target of a good hacker! ... but that'll never happen right? ;)


Attempt #2: Patterned alterations

Ok, so if I want a different password for every site I will ever use, how will I ever remember all of them. Well one simple way would be to make careful alterations to the password based on a pattern. This pattern should not be obvious by looking at a given password, but it should be reproducible based on whatever site you are trying to log in to. For example, if your normal password is 'P@$sW0rd', one pattern could produce 'T@$sW#Er' for when you're trying to log in to Twitter and "F@$sW#Ok" for when you're trying to log in to Facebook.
I'm sure you can guess the pattern here. Everyone will have their own unique twist on patterns and this can be quite successful if executed correctly, but of course if your pattern is weak and a real person gets your Facebook password of "P@sS-facebook", they can probably guess your twitter password would be "P@sS-twitter".


Attempt #3: Stored, centralised and synchronised passwords

Alot of people think that letting your browser remember passwords is a bad thing, and while it does have particular cons, there are some pros to it too.
For one, you can have completely random passwords and not have to remember them. Also, two of the methods of disclosing a password that I mentioned earlier were keyloggers and someone looking over your shoulder. Both of these scenarios are a lot less likely if your browser does the typing for you (but of course there are other considerations with this approach). The obvious con would be that if someone gets a hold of what the browser knows, they have all your passwords!

Firefox provides a "master password" facility to encrypt all your passwords (one of my pet hates is that Chrome lacks this) so when a password is needed, you type in your master password once, and it will then autofill any field after that. (Just remember to lock your screen if you leave your pc unattended).
Special consideration to make this password super strong should obviously be taken to avoid any brute force possibilities and of course a master password can be stolen just the same, but this password is useless online and it reduces the probability of others being stolen. (1 chance to steal the master password, as opposed to many chances to steal individual passwords).

Now throw Firefox Sync into the mix. Now all your encrypted passwords are in the cloud and available on any machine running Firefox. I found this to be really handy, but it represents its own risks. This is also just limited to Firefox, what about mobile browsers? What about Chrome or your friends computer?
Again, not a perfect solution, but not too bad either.


Attempt #4: Personal vault

Some really paranoid people will say "But what if Mozilla aren't encrypting your passwords properly?", or "I don't trust other people to store my passwords regardless of encryption". Well, in that case, if you want to store all your random passwords, and ensure they are encrypted, you could always do it yourself.
I played with a nifty command line tool called "PWS" and its open source so you can see exactly how they secure your passwords. The beauty about this method is that you are in complete control. For example, I could use a central repo to store my encrypted passwords and keep this synchronised across all machines, and if I don't want to check out the repo (say, on a friends computer), I could just SSH to my VPS where I could get the password. It doesn't fill forms in browsers, but it will copy the password to the clipboard for 10 seconds so you can just paste it in the browser (which is vulnerable to clipboard monitoring software/viruses).
It even has a random password generator for new sites.
While this method is great for paranoid people, its lacking a lot of features I would expect.


Attempt #5: Hosted password services

If you were to combine the best parts of the previous methods, you would get a hosted service that provides browser plugins for form filling on any browser, is centralised and synchronised across all machines, is encrypted with a master password, has an easy way to pull out any existing passwords from a "vault" and makes it simple to sign up for new sites with a unique random password.
As it turns out there are quite a few of these services available, such as 1Password and LastPass.

1Password is quite popular, especially among Mac users and provides clients for Mac, Windows, iPhones, Androids, etc. The interface is quite polished (as you could have guessed) but it costs about $50 for a Mac licence (or $70 if you want to use it on Windows and Mac). One feature that a lot people like is that you can choose where you would like to store the passwords, for example using dropbox to synchronise across machines, but personally I don't think that provides any real advantage.
LastPass is very similar in terms of features, but they host your encrypted passwords for you and it is free! They have plugins and clients for almost every conceivable device, but the only catch is that if you want to use the mobile browser plugins, you need a premium account, which costs $12 per year.

I've been using LastPass for a little while now and one thing I like the configurable random password generator. You can choose just how complex the generated passwords are by configuring length and character set. When you sign up for a new site, you can generate a ramdom password with one click and it will get entered into the site's form and saved in your vault for future. It can fill in standard forms with your personal details (name, email address, etc.) It is accessible anyway by logging into the web interface and its all secured using a master password, which I recommend using a super strong passphrase for, something in the order of 20-30 characters would be good. Remember if someone can log in here, they can get everything!

Another layer of protection is using 2 factor authentication. They have a few varieties for this, but the one I like is the Google Authenticator method. Basically when ever a new device is used to attempt to log in with your account, either using a plugin, app or just the website, they will need to provide the email address, the password and a token. To get this token I configured the Google Authenticator app on my Android, which means that even if someone was to somehow get my super strong master password, they would also need my phone before they can do anything.
I use this approach on my Gmail account too, but Gmail's 2 factor authentication uses SMS's instead of the Google Authenticator app.


Conclusion

So far I am pretty happy with LastPass. I now type in my super strong master password once a day and the rest is filled automatically. Signing up to new sites is a breeze and uses a completely random and unique password per site. My passwords are available in Firefox and Chrome; in Linux, Mac or Windows and potentially for my mobile browsers too (if I decide to pay $1 per month). Not only is my master password really strong, but it is backed up with 2 factor authentication using my phone. I can even get to my passwords from a public computer via the web interface and my phone (without needing to go via dropbox or anything). Best of all, I get all this security and convenience with minimal effort and without paying a cent!
Posted by Steve at 23:46 1 comments
Labels: security , websites Email This BlogThis! Share to X Share to Facebook

1 year and 40 posts!

Today marks 1 year since my first blog post.
In that time I have written 40 posts and this site has received over 7000 views from all over the world!
I've had some great feedback (even from total strangers), which has been fantastic - It's a good feeling to know that my ramblings can actually be useful for others too.

I started this blog because as a fairly technical person, I am constantly learning, but one of the caveats of this constant learning culture is that some people (such as myself) find it quite hard to remember all the cool stuff we pick up over the years, so this blog's primary purpose was to act as a "memory supplement".

The idea being that when you read something new, it will only stay in your head if you keep using it (or, unlike me, if you have a really good memory), but sometimes what ever it is that we just learned won't be totally relevant or useful until much later.

One of the best ways that I have found to retain this knowledge is to use it! For example, if you are reading up on a new programming language, use it! Write little scripts, re-write other existing programs in this new language and just get used to using it regularly.
If this isn't available (or suitable) I find talking about it with other like-minded people will reinforce the knowledge too. Alot of the time, you can really reinforce your knowledge of a topic by teaching it to someone else. Meetups and groups of like minded friends are great for this.

This is part of the reason I started this blog. Once I learn something new (that I have a desire to remember) I try to write up a quick blog post as soon as I can.
Not only does this reinforce my knowledge, but if I do happen to forget, instead of using Google to re-learn it, I can simply use my blog's search to find my own post on the topic and has the convenience of being written in my own way of thinking/writing.
Even if my post is out-of-date, or not complete enough, it will still refresh my memory and give me a better foundation to start learning up on that particular topic once again.

This blog has served its purpose well and will continue to do so. If you have a similar way of thinking (or a similar memory) as me, I highly recommend starting a blog!

Thanks to everyone that has been reading so far! :-)

Posted by Steve at 17:07 0 comments
Email This BlogThis! Share to X Share to Facebook

XBMC Eden + Ubuntu

Back when I started uni, I bought a new Asus A6J laptop. It was one of the first laptops available with a dual core CPU (Core Duo, not Core 2 Duo) and decently powerful graphics (ATI X1600).
The A6J is very dated now and weighing in at 2.85kg, its not very portable by today's standard (considering my Toshiba Portege weighs just 1.13kg).
A couple of years after I bought it, I got sick of carrying it around, so I bought an Asus EeePc as a replacement for uni, so the A6J stayed at home and was rarely used - it was just a spare for a long time.

Up until recently, I was using I used it as a (stationary) desktop replacement at work but I now have a new job where I am provided a Macbook Pro so this old machine is now spare once again. This with the recent release of XBMC 11 Eden, I thought I may as well re-purpose it as a permanent HTPC.

I considered quite a few options, such as running Arch Linux, OpenElec or Ubuntu with XBMC installed, or going with the recently improved XBMCbuntu (formerly known as XBMC Live).

XBMCbuntu

I downloaded the iso and had a bit of a play. I love how it boots directly into XBMC without the need to startup Unity or anything like that, although it does let you exit to the login screen and select either "XBMCbuntu" (LXDE) or "OpenBox" which is nice.

Once it had booted, it behaved so slow! I figured it mustn't have the correct drivers installed, so I tried to use the restricted drivers from the repo and after hitting quite a few problems I consulted the AMD site.
The AMD site explains that my ATI X1600 is now "legacy" and is supported by the ATI Catalyst 9.3 proprietary linux driver.
So I downloaded that and yet again hit a bunch of other issues.

I spent a fair portion of the day battling with this and couldn't help but think back to how easy Ubuntu Desktop handled all this, so I thought I'd just give that another go.

Ubuntu Desktop + XBMC

I downloaded the Ubuntu 11.10 iso and installed that over the top of XBMCbuntu and configured the user account as 'xbmc' and to automatically login at startup.
I then followed the instructions to install XBMC from their PPA. I did a quick update, installed SSH, reconfigured grub to auto-boot in 1 second (instead of 10) and rebooted the machine.

When I launched XBMC, it was perfect! It was very snappy and there was no lag whatsoever. 
I noticed that the power menu was missing the shutdown options that were in XBMCbuntu and that the suspend option did not work.
After a bit if research, I found a wiki page that explains how to modify policykit to allow xbmc access to all the power functions.
With this change, shutdown, suspend and hibernate were all working great.

I had already configured Wake-On-Lan in the past, so all that I needed to do was setup the Android XBMC remote app on my phone. After configuring the app with the laptops IP address, MAC address, etc. I was now able to use the "Turn your XBMC's Power On" button from the mobile app to fire up the laptop.
Of course to actually allow control of XBMC I needed to go into the settings screen and enable control via HTTP, etc.

So now I can power up the laptop and shut it down from my phone, but when it boots, I am brought into a Unity environment. In the past I would add XBMC to the startup applications, but with XBMC Eden, there is a better way.
XBMC Eden adds it self to the choice of desktop environments from the login screen (in other words, you get a choice: Unity or straight into XBMC like the live cd).
Unfortunately it doesn't remember the last choice with XBMC, so if I boot straight into it and then shut it down, next time it will still automatically boot in to Unity.

I then came across an Ubuntu community page that pointed in the direction the the LightDM config file. (LightDM is the thing that manages the login screen).
I opened '/etc/lightdm/lightdm.conf' and saw this line:
user-session=ubuntu

I replaced the 'ubuntu' part of this line with 'XBMC', rebooted and low and behold, it booted straight into XBMC!

I now have a fully functional HTPC that I can completely control from my phone.
The only things left to do now are configure my media sources, install some plugins and maybe play with some new skins.
Posted by Steve at 20:23 3 comments
Labels: ubuntu , xbmc Email This BlogThis! Share to X Share to Facebook

Rooting the HTC Desire HD & Cyanogenmod 7

At the end of last year my HTC Desire HD got its firmware upgrade to the new version of HTC Sense - the same version that the HTC Sensation is running.
At the time I thought it was quite cool, having shortcuts on the lock screen is great and the new eye candy looks pretty nice too.

But there were some very unwelcome changes with this new version too... lag and poor battery life!
I generally keep my phone on charge at work, so I didn't think this would bother me, but it got so bad that if I went out after work, by the time I got home it was flat (from 6pm to later that night). Even swiping between home screens would lag! So I figured it was time for a new phone, but in the meantime I thought I may as well experiment with rooting and other OS's.

To root the Desire HD is quite simple. The first thing to do is go get the "Advanced Ace Hack Kit" from the XDA Forums. In the zip file is all the tools you need to run the hack and most importantly, the aptly named "effen-manual.html", which is very important!

The manual explains everything you need to know, but the first step is checking that the version of android that you are running can be exploited.
I had software version 3.12.405.1, which judging by the effen manual, the hack tool can automatically downgrade to version 2.50.405.2 where there exists a flaw that can be exploited to give you root access.
Keep in mind that doing this will wipe your phone, so backup everything.

The effen manual also explains how to setup your computer to enable the hack tool to work properly. There are very few steps for linux which was great!

If you follow the instructions correctly, you will then have a stock standard install of an older version of HTC Sense. There are some advantages to having root access such as apps like titanium backup, ad blockers, etc. but the real fun comes from installing new Android ROMs.

I looked at 2 third party ROMs, the first was Cyanogen Mod and the second was Android Revolution.

Android Revolution looks pretty good. Visually it looks and behaves just like HTC Sense but they have made lots of improvements under the hood which in turn increases performance and battery life. As good as this looked, I haven't actually tried this option yet. Instead, I opted to go for a bigger change of scenery and give Cyanogen Mod a go.


Cyanogen Mod does not look like HTC Sense at all. Instead it is based on stock standard Android 2.3. They have then implemented a slew of changes that come as default, such as an audio equaliser, ADWLauncher, the super-user app, a completely customisable button widget in the notification bar, customizable lock screens and a pretty cool torch app that lets you over charge the LEDs for super brightness!
This mod also lets you overclock the hardware, put limiters in place and lots of other options I was not used to seeing in the HTC Sense ROM.

The 2 most important advantages of this change are that the UI is now quick and responsive again, I now have complete control over which effects are used and things like how long the animations should last, etc. and I have the best battery life I've ever had with this phone - I can now use the phone pretty heavily all day without needing a charge until I go to bed!

Very happy with it now and it should keep me tied over until the Samsung Galaxy SIII is released :)
Posted by Steve at 18:10 0 comments
Labels: android , hacking Email This BlogThis! Share to X Share to Facebook

Spam defence

For quite a long time I used to use Yahoo! Mail.
Even though I was lucky enough to get an invite for Gmail in its early stages, Yahoo! Mail had (IMO) one killer feature: Address Guard

The idea behind Address Guard was simple, you make your primary email address, say john.smith@yahoo.com, and then a secondary "base name", such as johno007.
This base name was not just another email address, infact all mail sent to johno007@yahoo.com would get dropped.
Instead, use that base name to create an unlimited number of "disposable addresses", such as johno007-facebook@yahoo.com, etc.

The idea was that if you follow the simple 3 click process (settings -> addressGaurd -> add new address!) to create a new disposable email address every time you signed up for a new website, if ever they spammed you, you simply delete that address and they wont be able to bother you any more - brilliant!

I avoided Gmail because they didn't have the same "whitelist" approach to email addresses, but when I bought my domain name and started using Google Apps for email, I decided to use Gmail as my primary email provider.
Naturally this forced me to look for a similar way to defend again spam (albeit Gmails spam filtering is quite good).

Google Apps provides "nicknames", which works in much the same way, you can have an unlimited number of aliases for an account, except the process was a bit longer (settings -> manage domain -> users -> Your user -> Add a nickname) and I got too lazy for that after a little while.
I still use nicknames for certain things, but not for every website I sign up for.

That's when I discovered the + symbol in Gmail. Unlike Yahoo! Mail that uses the "whitelist" approach (only addresses you created will accept mail), you can use Gmail with a "blacklist" approach (all addresses accept mail unless you block them).

Assume your email address is john.smith@gmail.com, you can append a + and then any (valid) characters you like to the end, such as john.smith+facebook@gmail.com and it will still get delivered.

If some rogue website starts sending spam to john.smith+dodgysite@gmail.com, then you can go into the Gmail settings and setup a filter to delete all mail that is sent to: john.smith+dodgysite@gmail.com.

I don't think it's quite as nice as Address Guard, but it is a bit more convenient because there is no set up. The biggest downside is that quite a few websites consider an email address to be invalid if it has a + symbol in it, but most are fine.
Posted by Steve at 22:14 0 comments
Labels: email Email This BlogThis! Share to X Share to Facebook

XKCD + BeyondPod

On my Android phone, I use an app called "BeyondPod".

BeyondPod is great because unlike Google Reader and Pulse (which are other great RSS readers), BeyondPod will download video and audio podcasts on a schedule.

What this means for me, is that at 2:30 AM, my phone will use my home ADSL2's off-peak downloads and fetch a bunch of regular podcasts so when I wake up and make my way into work, I will have all the latest episodes of my favourite shows to watch and listen to on the train.

One of the feeds that I'm subscribed to is XKCD. If you look at the comics online, you probably already know that if hover your mouse over the image, you get to see an extra message about the comic.

On Google Reader, you can tap and hold the image and use the menu to get to the tooltip, but with BeyondPod, there is no such option.

This means that the tooltip is actually included in the feed, so I thought it would be pretty easy to write a little proxy that pulls out the "title=" attribute and appends it to the body.

Before I started coding, I thought that surely someone would have already done this, so after a quick Google search I came across a Yahoo! Pipe from "Benjamin Cook" that does exactly that.

Ben's Pipe appends a "<br />" and then the tooltip, but the "<br />" seems to be getting escaped, so I copied the pipe and removed the "<br />" and the end result was exactly what I wanted.

If you have a similar problem, you can add my version of the pipe to your reader and here's what it'll look like:


Posted by Steve at 15:10 0 comments
Labels: android Email This BlogThis! Share to X Share to Facebook

Git + Hub = GitHub

As mentioned in a previous post, we use GitHub-Flow at work and I really like it.
In essence, it involves doing work in feature branches, while maintaining an always deployable master branch, then opening a pull request to merge a new feature / bugfix into master, which provides a great mechanism for code review / sign-off.

So a fairly typical situation would be as follows:
  • Bug found in app
  • Create an issue on GitHub with description, assignee, etc.
  • Create a new branch off master for the fix
  • Code it up, test locally, etc.
  • Push branch to GitHub
  • Open pull request to merge back into master
  • Get review / sign-off inside of the pull request
  • Deploy
When a pull request is opened on GitHub, it automatically creates an issue for that pull request, which would normally be helpful, but we already created an issue when the bug was discovered.
So now we have 2 issues and 1 pull request. What's nice is that if I push more commits to that branch, it will appear in the pull request automatically, but not the initial issue.

After looking into this, it seems (AFAIK) GitHub do not provide a way of attaching a pull request to an existing issue via the site, but they do provide that functionality via their API.

That is when I discovered Hub.
Hub is a wrapper for git and while it adds more power to alot of the standard git commands, hub adds one command that is really useful for me:

git pull-request -i 49

This basically means "Open a pull request to merge the current branch into master and attach the pull request to issue 49".

This means that the initial bug description, the commits, the review conversation and the merge are all encapsulated in a single issue - fantastic!
I don't know why this isn't built in to the web interface (or maybe it is and I just don't know how).
Posted by Steve at 13:37 0 comments
Labels: git , github Email This BlogThis! Share to X Share to Facebook

Copy and Paste over SSH with Xclip

Have you ever SSH'ed to a server and found you need to copy some data back where a simple selection copy and paste just doesn't seem practical?
When this happens to me, I normally dump that data to a temp file, start up another terminal and SCP the file back before going back to delete the temp file, but I recently found a better way.

I discovered xclip. Using the -X option of SSH to enable X11 forwarding, xclip allows you to interact with the "X selections" clipboard.

To use it, log on to a remote server via ssh -X and ensure xclip is installed, then simply pipe data to xclip and you will be able to paste it anywhere locally with the usual X selection paste (mouse wheel click, shift-insert, etc.).

Here is an example:

ssh -X steve@example.com
sudo apt-get install xclip
ps -ef | xclip

Now anywhere on your local linux machine, you can press <shift>-<insert> (or mouse wheel click) to paste the content.
If you need to pipe this data to another process locally, you can retrieve the clipboard from the command like with xclip like this:

xclip -o | less
Posted by Steve at 23:59 0 comments
Labels: linux , xclip Email This BlogThis! Share to X Share to Facebook

Minecraft exception in linux


I finally decided to install Minecraft on my new shiny Toshiba Portege z830.
Ubuntu ships with an open-source version of Java, which did run Minecraft, but the graphics were terrible, even on the lowest settings. There were artefacts everywhere!

So as recommended, I switched to the official JRE, but now the login screen works, but that's about it. After logging in, I just got a black screen and the following exception in the console:


Exception in thread "Minecraft main thread" java.lang.ExceptionInInitializerError at net.minecraft.client.Minecraft.a(SourceFile:180) at net.minecraft.client.Minecraft.run(SourceFile:648) at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0 at org.lwjgl.opengl.XRandR$Screen.<init>(XRandR.java:234) at org.lwjgl.opengl.XRandR$Screen.<init>(XRandR.java:196) at org.lwjgl.opengl.XRandR.populate(XRandR.java:87) at org.lwjgl.opengl.XRandR.access$100(XRandR.java:52)at org.lwjgl.opengl.XRandR$1.run(XRandR.java:110) at java.security.AccessController.doPrivileged(Native Method) at org.lwjgl.opengl.XRandR.getConfiguration(XRandR.java:108) at org.lwjgl.opengl.LinuxDisplay.init(LinuxDisplay.java:618) at org.lwjgl.opengl.Display.<clinit>(Display.java:135)
... 3 more

After discussing the problem in IRC, the solution was quite simple. It turns out "lwjgl" is a "Light Weight Java Game Library" and the version I had wasn't behaving.
On the advice of the helpful IRC'ers, I downloaded the latest "lwjgl" from here (which at time of writing is 2.8.3) to get it all to work nicely.

To install it, I downloaded the zip file, extracted it to a temporary directory, then copied across these files:
cp lwjgl-2.8.3/jar/lwjgl.jar ~/.minecraft/bin
cp lwjgl-2.8.3/native/linux/* ~/.minecraft/bin/natives
Done! Now it works nicely.
Posted by Steve at 23:25 20 comments
Labels: java , linux , minecraft , ubuntu Email This BlogThis! Share to X Share to Facebook
Newer Posts Older Posts Home

Blog Archive

  • ►  2013 (4)
    • ►  June (1)
    • ►  May (1)
    • ►  March (1)
    • ►  January (1)
  • ▼  2012 (17)
    • ▼  December (1)
      • A few photography tips
    • ►  October (1)
      • Bluetooth audio streaming from phone to Ubuntu
    • ►  September (2)
      • Changing the default boot option with GRUB2
      • Getting started with Ruby on Rails
    • ►  August (2)
      • Samsung Galaxy S3
      • Adding a network printer in Ubuntu 12.04
    • ►  July (1)
      • Arduino Web Server with SD card reader
    • ►  May (2)
      • Google Calendar - Repeating an event on the last <...
      • Password management
    • ►  April (2)
      • 1 year and 40 posts!
      • XBMC Eden + Ubuntu
    • ►  March (3)
      • Rooting the HTC Desire HD & Cyanogenmod 7
      • Spam defence
      • XKCD + BeyondPod
    • ►  February (3)
      • Git + Hub = GitHub
      • Copy and Paste over SSH with Xclip
      • Minecraft exception in linux
  • ►  2011 (33)
    • ►  December (1)
    • ►  November (3)
    • ►  October (3)
    • ►  September (4)
    • ►  August (3)
    • ►  July (4)
    • ►  June (6)
    • ►  May (6)
    • ►  April (3)

Labels

android (5) apache (1) arch linux (1) arduino (1) bash (11) calendar (1) compiz (1) design (1) diff (1) email (1) gimp (1) git (3) github (2) gnome3 (1) Google (2) hacking (1) hardware (4) howto (1) htpc (1) java (1) lamp (1) linux (28) Mac (2) minecraft (2) mysql (1) netduino (1) nfs (1) parallel port (1) patch (1) photography (4) php (1) pidgin (2) printer (1) programming (6) python (1) rails (1) regex (5) review (3) ruby (3) Samsung Galaxy S3 (2) Samsung Series 9 (1) security (1) sed (3) ssh (1) sudo (1) tank (2) Toshiba Portege (1) troubleshooting (1) ubuntu (16) ui (2) unity (2) vim (5) webcam (1) websites (3) xbmc (1) xclip (1) xul (1)

Total Pageviews

Sparkline
 
Copyright (c) 2010 Steven Occhipinti. Designed by Conveyancing
High Deductible Health Insurance, Purchase Beats