Nov 302013

The NetBeans IDE has some great refactoring tools. It makes lots of tasks so much less error prone than doing them manually. In this article, I describe some of my favourite refactoring tools. (These tools can be accessed from the main menu bar (Refactor) or from the context menu of a Java file open in the editor.)

#1 – Rename

Anything that has a name can be renamed. But my favourite example is renaming a class.



When a class is renamed, not only the source code of the class (optionally including comments) is changed, but also the name of the file where it lives. And also any usages of the class elsewhere in your open projects!

#2 – Encapsulate Fields

This feature allows you to generate getters, setters and property change support for fields in a class. It allows you to specify various parameters, such as the visibility of the accessors. So lets take a very simple class, and apply the Encapsulate Fields tool:



… and lets look at the generated code:


 #3 – Extract Interface

If you have an existing class, and you want to extract some of its methods into an interface, the NetBeans IDE has just the tool for you!



Not only does the interface get generated, but your class is automatically changed to implement the new interface too!


#4 – Introduce Method

Sometimes one wants to extract some lines of code into a separate method. Maybe because the initial method is becoming too long to be readable, or because that part of the functionality will be reused elsewhere. Whatever the motivation, the NetBeans IDE has just the tool for the job! So lets look at a silly example where an identical piece of code occurs twice in the same class:


And then lets look at the result of the refactoring:


Tip: Experiment with extracting large, complicated blocks of code – the NetBeans IDE is capable of much more than this simple example!

#5 – Change Method Parameters

Say we decide to now introduce a new parameter for the extractedMethod() created above. If we did this manually, it would mean changing each place where the method is called manually too. (Sometimes this is desirable, but it can be a lot of effort.) With the Change Method Parameters feature, this task becomes much easier, since it allows you to specify a default value for the new parameter.


Now our class looks like this:


Tip: Also try out the Create New Method and Delegate from Existing Method option!

Nov 152013

The NetBeans IDE has so many wonderful features that makes a Java developer’s life easier. And many of these features have keyboard shortcuts attached to them. So I decided to make a list of the shortcuts that I think every developer should know.

  • Ctrl+O : Quickly go to a class
    This shows a dialog that allows you to start typing the name of the class that you are looking for. You can then choose the class from a list of matched names.
  • Ctrl+Shift+I : Fix imports
    Add any new imports that are necessary and remove unused ones at the same time. If a class name matches multiple possibilities, a dialog is displayed that allows you to choose which class to import.
  • Alt+Shift+F : Format selection
    Format the selected code according to the rules that can be changed in the IDE Options > Editor > Formatting. This is also a handy way to format XML in a useful way.
  • Alt+F7 : Find usages
    Find where the currently selected type is used.
  • Ctrl+R : Rename
    Rename the selected variable or class, refactoring if required.
  • Alt+Insert : Generate code
    Choose from various context sensitive items that the IDE can generate, for example generating getters and setters.
  • Ctrl+Space : Auto complete
    Context sensitive auto complete.
  • Ctrl+/ : Toggle comment lines
    Adds // to the start of each of the selected lines. Or removes these if present.
  • Ctrl+Shift+Up/Down : Copy lines up/down
    Make a copy of the currently selected lines, without going through the clipboard.
  • Alt+Shift+Up/Down : Move lines up/down
    Move the currently selected lines, without going through the clipboard.

For a much more comprehensive list of keyboard shortcuts, have a look at Highlights of NetBeans IDE 7.4 Keyboard Shortcuts & Code Templates.

Sep 022013

Creating a wizard in a NetBeans Platform Application is quite easy since there is a NetBeans IDE new file wizard that creates all of the scaffolding for you. Have a look at the NetBeans Wizard Module Tutorial for a step by step description of how to work with the normal, modal wizards.

In the above tutorial, the DemoWizardAction class contains the sample code for calling the wizard. The relevant code for displaying the modal wizard is duplicated below for easy reference:

WizardDescriptor wiz = new WizardDescriptor(
        new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) {
    // do something

I recently ran into a use case where it was required that the wizard must be non-modal. Whether this is a desirable behaviour for a wizard is a topic all of its own, so lets just assume that we want to be able to do this. The code to display the wizard as non-modal is shown below:

WizardDescriptor wiz = new WizardDescriptor(
        new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
Dialog wizardDialog = DialogDisplayer.getDefault().createDialog(wiz);

Now the remaining complication is being able to catch the event that indicates that the wizard completed with the option WizardDescriptor.FINISH_OPTION as in the original code. I noticed that the WizardDescriptor allows for the registration of property change listeners. And so by debugging into the propertyChange method, I was able to determine what must be handled to catch this particular event:

WizardDescriptor wiz = new WizardDescriptor(
        new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
wiz.addPropertyChangeListener(new PropertyChangeListener() {

    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getNewValue() != null && "org.openide.WizardDescriptor.FinishAction".
                 equals(evt.getNewValue().getClass().getCanonicalName())) {
            // do something

Dialog wizardDialog = DialogDisplayer.getDefault().createDialog(wiz);
Jun 212013

In the previous blog post, some areas remained unexplored. Specifically, how to observe the values of variables with versions of the IDE that don’t include debug information. In this guest post by Robert Bracko (robert [dot] bracko [at] vip [dot] hr), he describes his experiences with building the NetBeans IDE source code to overcome this obstacle.

Step 1: Building NB sources

  1. Create local disk folder C:\nb6_9_1

  2. Download NB platform sources ( and extract it into C:\nb6_9_1\src

  3. Download NB binaries ( This step is necessary for getting the appropriate Ant builder. Extract only netbeans\java\ant into C:\nb6_9_1\ant. Result of that operation should be that C:\nb6_9_1\ant contains ant subfolders binetcextralib

  4. Create batch file (buildenv.bat) inside the folder C:\nb6_9_1. Put the following lines (adjust JAVA_HOME to match your Java JDK path!):
    set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_12
    set ANT_HOME=C:\nb6_9_1\ant
    set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%PATH%
    set ANT_OPTS=-Xmx1g

  5. Open command shell and change directory to C:\nb6_9_1. Execute buildenv.bat. Then change directory to NetBeans source which is to be built (C:\nb6_9_1\src). Execute ant (without any cmd-line params). Please be patient; depending on your machine power, the process can take up to hour!

As a result of above-described procedure, new folder is created: C:\nb6_9_1\src\nbbuild.

General notes

  • For some reason, path of Ant installation directory must not contain spaces!
  • If building for the first time, disable Windows Firewall because for some reason it prevents Ant from downloading jars from web.
  • Possible build error “java.lang.OutOfMemoryError” can be overridden by following batch command: set ANT_OPTS=-Xmx1g

Note on building NB 6.9.1 sources:

During build process, you will probably encounter the following error:
C:\nb6_9_1\src\o.jruby.distro\unpatched_source\jruby-1.5.0\build.xml:1141: Java returned: 1

Please check for a workaround.

Step 2: Debugging specific NB platform and/or NB module that was developed for that platform

Open your development IDE (in my case, it’s NB 7.3).
There are two possible ways to debug NB module that was developed for specific NB target-platform (in our case, it’s for NB 6.9.1). I prefer the first one ("Adding target platform through NetBeans Platform Manager") because it’s not necessary to install NBM inside target-IDE.

  1. Adding target platform through NetBeans Platform Manager

    1. Choose from main menu Tools > NetBeans Platforms. Press button “Add Platform…”. Choose the folder C:\nb6_9_1\src\nbbuild\netbeans. Let NB decide on the name of platform (“nb691″).

    2. Choose tab “Sources” and add the following folder: C:\nb6_9_1\src

    3. Choose tab “Harness” and check whether radio-button “Harness supplied with Platform” is selected

    4. Open your NBM project.
      The following is important! Open Project Properties > Libraries and adjust the field “NetBeans Platform” to hold the value nb691!

    5. Set the breakpoint inside your NBM code.

    6. Optionally, you can set the breakpoint inside NB platform source code. For instance, let’s imagine that your NBM uses functionality of NB class AbsoluteLayoutSupport and you want to check the interaction. Make a Windows file-search inside the folder C:\nb6_9_1\src. That results in containing folder C:\nb6_9_1\src\form\src\org\netbeans\modules\form\layoutsupport\delegates. So open the folder C:\nb6_9_1\src\form as another project in your development-IDE(uncheck the checkbox “Open Required Projects:”). Expand Projects window node Form Editor > Source Packages > org.netbeans.modules.form.layoutsupport.delegates. Double click on and set the breakpoint.

    7. Inside Projects window, right click on your NBM and choose Debug from the context menu. That makes target-IDE (6.9.1) to launch. Choose Tools > Plugins from target-IDE main menu, then choose tab “Installed”. You should see your NBM inside the list of installed plugins. Nice, isn’t it?

    8. Make some action that affects your NBM and enjoy debugging :)

  2. Opening src\nbbuild as a project

    1. Open your NBM project and set the breakpoint anywhere inside the code.

    2. Open the following folder as a project: C:\nb6_9_1\src\nbbuild. The node “NetBeans Build System” appears inside Projects window.

    3. Right-click the subnode build.xml and choose the following from context menu: Run Target > tryme-debug. That makes target-IDE (6.9.1) to launch. Choose Tools > Plugins from target-IDE main menu, then choose tab Downloaded. Press button “Add Plugins…”, find NBM on disk and then press button “Install”. Finish the installation process, then close Plugins window.

    4. Make some action that affects your NBM and enjoy debugging :)

    5. Optionally, you can set the breakpoint inside NB platform source code. Follow the same approach as given in “Adding target platform through NetBeans Platform Manager” step 6.
Jun 072013

Much has been written about the NetBeans Platform. But the ultimate resource still remains the source code of the Platform itself! I have used plenty of open source libraries over the years. And I have ventured into the source code numerous times. Quite often the experience is one that leaves one dazed and confused. But I have found that the NetBeans source code is well structured and easy to follow. So even on your very first adventure, you can gain much wisdom! :)

Reading source code is like reading a Physics text book. You can try to keep all of that information in your head, or you can experience it in practice. So in most cases, the easy way to find an answer is to debug into the source instead of just perusing it.

How to set up the source code to be able to debug into it, depends on what type of project you are working with. For Ant-based module projects, download the source code of the same version as the platform that you are building on, and configure the platform to use it in the NetBeans Platform Manager (Tools > NetBeans Platforms). This gives you access to all of the source code in all of the modules.

For Maven-based projects, you have to attach the source code for each of the dependencies. In project view, right-click on one of the NetBeans module dependencies and choose Download Sources.

Now put a breakpoint somewhere in your own module to start from. So for example, if you wanted to explorer the behaviour of the TopComponent class, put a breakpoint into the constructor of a TopComponent subclass (created using the Window wizard). And step into for example the setName() method.

Using this methodology, you can explore how the platform loads and uses things like nodes and actions and windows. That will provide you with much deeper insight into how these things work!

Robert Bracko (robert [dot] bracko [at] vip [dot] hr) explored the behaviour of an old third party IDE module from the 6.9.1 days. He sent me the following points, describing his fascinating first adventure!

  1. Downloaded NB 6.9.1 (Build Type: Release) from
    1. (description: NetBeans 6.9.1 Java SE OS Independent Zip/English)
      Extracted (not installed!) into directory netbeans-6.9.1-201007282301-ml-javase
      Extracted into directory netbeans-6.9.1-201007282301-src
  2. Inside Development IDE (NB 7.3), added platform nb691 as new NB platform, based on directory netbeans-6.9.1-201007282301-ml-javase\netbeans.
    Sources linked for that platform, based on directory netbeans-6.9.1-201007282301-src
    So far so good :-)
  3. Project opened inside Development IDE: KoalaLayoutSupport. Project properties changed: NetBeans platform set to nb691
    Attempt to build the project fails:
    The following error occurred while executing this line:
    X:\netbeans\netbeans-6.9.1-201007282301-ml-javase\netbeans\harness\testcoverage.xml:22: C:\Program Files\NetBeans 7.3\harness\testcoverage\cobertura does not exist.What is strange here is that error message refers to C:\Program Files\NetBeans 7.3 directory. Why does it look into NB 7.3 installation directory?
    Next step was to investigate exactly what’s going on during build process. So I’ve selected project’s node Important Files > Build Script and from the pop-up menu chose Debug Targer > netbeans. I found out that file nbproject/build-impl.xml refers to file nbproject/private/ which further defines property with value C:\\Documents and Settings\\Administrator\\Application Data\\NetBeans\\7.3\\ Nothing wrong with that, right? Because at the same time debugger’s variables-window shows that property contains value nb691, so the whole process of building should be (at least I think so) controlled by NB 6.9.1. platform.
    But then one suspicious thing: build-impl.xml tries to define the property harness.dir with value nbplatform.${}.harness.dir. After having executed that line, debugger’s variables-window shows the value C:\Program Files\NetBeans 7.3/harness for that variable! And that’s obviously wrong.
    So the next step was to change harness dir for platform nb691. I have done that through NB Platform Manager: inside tab Harness, choosing “Harness supplied with Platform” instead of “Harness supplied with IDE”. And then the build passed OK! :-)
  4. Next thing, module debugging. Breakpoint set inside of module’s class works OK, also a breakpoint set inside of a class of NB 6.9.1 source. But… For the latter one, debugger’s variable window shows the error message “variable information not available, source compiled without -g option”. I know what it means but how to resolve it?….. For me it’s rather important to see how NB Form Editor source code interact with my module…

Thanks for sharing, Robert! Some questions still remain unanswered in the steps above. Stay tuned for more about his next adventure!

Apr 242013

The NetBeans IDE’s debugging tools is one of maybe the top 5 features that I simply cannot live without! And as you can imagine, debugging is something I do quite regularly. So I was rather surprised when I only recently discovered an AWESOME feature that has been around for a long, long time. :) This feature is Variable Formatters.

To explain what a Variable Formatter is, some context is required. So lets have a look at the Variables window while debugging a very simple little Java application.

Variables Window

Variables Window

That is a pretty useful view. I can see all the variables that I could possibly need at a glance. (Of course, that is easy with an application this simple.) Of interest to this particular discussion, however, is the Value column. Notice how the various types have different string representations that are displayed. Now lets create a simple class called SomeObject:

public class SomeObject {

    private String var1;
    private String var2;

    public SomeObject(String var1, String var2) {
        this.var1 = var1;
        this.var2 = var2;

    public String getVar2() {
        return var2;

and create an ArrayList filled with SomeObjects, to inspect in the debugger:

ArrayList in the Variables Window

ArrayList in the Variables Window

Each of the elements in the list can of course be expanded to see the details. But what if you were looking for a specific element in a very long list? The great news is, that Variable Formatters allows us to customise how these items are displayed! From the main menu, select Tools > Options. Choose the Java page, and then the Java Debugger tab, Variable Formatters category.

Variable Formatters options

Variable Formatters options

A number of formatters are already specified, but we can add a custom one:

Custom Formatter

Custom Formatter

And very impressively, it gets applied immediately when you click OK on the options dialog! Even while the debugger is running! Now the display looks like this:

Customised Display

Customised Display

Suddenly ANY type of variable can have a user friendly, and customised, presentation in the variables window!

Mar 282013

The success of a software development project can be measured in many ways. But certainly one of the most important metrics for the users of open source software, is the quality of the software itself. And so it is fitting that the second interview in the series of NetBeans team interviews introduces Marián Mirilovič, NetBeans Quality Engineering Manager.

Marián Mirilovič at Edinburgh Castle, Scotland

Marián Mirilovič at Edinburgh Castle, Scotland

Hermien Pellissier: How long have you been a part of the NetBeans team?

Marián Mirilovič: Actually I was hired into the original NetBeans team (before it was bought by Sun Microsystems) in July 1999, but just a few days before my start date I got call-up and I was forced to spend one year in a Slovak Army base camp. Fortunately I got another offer from the team just before the end of my duty, so my official start point is November 2000. Wow… looking at the date now, it is almost 13 years and most of them unforgettable (especially those at Sun Microsystems).

HP: What is your role in the team?

MM: My actual position is “NetBeans Quality Engineering Manager”. So beside leading the QE team, I am also the one responsible for the final quality of the product, setting expectations in quality area for new releases and getting buy-in to new Quality Criteria by the Development team (the toughest part of my job).

HP: What is a typical work day like for you?

MM: It depends on the phase of the release cycle. But more or less I start with reading emails as we are an international company, and most of my colleagues work in different time-zones, so I usually get replies during my nights. Emails usually give me an updated picture what the status is, if there is a blocker for my team to continue in the activity we are currently working on. When everything goes well, I check the dashboard and go through high-priority bugs reported since my last check. Continue with meetings and tasks connected with the phase of the release cycle we are working on that day. Just before leaving office I do check the dashboard, what was the income in a day and other stats.

HP: When is the Quality Engineering team at its busiest?

MM: The whole season ;). Actually, there are a couple days after releasing new version when we have “a free time”, but after a day or two we start to work on a first patch, so there are almost no down-times.

HP: Which aspect of your job do you enjoy the most, and why?

MM: There are three peaks for me ;). The first one is when we complete testing of a new version and I am proud to send “GO” for a release.

The second is when we are getting replies to our “Thanks for your contribution to the NetBeans X.Y” emails and people thank us for a great IDE and appreciate the work we’d done during the whole release cycle.

And the last one is when we send recognition awards to the most active NetCAT participants. Actually this is usually the last task on the checklist for particular release. ;)

HP: What are your other interests?

MM: First of all my children. I have a four and a half year old daughter and a seven year old son. Both are very active and require a lot of attention. ;)

