Archive for June, 2010

Installing the AT&T Global Network Client on Ubuntu 10.04 Lucid Lynx 64 bit

The AT&T global network client is a 32 bit application, that with a bit of messing with it will run perfectly fine on Ubuntu 10.04 64 bit.

Here are the steps that I came up with that worked for me:

  • make sure you have the 32 bit compatibility package installed, `sudo apt-get install ia32-libs` will do the trick
  • Install getlibs from http://frozenfox.freehostia.com/cappy/getlibs-all.deb
  • Download the client from agnclient-2.0.1-ubuntu
  • Unzip the file
  • from the command line, install all three packages using `sudo dpkg –force-all -i <package.deb>` – I installed agnclient_1.0.1-1_i386.deb first, then the gtk package, then the dev package
  • Use getlibs to install the necessary libraries. I only needed libssl, so I did `sudo getlibs -p libssl0.9.8`
  • I then had to create some symbolic links so that the client would work properly, so in /lib32, i ran `sudo ln -s libssl.so.0.9.8 libssl.so.4` and `sudo ln -s libcrypto.so.0.9.8 libcrypto.so.4`
  • To verify that everything works properly, I checked the linking of the various programs to ensure that they were linking against the proper libraries, here is what I got
  • chuck@silverstone:/opt/agns/bin$ ldd NetVPN
    linux-gate.so.1 =>  (0xf7727000)
    libpthread.so.0 => /lib32/libpthread.so.0 (0xf76e5000)
    libssl.so.4 => /lib32/libssl.so.4 (0xf769f000)
    libcrypto.so.4 => /lib32/libcrypto.so.4 (0xf754b000)
    libdl.so.2 => /lib32/libdl.so.2 (0xf7547000)
    libc.so.6 => /lib32/libc.so.6 (0xf73ed000)
    /lib/ld-linux.so.2 (0xf7728000)
    libz.so.1 => /usr/lib32/libz.so.1 (0xf73d8000)
  • chuck@silverstone:/opt/agns/bin$ ldd agnclient
    linux-gate.so.1 =>  (0xf773b000)
    libagnLogc.so.1 => /opt/agns/lib/libagnLogc.so.1 (0xf7736000)
    libagnc.so.1 => /opt/agns/lib/libagnc.so.1 (0xf772c000)
    libpthread.so.0 => /lib32/libpthread.so.0 (0xf76ec000)
    libm.so.6 => /lib32/libm.so.6 (0xf76c6000)
    libdl.so.2 => /lib32/libdl.so.2 (0xf76c2000)
    libgtk-x11-2.0.so.0 => /usr/lib32/libgtk-x11-2.0.so.0 (0xf72ed000)
    libgdk-x11-2.0.so.0 => /usr/lib32/libgdk-x11-2.0.so.0 (0xf7257000)
    libatk-1.0.so.0 => /usr/lib32/libatk-1.0.so.0 (0xf723a000)
    libgdk_pixbuf-2.0.so.0 => /usr/lib32/libgdk_pixbuf-2.0.so.0 (0xf7220000)
    libpangoxft-1.0.so.0 => /usr/lib32/libpangoxft-1.0.so.0 (0xf7218000)
    libpangox-1.0.so.0 => /usr/lib32/libpangox-1.0.so.0 (0xf720b000)
    libpango-1.0.so.0 => /usr/lib32/libpango-1.0.so.0 (0xf71c8000)
    libgobject-2.0.so.0 => /usr/lib32/libgobject-2.0.so.0 (0xf7188000)
    libgmodule-2.0.so.0 => /usr/lib32/libgmodule-2.0.so.0 (0xf7183000)
    libgthread-2.0.so.0 => /usr/lib32/libgthread-2.0.so.0 (0xf717d000)
    libglib-2.0.so.0 => /lib32/libglib-2.0.so.0 (0xf70b3000)
    libxml2.so.2 => /usr/lib32/libxml2.so.2 (0xf6f89000)
    libc.so.6 => /lib32/libc.so.6 (0xf6e2e000)
    /lib/ld-linux.so.2 (0xf773c000)
    libpangocairo-1.0.so.0 => /usr/lib32/libpangocairo-1.0.so.0 (0xf6e22000)
    libX11.so.6 => /usr/lib32/libX11.so.6 (0xf6d05000)
    libXcomposite.so.1 => /usr/lib32/libXcomposite.so.1 (0xf6d01000)
    libXdamage.so.1 => /usr/lib32/libXdamage.so.1 (0xf6cfd000)
    libXfixes.so.3 => /usr/lib32/libXfixes.so.3 (0xf6cf6000)
    libcairo.so.2 => /usr/lib32/libcairo.so.2 (0xf6c7c000)
    libgio-2.0.so.0 => /usr/lib32/libgio-2.0.so.0 (0xf6bde000)
    libpangoft2-1.0.so.0 => /usr/lib32/libpangoft2-1.0.so.0 (0xf6bb7000)
    libfreetype.so.6 => /usr/lib32/libfreetype.so.6 (0xf6b41000)
    libfontconfig.so.1 => /usr/lib32/libfontconfig.so.1 (0xf6b10000)
    librt.so.1 => /lib32/librt.so.1 (0xf6b07000)
    libXext.so.6 => /usr/lib32/libXext.so.6 (0xf6af7000)
    libXrender.so.1 => /usr/lib32/libXrender.so.1 (0xf6aed000)
    libXinerama.so.1 => /usr/lib32/libXinerama.so.1 (0xf6ae9000)
    libXi.so.6 => /usr/lib32/libXi.so.6 (0xf6ada000)
    libXrandr.so.2 => /usr/lib32/libXrandr.so.2 (0xf6ad2000)
    libXcursor.so.1 => /usr/lib32/libXcursor.so.1 (0xf6ac8000)
    libXft.so.2 => /usr/lib32/libXft.so.2 (0xf6ab4000)
    libz.so.1 => /usr/lib32/libz.so.1 (0xf6a9f000)
    libpcre.so.3 => /lib32/libpcre.so.3 (0xf6a6d000)
    libxcb.so.1 => /usr/lib32/libxcb.so.1 (0xf6a53000)
    libpixman-1.so.0 => /usr/lib32/libpixman-1.so.0 (0xf69f9000)
    libdirectfb-1.2.so.0 => /usr/lib32/libdirectfb-1.2.so.0 (0xf6982000)
    libfusion-1.2.so.0 => /usr/lib32/libfusion-1.2.so.0 (0xf6978000)
    libdirect-1.2.so.0 => /usr/lib32/libdirect-1.2.so.0 (0xf6961000)
    libpng12.so.0 => /lib32/libpng12.so.0 (0xf693c000)
    libxcb-render-util.so.0 => /usr/lib32/libxcb-render-util.so.0 (0xf6937000)
    libxcb-render.so.0 => /usr/lib32/libxcb-render.so.0 (0xf692f000)
    libresolv.so.2 => /lib32/libresolv.so.2 (0xf691b000)
    libselinux.so.1 => /lib32/libselinux.so.1 (0xf68ff000)
    libexpat.so.1 => /lib32/libexpat.so.1 (0xf68d8000)
    libXau.so.6 => /usr/lib32/libXau.so.6 (0xf68d4000)
    libXdmcp.so.6 => /usr/lib32/libXdmcp.so.6 (0xf68ce000)
  • you might need to install additional libraries, use getlibs to do it as shown above (my system had some libraries on it before I started the install that yours might not have)
  • restart the daemon with `sudo /etc/init.d/agnclientd restart`
  • try opening the client from the applications menu under the internet category and connecting
  • If something goes wrong, check the logs in /var/log/agns

