“Fix” Eclipse’s UI With the Eclipse MoonRise UI Theme

A coworker tipped me off to a way to change the Eclipse UI from this mess:

SDK-RedFlag_Linux

Into this:
EclipseUiThemeDark

The magic is done through the Github project known as the MoonRise UI Theme. Installation is as simple as adding the update site into Eclipse and updating a UI preference. Make sure to add the “optional” RainbowDrops syntax highlighting scheme as the dark UI seems pretty useless without it. I found that even with the optional syntax highlighting I still needed to modify comment brightness and Java string text color.  For fine tuning of colors and text-brightness, simply right-click any text you’d like to tweak > Preferences > Java > Editor > Syntax Coloring, then find and change the Java, Javadoc, or Comment section you want to modify.

Wolverine’s Holiday Vacation in San Francisco!

Photo Dec 10, 10 10 37 AMRecently, I partook in Reddit’s Secret Santa 2013 -Reddit’s attempt to conquer the world record for the number of people participating in an international gift exchange.  At the time of this update, Reddit smashed the world record obtaining over 120,000 participants in 160 different countries. 

My pairing was with a Norwegian gal named Ava.  In her description she mentioned that she likes X-Men, and I had the idea to get a Lego X-Men character (Wolverine) and take him on an adventure in San Francisco, before sending him off to Norway.  Here is the story of our adventure around “Fog City.”

For those of you unfamiliar with San Francisco, or who simply want to follow along, I’ve created a Google Map indicating the location of each event.


Photo Dec 10, 9 19 20 AMWhile on a walk one day I spotted a strange-looking man sleeping on the sidewalk.

“Hmm,” I asked, bending over to check on him, “long night, I guess?”

“Uuuugh, it’s been a long week.  Help me up would you?” the man replied.

I bent over, lifted him and suddenly realized, “I recognize you!  I’ve seen you in movies.  What happened to you Wolverine?!”

Photo Dec 10, 9 17 55 AM“Ugh, I just got done fighting another villain for the countless time and it was harder on me than I expected.  I only wanted to take a short rest, and well… clearly, I was more tired than I thought.  Thanks a lot for your help!”

“No problem,” I replied.  “You sound exhausted.  I mean, you never hear about it, but… do X-Men ever take vacations?  You look like you could really use one.”

“No, not really,” Wolverine said groggily.

He paused, “Hey… now that you’ve got me thinking about it, a vacation sounds exactly like what I need! What are you doing today?”

“Well, I had planned on meandering about in San Francisco.  Would you like to come hang out with me today? I can show you around.”

“Yeah that sounds excellent, actually!  Sure you wouldn’t mind?”

“Not at all!  It’d be cool to hang out with a celebrity.  Also, I can show you some of the great experiences the city has to offer!”

“Sounds like a plan!” he exclaimed.

Photo Dec 10, 9 13 21 AM
Wolverine in front of the Walnut Creek BART station.

 

Photo Dec 10, 9 21 22 AM
Wolverine enjoyed the BART’s “gently aged” seats.

After that, we were set.  Wolverine accompanied me to the BART -the “Bay Area Rapid Transit” system of trains throughout the Bay Area. We took the train from my town into the city.

 

 

 

 

After our short ride in we reached the station next to my office building in the center of Downtown San Francisco.

 

 


We lucked out!  In a city renowned for its dense layers of fog, it was an incredibly sunny day! Barely a cloud in the sky!

Photo Dec 10, 10 11 37 AM
Little known fact about Wolverine, he has a bit of a sweet tooth when he’s on vacation!

 

 

 

 

When we got downtown, I helped Wolverine to some hot cocoa and cookies.  That man could eat!

 

 

 

Wolverine loved the authentic San Francisco Sourdough, the best bread in the world.
Wolverine loved the authentic San Francisco Sourdough, the best bread in the world.

 

 

I also got Wolverine a slice of bread from my favorite bakery called Acme Bread Company.





Around mid day, I ventured out to the rock climbing gym in nearby Oakland.  Wolverine tagged along for the exciting workout!

