Educating the world

Our blog has over 10,000 readers a month

The 5 Stages of Love

July 19th, 2012

From the series Quantum Leap season 3 episode A Hunting Will We Go, first aired on 18 June 1976. Good old ITV4 is rerunning them early weekday evenings.

Sam leaps into a bounty hunter who is handcuffed to a female fugitive with a bounty on her head, who’ll do anything to get away. During the episode Al is explaining how he knows that Sam is falling in love with the fugitive played by Jane Sibbett (who you’ll probably recognise from something).

It’s a textbook example of love and you are in the first stage. There are five stages of love. The first is denial, then the second is sex, then there’s acceptance, then there’s divorce …and then more sex, if you’re lucky.

Taking control of someone's PC using TeamViewer

July 17th, 2012

Taking control of someone’s PC is a pretty straightforward affair these days and the people at TeamViewer have made it even easier. Basically there are 2 sides: the student (who has their computer controlled) and the master (who does the controlling). There’s also a bit of security because the communications channel is the internet and it’s a wild frontier out there!

Student

  1. Go to: http://www.teamviewer.com/
  2. Click the Download navigation tab at the top of the screen.
  3. Download the All-In-One: TeamViewer full version and save it somewhere sensible.
  4. Run the downloaded program.
  5. The first window to pop up asks if you would like to Install or Run, so select Run and click Next.
  6. Accept the terms and click Next.
  7. A second later, a window will pop up.
  8. On the left hand side, make a note of Your ID and Password.
  9. When asked for them hand them over to the master.
  10. When you want to deny the master from controlling your PC, just close the TeamViewer application.

Master

  1. Go to: http://www.teamviewer.com/
  2. Click the Download navigation tab at the top of the screen.
  3. Download the All-In-One: TeamViewer full version and save it somewhere sensible.
  4. Run the downloaded program.
  5. The first window to pop up asks if you would like to Install or Run, so select Run and click Next.
  6. Accept the terms and click Next.
  7. A second later, a window will pop up.
  8. Speak to your student and ask them for their User ID and Password.
  9. Enter their User ID in the box marked Partner ID and click Connect to partner.
  10. When the connection has been made, you will be asked for the password.
  11. Enter the password and the application will open up to reveal their remote screen.
  12. To end your control of their PC, just close the application.

That’s it, told you it was easy!

Creating a unique backup file name under Unix

July 16th, 2012

Before updating a system file I’ll take a backup copy of it. The less imaginative of you will choose a backup name like file.bak or file2. Some of you will use your initials, especially if you work in an environment where you might run into your colleagues working on the same platform. Some of you who are a bit cleverer will incorporate the date in the backup file name. Sure you can see the date from the timestamp on the file but that information can be lost when you copy the file or restore it from an archive.

For files that I might be testing configuration, I might make lots of copies as I try different things. I use a full date time stamp e.g. httpd.conf-2012-07-16--13-03-00. It takes a bit of time to read the clock and write the full backup file name. I started doing it using the date command to generate the time and date string like so:

cp httpd.conf `date '+%Y-%m-%d–%H-%M-%S'`-httpd.conf

But then I thought why remember the magic percent sequence of the date? So if you edit your ~/.bash_profile and add the following line:

export d="date +%Y-%m-%d–%H-%M-%S”

Now you can create a backup file name really easily:

cp httpd.conf `$d`-httpd.conf

or if you prefer the date at the end of the file:

cp httpd.conf httpd.conf-`$d`

Rerunning the above command line creates different file names which are guaranteed not to overwrite each other. You also might want to add a reason for the backup

cp httpd.conf httpd.conf-`$d`-before-add-bigsoft-virtual-host

Movie releases in your GMail Calendar

July 3rd, 2012

If you have a GMail account you can get new movie releases to appear in your calendar. It’s really easy too!

  1. Log into your GMail account.
  2. Go to: http://www.hollywoodchicago.com/forums/3266/automatically-updating-google-calendar-of-upcoming-movie-dvd-releases
  3. When the page loads you will see an example of the calendar in the centre of the page.
  4. At the bottom of the calender panel there is a (+) Google Calendar icon. Click it.
  5. Your web browser will open a new window taking you to your Google calendar page.
  6. A dialogue box will appear asking you to confirm the addition of the new calendar so click Yes, add this calendar.
  7. It took a brief moment and the calendar updated with all the new movie releases.

I can’t wait for Dark Knight Rises in a couple of weeks!

Obtaining the CORBA IOR and connecting to the ZonePortal

June 21st, 2012

It’s all very well to talk to these CORBA objects floating around the network but how do you get your first one; how do you get into the system? The Quantel Broadcast System uses an Interoperable Object Reference (IOR) in a well known location. The IOR is nothing more, than just a series of characters making up a locator string. In the example below I’ve wrapped the lines but in real life this is just one line:

IOR:000000000000002349444C3A515F5175656E74696E2
F515F496E7465726E616C506F7274616C3A312E30000000
000001000000000000006C000102000000000D31302E313
6322E35352E313400004E84000000143633383336313433
392F0517230C1F483E23462300000002000000000000000
8000000004A414300000000010000002000000000000100
01000000010501000100010109000000020501000100010
100