Good Luck!

even programmers have some humor

I run Linux on all my personal computers (including the server that hosts this blog), except my media center pc (Linux is a bit behind for watching high definition movies, especially for digital audio like Dolby TrueHD and DTS Master Audio). I absolutely love Ubuntu, so when I rediscovered this today it made me laugh.

Bug #1 in Ubuntu: “Microsoft has a majority market share”

why not use standard widgets?

This summer I am working on a project to design and build automated functional tests of some of IBM’s web interfaces that act as control panels for their servers. This appears to be a fairly straightforward task: figure out what the test should do, use the tools to write the test, and debug the test until it works properly. Oh if only life were so easy…. Due to some design choices in IBM’s hardware management console software, the process has been extended with an additional step: figure out what the test should do, modify the tools so they can do what they need to, use the modified tools to write the test, and then debug the test until it works properly. Rather than ranting on forever and ever, I figure a picture is worth a thousand words, so here it is, IBM’s HMC interface in all its glory:

Above is the welcome screen, which is innocent enough. Nothing major here to report that personally makes my life difficult. I just felt that it would be too one-sided if all I did was complain. Now, lets get on to the stuff that makes you wonder why was this done?

What we have here is my first example of non-standard widgets that cause me problems. If you look at the screenshot carefully, you might notice two places that seem perfectly normal at first but at closer inspection are just not quite right. Were you thinking about the check box in the table and the drop down combo box in the upper right corner? These widgets are actually images that are manipulated with fancy Javascript to appear as normal as possible. The tools we are using support standard widgets, things built with input tags, fancy JS is just a pain to test. Plus, imho, it makes the interface feel much more sluggish. Every time one of these widgets is manipulated there is a definite delay before any feedback is presented to the user.

Now, let’s get on to another example. In the images below, there is another example of a drop down combo box that is implemented purely with image tags and Javascript. What is worse about this particular example, is that upon changing the value of the combo box, the entire page reloads to fill in the new value. This is because the combo box options are implemented by hyperlinks that when clicked, redirect the browser to a new page that has the previously clicked link as the selected option.

Now its not that I am angry with the way this was designed or that I am overly critical of it, but it raises the question, are the standard widgets that we are provided by our programming APIs sufficient for most uses? On the internet, I would say that overwhelmingly the widgets that are built into the browser are fantastic for 95% of whats out there. I mean, realistically, how often do you see someone reinventing a textbox with some Javascript ninja magic. The answer: never. Why? Because the ones built into the browser are already good enough at what they do. Alright alright, some things just cannot be done with standard widgets in a web browser, things like date pickers and sliders, but why reinvent the wheel when it is not necessary? The only thing that I could think of for this particular case was that using homegrown widgets improved cross-browser compatibility in some way that I couldn’t imagine. If I find out the answer to this question, I’ll try to remember to put it up here.

But back to my basic question, are when are standard widgets not enough? I guess there are lots of times the more I think about it, but lots of times in a sea the size of an ocean is still a limited amount. Then that also raises the question, what does it take to consider a widget to be “standard”? All the major web browsers implement the widgets slightly differently, especially between different platforms. And take Java for instance, built into the language are two widget libraries, AWT and Swing, which I would argue are Java’s “standard” widgets. But there exists a popular add on library confusingly named the Standard Widget Toolkit (SWT), so what is a newcomer to think? I think Ill come back to this question later.