Photo Dec 10, 7 48 34 PMPhoto Dec 10, 7 55 40 PMPhoto Dec 10, 7 52 21 PMPhoto Dec 10, 7 48 44 PM

Wolverine is a great climber (naturally), and also very helpful and responsible.  He even helped to belay my friend while he was climbing.

Photo Dec 10, 7 56 12 PM
Wolverine understands other human’s don’t have his regenerative capabilities, so he’s very safe and careful when belaying.

When we finished there, we decided to go sightseeing.

Wolverine doesn't like politicians.
Wolverine doesn’t like politicians.

 

 

We saw the San Francisco City hall.

 

 

Photo Dec 17, 11 55 58 AM

 

 

 

We saw some tall buildings in SOMA -the “South of Market” district, a San Francisco hot spot for creative and well-established tech companies.

 

 
Eventually, we made it to the other side of town to take in one of the greatest overlooks in San Francisco, with a great view of the Golden Gate Bridge, and Alcatraz.

Wolverine got a bit windblown.
Wolverine got a bit windblown.
Photo Dec 17, 12 47 34 PM
Not a flattering picture of Alcatraz or Wolverine.

Photo Dec 17, 12 46 31 PMI gave Wolverine the option to head out on his own or join my coworkers and me at a local charity, while we packaged up meals for those in need.

Photo Dec 11, 1 23 05 PM
Wolverine got to see a great view of the San Francisco skyline during the day.

Photo Dec 11, 2 05 35 PM



An ol’ softie at heart, Wolverine decided to accompany me to Stop Hunger Now, a charitable organization that sends millions of meals to the hungry in third-world countries. We jumped on a shuttle and rode across the Oakland Bay Bridge.





With his help, we managed to package meals for over 78,000 families in just under 3 hours!





After we finished, we returned to my office building and I wanted to show him one more great view of the San Francisco Bay from my office rooftop before the sun set.

Photo Dec 17, 3 53 10 PM

“Well Brian, that was a great time today!  Thank you so much for showing me around and inviting me along on your volunteer trip.  This was exactly what I needed!  I’m pumped back up, and ready to face the world again.”

Photo Dec 10, 9 08 01 AM

 

“It was my pleasure Wolverine.  Where do you think you’ll go now?”

“I have some business to attend to in Norway -a meeting with a certain lady about a Secret Santa exchange.  I best be off.  Good luck to you Brian!”

 

And with that, he sped off to his next adventure.  Good-bye Lego Wolverine!  Take care of Ava!

Final Interview Results

The career fair has come and gone, resumes were dropped off, phone calls were made, flights were taken, onsite and offsite interviews were attended, and job offers were achieved.  Overall it was a success, and a lot was learned.  As I plan my next set of articles about any wisdom I can offer about the interviewing experience, I want to first give a few statistics anyone curious of what happened.

  • 23 resumes dropped off
  • 48 interviews with 13 companies
  • 6 job offers
  • 1 job :)

It was honestly an extremely exhausting and repetitive experience, but should hopefully be very encouraging for anyone looking to start a career in the Computer Science field out of college right now!

Interview Questions: Describing Code (Braces)

One of the most frustrating things during interview can be coding on paper then having to reiterate what you’ve written to an interviewer.  One frustration I’ve found was discerning the differences between the names of the braces used in programming.  Here’s a list to help with that:

  • ( ) – Parenthesis, aka open-bracket (used when defining ranges in math), or round-bracket
  • [ ] – Square brackets, or closed-bracket (used when defining ranges in math)
  • { } – Curly brackets
  • < > – Angle brackets, aka inequality signs, or just “brackets”

When describing them from left to right, ( is the “open parenthesis”, ) the “close/closing parenthesis”.

Example:

\[(\d{1,4}),(\d{1,2})\]

Would be “Backslash open-square-bracket open-parenthesis back-slash d open-curly-brace one comma four closing-curly-brace closing-parenthesis comma open-parenthesis backslash d open-curly-brace one comma two closing-curly-brace closing-parenthesis backslash closing-square-brace”.  This is why telling an interviewer a regular expression is a terrible experience.

