Request a topic or
contact an Arke consultant
404-812-3123
Arke Systems Blog | Useful technical and business information straight from Arke.

Arke Systems Blog

Useful technical and business information straight from Arke.

About the author

Author Name is someone.
E-mail me Send mail

Recent comments

Archive

Authors

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2018

Hyper-V Miscellaneous

So I've been working on getting 2 VMs setup in Hyper-V today, a Windows 2003 server and a Debian Server.  Below are the issues I ran into and how to solve them.

 

Windows Server 2003 Standard

The main issue I ran into here was the inability to run the full Microsoft Update web site.  Basically when I clicked on Custom update, it would process for a while then end with an 0x80072ee2 error.

To fix this you have to disable TCPIP offloading.

  1. Run->regedit
  2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  3. Add a REG_DWORD key/value pair:
    1. DisableTaskOffload = 1

Restart and you'll be able to access Microsoft's updates again.

 

Debian 4.0R3

The problem I ran into here, is that Debian does not detect the default Hyper-V virtual network adapter.  To fix this you'll need to go to you're VM's Settings page.

  1. Select the network adapter and delete it
  2. Select the Add Hardware option
  3. Add a new Legacy Network Adapter
  4. Modify settings on this as needed

You'll now be able to install Debian on the VM, and the installer will detect the network adapter

 

kick it on DotNetKicks.com

Posted by Trenton Adams on Friday, April 11, 2008 3:58 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Web Developer Tools now support Firefox 3.0

For those of you like me that use Chris Pederick's Web Developer Tools on the regular, you should be happy to know that 1.1.5 is out, and supports Firefox 3.0.  This makes me happy, as I have migrated to 3.0 everywhere except on my work machine, becuase I was waiting on support for a few extensions. 

Apparantly I was a bit behind the power curve on this one,  as he released it a couple weeks ago.


Posted by Wayne Walton on Thursday, April 3, 2008 1:14 PM
Permalink | Comments (0) | Post RSSRSS comment feed

SharePoint problems, copying from old content management systems

Different content management and versioning systems have different methods on how they track versions.  So when migrating from one system to another, you can run into issues.  We recently experienced this when moving some data from an old CVS tracking system to a new SharePoint system (though this also affects old Novell systems). 

 The quickest way to move a large number of file to SharePoint is, of course, through the Explorer window.  That way you don't have to manually make all your folders and everything else you might need.  However, this can lead to problems, such as these errors:

Error 0x8007011A: The mounted file system does not support extended attributes.  

or

Invalid MS-DOS function

Both of these indicate that the old CMS has some extended file attributes that SharePoint doesn't handle.  Stripping them is the only reliable way to allow SharePoint to manage these files.
You can let the web interface do this for you, but that means making all your own folders.  Not terribly quick when you're dealing with large moves.  There is a quick workaround that I used, and that is to move the files to a neutral location, zip them up, and then unzip them.  Archiving them that way actually strips those extended attributes, and Zip doesn't support them.  So now you have clean files you can copy over to SharePoint (sans any versioning from the old system).

Right now, we're also looking at building an app to automate this process, and possibly add some intelligence to it.

Also, does anyone know of any tools that can examine this kind of extended data?  That would make our lives a lot easier.


Categories: SharePoint
Posted by Wayne Walton on Thursday, April 3, 2008 12:51 PM
Permalink | Comments (0) | Post RSSRSS comment feed

The Importance of Your Customer Data Lifecycle

This is a first of a series of articles I will be writing on customer data in business.  I'm starting off with a broad scope, but plan on breaking down into how CRM can help in these situations in future articles.

 

When you think of companies, what do you think of as their most important asset?  Is it what they produce?  If it the real estate they own?  Perhaps their employees, as so many are wont to claim.  While all of these might be important, none of it matters without customers.  A company’s information on their customers is their lifeline to continued success and profitability.  Without it, they have no reliable way to upsell their returning customers.  They have no way to follow up and make sure their customers’ needs are fulfilled.  Further, loss of customer information can lead to lawsuits and public embarrassment.  All told, the data you have on a customer has a lifecycle.

This lifecycle begins when you acquire a new customer.  Who is responsible for entering a customer’s data?  Does everyone follow established procedure when they enter new information? What is the initial follow-up procedure?  Consistency ensures that all future maintenance and manipulation can be done with a minimum of fuss. This is also a good time to ask questions of your new customers.  Most will appreciate the attention.  As a personal example, I enjoyed a particularly good beer recently, and wrote the maker, Anheuser-Busch asking them to produce more.  A couple weeks later, I got a call from them, wanting to know more.  They spent an hour on the phone with me, picking my brain about what I like.  In the end, they knew a lot about my beer habits, and I felt useful.

