We're expanding the development team on our line of existing products. You'll be working on a small team that develops applications for large businesses using some of the latest technology. You will be involved in all aspects of solution development, including analysis, design, development, testing, documentation, and support.
We’re looking for a software developer with demonstrable C# (preferably .NET 2.0 or later) and HTML/CSS experience (ASP.NET MVC is a plus). Any experience with test-driven development or automated unit testing in general is a huge plus. Also, participation in the community (attendance of events, avid blog reader + commenter, or maybe you even have a blog yourself) will put you firmly in the running for this position. We’re looking for people that believe learning and continuous improvement are primary responsibilities of a software developer. We’re hiring motivated people for a terrific opportunity with a team of recognized .NET and agile community leaders.
Our practices and technologies include:
- Test-driven development
- Continuous integration
- Behavior-driven design
- Domain-driven design
- HTML, CSS, Javascript (jQuery)
- ASP .NET MVC
- C# 3.0, .NET 3.5, Visual Studio 2008
- SQL 2008
- Oracle
- NHibernate 2.x
- StructureMap
Email us and tell us why you’d make a great addition to our team: tech-jobs@dovetailsoftware.com
This is a full-time, on-site position in our Austin, TX office. Please DO NOT contact us for outsourcing or tele-commuting.
For any of you Clarify peeps out there looking for a gig, there’s a Clarify Technical Consultant available at IDC Technologies in Silicon Valley.
Requirements:
- 4-5 years in the following amdocs modules
- Clarify Application: amdocs crm, clarify classic client, call center application, clear support application, clarify schema,
- clarify deployment in 3-tier environment
- tuxedo
- VB 6
- Minimum 4-5 years of experience in Clarify enhancements
- Understanding the customer requirements
- Enhancements and testing
Note: This isn’t a position at Dovetail, and I don’t have any vested interest in filling this job. I’m simply sharing an opportunity with my Clarify compadres.
While I’m in Massachusetts next week, we’re sponsoring a get-together for our Dovetail and Clarify friends.
Wednesday, December 16th from 5:30 - 8:00 at John Harvard's Brewpub in Framingham, MA.
Drinks and appetizers are on us.
It’s an informal evening, talking Dovetail and Clarify, technology, and meeting like-minded people, all while sharing a few pints.
RSVP to the event through meetup.com: http://www.meetup.com/DovetailHappyHour/
Looking forward to seeing you there!
Kevin has started his first in a series of posts around customizing Dovetail Carrier.
Good stuff!
I’m looking forward to the rest of his series.
I spent last week at the Monospace conference, which was held concurrently with the annual Innotech conference here in Austin.
Monospace
This was the first year for Monospace, and it was fantastic. Scott Bellware did a great job of organizing the conf, bringing in top notch attendees, and providing fun after-hours activities as well. Miguel de Icaza (founder of the Mono project) attended, along with a good chunk of his team. There were plenty of local folks (including a few of us from Dovetail), folks from Microsoft, as well as a bunch of international developers as well. It was an incredible bunch of super-smart folks, all willing to share and help others kick ass.
From the Monospace website:
Monospace is the conference that teaches .NET software developers and organizations how to use the Mono framework and Microsoft .NET to leverage existing investments in skills and applications on a broader array of platforms for a broader array of opportunities.
The Mono framework lets you take advantage of not only Windows, but also Linux, Mac, iPhone, Android, and comprehensive cloud computing platforms like Amazon's EC2, and even special-purpose hardware platforms.
For those not familiar with Mono, its a cross platform, open source .NET development framework. The Mono FAQ is a good place to start.
I’m extremely impressed with what the Mono team has accomplished.
The conference was 2 days of workshops followed by 2 days of Open Space. Since a good deal of us attendees were .NET developers, we were able to get acquainted with Mono, MonoDevelop and MonoTouch in the workshops, and then dive into various topics during the Open Space. There were open space topics on MEF, iPhone development, adding scripting to your application, Silverlight, NHibernate, and some good discussions around legal aspects of using open-source software.
I loved the combination of workshops + Open Space.
MonoDevelop
I got to see my first glimpse of MonoDevelop. Impressive.
MonoDevelop is an IDE primarily designed for C# and other .NET languages. MonoDevelop enables developers to quickly write desktop and ASP.NET Web applications on Linux. MonoDevelop makes it easy for developers to port .NET applications created with Visual Studio to Linux and to maintain a single code base for all platforms.
MonoTouch
MonoTouch was one of the biggest hits of the show.
From the MonoTouch website:
MonoTouch allows developers to create C# and .NET based applications that run on Apple's iPhone and Apple's iPod Touch devices, while taking advantage of the iPhone APIs and reusing both code and libraries that have been built for .NET, as well as existing skills.
It was pretty bad ass seeing .NET developers writing C# code to create iPhone apps.
SUSE Studio
We also saw SUSE Studio in action. Miguel did a great demo when he showed building an application in Visual Studio in Windows, from VS, compiling/building in on Linux which created a RPM package. Uploading that to the cloud, using SUSE Studio to create a custom Linux distro, and running the just built app in the cloud. This custom distro can also be pushed to EC2. Totally. Bad. Ass.
InnoTech
In the midst of all the Monospace goodness, the InnoTech conference happened on Thursday. I think this is my 4th year attending InnoTech here in Austin.
InnoTech is an annual conference and exhibition built specifically for business and technology executives, highlighting the region's innovation and technology development opportunities by showcasing pioneering products and services.
There were lots of talks on social media (no surprise), cloud computing (again, no surprise), as well as some technical talks including ASP.NET MVC, database change management, and one on Operational Transformation: The Key to Understanding Google Wave. Great stuff.
A wide range of topics – great for both business and technical folks.
Exhibitors
One of the fun parts of InnoTech is walking the exhibit floor, getting to see new products, and engage in good discussions.
It was very cool to see multiple CRM companies exhibiting this year: Parature, txt4crm, and TeamSupport. This was my first exposure to TeamSupport – they have a nice product.
Get out of your office
If you haven’t attended InnoTech before – I would recommend it – especially if its local. Not only is it a great way to see and hear about new products and technology, but it’s an opportunity to get out and meet other tech pros, bounce some ideas around, and stay in touch with the ever-changing technology world that we live in.
Whenever I go to a conference, my Idea faucet seems to open up wide. I’m constantly jotting down new ideas – I just wish I had time and resources to do them all!
For any of you Clarify peeps out there looking for a gig, there’s a Clarify Architect position available in Cincinnati Ohio.
Requirements:
- Very Strong experience with Clarify/Amdocs product platform (Customer/Call management systems)
- Strong experience with installations, configurations and migrations of Clarify product platform
- Strong experience with TIBCO.
- Should be able to perform installations and configurations, as well as setting up interfaces etc
- Experience with Tuxedo and Weblogic are required.
- Should be able to perform installations and configurations, as well as any troubleshooting
Note: This isn’t a position at Dovetail, and I don’t have any vested interest in filling this job. I’m simply sharing an opportunity with my Clarify compadres.
I was writing some PowerShell this week, and wanted to do some logging.
I’ve blogged in the past about configuring log4net with the fcSDK within Powershell.
However, this method relied on the log4net handling within our SDK. What if I wanted to log before I got to the SDK initialization?
Kevin shared some of his log4net fu, and I put it into Powershell.
Configure Logging
Here’s what I came up with:
function configure-logging()
{
[system.reflection.assembly]::LoadWithPartialName("log4net") > $null;
$LogManager = [log4net.LogManager]
$global:logger = $LogManager::GetLogger("PowerShell");
if ( (test-path $appSettings["logConfigFilePath"]) -eq $false)
{
$message = "WARNING: logging config file not found: " + $appSettings["logConfigFilePath"]
write-host
write-host $message -foregroundcolor yellow
write-host
}
else
{
$configFile = new-object System.IO.FileInfo( $appSettings["logConfigFilePath"] );
$xmlConfigurator = [log4net.Config.XmlConfigurator]::ConfigureAndWatch($configFile);
}
}
Notice that the logging config file is coming from $appSettings. I blogged about this earlier.
Logging Config File
a pretty standard log4net config file setup with a rolling file appender:
<log4net>
<appender name="PowerShellRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="C:\logs\powershell.log" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Size" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaximumFileSize" value="1024KB" />
<param name="StaticLogFileName" value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%-5p] [%c] %n %m%n%n" />
</layout>
</appender>
<root>
<level value="info" />
</root>
<logger name="PowerShell" additivity="false">
<level value="info" />
<appender-ref ref="PowerShellRollingFileAppender" />
</logger>
</log4net>
Logging functions
I then created some wrapper functions for messages & warnings that write to the output and to the log4net logger:
function log-info ([string] $message)
{
write-host $message
$logger.Info($message);
}
function log-warn ([string] $message)
{
write-host "WARNING: $message" -foregroundcolor yellow
$logger.Warn($message);
}
Startup function
This function loads up the configuration (which sets up $appSettings), and configures logging:
function startup()
{
.\LoadConfig dovetail.config
configure-logging;
}
Go-Go gadget logger
After calling startup, I can log away, and it will go to the console, and to my log file:

Saving Searches in Dovetail Agent
One of the things under development for the next version of Dovetail Agent is the ability to save your favorite searches.
Here’s a screenshot:
So you can now save your searches, and easily execute them again at anytime.
You can also name a search. By default, the name of the search will be the search terms. But you can rename it to whatever you want.
For example, as opposed to a search being named: “squeaking washer condition:open casetype:problem”
You may choose to rename it as “open cases for squeaky washer”
Look for this functionality in the next release of Dovetail Agent.
Saving Searches in Dovetail Mobile Agent and Agent Lite
Currently, we don’t have Saved Searches in Dovetail Mobile Agent or Agent Lite. This is on the enhancement list for the future.
But, you can easily save a search today by simply using a browser bookmark/favorite.
Here’s a screenshot of a search within Dovetail Agent Lite:
Notice the URL:
http://localhost/AgentLite/Search/query?query=squeaking+washer+condition:open+casetype:problem&searchDomain=case
Notice that it has all of the search parameters within it.
- The path to the search page: http://localhost/AgentLite/Search/query?query=
- The text keywords to search for: squeaking + washer
- Structured attributes: condition:open + casetype:problem
- And a search domain: &searchDomain=case
So you can simply bookmark this using your browser, and easily execute this query again at anytime.
The functionality works exactly the same within Dovetail Mobile Agent.
I recently received a request asking how to migrate some data (specifically, cases) from Clarify into Zendesk. Seems the company is in the process of turning off Clarify and rolling out Zendesk.
It’s all about the APIs
We provide a full set of APIs for Clarify within our Dovetail SDK, and Zendesk also provides a set of APIs. So we just need to put them together.
PowerShell
I’ve been using PowerShell more and more lately, so I decided to use that as my environment. And because Powershell gives me full access to the .NET framework, I can use classes such as System.Net.WebClient, which makes it easy for me to call the Zendesk REST APIs.
Login to Clarify
In a previous post, I showed how to use some common functions in PowerShell for logging into a Clarify database.
. .\DovetailCommonFunctions.ps1
$ClarifyApplication = create-clarify-application;
$ClarifySession = create-clarify-session $ClarifyApplication;
Get the case data from Clarify
Now, we need to get the details of a case.
A quick little function to get a case given its ID number:
function get-case-by-id([string] $id)
{
$dataSet = new-object FChoice.Foundation.Clarify.ClarifyDataSet($ClarifySession)
$caseGeneric = $dataSet.CreateGeneric("case")
$caseGeneric.AppendFilter("id_number", "Equals", $id)
$caseGeneric.Query();
$caseGeneric.Rows[0];
}
Then we can call this function that we just created:
$case = get-case-by-id "10";
and get some case data:
$subject=$case["title"];
$description = $case["case_history"];
That’s all the Clarify stuff. Now onto the Zendesk side of things.
It’s a ticket in Zendesk
In Clarify, they’re called tickets. In Zendesk, they’re called tickets.
First, we’ll create the XML needed by the create ticket API:
$createTicketXML = "<ticket>";
$createTicketXML+= "<subject><![CDATA[" + $subject + "]]></subject>";
$createTicketXML+= "<description><![CDATA[" + $description + "]]></description>";
$createTicketXML+= "</ticket>";
Zendesk authentication and URL
$zendeskLoginName = "myLoginName";
$zendeskPassword = "myPassword";
$zendeskURL = “http://myZendeskAccount.zendesk.com/”
$ticketsURL = $zendeskURL + "tickets.xml"
A simple web request
As I mentioned earlier, since I’m in Powershell, I can easily use the System.Net.WebClient object. Setup the login credentials, set the content type to be application/xml, and then we can post the XML to create a ticket.
$webClient = new-object "System.Net.WebClient"
$webClient.Credentials = new-object System.Net.NetworkCredential($zendeskLoginName,$zendeskPassword )
$webClient.Headers.Add("Content-Type", "application/xml");
$webClient.UploadString($ticketsURL,$createTicketXML);
Status Check and output
if ($webClient.ResponseHeaders["Status"] -eq 201)
{
write-host "Successfully created a new ticket in Zendesk at:" $webClient.ResponseHeaders["Location"]
}
This will output something like:
Successfully created a new ticket in Zendesk at: http://myZendeskAccount.zendesk.com/tickets/34.xml
Next steps
Next would be to probably get a list of cases from Clarify, loop through them, and for each one, create it in Zendesk. I’ll leave that as an exercise for the reader.
Did I mention it’s all about the APIs?
Rock on.
When creating a new table or view in Clarify/Amdocs/Dovetail, a unique ID number must be supplied.
How do I know what ID to use?
Clarify has defined a range of numbers that are reserved for custom tables and views. They guarantee that they will not use any numbers in this range. So, you need to use a number in this range.
There are two ranges reserves for custom IDs: 430-571 and 2000-4999. The rest are reserved for Clarify baseline use.
So, you simply need to pick a number in that range that hasn’t yet been used.
How do I know what numbers have already been used?
The most common method is to export your schema, pick a number, and search your schema to see if its in use. If it is, pick another number, search again. Repeat until you find an available number.
A better way
Since our BOLT product is a great way to visualize and navigate your way through the schema, it seemed natural to add this functionality to it.
New in BOLT 2.8.1: a page that gives you information about user-defined table and view ID.
It gives you information about each range, including which numbers have been used, and the lowest available number in the range.
Here’s what it looks like:
This should make it easy to know what ID number you can use next time you want to create a new table or view.
Get it
If you have a logon to Dovevtail SelfService, login and request the latest version of BOLT. Or leave a comment on this post on the Dovetail forums.
Genesis
I would love to say that I came up with this idea on my own, but, no. Interestingly, it actually came up from two different people at two different times.
It was presented as a suggestion in our last Dovetail Developer Workshop, and more recently, as a question on the Clarify forum on Toolbox for IT.
We love hearing ideas from the community – so keep ‘em coming!