Interview Questions: Linux/Unix

One thing I have neglected to study are the not-to-often used commands of Linux and Unix.  In an effort to make sure I never forget them, I’ll keep a list of the few that I have been asked about:

  • lsof – lists all of the files currently open in the operating system.
  • echo $SHELL – displays which shell you are currently using.
  • uname – displays which operating system you are running.  By itself it doesn’t tell you much, but uname -a tells you everything about the computer you are logged into.
  • find vs grep – use grep to find stuff in files, use find to find files by file name.  Specifically: find . -name filename -print looks for files matching the filename string.  You can use * for wildcard, eg: *brian* to look for any files containing brian (case sensative).

Golden Rule to Boost Website Performance

I just attended a Yahoo tech talk here at UCSD, held by Marcell Duran, Yahoo’s Frontend Lead with their Exceptional Performance Team. The tech talk was extremely enlightening and discussed the number one golden rule to boost your website’s performace:

Reduce the number of HTTP requests

While there are several ways to do this, such as making sure to cache content on visitor’s computers, the principle tactic recommended by Yahoo was to attempt to merge all of the JavaScript scripts, CSS stylesheets, and images into as few files as possible.

Tip 1 – Merge JavaScript and CSS: You should combine your JS and CSS pages into one large file JS/CSS page instead of having your site require user’s to fetch script1.js, script2.js, script3.js, …etc.

Tip 2 – Merge Images: Something else I learned tonight about strategies used to optimize load times of Yahoo’s home page is that through CSS, you can effectively “merge” images (called image slicing). When you view Yahoo’s homepage, there is the Yahoo Sites section on the left hand side:

Yahoo SitesWhat you may notice is that each Yahoo site has its own icon… or does it? If you inspect closer, Yahoo actually uses a single long image (on the right of this post) over and over again, but obscures most of the image except for the visible “icon” you see. This is image slicing, and is done by delivering only one image, and reusing different regions of the same image multiple times across the web page.

There were several other optimizations mentioned at the tech talk including using image compression, and even base64 encoding an image to have it delivered initially by using a URI scheme. This method is essetially taking the base-64 encoding of an image and embedding the encoded data in the initial HTML payload, instead of having it come up as a separate request for an image–information here.

When your webpage is optimized, Marcell mentioned a few tools that can be used to profile the webpage, specifically YSlow. This tool is a plug-in for Chrome, Firefox, and several other browsers, and analyzes the web page currently being viewed and rates it on 23 different criteria. The first rating mentioned: number of HTTP requests! The best part about YSlow is that it actually gives recommendations on how to optimize areas where the site is slow.

The original presentation available at: Yahoo’s Web Performance Optimization 101 slides.

How to Conquer the Atlassian Dragon

I decided to document my attempt at slaying the Atlassian “Dragon” in Atlassian’s Here Be Dragons challenge.  Atlassian is a software company, that makes bug-tracking, collaboration, and software management company with products aimed at software development teams, specifically those using agile methodologies.  Since they are near the top of the list of companies I will apply for in the next few months I thought I should familiarize myself with their product line as well.  I documented everything I did in case anyone wants to follow in my footsteps. I set up a Linux virtual machine using Oracle’s VirtualBox platform which runs on Windows, Linux, and OSX, and allows anyone to follow along if they like!  Warning: this is a fairly long article.

The quest begins with:

Beware, all ye who enter, for here be dragons! This is the starting point for the Atlassian Dragon Quest.

It involves setting up Atlassian’s main set of products:

Atlassian allows setup of their products on most operating systems, and supports many different databases for the back-end persistent data management.  Since they allow complete setup on Linux, I choose that route mostly to force me out of my Windows comfort zone.  I created a VirtualBox virtual machine running Mint Linux 11.  It took me longer than Atlassian’s expected 4 hour completion time since I also documented everything I did.  Here was my rolling documentation over the whole process:


Setup:

To begin virtual machine (VM) setup I have downloaded the latest version of VirtualBox (version 4.0.12 at the time of writing this) and have downloaded a distribution of Linux I had recommended to me by a friend last year called Linux Mint 11 (I downloaded the the 32-bit DVD ISO file).  Mint Linux is a derivation of Ubuntu Linux that includes several non-open source codecs, something Ubuntu does not like to include by default due to its “open source only” ideology.  I’m all for open-source, but that’s a topic for a different article.

Mint Linux VM Installation:

I have officially begun!  I have tweeted my status and am installing the Mint VM on VirtualBox.  Atlassian says I’m going to need ~2GB of ram on the VM to run everything so I’ll setup the VM with their recommended setup.

VirtualBox settings for anyone following in my footsteps:

  1. New (button)
  2. Name your virtual machine (named mine MintLinux11), operating system: Linux, version: Ubuntu
  3. Memory: 2048 MB
  4. Create New Disk (start-up disk checked)
  5. VHD file type since it is compatible with VirtualBox and I believe several other virtualization software platforms
  6. Dynamically Allocated
  7. Allocating 10GB, but I don’t think it’ll go much above 5
  8. Create VM

On the main VirtualBox screen:

  1. Select VM and select Settings (button)
  2. In the Settings Menu, select the Storage item (1)
  3. Under the storage tree mount the MintLinux11 ISO downloaded from Mint Linux’s website (press the disc icon with the + sign (2)).  Here’s a screenshot with items circled:
    VirtualBox ISO Mounting
  4. Press OK, then Start (button) the new virtual machine

Linux Initial Setup

Linux will start in an evaluation mode, but we want to completely install it.  Double click the “Install Linux Mint” disc icon on the desktop.  Installation is as straight forward as possible (next next next next finish).  Make sure to select the “Erase Disc and Install Mint Linux” option–no worries it only sets up the 10GB virtual hard disk setup earlier.  The VM installation process will take roughly 10-20 minutes depending on your computer’s capabilities.

When installation is complete, Mint will prompt you to restart, click restart.  After restarting, you will need to unmount the ISO image you installed earlier.  In VirtualBox menu bar, select: Devices > CD/DVD Devices > IDE Controller (IDE Primary Master) > Remove Disc from Virtual Drive.  Select enter to complete the restart of the virtual machine if prompted to do so.  If you end up back at Mint Linux’s login screen, you’re ready to go!

Mint Linux

Guest Additions:

The Virtual Machine is setup and installed, setting up the desktop environment is the next step: VirtualBox guest additions first.  Guest additions provide a more streamlined integration between your computer’s regular operating system (known as the “Host” operating system) and the virtual machine operating system (known as the “Guest” operating system).

In the VirtualBox menu, select Devices > Install Guest Additions… Press Ok on the autorun prompt, then Run.  Enter the password you used when setting up the virtual machine, let the guest additions install.  Perform a quick reboot by going to Mint’s Menu > Quit > Restart.

Once restarted, your virtual machine should now resize the desktop whenever you reszie the virtual machine window!  Neat.  Guest additions also provide better mouse support, graphics support and more.  Read here if curious.

Last thing to do is make sure all of your operating system packages are up to date.  Right click your virtual machine’s desktop, and click “Open in Terminal”.  Type sudo apt-get update, then press enter and type your password.  After the update, type sudo apt-get upgrade, and enter Y when prompted to do so this will upgrade all system packages making sure your operating system is fresh and ready to go!  This last will take ~15 minutes.

Pre-JIRA setup:

Java and PostgreSQL:

Java: Done.  Ok, using Mint Linux is sort of cheating since Java comes pre-installed.  Verify the installed version of Java is compatible with JIRA just to be safe by opening a terminal (right click desktop > Open in Terminal, remember?) and type java -version.