The main lifecycle of most customer data is while they are active customers.  This is the part that is most obviously critical to a business.  How are customers being upsold? What market trends can be gleaned from current sales? When they leave, why are customers leaving?  These three questions are closely tied together, and really lead to one determinant question.  Are you fulfilling your customers’ needs? Without the answer to this key problem, a company can never truly thrive.  As an example, Google’s whole business model is built around getting buyers and sellers together as effectively as possible.  Most people think of Google as a search company, but in reality their business is advertising.  Their AdWords (and its counterpart, AdSense) product is designed to create an efficient market where companies can bid on commonly used search terms.  Between this, and the ROI (return on investment) tools they offer to their customers, Google has built one of the most effective systems in the world of connecting company and customer.

Finally, in its end time, customer data must be secured and stored. Is there a data retention policy in place? What security measures are being taken to ensure that sensitive data is not inadvertently released? What is being done to mine this old customer information?  Old data is both a treasure trove and a security hazard. Properly analyzed, old data might reveal former customers that have a need of a new offering you have, or a fixable flaw in why you they are former customers.  Flipside, an embarrassing data leak can lead to a company being in the papers for all the wrong reasons.  Likely the most famous example is when CardSystems released 40 million credit card numbers accidentally.  Charges were even brought against them by the FTC.  This kind of loss could even sink a company.

The lifecycle of customer data is easily the most overlooked process in companies today.  As it is not a physical, tangible object, many tend to undervalue such information, even though it represents the core of what a company does. After all, without anyone to sell to, what would a business do?


Posted by Wayne Walton on Monday, March 17, 2008 2:16 PM
Permalink | Comments (0) | Post RSSRSS comment feed

How to move SharePoint sites around

I found an incredibly useful article about deploying and migrating SharePoint content.

http://sharepointnutsandbolts.blogspot.com/2007/10/stsadm-export-content-deployment.html


Categories: SharePoint
Posted by Eric Stoll on Monday, March 17, 2008 10:31 AM
Permalink | Comments (0) | Post RSSRSS comment feed

Asp:LinkButton as an Asp:Panel's Default Button in FireFox

The asp:LinkButton doesn’t work as a panel's DefaultButton in FireFox

Here’s a link explaining the issue:

http://kpumuk.info/asp-net/using-panel-defaultbutton-property-with-linkbutton-control-in-asp-net/

I’ve written a custom control similar to the one in the article (Arke:LinkButton). Which fixes the FireFox issue.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Arke.Web.UI.WebControls
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:LinkButton runat=server></{0}:LinkButton>")]
public class LinkButton : System.Web.UI.WebControls.LinkButton
{
protected override void OnLoad(System.EventArgs e)
{
Page.ClientScript.RegisterStartupScript(GetType(), "addClickFunctionScript", _addClickFunctionScript, true);
string script = String.Format(_addClickScript, ClientID);
Page.ClientScript.RegisterStartupScript(GetType(), "click_" + ClientID, script, true);
base.OnLoad(e);
}
private const string _addClickScript = "addClickFunction('{0}');";
private const string _addClickFunctionScript =
@"  function addClickFunction(id) {{
var b = document.getElementById(id);
if (b && typeof(b.click) == 'undefined') b.click = function() {{
var result = true; if (b.onclick) result = b.onclick();
if (typeof(result) == 'undefined' || result) {{ eval(b.href); }}
}}}};";
    }
}

To use this control...

  1. Add "using Arke.Web.UI.WebControls;" to your code behind.
  2. Register the assembly in the Asp.NET page "<%@ Register Assembly="Arke.Web" Namespace="Arke.Web.UI.WebControls" TagPrefix="Arke" %>"
  3. Add the control (or change your asp:LinkButtons to Arke:LinkButtons) "<Arke:LinkButton ID="ArkeLoginButton" Text="log in" runat="server" CssClass="login_button" />"
View Trenton Adams's LinkedIn profileView Trenton Adams's profile

Posted by Trenton Adams on Thursday, March 13, 2008 1:16 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Using the connection strings in your web.config for LINQ

I ran into a problem with using LINQ when deploying code to different environments, when the dbml and the web code were in separate assemblies.  After doing some research I ran across the following blog by Rick Strahl: LINQ To SQL and the Web.Config ConnectionString Value

It's a good read, and really helped me understand what's going on under the hood with the LINQ connections.  Anyway, I ended up writing a partial class that allowed me to keep the nice default constructor with LINQ DataContexts, and also use a simple connection string in the web.config file.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WebProject.Data
{  
    public partial class WebProjectDataContext   
    {       
        public WebProjectDataContext() :
            base(System.Configuration.ConfigurationManager.ConnectionStrings["WebProjectConnectionString"].ToString(), mappingSource)       
        {           
            OnCreated();       
        }   
    }
}

 

