2. Smallworld Magik - McNamara Consulting, Inc.

Kevin McNamara
(303) 642-7943
[email protected]
Technical Biography
January 2004
Table of Contents
Section
1.
2.
3.
4.
5.
6.
7.
8.
Page
Introduction............................................................................................................................. 1
Smallworld Magik .................................................................................................................. 1
2.1.
Magik Applications Developed...................................................................................... 1
2.1.1.
GE Network Solutions – DM AVA Application................................................... 1
2.1.2.
Level3 - Data Validator ......................................................................................... 1
2.1.3.
Level3 - Work Order Monitor ............................................................................... 2
2.1.4.
Level3 – MIT Vitria Interface ............................................................................... 3
2.1.5.
Level3 – Data Copy Engine .................................................................................. 3
2.1.6.
Duke Energy – Multi-purpose Tracing Engine ..................................................... 3
2.1.7.
Duke Energy – Data QA/Bulk Update via Tracing ............................................... 4
2.1.8.
Duke Energy – Cornerstone Customization .......................................................... 4
2.1.9.
Niagara Mohawk – Gas Leak Survey.................................................................... 4
2.1.10.
Niagara Mohawk – Leak Archive Report ............................................................. 5
2.1.11.
Niagara Mohawk – ACES – Joint Pole Proposal .................................................. 5
2.2.
Magik Scripts/Tools Developed..................................................................................... 5
2.2.1.
Level3 – Print Common Ancestry ......................................................................... 5
2.2.2.
Level3 – Inside Plant Data Query Methods .......................................................... 6
2.2.3.
Level3 – Text Sorted Collection ........................................................................... 6
2.2.4.
Level3 – Load List Generator ............................................................................... 6
2.2.5.
Level3 – Big Rope and Big Hash .......................................................................... 7
2.2.6.
Niagara Mohawk – Association Table Mixins ...................................................... 7
UNIX Shell and PERL Scripting ............................................................................................ 7
3.1.
BellSouth – Pre-Order Gateway .................................................................................... 7
3.1.1.
Volume Test Automation ...................................................................................... 8
3.1.2.
Volume Test Analysis ........................................................................................... 8
3.1.3.
Data Log Analysis ................................................................................................. 9
3.1.4.
Configuration Manager ......................................................................................... 9
3.1.5.
Automated Filename Change ................................................................................ 9
3.2.
Bell Atlantic/Verizon – DSLAM Discrepancy Analysis ............................................... 9
Oracle & PL/SQL ................................................................................................................. 10
4.1.
BellSouth – POG.......................................................................................................... 10
4.1.1.
PSIMS Oracle Data Loader ................................................................................. 10
4.1.2.
DDL Schema Update........................................................................................... 11
4.2.
Level3 – Model.it and NextGen Analysis .................................................................... 11
C/C++ ................................................................................................................................... 11
5.1.
BellSouth – POG.......................................................................................................... 11
5.2.
US West – Log GUI for Protocol Converter Interface................................................. 12
Visual Basic .......................................................................................................................... 12
6.1.
Bell Atlantic/Verizon – DSLAM Discrepancy Analysis ............................................. 12
6.2.
Level3 – Excel Automation within Magik ................................................................... 12
XML/HTML ......................................................................................................................... 13
7.1.
Telcordia – XML/FCIF Translation ............................................................................. 13
7.2.
Niagara Mohawk – NMGAS GIS Web Pages ............................................................. 13
ESRI ArcInfo/ArcView ........................................................................................................ 13
8.1.
University of Wyoming – Master’s Thesis .................................................................. 13
ii
1. Introduction
This document describes information systems software I have developed over the course
of my career. These software development descriptions are organized by programming
language.
2. Smallworld Magik
2.1. Magik Applications Developed
2.1.1.
GE Network Solutions – DM AVA Application
This provides an interface between Design Manager and AVA programs. AVA is an
accounting standard used in cost estimations across utility corporations in Germany.
AVA accounting models in XML format are imported into Smallworld, where
administrators can customize these models for use within their company. Engineers
working in Design Manager associate these custom models to work done in their jobs.
Accounting information for each job is then exported in XML format to AVA programs
outside of Smallworld, where cost estimations are calculated.
I assisted in the internal design and development for several features of the DM AVA
application. A few of these features are described below:
Menu Item Visibility: One major challenge was development of a unified system to
control menu item visibility. The application GUI contains dozens of menu items, each
of which is visible based on the type of data the user has selected. I developed a
framework that allows definition of all menu item visibility from a single point within the
Magik code using a well-defined API.
Hierarchical Search: The AVA data is hierarchical in nature, and therefore is displayed
in trees within the GUI. I developed algorithms and corresponding GUI functionality
allowing users to quickly “drill down” though these trees to find data of interest.
Three-Tiered Architecture: The DM AVA Application was initially developed as a
rapid prototype. I re-engineered the internal design employing a three-tiered architecture
such that data, engine, and GUI code are clearly separated. Going forward, this
decoupling will provide flexibility in customizations. For example, the existing Magik
GUI could be replaced with a Visual Basic GUI without a change in internal
functionality.
2.1.2.
Level3 - Data Validator
The Data Validator provides automated analysis, update, and tracking of records in the
Smallworld VMDS (Version Managed Datastore). Development of this application
began with creation of Magik scripts to assist in the data validation/integrity efforts for
1
Smallworld Model.it inside plant data. These scripts fell into two categories: data query
and data update. Data query scripts output errors and discrepancies in the Model.it data,
while data update scripts provide automated repair of this data. A large number of these
scripts were rapidly created, and a higher level of organization was needed to track their
findings and updates. I developed the Data Validator application to address this need.
An instance of the data_validator class is sent the ‘run()’ message with the name of a
script as an argument. Information on the records flagged and/or updated via the script is
then logged to Data Validator tables in a separate Smallworld datastore.
I integrated Data Validator functionality into the Model.it Work Order Application.
When a user shares changes on a work order (i.e. posts), a Data Validator is instantiated
and specified scripts are run, with the results being saved to the dB. Furthermore, if data
errors are found and cannot be updated automatically, the user is informed of the specific
problem, and the work order is not posted. Errors in work orders occur due to both user
error and data corruption from the Model.it application itself. Some examples of
validations to flag and repair these data errors are:




Find Dislocated Children: Flag any child (‘n’ side of 1:n relationship) inside
plant records whose area geometries are not fully inside their parents’ area
geometries.
Repair Lost Geometries: Geometries for inside plant records sometimes get
into the wrong world, causing them to be invisible in their proper world. This
script finds such geometries and attempts to put them back in the correct world
based on their relational joins. In other words, provided that the foreign key to
traverse from the ‘n’ to the ‘1’ in a 1:n relationship is intact, and the ‘parent or
owner’ record is in the proper world, the ‘child’ record can be returned to that
world.
Repair Orphans:
This is a sort of inverse validation from ‘Repair Lost
Geometries’. If the foreign key on the ‘n’ side of a 1:n relationship is unset, this
record is termed an orphan. Provided that the area geometries of both lost parent
and orphaned child records are set and located properly in the same world, spatial
queries are used to reunite parent with child record via the foreign key value on
the child.
Various Text Validations: These ensured that particular text field values on
records contained valid data based on what type of telecommunications
equipment these records represented.
2.1.3.
Level3 - Work Order Monitor
The need for Work Order Monitor arose due to the large number of conflicts Level3 users
were receiving when posting their work orders for Model.it inside plant equipment. I
developed this application to proactively prevent this conflict occurrence. With Work
Order Monitor in use, if a work order user inserts, updates or deletes equipment within a
Bay, that entire Bay is locked from alteration in other work orders. If users of other work
orders attempt to modify equipment in that Bay, they receive a message that the Bay is
already in an open work order. Also, users have the option to highlight all Bays that are
in open work orders. The back end is a simplified copy of the Work Order Association
2
table, named Work Order Monitor, in a separate non-version managed datastore.
Model.it provides such a datastore for storing template data for inside plant equipment,
and I added Work Order Monitor table to this datastore. This table holds all locked Bays
until the pertaining work orders are closed.
2.1.4.
Level3 – MIT Vitria Interface
MIT Vitria Interface provides a gateway for sending Model.it inside plant relational data
to downstream applications. This application was needed as Level3 chose Smallworld
Model.it to be the source of record for all network inventory data. From a connection to
Oracle within the Smallworld image, data is first sent to an Oracle dB with the same
inside plant relational data model as Model.it. When this process is completed, a trigger
is evoked in the Oracle dB to notify a Java application in Vitria Middleware that the
Model.it data is complete and available for use by downstream applications.
In MIT Vitria Interface’s basic form, all inside plant data is sent (Bulk Load). However,
functionality is also available to send a subset of this data. This subset can be records in
a work order, all inside plant records within a particular internals world, or records
selected via a predicate search. The Bulk Load functionality allows an initial send of all
records when a Model.it database first becomes available to downstream applications. I
modified the Model.it Work Order application to send all rwos (real world objects) in a
work order through the MIT Vitria Interface whenever the work order is posted. When a
new central office becomes available, all inside plant records in that central office’s
internals world can be sent downstream. If somehow, data “falls through the cracks”, and
downstream applications get out of sync with Model.it, the data of concern can be
selected via predicate in Model.it and sent downstream. Together, these functions ensure
that downstream applications are kept in sync with the latest inventory upgrades in
Model.it.
2.1.5.
Level3 – Data Copy Engine
This allows automated copy of Smallworld geometric and relational data from one dB to
another dB in a separate image. The intermediate data storage vehicle is a set of ASCII
text files. A “dump” instance of Data Copy Engine is run from one image to create the
ASCII text files. The information in these text files is then used to populate the other dB
via a Data Copy Engine “load” instance.
Level3 found this functionality very useful during the initial entry of data into Model.it.
This data entry was done on several laptops, each of which stored a Smallworld dB for a
UTM zone where Level3 owned infrastructure and equipment. Prior to creation of the
Data Copy Engine, data was manually entered into each laptop separately from Excel
spreadsheets. This process resulted in extensive repetition of manual data entry,
especially since the inside plant data for each central office was nearly identical. Data
Copy Engine allowed the replacement of manual data entry with an automated process.
2.1.6.
Duke Energy – Multi-purpose Tracing Engine
I developed a tracing engine and corresponding GUI class that utilizes core Smallworld
Network Follower technology. This application provides users with the ability to specify
3
manifold, trace direction (upstream, downstream, both directions, user specified via
trailpoints), network analysis type (trace out or shortest path), and configurations (stop
predicates and weighting types) based on Duke Energy’s specific application needs.
Additionally, the most frequently used parameter combinations can be hard-coded to
provide users with “canned” traces. The Duke Energy tracing GUI can be customized to
include access to these canned traces.
2.1.7.
Duke Energy – Data QA/Bulk Update via Tracing
A number of GeoData developers contributed to this application. This engine provides
automated QA and update of Electric, GAS, and Landbase GIS data. I assisted in
integration of this application with the Duke Energy Tracing Engine to provide
automated analysis and update of electric circuits.
2.1.8.
Duke Energy – Cornerstone Customization
GeoData developed Cornerstone as a foundation for utilities’ Smallworld
implementation. I worked with a team to customize Cornerstone. I assisted in enhancing
the classes and inheritance structure corresponding to the Cornerstone data model to meet
Duke Energy’s specifications. I created a general relationship class for inheritance by
rwos related through a field mapping join. Some examples of such rwo relations are
paths to conductors and structures to equipment.
2.1.9.
Niagara Mohawk – Gas Leak Survey
The Gas Leak Survey application provides facilities for the planning, tracking, reporting,
and mapping of Niagara Mohawk’s surveys for gas main and service line leaks. I was a
member of a team that gathered requirements for this application through extensive
meetings with the end-users to ascertain business needs. These end-users were
operations supervisors (OS). As a result of these efforts, a Smallworld data model and
corresponding Magik application were delivered to meet Niagara Mohawk’s gas leak
surveying requirements. I was the lead developer of this data model and application.
Fundamental to the Gas Leak Survey application is the concept of survey areas and
workdays. A survey area contains a portion of the gas network to be surveyed for leaks
within a given timeframe. A workday consists of all gas mains and service lines
surveyed by a particular worker or crew on a given day. The connection between survey
areas and workdays is modeled in the Smallworld dB as a many-to-many (m:n)
relationship: a worker can complete more than one survey area in a given workday, but
some survey areas take multiple workdays to complete. Thus, survey of the gas network
is administered on two levels: by survey area and by workday. The link between gas
network infrastructure and these administrative levels is enabled through association
tables similar to that used in Work Order applications.
The Gas Leak Survey GUI consists of editors, custom tools, reports, and a Survey Viewer
to geographically view survey work. Through use of Survey editors an operations
supervisor associates gas infrastructure to the survey area. This can be done via selection
of gas objects, definition of an area via a trail boundary, or through selection of a preexisting area object in the GIS (such as a town) to delineate the survey area boundary.
4
Miles of gas line associated with each survey are automatically calculated. The OS can
print a report of all gas lines in each survey for distribution to surveyors before going out
in the field. The OS then uses the Workday editor to track work done towards
completing these surveys. The Survey Viewer provides the OS a variety of GIS views
useful to the planning and tracking of surveys. These views are enabled by custom draw
methods on the gas line objects. For example, due dates for gas lines are calculated based
on their type, location, and date last surveyed. The Survey Viewer then provides a colorcoded map of date until due for survey (by month or year) for all gas lines in the current
GIS view.
2.1.10.
Niagara Mohawk – Leak Archive Report
I was lead developer of the Leak Archive Report. This report allows users to see a
history of changes to Leak records in the Smallworld dB, thus providing a tool to validate
that leaks on the gas network are documented and repaired in a timely fashion.
The Leak Archive Report derives its information from a text join field (named Leak
Archive Text) on the Leak table. This field provides a very large buffer for storing
information on all changes to Leak records. The Leak Archive Text field is populated via
an update trigger on the Leak table. Each time a Leak record is updated, the previous
values of any changed fields are added to the Leak Archive Text field. This information
can be seen as nested key-element pairs. The outer key consists of the Leak record
update date and user, while the inner data consists of field name keys and field value
elements. When a user requests a Leak Archive Report for the current record in the Leak
editor, the information in this text join field is parsed for display in the report.
2.1.11.
Niagara Mohawk – ACES – Joint Pole Proposal
Joint Pole Proposal (JPP) is a component of Niagara Mohawk’s ACES (Automated
Construction and Estimation System), designed to integrate Smallworld GIS work orders
with Niagara Mohawk’s accounting practices. I was a member of the development team
for the JPP component of ACES. JPP provides billing information for work done on
utility poles owned jointly by Niagara Mohawk and one or more other companies. I
created a prototype JPP data model using Smallworld’s CASE tool, and corresponding
billing logic and editor functionality using Magik. A fellow Magik developer used the
information generated by JPP to create custom billing reports stating cost to each owner
for work done. This work involved extensive review of Niagara Mohawk’s billing
agreements with joint owners of equipment, and close communication with electric utility
SMEs (subject matter experts) within Niagara Mohawk.
2.2. Magik Scripts/Tools Developed
2.2.1.
Level3 – Print Common Ancestry
I created this script to assist developers in understanding related objects with complex
common inheritance trees. The need for such a tool arose since Model.it contains several
objects with complex inheritance. This script accepts the names of Magik object classes
as parameters. The output is in the same format as the Smallworld core print_ancestry()
method, except that only those ancestral classes common between all input classes are
5
displayed. This functionality is useful if, for example, you are trying to decide where to
put a new method so that it is available on a specified set of object classes. In this
situation, the input for print_common_ancestry() would be this set of object classes, and
output will be those super classes where the new method can be put such that it is
available on all objects of the input classes.
2.2.2.
Level3 – Inside Plant Data Query Methods
The inside plant data model in Model.it is a hierarchy of 1:n relationships. From top
down, this hierarchy is: Hub, Building, Floor, Room, Bay, Shelf, Slot, Card, Port. The
data model is highly normalized. In other words, there is no field on Port, for example, to
directly access the owning building. Instead, one would have to issue the code
‘port.card.slot.shelf.bay.room.floor.building’. Queries in the other direction (say, to find
all ports in a building) are even more code intensive. I wrote methods on these objects so
that any equipment record can access its related equipment with a single method call. For
example, the code above is simplified to ‘port.q!building’, and ‘building.q!ports’ will
return a set of all ports within a building. This encapsulation of relational complexity
enables subsequent Model.it Magik development to be much faster, producing simpler
code that is easier to read.
2.2.3.
Level3 – Text Sorted Collection
I created this object as a subclass of Smallworld’s core sorted_collection class.
Text_sorted_collection allows sorting of text elements in a more humanly recognizable
order than is possible with standard sorting. In other words, the string “Port 10” will
come before “Port 3” in standard sorts. In text_sorted_collection, this is reversed. The
need for this tool arose due to Level3’s requirement to see hundreds of port descriptions
of this type sorted in a humanly intuitive order. In addition, Level3’s port descriptions
included fractions such as “Port ¾”. I borrowed some basic XML/HTML concepts in
creating text_sorted_collection, in that I treated each string to be sorted as data separated
by markup. The markup were things such as spaces, forward slashes, and commas. The
remaining data is processed based on the nearby markup. This allows logic, for example,
that orders “Port ¾” before “Port 2”, which comes before “Port 10”. The one drawback
of Text Sorted Collection is that it takes a while to sort due to heavy processing overhead.
While Magik is an excellent language for OO Application development and rapid
prototyping, it can be slow in algorithm processing. Therefore, I would like to rewrite
this class in PERL or C++, where it could perhaps be called from within Magik via an
ACP (alien co-processor) if the need ever arose to replicate this functionality.
2.2.4.
Level3 – Load List Generator
I wrote this procedure to automate the creation of load list files in a Magik build tree. In
its basic form, you send in the root path of your build tree directory as an argument.
Load List Generator then recursively creates new load list files based on all Magik files
and subdirectories found at each level. Optionally, you can pass in additional arguments
to specify a load order if necessary. Load List generator provides the obvious benefit of
providing an automated process to replace tedious manual load list maintenance. In
addition, I believe it enforces good file organization within your build tree. If you do not
want a file or subdirectory to get into your build, it probably should not be in your build
6
tree. However, it is crucial to remember that this procedure does overwrite existing load
lists. Also, additional work is needed to integrate Load List generator functionality with
source code management.
2.2.5.
Level3 – Big Rope and Big Hash
I worked with another developer to create these classes. They are designed to handle the
size limitations of the core Smallworld rope and hash_table classes, which could hold a
maximum of roughly 20,000 elements. Internally, the big_rope and big_hash classes
function as ropes of ropes, and ropes of hash tables, respectively. Each of the inner data
structures holds a maximum of roughly 10,000 elements (well within the size
limitations). This behavior is encapsulated on the class methods, so that is it is hidden
from users of the classes. Externally, these classes function very nearly the same as
conventional Magik ropes and hash tables, except they can be used to store many more
data elements.
2.2.6.
Niagara Mohawk – Association Table Mixins
I created these mixin classes to provide reuseable code based on a recurring design
pattern. In this pattern, rwo records are related to some sort of administrative records
through an association table. Some examples of these administrative records are Work
Orders, Valve Zones, and Surveys/Workdays (see description in Section 2.1.8 – Gas Leak
Survey). Rather than rewrite code with the same functionality for each of these, I created
generic mixin classes that the objects and editors could inherit from, and thereby share
common methods. These association table mixins are as follows:




At_admin_obj_mixin: e.g. Work Order, Valve Zone, Survey. This provides
methods for getting information on associated rwos from _self (i.e. the current
object inside its method). Also, methods are provided for getting information on
what objects can be associated with _self. A shared constant must be subclassed
to get this latter functionality.
At_rwo_obj_mixin: e.g. Pole, Valve, Gas Main. This provides methods to
obtain information on associated administrative objects from _self.
At_admin_ed_mixin: This provides methods to goto and highlight rwos
associated with the current record in the editor. Also, methods are provided to
enable the selection of rwos (via geometry selection or trail boundary placement
in the GIS) for association with the current record in the editor.
At_rwo_ed_mixin: This provides methods to view all administrative
associations for the current record in the editor.
3. UNIX Shell and PERL Scripting
3.1. BellSouth – Pre-Order Gateway
I worked extensively with UNIX Korn shell and PERL during my year of Pre-Order
Gateway (POG) software support. A large team at Telcordia developed POG to provide
CLECs (competitive local exchange carriers) a single convenient interface to query
multiple BellSouth mainframe databases. These mainframe databases contain
7
information necessary for providing customers telephone and related services. POG
transactions adhere to EDI (electronic data interchange) standards. Input contracts are in
EDI 850 format, returning an EDI 855 contract as output. Both input and output
contracts are in fixed field (as opposed to delimited) format. My work with UNIX Korn
shell for POG involved scripting, as well as extensive command line work on a daily
basis. This work ensured POG was ready for third party testing, an important milestone
towards BellSouth's entrance into the long distance market.
3.1.1.
Volume Test Automation
POG is not designed to include a direct user interface for production use. Instead, POG is
designed to interface with separate front-end software that provides automation to enable
volume contract processing. Some examples of front-end automation include
instantiation of multiple POG server instances and validation of unique Ids for each
transaction. Since POG itself lacks this automation capability, is not possible to conduct
volume testing directly from POG.
I created a system of UNIX scripts to allow volume testing directly from POG. Using
these scripts, it is possible to instantiate a specified number of POG servers and specify
the set of contracts to run. With multiple servers, these contracts can either be run in
series or in parallel. I manipulated input contracts such that the unique key for each
contract was automatically updated before processing (a task normally allocated to frontapplications). This provides functionality to run a contract several times to test POG
processing limits. These scripts enabled replication of volume testing while removing
front-end applications and related network communication issues from the test scenario.
This proved very helpful in determining the source of defects.
3.1.2.
Volume Test Analysis
Utilizing the volume test automation described above, I was able to locate the source of a
serious performance defect that was delaying third party testing acceptance work. This
defect was manifested during heavy volume testing initiated from TAG
(Telecommunications Access Gateway). TAG communicated with POG across a
network utilizing Orbix (CORBA compliant middleware). Errors occurred during high
volume testing against POG servers on a high-end machine with extensive RAM. Using
the POG volume test automation scripts I developed, I was able to replicate this test
directly from POG. In this scenario, the test ran successfully, demonstrating that the
defect was not originating from POG.
Since the defect was not in POG, this indicated that the defect was due to network issues,
Orbix, or TAG. To help pinpoint the defect source, I developed UNIX Korn shell scripts
to output processing times and result information for each contract. I then sent this data
to MS Excel to calculate and graph comparative statistics between POG servers on
machines with varying amounts of RAM. I demonstrated a direct correlation between
RAM and the number of contracts processed per minute when volume testing was ran
directly from POG. I then installed POG clients on different machines from the POG
servers to determine how the network variable effected performance. In doing this, I was
able to replicate the original error from the original two machines (TAG client and POG
8
server) that the defect was reported on. I analyzed the network and determined that the
connection between these two machines was an order of magnitude slower than between
most of BellSouth’s other machines. This demonstrated that that the volume test errors
occurred due to network issues between these two machines, thus pinpointing the source
of the defect.
3.1.3.
Data Log Analysis
As part of the effort to support POG and TAG third party testing, I wrote UNIX Korn
shell scripts to trace contracts from TAG to POG. These scripts utilized sed and grep
functionality extensively. Essentially, there were several log files that contained
pertinent data distributed across the network. I used sed and grep to filter out the data of
interest from each log file, and then I synthesized this data into information on contract
flow through POG, Orbix, and TAG.
3.1.4.
Configuration Manager
I revised a script that provided configuration and startup assistance for the POG
environment. Essentially, this script ensured that pertinent related software was running
(e.g. Oracle RDBMS, Orbix). If this software was not running, the scripts would output
information on the problem. Otherwise, it would initialize the POG software. This script
no longer functioned due to significant changes in the POG architecture and environment,
and I provided upgrades to make it functional with the current POG release.
3.1.5.
Automated Filename Change
I created a PERL script to assist in unit and acceptance test of POG software releases.
For this testing, several EDI 850 input files are used for each contract type to be tested.
There is a standard naming convention for these files. However, this convention often
changed between POG releases. To automate these name changes (and thereby avoid
manually renaming dozens of contract files), this PERL script accepted as arguments a
search string and a rename string. The script updates the names of all files in scope that
have the search string in their name, with the search string being replaced by the rename
string.
3.2. Bell Atlantic/Verizon – DSLAM Discrepancy Analysis
I worked with an analysis team to create a system of interconnected UNIX Korn shell and
PERL scripts to assist Verizon in detecting discrepancies between their mainframe
SWITCH database, NCON, and real-time query of their DSLAM equipment. Essentially,
this work consisted of comparing DSLAM ports within several central offices across
Verizon’s service area. These comparison scripts enabled detection of several thousand
discrepancies between the these data sources. This discrepancy data was an important
source of information in Verizon's data migration effort from SWITCH to NCON. Also,
this discrepancy data identified records in the NCON dB that were not in sync with the
DSLAM equipment.
There were three main steps in locating these data discrepancies as described in the three
paragraphs below.
9
While the NCON and the DSLAM data were of the same form, SWITCH data was in a
different data model. It was therefore necessary to map the SWITCH data to the NCON
and DSLAM data using lookup tables. This mapping was needed before data comparison
could be done. I wrote PERL scripts to provide metrics on data joined between SWITCH
and NCON through the mappings we identified. These metrics were sent to Excel
spreadsheets for analysis and display (see Section 5.1).
Once the proper mapping between SWITCH and NCON was determined, I assisted in
development of scripts to compare information from the SWITCH, NCON, and DSLAM
data sources. This comparison produces a set of discrepancy reports organized by
geography: one report for the port discrepancies in each central office.
When SWITCH data was fully migrated to NCON, the task of resolving discrepancies
between NCON and the DSLAM equipment remained. I developed scripts to create
reports displaying these discrepancies. These scripts call heavily upon the text
processing, data structuring and reporting functionality within PERL. In addition to the
basic reports describing discrepancies (i.e. Ports in NCON but not on connected on
DSLAM equipment, and ports connected on DSLAM equipment but not in NCON), I
reported on the distribution of these discrepancies. For example, one report lists the
CLLI (common language location identifier) code of each central office where
discrepancies occur, while another report displays discrepancy distribution graphically.
4. Oracle & PL/SQL
I used SQL on a daily basis in my work at Telcordia and Level3 to query and update
Oracle dBs, primarily to support testing and development efforts. Through this work, I
have gained expertise in structuring SQL queries to obtain specific information in a
desired format from relational databases. In addition, I have experience with ‘wrapping’
SQL in PL/SQL and UNIX shell code as described below.
4.1. BellSouth – POG
4.1.1.
PSIMS Oracle Data Loader
I revised a system of UNIX Kornshell/AWK scripts used for text file data loading into
POG’s Oracle dB. The actual data loading to Oracle is accomplished through embedded
SQL in the UNIX code. AWK is used to parse the raw text files to build SQL statements
to load the data. I modified these scripts to enable successful loading of very large text
files. This modification was necessary because the amount of PSIMS (Product and
Services Inventory Management System) mainframe data available had increased
significantly. I carried out this modification though serial loading of all text data by state.
Prior to my modification, all data for BellSouth’s entire operating region was parsed and
then loaded at once. This exceeded system performance limitations when large data sets
were loaded. By parsing and then loading this data one state at a time, the PSIMS Oracle
Data Loader scripts run successfully and do not exceed system limitations.
10
Also, I investigated the possibility of using of Oracle SQLLOAD functionality to replace
the embedded SQL statements in PSIMS Oracle Data Loader. This has the potential of
greatly decreasing load times compared with loading one record at a time using insert
statements. Although this functionality was not implemented in production, I gained a
good working knowledge of SQLLOAD functionality through researching this
possibility.
4.1.2.
DDL Schema Update
I maintained DDL to build POG Oracle database schemas for each release. Numerous
versions of this DDL were needed since the schema changed between releases. For
debugging purposes, it was sometimes useful to test a contract against numerous schemas
in the same release. This keeps the code constant, while testing how changes in the data
model effect bug occurrence. I created scripts to automatically update portions of the
schema definition that have changed with each release. When used in a test environment,
these scripts assist in determining if a defect is caused by data model changes.
4.2. Level3 – Model.it and NextGen Analysis
At Level3, I used PL/SQL extensively in my work on the interface between Smallworld
Model.it GIS and NextGen, the Level3 custom provisioning system. As outlined in
Section 2.1.3, I played a key role in the integration of these two systems by developing a
translator to send the Smallworld data into an Oracle dB (where it was then massaged and
sent to NextGen via Java and Vitria Middleware). This effort did face a challenge,
though, as both Model.it and NextGen had gigabytes of separate production data before
our Middleware went online. Therefore, there were considerable data discrepancies
between the two systems. I wrote PL/SQL code to compare these databases and assist in
resolution of the data discrepancies.
5. C/C++
5.1. BellSouth – POG
I worked as a development team member on three releases of POG for BellSouth
providing enhancements and debugging for the core POG C/C++ source code.
An example of an enhancement provided is the update of specified contract transactions
to return additional customer information data for the CLECs. POG receives extensive
return data from the mainframe databases in response to the EDI 850 contracts it sends to
these mainframes. The POG requirements define the portions of this mainframe data to
be sent back to the CLEC as an EDI 855 return contract. As these requirements change,
the code functionality must be updated accordingly.
An example of debugging I provided is the tracking of contract data at several stages in
the processing to determine the source of bad data in EDI 855 output contracts. When an
output contract does not contain the expected data, the transaction must be traced from
input contract, to mainframe query, to return data, and finally to build and return of
output contract. Character buffers at each point in this process must be queried to ensure
11
they contain proper data. I provided debugging code to output this data from within
methods and then rebuilt the affected POG executables for testing. Through several
iterations of this work I became very familiar with information flow through the POG
C/C++ code structures.
5.2. US West – Log GUI for Protocol Converter Interface
I served as a developer for the initial requirements stages of Protocol Converter Interface
(PCI), an application to support broadband provisioning of video and data service for US
West/Qwest. I created a prototype GUI using Visual C++ to view error log information.
The sample log data viewable with this GUI is based on sample log data descriptions
from PCI requirements documents. These documents describe the log data that should be
output when errors occur. The log data include information on transaction identifiers,
user, error occurrence time, type, code, severity, and description.
The error log GUI prototype I created consisted of three major components: an error log
generator, an error log data manager, and the error log GUI itself. Since this prototype
was developed well before any actual error log files existed, the error log generator
creates random error logs of varying size based on specifications in the PCI requirements
documents. This provides pertinent sample data for the application to work with. The
error log data manager provides a data structure to hold the error log information. When
the error log GUI is activated, the error log data manager is queried to obtain data for
display. The error log GUI provides the ability to filter errors based on user, date ranges,
and/or error types. This provides users with a Windows interface to rapidly to obtain
specific error information from within a large text log file.
6. Visual Basic
6.1. Bell Atlantic/Verizon – DSLAM Discrepancy Analysis
I assisted in creation of Visual Basic code to process text mapping files for DSLAM ports
in SWITCH and NCON databases. These text files were ouput from PERL scripts I
created to provide metrics to assist in mapping SWITCH to the NCON data model (see
Section 3.2). Visual Basic was used to automate the creation of Excel spreadsheets that
display SWITCH and NCON port data related through specified mapping algorithms we
had developed.
6.2. Level3 – Excel Automation within Magik
I used VB automation within Magik to export Model.it inside plant data to Excel
spreadsheets. Members of the team supporting NextGen (Level3’s provisioning
application) used these spreadsheets for comparison of the Model.it and NextGen data.
12
7. XML/HTML
7.1. Telcordia – XML/FCIF Translation
I was involved in the preliminary requirements stage of several projects utilizing various
middleware packages (Vitria, webMethods, etc..) to translate data in Telcordia’s FCIF
(flexible computer interchange format) to and from XML. Through this work I became
very familiar with FCIF, and gained a good working knowledge of XML.
7.2. Niagara Mohawk – NMGAS GIS Web Pages
I used HTML to build web pages on Niagara Mohawk’s intranet describing their
Smallworld NMGAS GIS.
8. ESRI ArcInfo/ArcView
8.1. University of Wyoming – Master’s Thesis
I gained a serious interest in software/database development when working on a thesis in
graduate school. Using GPS and surveying equipment to map headwater drainage basins,
I quickly amassed a great deal of data. I stored this data in ESRI ArcInfo and ArcView
GIS, and in series of connected Excel spreadsheets. I realized the great value of having
an automated system to turn data into meaningful information. In addition, I developed
excellent investigation and communication skills while working on this project.
Although my thesis was in Physical Geography, it incorporated aspects of Civil
Engineering, Geology, Hydrology, Fluvial Geomorphology, Biology, and Range
Management. I therefore needed to communicate with a wide variety of people in
various fields to design my data collection, modeling, and analysis techniques. This
instilled in me an understanding that excellent information system design requires both
human communication and technical expertise.
The main focus of my thesis was a comparison of stream network form and extent on
either side of a vegetation boundary (between forest and grassland). I used Trimble GPS
to map out the stream network in my study region, and then uploaded this data to
ArcInfo, where I created a stream network line coverage. I also created stream network
coverages using map-based stream delineation methods. This enabled a comparison of
stream networks delineated by map and field-based methods. In addition, I created a
vegetation polygon coverage for the study area. I conducted an overlay and INTERSECT
of the stream and vegetation coverages to create updated stream coverages with arcs
broken upon vegetation boundaries. Next, I exported these coverages to ArcView for
analysis. I conducted comparative analysis of drainage density (total length of streams
per watershed area) between the vegetation zones, and for map vs. field delineation
techniques. Also, I analyzed the stream network for a number of topological indices with
ArcView. This GIS analysis facilitated comparison of my results with data from related
field studies and theoretical models of stream networks.
13