Working with Static IP’s, Virtual Networks, and Shared Internet Access in VMWare Fusion 5

VMWare Fusion 5.0 and Static IP’s for Windows AD and Client Machines

Here’s the problem. You have a two Windows VM’w (one of them an AD, another a server that uses the first as its Active Directory). You want these two VM’s to remain in synch, and they both must see each other on the local, virtual network, but you also want them both to be able to reach the shared internet connection used by your Mac). What now? You main challenge is ensuring that the Windows Server that isn’t the Active Directory (AD) won’t have name resolution issues.

Core Question: How can two servers on a private network both share the host internet access AND always see each other, particularly when one of those client machines is both an Active Directory (AD) as well as DNS server for the private network???

Step 1

Check the file dhcpd.conf in Library/Preferences/VMware Fusion/vmnet8. Find the following information:

subnet 172.16.165.0 netmask 255.255.255.0 {
range 172.16.165.128 172.16.165.254;
option broadcast-address 172.16.165.255;
option domain-name-servers 172.16.165.2;
option domain-name localdomain;
default-lease-time 1800; # default is 30 minutes
max-lease-time 7200; # default is 2 hours
option netbios-name-servers 172.16.165.2;
option routers 172.16.165.2;
}

Note that this VMware 5 instance is using 172.16.165.X as the private VLAN for VM’s.

This means that any address where X is between 3 and 127 can be used as static addresses for one or many VM’s. Meanwhile, your gateway should be 172.16.165.2, as this is the routing address.

NOTE: Your VM may use a different range of address, in which case replace 172.16.165 with your own address.

Step 2

Take VM #1 (your AD server), set the VMware Network Adapter to “Share with My Mac” (which is NAT, essentially). Configure the network settings as so.

IP:172.16.165.10
Mask: 255.255.255.0
Gateway:172.16.165.2
DNS Server: 127.0.0.1

Step 3 – Take VM#2 (your server that will access the AD server), set the VMware Network Adapter to “Share with My Mac” (which is NAT, essentially). Configure the network settings as so.

IP:172.16.165.11
Mask: 255.255.255.0
Gateway:172.16.165.2
DNS Server: 172.16.165.10 (note that we use the AD server as the DNS server).

This allows VM#2 to use the AD server for authentication and any DNS within your private network. This allows VM#1 to act as both DNS and AD locally, but passes through any other requests to the host system.

So, since you are now using static IP’s, when you VM’s startup, they can always find each other…. good news!

Quickly looking up documents using Document ID’s in SharePoint – Part 2

In my last post, I discussed some of the issues I had seen with the DocIdRedir.aspx, and I’ve concluded that the main solution is to author a new version of the page, with some enhanced “abilities”.  In my case, I ended up authoring an .ashx page, rather than an .aspx page.  In doing this, I started with two main references:

Kobi’s excellent post on writing an .ashx handler for Doc Id redirection:

http://kobikobi.wordpress.com/2010/09/29/sharepoint-2010-using-document-id-to-link-to-a-specific-version/

The decompiled code from the current DocIdRedir.aspx (as a basis for our new functionality):

https://gist.github.com/601861

In my case, however, I want an entirely different behavior from the “redirect me to the file” behavior.  I’m looking to significantly enhance the data that the handler can return, so that I can get all of the links, metadata, and publishing status of the current document (including returning the link to the latest published version, not the latest version of the file).  As a result, I’ve chosen to return a payload of JSON, with the purpose of letting the calling page / javascript choose the appropriate path based on the returned data.

In this example, my modified DocIdBatchData.ashx has the following features:

  • You can submit a GET request to return the data for a single document OR you can post a collection of Document Id’s to resolve many documents at once.
  • All data is returned in JSON format, allowing javascript to quickly parse and deal with the results.
  • You can request additional metadata to be returned by posting those fields and Document Id’s into the handler.

A sample of the returned data is as follows:

{
"data": [{
"mData": {
"Title": "SABCS Poster Book"
},
"docId": "3AWMK2HN32DR-4-3 ",
"versionLabel": "",
"docSiteUrl": "http://myserver:40921",
"docWebUrl": "http://myserver:40921",
"docWebServerRelativeUrl": "/",
"listGuid": "caa79391-faf7-4095-9ed1-486a55dba9bf",
"listName": "Library Objects",
"listItemId": "3",
"listItemFilename": "LOFile2.pdf",
"urlHistory": "_layouts/Versions.aspx?list={caa79391-faf7-4095-9ed1-486a55dba9bf}&ID=3",
"versionLatest": "1.0",
"versionLatestUrl": "Library Objects/LOFile2.pdf",
"versionLatestFolder": "Library Objects",
"versionRequested": "1.0",
"versionRequestedIsPub": true,
"versionRequestedUrlDisplay": "Library Objects/Forms/DispForm.aspx?ID=3&VersionNo=512",
"versionRequestedUrl": "Library Objects/LOFile2.pdf",
"versionRequestedContentType": "0x010100548E9644DF2341A6AE310514AE3913D900130033306EFE434696B5DD9689DC30A4",
"errorStatus": 0,
"errorMessage": null
}],
"errorStatus": 0,
"errorMessage": null
}