You'll need to change your LINQ classes' DataContext Properties so that it doesn't read from the app.config file (set connection to NONE).  That will keep LINQ's code generator from creating the default constructor.  You can then place a partial class like the one above in the assembly.  LINQ will then use your web.config's ConnectionString when creating the DataContext with the default constructor.

View Trenton Adams's LinkedIn profileView Trenton Adams's profile

 

kick it on DotNetKicks.com


Posted by trenton adams on Wednesday, March 5, 2008 8:01 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Web Application Foundation - Part 2 - Preparing a client machine with Visual Studio 2008 for Continuous Integration (Draft)

The first part of this article series dealt with setting up the Continuous Integration server with CruiseControl.NET and related tools.  This article will deal with the tools, components, and configurations you need to set up on your development workstation in order to take full advantage of the CI environment.  Along with a few other items for consideration.

Installing the Deployment Project Extensions:

Web Deployment Extensions for Visual Studio 2008

Basically the Deployment Project will pull all necessary files and assemblies into a file structure that will allow for easier deployment from the developer's machine to another web environment.   The Deployment project will also combine and prepare all the web project's application code into a versioned assembly and .compile files.

To install the extensions...

  1. Make sure that all instances of Visual Studio are closed. 
  2. Download the msi from the link above. 
  3. Run it as administrator, and follow the wizard.

 

 

WiX (Windows Installer XML):

WiX - Homepage

You will need the weekly build version 3.0.3621 or better in order for the project to correctly load in VS2008.

WiX is a setup and installer framework created by Microsoft, and used as the installer for a number of programs including Office 2007.

Why WiX instead of the Visual Studio Setup Project?

There are number of reasons for this (below), but the most important one is that MSBuild does not know how to handle .vdproj (setup) projects.   (segway:  MSBuild is the build platform in .NET roughly equivalent of other programs such as ANT or make)

MSBuild is important if you plan on using Continuous Integration with a program like CruiseControl. 

WiX is also based on XML.  WiX projects and files are roughly human readable and easily allows for extensibility by following the XML spec.

To Install:

  1. Download WiX version 3.0.3621 or later
  2. Make sure that all instances of Visual Studio are closed
  3. Run the msi as administrator

This install will also include Votive (not supported in Express Editions) 

Also...

"ProjectAggregator2.msi, which is available here. This is a small COM component that the Visual Studio SDK framework requires. It has very minimum impact on your system and has a clean uninstall. This is only required for Visual Studio 2005. For Visual Studio 2008, this is no longer a requirement. "

 

NAnt:

http://codebetter.com/blogs/jeffrey.palermo/archive/2007/11/28/upgrade-nant-for-use-with-vs2008-solutions-and-net-3-5.aspx

CCTray:

Cruise Control Tray is a notification tray tool that monitors your build projects on the server.  It will inform you when a project is building correctly on the server, failing, and when it makes a new build.    To install the CCTray on your workstation, go to the web address of the server on which you installed Cruise Control.  You can download the CCTray tool from here.  After installing the tool, you can open the tray tool and set up which projects you would like it to monitor.

Adventure Works:

Adventure Works is the new Northwind.  While this is not a necessary install for the AWFF, it is used in the sample project for example's sake.  If you are going to run the sample application without changes, you'll need to install the AW database. 

Installation instructions and the download can be found here: Codeplex - SqlServerSamples

As a note, the sample makes use of the full standard AW database (not the Case Insensitive Versions or the Light versions or the warehousing versions)

 

 

  • Create a database (or use the AdventureWorks database)
  • At a command prompt (with admin access) run the ASP.NET SQL Server Registration Tool (ASPNET_REGSQL.exe).  The aspnet_regsql.exe file is located in the [drive:]\%windir%\Microsoft.NET\Framework\version folder on your machine.
  • Follow the wizard to register the database you created
  • Create new project from AWFF
  • In VS2008, on the menu, select "Project->ASP.NET Configuration" this will bring up the ASP.NET Web Site Administration tool.
  • Click on the Security Tab
  • Under the Roles menu, select "Enable Roles"
  • Now click on the "Create or Manage roles" link.
  • Create two new roles.  Admin and User
  • Go back to the Security Tab
  • Click on "Create User"
  • Create a user "Administrator", assigning both roles and making sure that he is Active.  Then click "Create User"
  • Click Continue
  • Go back to the Security Tab
  • Select "Manage Access Rules"
  • On the root folder, create a rule [All Users, Deny]
  • On the root folder, create a rule [Role: User, Allow]
  • On the Admin folder, create a rule [Role: Admin, Allow]
  • On the App_Themes folder, create a rule [Role: Anonymous, Allow]
  • Click on the Application Tab
  • Select "Configure SMTP e-mail settings"
  • Fill in settings and save.
  • Close the Web Site Admin tool