The other important thing in my life is sport. I play ice-hockey, beach volleyball, and I like jogging in summer and skiing in winter.

HP: What is your favourite holiday destination?

MM: We are used to spending our summer holidays on one of the Greek Islands. The other usual place is the area under High Tatras in Slovakia (my birthplace) and the last one is Lake Lipno in the Czech Republic.

HP: What is your favourite show or movie?

MM: I like the Sci-Fi genre and movies about history. I have read plenty of Isaac Asimov and Arthur C. Clarke’s books. There are a lot of movies I like. The first two that come to my mind just because I saw them recently are “Invictus” and “Moneyball”.

HP: Are there any blogs (NetBeans related or otherwise) that you would recommend?

MM: I like Geertjan’s Blog ( and I strongly recommend reading it. Also NetBeans’ PHP blog ( is pretty active and keeps our huge PHP community updated.

HP: Thank you for the interview!

Mar 112013

NetBeans is an IDE, a platform, and a community. And the full time NetBeans team at Oracle plays a very important role in all of that. However, the people that does all the great work are also very modest about their accomplishments. And so the community doesn’t know all the interesting people that are involved and what they do every day. This is the first in a series of interviews with the various team members, to introduce them to the community. Today I am priviledged to introduce Jiří Kovalský.

Jiří Kovalský on vacation in the Jizerske hory mountains

Jiří Kovalský on vacation in the Jizerske hory mountains

Hermien Pellissier: How long have you been a part of the NetBeans team?

Jiří Kovalský: I am proud to work for the NetBeans project already since July 2000 so it will be 13 years this summer! Being part of one team for such a long time has both good and bad aspects. On one side you watch the fantastic progress of the project while on the other hand it also brings sad moments like seeing your good friends leaving the road you walked together for years.

HP: What is your role in the team?

JK: I am actually sitting on two chairs. My job title reads “NetBeans Community Manager” so I should be managing NetBeans community but I prefer to call it cooperation or coordination at maximum rather than any kind of management. In open source world people contribute voluntarily, right? NetBeans has a huge community which by the way reached 1.3 million active users last year and it’s logical that there are many people who want to give something back for the free tool they use daily. So, I for example try to do my best to help those active users contribute where it makes sense and coordinate such efforts to maximize productivity.

You might have probably heard of NetCAT program which is now an essential part of the NetBeans stabilization phase. Imagine there are ~100 NetCAT participants who test NetBeans development builds. Such a crowd needs a bit of coordination to distribute the work load, you must provide clear instructions to avoid misunderstandings and of course empathy is handy too. And that’s my job.

Besides NetCAT, I for example “manage” team of Plugin Verifiers. These are volunteers who constantly test NetBeans plugins which aim to the NetBeans Update Center. I am also responsible for processing Oracle Contributor Agreements.

HP: And what’s the other chair?

JK: Secondly, I am member of the NetBeans Quality Engineering team responsible for Java/Ant Debugger and JUnit/TestNG support. This includes testing these features, reporting bugs, updating test specifications or maintenance of automated tests. Since the beginning I have been also involved in design of the Plugin Portal so I feel responsibility for that web too.

HP: What is a typical work day like for you?

JK: Firstly, I must explain that I work from home 4 days a week. Since I live in a small town called Bohumin, I travel to the office in Prague every other week for two days.

I wake up at 6:00 AM, make some tea and prepare a breakfast for kids. Then I wake them up and prepare my breakfast and a snack for the children. At 7:30 we drive to school. On my way home I sometimes do some shopping. After my return from the school I finally turn on my computer. Yes, its uptime is 24 hours at maximum. :)

I know some mentors would disagree with it but I start my working hours by reading e-mails. Being the NetBeans Community Manager I have to communicate a lot and morning is the perfect time to resolve things from those community members who live on the other side of the Earth. Requests from those in my time zone or near enough can wait till the afternoon, can’t they? :) I dedicate ~1 hour to e-mails and then switch to the most important task planned for the day. This can be for example testing latest NetBeans IDE and JDK bundles, calculating activity of NetCAT participants, searching for new plugins to be featured on the web site, verification of bug fixes planned to an update release, writing a speech for an online chat with community members or stabilization of Debugger sanity automated test suite.

