Microsoft has for free the Virtual Server or Virtual PC 2007 SP 1 as virtualization software. I wanted to test Microsoft Windows 2003 R2 Server. On the Virtual Appliance Marketplace at VMware is only a VHD from Microsoft available. A VHD is the Microsoft vm image type. I installed the Microsoft Virtual Server and had no luck to start the vhd image successfully. Virtual PC 2007 works instead. I can start the VM and configure this vm server as active directory, DNS and WINS server like described in this howto. The networking functionality in Microsoft Virtual Server/PC is a pain in my ass. For active directory and dns server is a fixed ip configured inside the vm. No clue on which ip i can reach my vm from the host system. Sun virtualbox works in that aspect more like expected. You can switch between NAT and hostonly mode. With the host only networking mode has the VM a fixed ip inside the host system. So far so good. I tested this with a ubuntu 9.04 server as guest os inside virtualbox. For updates you need to shutdown, reconfigure to use NAT and start the vm again. In NAT mode is the vm only accessible via the virtualbox window. You have to define each port manually if you want to access the NAT vm from outside the virtualbox. Typically i use such a vm ubuntu server as subversion, maven artifactory, … server for development. VMware server 2.x works for me like expected. NAT networking to have internet access from the guest os and full access on all ports from the hostsystem. The guest os see a DHCP networking interface and the host os has a fixed ip to access the vm. So how do i get the 30 days trial edition from Microsoft Windows 2003 server get to run inside VMware server? After setting up the server inside Virtual PC you had to remove the Virtual Machine additions via the menu. This additions are not available as software package inside the software overview in windows 2003 server. Now shutdown the guest os and close virtual pc. With the VMWare vCenter Converter 3.0.3 (Starter Edition) you can convert the VHD to a VMX image for VMWare Server or Player. Select in the last step of the wizard to remove all checkpoints inside the guest os, to install VMWare tools and to setup the networking interface (NAT on one instead of two nic). The VHD image has 1,5 GB and needs on my laptop round about 1h to convert. After that i can start VMWare server and register this new guest os image. The converter has set the type correct to MS Windows 2003 server 32bit. A little bit annoying is that my bluetooth connected mouse works perfect inside Virtual PC but not out of the box inside the VMWare window :-( So i grabbed my old usb mouse to have a running mouse. With the Sysinternals ADExplorer i can examine my new active directory from my host os. Inside eclipse 3.5 is Apache Directory Studio a good choice to to access the AD via LDAP.

Tags: , , , , ,

ralf on May 26th, 2009

The good news is that most of the common used software works. So far i install only the necessary software for such a netbook. No video editing, development tools, ide,…

Software which works

Flash under IE8 work only with a trick. The direct download or installation from adobe.com does not work. Via PCWelt is the install exe as well available. Save the file and start the installation. Et voila.

The Samsung has no built in bluetooth device. I bought a ultra small usb Trust bluetooth 2.1 adapter. Windows 7 RC recognize most but not all functionality. The broadcom driver for Vista works perfect. After that i can install the Nokia PC Suite 7.1 and access my Nokia N95 successfully.

Tags: ,

ralf on May 25th, 2009

The Samsung netbook shipped with pre installed Windows XP and 1GB RAM. After upgrading to 2GB RAM and good tests of Windows 7 RC under Virtualbox and VMware i feel safe to install Windows 7 RC. I made under the running XP all available updates including bios firmware. My RAM dealer told me about a other customer with non bootable netbook after upgrading under windows 7. You need a USB Stick to extract the iso to it and boot from it like described here. Reboot the netbook and press F2 to enter the BIOS for changing the boot order. Push the “USB HDD” over the internal HDD and press F10 for “save and exit”. Insert the stick and enter the setup of windows 7 RC. The installation works perfect and nearly all hardware works out of the box. Windows update updates the lan,wlan and graphics driver. My netbook has a built in UTMS modem which is not recognized out of the box. Under XP are two possibility to establish HSPDA connections with the internal UMTS modem: Vodafone Dashboard or the Samsung Connectionmanager. I tried from samsung.de the XP version with no luck. The polish Samsung website has a newer working version. Another problem was the touchpad. Windows recognize only a PS/2 mouse… The vista driver from the synaptic download site works well. Good first place to look is the “troubleshoot compatibility” entry in context menu of each executeable. Set their the requirement to use Admin rights and Vista or XP (in that order) compatibility. The connectionmanager works only with Vista OS and Admin rights settings. WLAN at home was no problem. No jumps or quirks has to be done to establish a WPA2 AES connection.

I use AVG Antivir Free edition as antivirus solution. The newly maintenance center offers online a page with working products. Microsoft links directly to AVG Antivirus. AVG Antivir Free works as well with the limitation that windows is not informed about the state of virus definitions. You can disable this additional check inside the maintenance center to avoid further warnings about a maybe outdated antivirus solution. I tried inside Virtualbox Kapersky as trial which has a perfect integration.

Windows 7 RC compared to Vista is much faster. Even on a netbook will the Aero extension work. Other programs or windows get a glass l&f if you swith with the tab key through the runnning programs. The taskbar shows the running IE 8 including the possibility to navigate directly to the open tabs. Download progress is shown as a green filling taskbar icon.

Most software seems to run like Office 2003, Notepad++, 7-Zip or firefox.

Overall is the Samsung NC10 a good choice as netbook with the non glare display and the long running battery with 3-4h capicity.

Tags: , ,

ralf on February 4th, 2009

Most enterprises use LDAP as interface to their company structure database. In the Microsoft world is Active Directory the implementation for LDAP. Under Linux is OpenLDAP the common choice for admins. Such LDAP directories are tree based. OpenLDAP is the reference implementation for LDAP v3.

The JNDI API inside the Java SDK is usable as implementation to access such LDAP directories. With Spring LDAP is more sophisticated API available.

My first code sample works in the company against their OpenLDAP server. For security reasons is the access not possible from outside. So my JUNIT Tests was code red after running in my homeoffice. Maven standard is to run all test prior to build a package like a J2EE war or ear file. So i decided to setup a OpenLDAP server inside my ubuntu 8.10 server vmware server vm.

First step is to retrieve and install the openldap package as root:

  • sudo su -
  • apt-get install slapd ldap-utils nmap php5-ldap db4.2-util

You have to set a password during installation for the OpenLDAP server. Keep that in mind!
Now run the configuration assistant:

  • dpkg-reconfigure slapd

Wizard steps:

  1. omit openldap server configuration? – no
  2. dns domain name? vm.example.org
  3. organization name? myCompany
  4. database backend to use? hdb
  5. do you want the database to be removed when slapd is purged? yes
  6. may be the question: move old database? yes
  7. administrator password? the same one as entered during installation
  8. confirm password? see last step
  9. allow LDAPv2 protocol? no

Now edit the /etc/ldap/ldap.conf file for the client side configuration:

ldap_version 3
URI ldap://localhost:389
SIZELIMIT 0
TIMELIMIT 0
DEREF never
BASE dc=vm,dc=example, dc=org

With the command “ldapsearch -x” you should see the following output:

# extended LDIF
#
# LDAPv3
# base  (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# vm.example.org
dn: dc=vm,dc=example,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: myCompany
dc: vm

# admin, vm.example.org
dn: cn=admin,dc=vm,dc=example,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

For easier admininstration exist a php admin ui called phpldapadmin and can be installed with:

  • apt-get install phpldapadmin
  • ln -s /usr/share/phpldapadmin/ /var/www/phpldapadmin

Open now the config file /etc/phpldapadmin/config.php with joe (a editor) and change the line with the ldap node info to:


/* Array of base DNs of your LDAP server. Leave this blank to have phpLDAPadmin
   auto-detect it for you. */
$ldapservers->SetValue($i,'server','base',array('dc=vm,dc=example,dc=org'));
...
$ldapservers->SetValue($i,'login','dn','cn=admin,dc=vm,dc=example,dc=org');

Check your PHP5 memory settings in /etc/php5/apache2/php.ini:

memory_limit = 64M      ; Maximum amount of memory a script may consume (16MB)

Restart the apache to use this changed configuration

  • /etc/init.d/apache2 restart

and go to:

http://your.vm.ip/phpldapadmin

Click on the login link on the left side and enter as “login dn”:

  • cn=admin,dc=vm,dc=example,dc=org

and your password in mind. First step is now to enter a “organisational unit”:

  • click on the left side on the link beside the world icon “dc=vm…”
  • click on “create a child entry here”
  • choose “organisational unit” as template
  • enter “people” and click on “create object”
  • click on this new orginsational unit people in the tree
  • click on “create a child entry here”
  • choose “Address Book Entry (mozillaOrgPerson)” as template
  • enter “John” as “first name”
  • enter “Doe” as “last name”
  • go to common name (cn) and enter “John Doe”
  • click on “create object”

Now check with “ldapsearch -x” if everything is ok:

# extended LDIF
#
# LDAPv3
# base  (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# vm.example.org
dn: dc=vm,dc=example,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: myCompany
dc: vm

# admin, vm.example.org
dn: cn=admin,dc=vm,dc=example,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# people, vm.example.org
dn: ou=people,dc=vm,dc=example,dc=org
objectClass: organizationalUnit
objectClass: top
ou: people

# John Doe, people, vm.example.org
dn: cn=John Doe,ou=people,dc=vm,dc=example,dc=org
objectClass: inetOrgPerson
objectClass: top
givenName: John
sn: Doe
cn: John Doe

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

Your LDAP server is now running and you can easily configure it inside your favorite browser

LDAP Tree

Tags: , , ,

DBUnit is very nice for testing database content changes made by an application. You define in XML the data including the structure of your tables (dataset.xml).



	

Simple_Data is the name of the table and each column is a attribute in the xml doc with the content value e.g. id with value 1.

The Getting Started of DBUnit work with JUnit 3.8 and self handling of the JDBC Connection.

JUnit 4.x are more comfortable with annotations based test methods and Spring comes with dependency injection for separating
configuration from implementation code.

The following approach combines DBUnit with JUnit 4.4 and Spring 2.5.6 to test comfortable a Oracle 10g database.

I use Maven 2.x to define the depending libraries used by the example (pom.xml):



	4.0.0
	de.schaeftlein.dev.dbunit
	test-dbunit
	test-dbunit
	0.0.1-SNAPSHOT
	
	
		
			org.dbunit
			dbunit
			2.4.2
		
		
			org.springframework
			spring
			2.5.6
			jar
			compile
		
		
			junit
			junit
			4.4
		
		
			commons-dbcp
			commons-dbcp
			1.2.2
		
		
			org.springframework
			spring-test
			2.5.6
		
		
			org.slf4j
			slf4j-api
			1.5.6
		
		
			org.slf4j
			log4j-over-slf4j
			1.5.6
		
		
			log4j
			log4j
			1.2.14
		
		
			org.slf4j
			slf4j-log4j12
			1.5.6
		
		
			com.oracle
			ojdbc14
			10.2.0.2.0
		
	

Keep in mind that the Oracle JDBC Driver has to be downloaded manually.
The public maven repos include only the Pom definition for the oracle driver. Generate with maven command line tool the eclipse project files:

mvn clean eclipse:clean eclipse:eclipse

The JDBC datasource is defined via Spring (applicationContext.xml):




  




  

Additionally we define the expected data as well in XML for DBUnit (expectedDataSet.xml):



	

Now we can code our JUnit 4.x Test to

  1. load data before the test method
  2. change the data via JDBC to emulate a application
  3. compare the changed data with expected data
  4. clean up the database

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class TestDBUnitWithSpring {

	@Autowired
	private DataSource dataSource;

	@Before
	public void init() throws Exception{
		// insert data into db
		DatabaseOperation.CLEAN_INSERT.execute(getConnection(), getDataSet());
	}

	@After
	public void after() throws Exception{
		// insert data into db
		DatabaseOperation.DELETE_ALL.execute(getConnection(), getDataSet());
	}

	private IDatabaseConnection getConnection() throws Exception{
	// get connection
		Connection con = dataSource.getConnection();
		DatabaseMetaData  databaseMetaData = con.getMetaData();
		// oracle schema name is the user name
		IDatabaseConnection connection = new DatabaseConnection(con,databaseMetaData.getUserName().toUpperCase());
		DatabaseConfig config = connection.getConfig();
		// oracle 10g
		config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new Oracle10DataTypeFactory());
		// receycle bin
		config.setFeature(DatabaseConfig.FEATURE_SKIP_ORACLE_RECYCLEBIN_TABLES, Boolean.TRUE);
		return connection;
	}

	private IDataSet getDataSet() throws Exception{
		// get insert data
		File file = new File("src/test/resources/dataset.xml");
		return new FlatXmlDataSet(file);
	}

	@Test
	public void testSQLUpdate() throws Exception{
		Connection con = dataSource.getConnection();
		Statement stmt = con.createStatement();
		// get current data
		ResultSet rst = stmt.executeQuery("select * from simple_data where id = 1");
		if(rst.next()){
			// from dataset.xml
			assertEquals("value_before", rst.getString("content"));
			rst.close();

			// update via sql
			int count = stmt.executeUpdate("update simple_data set content='value_after' where id=1");

			stmt.close();
			con.close();

			// expect only one row to be updated
			assertEquals("one row should be updated", 1, count);

			// Fetch database data after executing the code
			QueryDataSet databaseSet = new QueryDataSet(getConnection());
			// filter data
			databaseSet.addTable("simple_data", "select * from simple_data where id = 1");
			ITable actualTable = databaseSet.getTables()[0];

			// Load expected data from an XML dataset
			IDataSet expectedDataSet = new FlatXmlDataSet(new File("src/test/resources/expectedDataSet.xml"));
			ITable expectedTable = expectedDataSet.getTable("simple_data");

			// filter unnecessary columns of current data by xml definition
			actualTable = DefaultColumnFilter.includedColumnsTable(actualTable, expectedTable.getTableMetaData().getColumns());

			// Assert actual database table match expected table
			assertEquals(1,expectedTable.getRowCount());
			assertEquals(expectedTable.getRowCount(), actualTable.getRowCount());
			assertEquals(expectedTable.getValue(0, "content"), actualTable.getValue(0, "content"));

		} else {
			fail("no rows");
			rst.close();
			stmt.close();
			con.close();
		}

	}
}

Tags: , , ,