The IOR “string” is a formally serialised object that can be converted back to a real CORBA object. We can see the data contained in the IOR string by using the dior command (decode IOR) from the JacORB bin folder we looked at in the previous article:

cd D:\blog\jacorb-3.0rc1\bin
dior -i IOR:00000000000…

Gives the output:

TypeId : IDL:Q_Quentin/Q_InternalPortal:1.0
TAG_INTERNET_IOP Profiles:
  Profile Id:             0
  IIOP Version:           1.2
  Host:                   10.162.55.14
  Port:                   20100
  Object key (URL):       638361439/%05%17%23%0C%1FH%3E%23F%23
  Object key (hex):       0x36 33 38 33 36 31 34 33 39 2F 05 17 23 0C 1F 48 3E 23 46 23
  -- Found 2 Tagged Components--
  #0: TAG_ORB_TYPE
     Type: 1245790976 (JacORB)
  #1: TAG_CODE_SETS
     ForChar native code set Id: ISO8859_1
     Char Conversion Code Sets: UTF8
     ForWChar native code set Id: UTF16
     WChar Conversion Code Sets: UTF8, UCS2

As you can see the IOR string contains all the information needed to talk to a particular object in the CORBA system. It includes everything from IP address and port number to protocol version and text encoding type.

Quantel has made it easy to obtain the IOR from the ISA Manager by delivering it through the built-in web server. The ISA Manager is a critical component to the Quantel Broadcast System. As a consequence there is an ISA Manager and an ISA Slave for fail-over and redundancy. Each ISA delivers the IOR of the manager so you don’t have to worry about tracking which one of the ISAs is in control of the system.

For the largest part we don’t really care what’s is in IOR we just get it, convert it and make calls on it. So let’s continue with that in mind and start with a simple client to read the IOR string from http://isa-manager/ZonePortal.ior

Code

URL loc = new URL("http://10.162.55.14/ZoneManager.ior");
InputStream is = loc.openStream();
BufferedReader br = new BufferedReader (new InputStreamReader(is));
String ior = br.readLine();
br.close();

From the output of the dior program (above) we can see the that underlying type of the IOR object is Q_Quentin/Q_InternalPortal:1.0. However this is a bit useless because we don’t have the interface definitions for that. We, as users, must be told that we can cast a Q_Quentin/Q_InternalPortal:1.0 into a Quentin/ZonePortal:1.0.

Casting is a computer language term which means to take the same bit of memory where an object lives and treat it as a different type. It only works if the 2 types are related. In CORBA terms 2 classes might share the same interface but may be totally different classes. In this case CORBA coins the term narrowing to convert one type into another. It almost always requires a bit of extra knowledge that says that 2 items are related on an interface level: this is where the Object Request Broker (ORB) comes in.

The ORB knows about the relationships between the CORBA interfaces and will allow you to convert between them. Your local ORB will ask the remote ORB to do the narrowing for us because we might not have the full interface definitions, i.e. we have no way to find out what a Q_Quentin/Q_InternalPortal:1.0 is or how to convert it into a Quentin/ZonePortal:1.0.

This part is somewhat CORBA implementation specific. In this example I’m using Java and JacORB but it would look similar if you were using a different implementation.

Setting up the CORBA sub-system is a bit like creating Sockets for network communications in that there are lots of options and documentation about those options but after going through all of it, you inevitably end up with the same couple of lines of code!

The CORBA interfaces are built into the Java Standard libraries so all we need to do is tell Java to use the JacORB implementation, which is simply a case of telling it which class to use. The args and props variables give you the opportunity to add extra configuration options from the command line and configuration files respectively.

Code

Properties props = new java.util.Properties ();
props.setProperty ("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
props.setProperty ("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
 
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);

Once the ORB is set up we can use it to narrow the IOR into a ZonePortal.

Code

org.omg.CORBA.Object rawo = orb.string_to_object (ior);
ZonePortal portal = ZonePortalHelper.narrow (rawo);

Now that we have our very own ZonePortal we can test it with a simple get version call:

Code

String x = portal.getProperty (PropertiesOperations.softwareVersion);
System.out.println ("This ISA Manager is version " + x);

So let’s put it all together.

Code

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Properties;
 
import com.quantel.quentin.PropertiesOperations;
import com.quantel.quentin.ZonePortal;
import com.quantel.quentin.ZonePortalHelper;
 
 
class OrbExample
{
  
static org.omg.CORBA.ORB orb;
static org.omg.PortableServer.POA poa;
  
  public static void main (String[] args) throws Exception
  {
    // read ior
    URL loc = new URL ("http://isa-manager/ZoneManager.ior");
    InputStream is = loc.openStream ();
    BufferedReader br = new BufferedReader (new InputStreamReader (is));
    String ior = br.readLine ();
    br.close ();
    
    // Initialisation properties
    Properties props = new java.util.Properties ();
    props.setProperty ("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
    props.setProperty ("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
    
    // create orb
    orb = org.omg.CORBA.ORB.init (args, props);
    org.omg.CORBA.Object rawo = orb.string_to_object (ior);
    ZonePortal portal = ZonePortalHelper.narrow (rawo);
    
    String x = portal.getProperty (PropertiesOperations.softwareVersion);
    System.out.println ("This ISA Manager is version " + x);
 
    orb.shutdown(false);
  }
}