View Trenton Adams's LinkedIn profileView Trenton Adams's profile

Posted by trenton adams on Sunday, February 17, 2008 9:56 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Flash talking to Javascript

For the past few versions of Shockwave Flash, loading a flash object from a browser is no longer a one-way street.  Flash objects can interact with the browser, including calling Javascript, and the browser can interact with Flash, including Javascript calling Flash's ActionScript.

There are some security restrictions in place - ActionScript has to be registered via ExternalInterface.addCallback, and by default you can't call scripts across servers.  But we were running into a problem I haven't seen clearly explained anywhere - calls from Flash to Javascript weren't working right only when displayed in Mozilla. A simple test with window.parent.doTest() worked in IE, not in Netscape.

It turns out that Mozilla has wrapped the Javascript object model in XPCNativeWrapper as part of a security fix a while back.  Unfortunately, part of the functionality of this wrapper includes hiding any Javascript functions outside of the 'self' container.

So, for Javascript calls to work right in Netscape, they need to only call functions in the self container (i.e. the javascript needs to be in the head for the current iframe.)  If you try to embed the .swf directly in an iframe, it won't be able to call any Javascript. 

Changing out test to self.doTest(), and moving the definition of the doTest function inside of the current iframe's HTML, fixed the problem.  But, we have to change our app a bit - previously the iframe directly included the .swf, and there is no way to make the Javascript available that way.

Maybe this is documented clearly somewhere, and if so, I'd love to know the link so that I can have better docs to review next time I'm stuck.  So far About exchanging data with Flex applications has been useful, but everything else I could find about flash javascript problems just pointed to the allowScriptAccess parameter Adobe added to combat cross site scripting.


Posted by David Eison on Friday, February 8, 2008 1:46 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Creating a Horizontal Tabbed Menu with the Menu Control

I needed to create a quick horizontal tabbed menu with the Menu control.  The tabs have rounded corners so we're using image backgrounds.  We also have different images for the selected tab and when you hover.

image

<asp:Menu runat="server" ID="Menu1" SkinID="MenuHorizontalTabs">
    <Items>
        <asp:MenuItem Text="Tab 1" Value="Tab1" Selected="true" />
        <asp:MenuItem Text="Tab 2" Value="Tab2" />
        <asp:MenuItem Text="Tab 3" Value="Tab3" />
        <asp:MenuItem Text="Tab 4" Value="Tab4" />
    </Items>
</asp:Menu>

Then I added MenuHorizontalTabs to my skins file. 

<asp:Menu runat="server" SkinID="MenuHorizontalTabs" Orientation="Horizontal">
    <StaticItemTemplate>
        <div>
            <span>
                <asp:Literal runat="server" ID="Literal1" Text='<%# Eval("Text") %>' />
            </span>
        </div>
    </StaticItemTemplate>
    <StaticSelectedStyle CssClass="MenuHorizontalTabsSelectedMenuItem" />
    <StaticHoverStyle CssClass="MenuHorizontalTabsHoverMenuItem" />
    <StaticMenuItemStyle CssClass="MenuHorizontalTabsMenuItem" />
</asp:Menu>

Now, let's look at the CSS file.

.MenuHorizontalTabsMenuItem * div
{
    background:url(/images/header/left_both.gif) no-repeat left top; 
    height: 22px; 
    padding-left: 9px; 
    cursor: pointer;
}
.MenuHorizontalTabsMenuItem * span
{
    background:url(/images/header/right_both.gif) no-repeat right top; 
    padding: 5px 15px 4px 6px; 
    font-size: 10px; 
    color: #333; 
    height: 22px;
}
.MenuHorizontalTabsSelectedMenuItem * div
{
    background-position: 0px -150px;
}
.MenuHorizontalTabsSelectedMenuItem * span
{
    background-position: 0px -150px;
}
.MenuHorizontalTabsHoverMenuItem * div
{
    background-position: 0px -150px;
    color: Blue;
    text-decoration: none;
}
.MenuHorizontalTabsHoverMenuItem * span
{
    background-position: 0px -150px;
    color: Blue;
    text-decoration: none;
}

And finally, let's see the images.

left_both

left_both.gif

right_both

right_both.gif


Categories: ASP.NET
Posted by eric stoll on Thursday, January 31, 2008 10:07 AM
Permalink | Comments (0) | Post RSSRSS comment feed