So, the primary value proposition here is that we’ve used the existing DocIdRedir.aspx file resolution, but instead of simply redirecting the user, we are allowing the caller to get some additional data back, and allowing that user / page / javascript / client code to then make a CHOICE about where to go.

More Items that Broke During Snow Leopard Upgrade…

Having recently been through a Snow Leopard upgrade on my Macbook Pro (2.4 GHz Core Duo model), I previously noted a number of issues with my Ruby on Rails install related to two core issues:

  • Java is automatically upgraded to version 1.6
  • Many of your Ruby gems need to be reinstalled due to Snow Leopard’s 64 bit support

My latest issue is around my Logitech keyboard and mouse. They still work, but the Logitech Control Center doesn’t. This is message I see in the Control Center: “No Logitech Device Found”.

The solution appears to be a simple reinstallation of the Logitech drivers, which can be found here:
Logitech Control Center

Alternately, I found some great instructions at TUAW.


Ruby / MacBook / Snow Leopard Upgrade

After upgrading to Snow Leopard, I was greeted with the following upon trying to run my latest Ruby application:

/path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle: dlopen(/path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle, 9): no suitable image found.  Did find: (LoadError)
/path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle: no matching architecture in universal wrapper -/path/to/gems/ruby-debug-base-0.10.3/lib/ruby_debug.bundle

/path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle: dlopen(/path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle, 9): no suitable image found.  Did find: (LoadError)
/path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle: no matching architecture in universal wrapper - /path/to/gems/linecache-0.43/lib/../lib/trace_nums.bundle

/path/to/gems/activerecord-2.3.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:76:in `establish_connection': Please install the postgresql adapter: `gem install activerecord-postgresql-adapter` (dlopen(/path/to/gems/pg-0.8.0/lib/pg.bundle, 9): no suitable image found.  Did find: (RuntimeError)
/path/to/gems/pg-0.8.0/lib/pg.bundle: no matching architecture in universal wrapper - /path/to/gems/pg-0.8.0/lib/pg.bundle)

I did find a quick fix: basically, the native system gems need to be reinstalled for 64-bit gems:

I found a good script for doing this at:

http://stackoverflow.com/questions/1367380/snow-leopard-64-bit-ruby-gem-problem

From the irb interface, try this:

$ irb
  irb> `gem list`.each_line {|line| `sudo env ARCHFLAGS="-arch x86_64" gem install #{line.split.first}`}

After about 20 minute of trashing, my system was up and functional again!

— UPDATE —
As pointed out by Jeffrey Lee, this could be a little more verbose with the following modifications:

`gem list`.each_line {|line| puts "Installing #{line.split.first}"; `sudo env ARCHFLAGS="-arch x86_64" gem install #{line.split.first}`}

Ruby on Rails and iPhone Web App Development – Part 1

mediconnect1.png
In this article, I’ll be describing my setup for a simple iPhone application that I’ve built using Ruby on Rails.The primary objective was to quickly build out a prototype application demonstrating the use of a mobile device in entering critical data in the field (in this case, for Pharmaceutical Sales Reps) as well as content integration to another application for rapidly searching and repurposing legacy Word and Excel 2003 content (that part comes later!)

This is a high-level description, so I’ll be only providing an overview of some of the rails functionality, so those people looking for a full walkthrough might be a little disappointed.

PART 1 – Building the Basic Application and Simple Data Entry

My environment:

OS: Macbook Pro (Leopard 10.5.7)

Primary Dev Environment: Eclipse (Galileo) + Aptana RadRails (v1.5.1)

Target iPhone Device: iPhone 3G

My Plugins / Gems/ Rails Addons

jRails v0.4 – An excellent substitute for the default prototype libraries used in Rails.

tank-engine – austinrfnd’s branch branch of Noel Rappin’s tank-engine project.

Creating the Basic Application

After creating the basic application in Aptana studio, I created very a very basic page for handing new medical information requests:

script/generate scaffold mirequest summary:string description:string potential_ae:string potential_pc:string primaryproduct

At this point, I could access basic RESTful functions for index, new, edit, etc. through a standard browser.

Adding iPhone Functionality

In order to best use the iPhone, I first started with Noel Rappin’s tank-widget plug-in. This is simple successor to to his original rails-IUI plugin, but features integration with the jQuery library instead of using the iui javascript and css files. I actually started with one of the most current branches of this code based on some changes by austinrfnd in his own branch (tank-engine).

There are some good demonstrations of using this functionality in a series of articles hosted by IBM;

Developing iPhone applications using Ruby on Rails and Eclipse…

So, setting up the environment looked something like this:

Install the jQuery Rails plugin (my version is 0.4)

sudo script/plugin install git://github.com/aaronchi/jrails.git

Manually copy the javascript files in the plugin. to your javascripts directory.

Install the tank-engine widget

sudo script/plugin install git://github.com/austinrfnd/tank-engine.git

rake tank_engine:install