PostgreSQL: This is a tid trickier than the previous step.  We’ll install PostgreSQL and pgAdmin3, the database and management tools that the Atlassian instructions have us use.  Open the terminal and type sudo apt-get install postgresql postgresql-client-8.4 postgresql-client-common pgadmin3 and press Y and type enter when prompted to do so.  After installation completes (~3 minutes) you’ll need to setup the postgres user login info.  First type sudo passwd -d postgres to reset the postgres password, then type sudo passwd postgres and set the postgres system user’s password to password.  Set the postgres database password by typing sudo su postgres -c psql template1 and enter the SQL command ALTER USER postgres WITH PASSWORD ‘password’; to set the database login password, then type \q to quit SQL entry mode. Last we need to set the database to allow password authentication by editing it’s pg_hba.conf file.  Type sudo gedit /etc/postgresql/8.4/main/pg_hba.conf, scroll to the bottom and change the last lines to have everything use password authentication.  Changes in bold below (change “ident” to “md5″):

# Database administrative login by UNIX sockets
local   all         postgres                          md5

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               md5
# IPv4 local
 connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5

Almost done!  Restarting the database for the authentication changes to take affect.  Type: sudo /etc/init.d/postgresql restart

Lastly, verify the setup by opening pgAdmin3, the PostgreSQL database management software.  Type pgadmin3 & and press enter in the terminal.  Click the plug button to connect to the database installation, enter information as shown here:

Register Database

When finished press Ok.

Everything from here is much more straight forward since this is really where the Atlassian guides have explicit instructions.

Setup database login role and database:

Expand Server Groups > Servers > pgdb.  Follow the instructions on Dragons Stage 1.

JIRA installation:

At the time of writing this, JIRA 4.4 is out so I will be installing that according to Atlassian’s Dragons Stage 1 instructions.  Carrying on, I have downloaded JIRA from the download site.  When downloaded you’ll receive a file called atlassian-jira-X.X-x32.bin (make sure to download the 32-bit version, X-X is the version number you downloaded).  Right-click the folder and open the folder in terminal.  We need to allow this file to be executed so enter sudo chmod 755 *, then type sudo ./atlassian-jira-X.X-x32.bin (where X-X is the version of JIRA you downloaded).  Install JIRA with all defaults.

JIRA setup:

Navigate to http://localhost:8080/ (the default JIRA installation location), and follow the JIRA setup instructions very closely!  On the computer name step, select the name of the VM.  This can be found by typing cat /etc/hostname in the terminal, and make sure to keep it in mind since you use it in nearly every product setup step.  Also, you will need to create an Atlassian account (if you do not already have one) to generate evaluation keys for each of the products you will setup during the Here Be Dragons challenge.

Setup project and create JIRA database:

Continuing on I’ve setup the use groups, created the project, and added the initial issue!

Greenhopper setup:

Extremely straight forward setup!  Finished the instructions in ~ an hour.  I setup Greenhopper and have created the extra issues.  I even created a SCRUM issue.  I’ll have to look into what exactly the SCRUM methodology is another time though.

Confluence setup:

3.5.7?  I wanted to try the new Confluence 4.0, but I guess I’ll have to wait for now.  Onward!  I begin with the Confluence instructions.

Here, I didn’t finish the night I meant to, and left for a brief vacation before sitting down to finish.  😉

Finally finished.  It only took 14 days. 😉  Again everything was very straight forward.  :)

FishEye and Crucible setup:

The first step says to get Mercurial and Python setup.  Mint 11 has Python 2.7.1 installed, but Mercurial is not.  Unfortunately the python headers and setup tools are needed to build things, and are not installed by default.  This can easily be remedied by running:

sudo apt-get install build-essential gcc python-dev python-setuptools

Then you install python’s docutils by entering this command:

sudo easy_install docutils

and finish by installing mercurial.  Download it from Atlassian’s recommended download site (I downloaded 1.9.2).  Then finish by extracting the downloaded tar file, change directory to the extracted file, and run:

sudo make install

Type “hg” to verify the installation went smoothly.

Create the .hgrc file in your Mint user’s home directory by opening a terminal window, typing cd ~ then type gedit .hgrc .  Add the contents mentioned in Atlassian’s instructions in the first step.

Everything else was pretty straight forward.  To set the FISHEYE_INST environment variable, enter this in the terminal before starting up Fisheye (change the directory if you didn’t install to /opt/fisheyecrucible):

FISHEYE_INST=/opt/fisheyecrucible
export FISHEYE_INST