Around noon I eat lunch in advance cooked by my wife or prepare something myself. One of my bad habits is reading Facebook or some newspapers during lunch. :) In the afternoon I again check my e-mails and try to fully clear my Inbox. Then I sometimes prepare for meetings if there are any. If not, I switch to another priority task on my Todo list. Typically it concerns some communication with NetBeans community which needs concentration and time. I am not fan of multitasking so I prefer finishing my task at all costs before going further. Downside of this approach is that I sometimes end my day with more duties than I had in the morning.

At 4:30 PM I often interrupt my work and drive for kids and wife. If there is something critical I continue working in the evening when our house goes silent. This happens when I for example write a NetCAT status report which takes around 6 hours in total. I try to shutdown my computer no later than 10:30 PM. Just out of curiosity, in 2012 I spent 18.9% with e-mails, 28.4% with NetCAT or 14.3% on testing.

HP: Which aspect of your job do you enjoy the most, and why?

JK: You know what’s exciting? That so many different people from variety of cultures with almost no chance to meet in person cooperate together to build a better product. I like that although I am just a tiny bit in this big puzzle I can make a difference. Just as anyone who feels strongly about NetBeans too. That’s what I like about my job.

HP: Which new NetBeans feature(s) are you most excited about?

JK: How many you want to hear? Just one? :) Oh, it will be difficult. So, just briefly:

7.3: New web client development support and the integration with Chrome is simply amazing.
7.2: Background indexing using transactions which lead to vastly increased performance.
Overall: It may sound stupid but I like small Editing features like Hippie Completion (Ctrl+K), regular expressions in Find & Replace tool and Macros. These are some quite good time savers.

HP: What are your other interests?

JK: First of all family comes to my mind. I like to spend my time with my wife and kids. I like reading books for Ondrej (6 years old son), I like listening to Zuzana (8 years old daughter) playing violin, I like programming with Barbora (10 years old daughter) and of course I like for example skiing or going to a theatre with my wife.

Sport is significant for me in general. I am especially keen on playing volleyball (Fridays) and squash (bi weekly). I do weights once a week. I am also kind of interested in arts – I collect old paintings for instance. I don’t have any from Pablo Picasso or Claude Monet yet :D but these were really great painters.

HP: Which movie/book genre(s) is/are your favourite(s)?

JK: I know it is scary but I don’t read books. I am sure though I will enjoy it when I retire. :) However, I like Sci-fi genre which fascinated me when I first saw the Aliens movie by James Cameron in 1988. The Matrix from 1999 was another hit and recently I liked Avatar a lot from 2009.

HP: What is your favourite holiday destination?

JK: I don’t have any concrete preference but since the Czech Republic is a landlocked country I like for some reason sea, waves and the fresh air. My wife prefers mountains so we made a compromise and go to mountains one year and fly to some coast next year. :)

HP: Are there any blogs (NetBeans related or otherwise) that you would recommend?

JK: I don’t watch blogs much but Geertjan’s blog keeps surprising me with its useful content and has the most hits in my browser’s history. Otherwise I am happy subscriber of PHD Comics by Jorge Cham. It’s not only entertaining but educative at the same time.

HP: Thank you very much for the interview!