At this point, I needed to modify a few files to add the iPhone rendering format to my mirequests index view.

Copy and rename views/mirequests/index.html.erb to views/mirequests/index.iphone.erb.

The next step is to enable the controller to detect iPhone specific requests and to include the plug-in helpers for tank-engine.

  acts_as_iphone_controller :test_mode => true

  include TankEngineHelper

Finally, you can get a basic set of buttons and a title-bar by editing the index.iphone.erb.

Here’s what mine looks like.

%=

l = { :caption => ‘Create MI’, :url => new_mirequest_path, :html_options => { :class => ‘te_slide_left’ } }

r = { :back => true, :caption => ‘Back’, :url => “/”, :html_options => {} }

te_navigation_bar( r, “MI Request”, l ) %>

<% panel do %>

<div>

<h2>Pending MI Requests:</h2>

</div>

<% fieldset do %>

<% @mirequests.each do |mirequest| %>

<% row mirequest.summary do %>

<%=h mirequest.description %>

<%= te_link_to ‘Show’, mirequest %>

<% end %>

<% end %>

<% end %>

<% end %>

You can find documentation on these helpers in the tank-engine github site as well as the IBM articles listed above. I did have some formatting issues, however, and the usage of some of the tank-engine helpers wasn’t completely documented. One thing that I learned was that unless you place the row and fieldset helpers inside the panel helper, you won’t get the intended look and feel.

The result should look something like this:

200909111348.jpg

In the next article, we’ll discuss some of the formatting issues and shortcomings with the tank-engine library and how I chose to spice this up a little bit as follows:

200909111352.jpg

Getting Started with Cocoon 2.2 Under Mac OS X Leopard (1.5)

Versions of Software Used

  • Mac OS X Leopard 10.5.6
  • Maven 2.0.10

STEPS

Upgrade Maven on Leopard

Download Cocoon

Loading Cocoon Block into Eclipse

From the Command Line

mvn archetype:generate -DarchetypeCatalog=http://cocoon.apache.org

cd /Users/smetker/development/cocoon_dev/svn

mkdir getting-started-app

mvn archetype:generate -DarchetypeCatalog=http://cocoon.apache.org

Choose a number: (1/2/3): 2

Define value for groupId: : com.rwd.infomaestro

Define value for artifactId: : myBlock1

Define value for version: 1.0-SNAPSHOT: : 1.0.0

Define value for package: com.rwd.infomaestro: : com.rwd.infomaestro.myBlock1

mvn archetype:generate -DarchetypeCatalog=http://cocoon.apache.org

Choose a number: (1/2/3): 2

Define value for groupId: : com.rwd.infomaestro

Define value for artifactId: : myBlock1

Define value for version: 1.0-SNAPSHOT: : 1.0.0

Define value for package: com.rwd.infomaestro: : com.rwd.infomaestro.myBlock2

cd myBlock1

mvn eclipse:eclipse

Create the 2nd eclipse project settings


cd ../myBlock2


mvn eclipse:eclipse


cd ..



Choose a number: (1/2/3): 3

Define value for groupId: : com.rwd.infomaestro

Define value for artifactId: : myWebApp

Define value for version: 1.0-SNAPSHOT: : 1.0.0

Define value for package: com.rwd.infomaestro: : com.rwd.infomaestro.myWebApp

cd ..

In order to use blocks as dependencies you need to install them into Maven’s local repository. First go to myBlock1/ and myBlock2/ directory and execute following command:

cd myBlock1
mvn install
cd ..
mvn install


So far the web application myCocoonWebapp doesn’t have any information about the existense of the block myBlock1 and myBlock2. Change this by opening getting-started-app/myCocoonWebapp/pom.xml and add the block as dependency:

<project>
[...]
<dependencies>
<dependency>
        <groupId>com.rwd.infomaestro</groupId>
<artifactId>myBlock1</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
        <groupId>com.rwd.infomaestro</groupId>
<artifactId>myBlock2</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
[...]
</project>


Running Jetty from Command Line (Jetty bundled with Cocoon block)

mvn jetty:run


Debugging Cocoon in Eclipse

Follow the instructions under this link first: Cocoon Main Site – Debugging Cocoon in Eclipse

Using the Jetty launcher is much simpler and you don’t have to create a Java project for each Cocoon application that you want to debug.If you prefer using Jetty 6, you can start Jetty as Java application from within Eclipse. For this purpose

  • download Jetty 6
  • and extract it into a directory of choice. You only have to make sure that it is not a subdirectory of an Eclipse project that is added to your Eclispe workspace.
  • now create a new Java project (e.g. “Jetty6”) in your workspace and add jetty-6.x.jar, jetty-util-6.x.jar, servlet-api.2.5.x.jar and start.jar as library dependencies (all 4 files are part of the official Jetty distribution)
  • add the project(s) that you want to debug as Project References and as Java Build Path – Projects references. This makes it necessary that these projects are added to the current workspace.
  • provide a minimal Jetty configuration file jetty-debug-cocoon.xml, e.g. in the root directory of your “Jetty6” project