Get JIRA and Fisheye Talking:

This one was straight forward and a piece of cake!  Nothing can really give you too much of a hangup.  The dragon is coming along nicely!!

Get JIRA and Crucible Talking:

Another easy one!  Woohoo.  Got the dragon all Crucibled up!

Install Bamboo:

Again, getting Maven 2 is pretty easy with Mint, just download it from the APT repository by typing this into the terminal window: sudo apt-get install maven2

After, you will need to set the M2_HOME and JAVA_HOME environment variable.  As before, type:

M2_HOME=/usr/bin/mvn
JAVA_HOME=/usr/bin/java
export M2_HOME
export JAVA_HOME

These instructions seemed like they needed a bit of fixing, but the default IP address values seemed ok (127.0.0.1).

In step 6, set the JDK to JDK 1.6.

Bamboo Gadgets and JIRA Victory:

Adding the two gadgets are easy!

Summary:

Conquered the dragon!
Conquered the dragon!

I’m done!  I got the VM setup, installed all of the products in the challenge, and best yet, I got a free t-shirt to show off my dragon conquering prowess!

Dragon Slayer!

I hope this has helped fellow dragon conquerors.  Please feel free to leave comments or questions!

How to Feed a Developer – Challenge Accepted: DiGiorno Toll House

DiGiorno Pizza AND Cookies
Pizza, Meet Cookies

You can only pass by the freezer isle and see something this ridiculous before one night you stop, and go “yep, this is happening, I’m going to do this.”

Make Friday Night Memorable!
This settles it!

But is it:

Pizza, and cookies?

          Pizza. And cookies?

                    Or

                              Pizza and cookies?

These are the decisions you are left with.

Let me see the nutrition information:

Pizza Nutrition
Really? 5 slices?
Cookie Nutrition
One cookie? Who eats only one cookie?

Pizza, and cookies:

Calories: 2 slices, 2 cookies: 680, + 180 = 860
Cholesterol: 2 slices, 2 cookies: 60, + 10 = 70
Sodium: 2 slices, 2 cookies: 1940, + 160 = 2100

Now the pizza. And cookies:

Calories: 2 slices = 680. 2 cookies = 180. Total: 860
Cholesterol: 2 slices = 60.  2 cookies = 10. Total: 70
Sodium: 2 slices = 1940.  2 cookies = 160. Total: 2100

When you think about it, they’re the same when you eat the pizza first, then the cookies at a later time, or when you eat the pizza and the cookies in the same sitting, but what if…

Pizza AND Cookies?!

Calories: 2 cookie-slices = 860
Cholesterol: 2 cookie-slices = 70
Sodium: 2 cookie-slices = 2100

Yep… cookie pizza:

Pizza Cookie

Oh man, that was… interesting.  Not recommended more than once though.  Now I need to clean up.  I’ll throw away the box.  But wait, what’s this?!

DiGiorno - Try All 3!
...At the same time?!

To be continued…? :)

A Neat Java WindowAdaptor Trick

I discovered this neat trick when I was trying to have a status bar get updated with an element when a Java dialog box gets created (JDialog).   The element in the status bar gets removed when the dialog box is closed.  This is handy, and also gives an example of the order that listeners get added with creation of Java GUI elements.

    //... JDialog box initialization code ...
    StatusBar.addTemporaryElement(temporaryElement, this);
    //... Rest of JDialog initialization ...
    //... in StatusBar class (extends JFrame)
    public void addTemporaryElement(JComponent temporaryElement, JDialog dialog)
    {
        //example, adding a temporary label or button to the status bar frame
        add(temporaryElement, JFrame.RIGHT_ALIGNMENT);
        dialog.addWindowListener(new MyWindowListener(temporaryElement));
    }
 
    public class MyWindowListener extends WindowAdapter
    {
        private JComponent tmpElement;
 
        MyWindowListener(JComponent tmpElement)
        {
            this.tmpElement = tmpElement;
        }
 
        @Override
        public void windowClosed(WindowEvent e)
        {
            remove(tmpElement);
        }
    }