Official BV Software Blog
New, Updates and Anything else we find interesting

PABP changes to PA-DSS

May 4, 2008 10:59 by mmcconnell1618

Even before the PCI security standard for applications (PABP) becomes mandatory the PCI organization has retired it. It has been replaced with a new PA-DSS standard. The PCI web site details the  changes from PABP to PA-DSS.

One of the big changes is the PA-DSS is NOT required to process credit cards unless your credit card gateway/provider requires it. This should be a huge relief to many merchants as it will allow them to negotiate with their payment provider for a reasonable timeline to get certified.

 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

BV Commerce wins aspNetPro Reader's Choice Award 2008

April 24, 2008 16:31 by mmcconnell1618

BV Commerce has once again won the AspNetPro Magazine Reader's Choice Award for Best eCommerce application. That makes 4 out of the last 5 years that it has captured the title. An incredible achievement given the pace of innovation in the industry.

DotNetBB our message forum software has also captured the runner-up position for best asp.net forum software. 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Generate a Customer List for BV Commerce 5

March 26, 2008 15:50 by mmcconnell1618

If you've ever needed to get a quick export of everyone who has purchased from your store in the last year this SQL script can be used to generate a comma separated text file. Make sure you change the "> date" part to be the correct starting point for your export. You'll get customers' names, address, phone and email as long as they placed an order on your store.

 

SELECT 'LastName, FirstName, Line1, Line2, City,

        RegionName, PostalCode, CountryName,

        Phone, Email' AS Expr1, 0 AS [Order]

UNION

SELECT   CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/LastName/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/FirstName/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/Line1/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/tLine2/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/City/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/RegionName/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/PostalCode/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/CountryName/text()') AS nvarchar(1000))

+ ', ' + CAST(CAST(AddressBook AS xml ).query(N'/AddressBook/Address[last()]/Phone/text()') AS nvarchar(1000))

+ ', ' + Email AS Expr1, 1 AS [Order]

FROM   bvc_User

WHERE (bvin IN

          (SELECT DISTINCT UserId

           FROM         bvc_Order

           WHERE (OrderNumber <> '') AND (TimeOfOrder > '01/01/2007')))

ORDER BY [Order]

 Run this in SQL Management Studio and then copy and paste the results to a text file. You can open the text file in Excel as "comma separated" (CSV) to get sort the data or mail merge.

 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

If you're late paying your cable TV bill your credit card payments can go up!

March 25, 2008 11:48 by mmcconnell1618

I've got a love/hate relationship with credit card companies. On one hand credit cards make it easy for BV to sell software over the internet. On the other hand chargebacks and fraud with credit cards is a royal pain with limited protection for merchants. I watched a great episode of Frontline on PBS about the Secret History of Credit Cards.

The most surprising revelation was that most credit card contracts include a clause called "Universal Default." Basically, if you make a late payment to any other lender or company the credit card issuer can automatically raise your interest rate. If you're on vacation and forget to pay Comcast on time your Visa interest rate can jump from 18% to 25% without warning. 

Credit card companies are the only lenders that get to decide how risky you are when they issue you credit AND change their minds about how risky you are later too. My bank doesn't get to raise my mortgage payments because they think I'm riskier now than when I signed up for my mortgage so why should credit card companies get that ability? Sounds like a huge loophole that lets credit card companies jack up your rates almost at will.

Anyways, if you found this interesting you can watch the whole episode online


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

JQuery 1.2.3 conflicts with Google Analytics

March 19, 2008 17:42 by mmcconnell1618

I was watching our Google Analytics traffic last week and noticed a sharp decline. My first thought was "My God, we've been blacklisted by Google or another search engine." I couldn't figure out why our traffic had dropped so dramatically. If it had dropped to zero I would have instantly thought the tracking script was at fault but instead it just dropped but kept counting with day to day variations.

I discovered that IE was reporting a script error and that was the clue to the mystery. We had added the JQuery library version 1.2.3 to our master page for some fancy image swapping. It turns out that this particular version of JQuery has an odd way of handling some click events and it conflicts with click handlers in Google Analytics. Apparently it doesn't happen all the time and it doesn't happen in all browsers so that's why we were still seeing some traffic records.

I pulled JQuery until it's patched and the stats popped back to normal the next day. Whew!

 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Silverlight, MVC, and more at Mix08 in Las Vegas

March 11, 2008 13:33 by mmcconnell1618

I just got back from the Mix08 conference in Vegas. It was fantastic! Scott Guthrie and Ray Ozzie showed off some new web tools during the opening keynote and it's clear that Microsoft is jumping into the web with both feet. Ray Ozzie pretty much said that Microsoft will be coming out with a new cloud based services model that will include most (if not all) Microsoft applications. Hosted data services are also coming and I'm interested to see how they differ from SQL relational databases. Ray didn't say anything about Microsoft hosting services but if I was in the hosting business I might be a little worried about what will happen down the road.

Silverlight, Silverlight, Silverlight was the battle cry from just about every Microsoftie I met. They are pushing this hard as THE platform for rich internet applications (RIA) in the coming years. NBC will be launching a silverlight based web site for Olympic coverage and if it does everything they showed in the demo the internet is going to grind to a halt with that much video running at once. Clearly, Microsoft wants Silverlight to take down Flash as the defactor way to add video and animation to web sites. Given Microsoft's ability to build great developer tools to support their platforms they just might do it.

Scott Hanselman gave a great presentation on ASP.NET MVC or Model View Controller. He started off by opening Notepad on a 40 foot projection screen and just typing random funny comments about the crowd. The room was silent in less than a minute and I thought it was a genious way to start things off rather than screaming for everyone to sit down.

MVC is an alternate way to build ASP.NET web pages instead of using WebForms. With WebForms you have a .aspx page and a code behind file. The code behind file pulls information from your business objects and binds it to controls on the .aspx part of the form. Everything is in one giant <form> tag and viewstate is used to emulate winforms-like interactions. With MVC you have views which are html pages or template language pages that accept some data and are responsible for rendering out angle brackets. A controller is a class that does not have a corresponding display page and is responsible for pulling data from business objects and packaging it into a bundle of data for a view to render. This is very similar to Ruby on Rails and will give ASP.NET programmers an alternative to WebForms. Scott was very clear to point out the MVC is not replacing WebForms and that the two can co-exist in the same web site if you want.

Wednesday night Microsoft sponsored a party at TAO, a night club in the Venetian where the conference was held. They brought in Steve Wiebe who attempted to regain his title as Donkey Kong champion of the world. Steve wasn't able to beat the high score but he did reach level 22, known as the kill screen, where Mario dies because the programmers were out of memory. The kill screen has only been reached 5 times during competition. If you're in Vegas you have to try the Kobe beef sliders at TAO which are incredible!

This was the first MIX conference that I've been to and it was different from other Microsoft events. There were so many opportunities to meet both Microsoft team members and other developers that I'd really recommend it to anyone building web applications on the Microsoft platform. Next year's Mix09 conference will be at the Ventian in Vegas March 18-20, 2009.

 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Meta Keyword Tag is Dead

March 6, 2008 10:44 by mmcconnell1618

I'm probably very late to this party but apparently the Meta Keyword tag is all but useless to modern search engines. I had a chance to meet Nathan Buggia from Microsoft's Search team yesterday and he was gracious enough to answer a lot of questions for me.

Nathan explained that all major search engines pretty much ignore the keywords tag and instead generate their own keywords directly from your page content. The meta keyword tag is a really great way to let your competitors know which words you think are important but aren't going to impact search rankings.

I also asked him some common questions that our customers ask us about. It's great to talk to the people that actually know the answers instead of guessing which SEO guru is right.

Does it matter that the extensions are ".aspx" instead of ".html"
The short answer is "no."  The only expection is that Microsoft Search will actually read some .aspx pages more intelligently than non .aspx pages so there could be a slightly benefit to using ASP.NET in general.

Is it okay to use non-latin characters in domain names? I've heard they can flag your site as a phishing page.
Nathan says that it is 100% fine to use non-latin characters in URLs as long as your page content also contains non-latin characters. A 100% us page with all latin characters that uses non-latin characters in the URL could raise some alerts on filters.

 

Any other buring search engine questions? Email me and I'll try and get Nathan to answer them if I catch up with him again.

 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Technorati Profile link

February 28, 2008 21:49 by mmcconnell1618
Technorati Profile

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags:
Categories:
Actions: E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Rock beats Scissors, Trashcan Beats Orb

February 28, 2008 21:14 by mmcconnell1618

I use both Windows and Mac OSX at BV Software. I really like somethings about each operating system and since we make web based apps we need to test them on both platforms. Tonight my 2 1/2 year old son showed me why a trashcan beats an orb.

I had my laptop booted into Vista and Gideon was "helping me" finish up some email messages. Click here, click there, window opens, etc. Not a peep out of him.  When I was finished I rebooted into OSX because I remembered that he liked Photobooth and making silly pictures.

OSX was on screen and in less than 2 seconds Gideon promptly pointed out "Ooo, Trashcan, Oooo Book." That is great UI design. My 2 year old instantly recognized a trash can and that the Address Book program looked like a book. He can't read but he understood perfectly. 

He never said one peep about the Windows "orb" that represent the Vista start menu. 

 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , ,
Categories: General | UI
Actions: E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

How to create a Dynamic LINQ Query Programmatically

February 27, 2008 21:14 by mmcconnell1618

If you've been stuggling to create a dynamic LINQ query you're not alone. Thanks to some research, hard work and a smart co-worker I was able to implement some cool dynamic LINQ code in our help desk application. 

In our helpdesk we have filter screens that look like this: 



Creating a LINQ query in challenging because we don't know ahead of time which fields the user will complete. They are all optional and without anything selected we want to pull back all tickets. Normally, you'd write a query like this:

 

var ticket = (from t in db.cerberus_Tickets

                          where t.id == id

                          select t).Single();

In the example above we know that the t.id parameter will always be given. So how do you create a query in code when you don't know what fields to include in the WHERE clause ahead of time?

The first key is understanding the LINQ queries are not executed until they are used to enumerate through a collection. This part is key because it means we can create a query and change it in code as long as we don't try to look at the results first.

What we're going to do is create an IQueryable collection that contains all of our Ticket objects and we'll dynamically add our WHERE clause information.  Then we'll create a normal LINQ query that selects all of the matches from our IQueryable collection and handles paging. Because we don't actually enumerate the IQueryable collection that contains all our tickets, it won't actually pull back all of the tickets (which would take forever!). Instead, it will be "merged" with our normally LINQ query at run time when we enumerate over it.

1) Create our LINQ to SQL context objects

 

 

 List<cerberus_Ticket> result = new List<cerberus_Ticket>();

 cerberusDataContext db = new cerberusDataContext(connectionString);

 

2) Create an empty IQueryable collection containing all tickets. Note that this query doesn't actually select everything from the database yet. If it did this would take forever and effectively be filtering the database table in memory. That would not be a good design!

 

 

 IQueryable<cerberus_Ticket> matches = db.cerberus_Tickets;

 

3) Add our WHERE clause information with custom logic to decide if the clauses should be added or not

 

       

 if (this.AgentIdField.Text.Trim().Length > 0)

 {

     matches = matches.Where(a => a.AgentId == criteria.AgentId);

 }

 

 if (this.TicketIdField.Text.Trim().Length > 0)

 {

     matches = matches.Where(a => a.TicketId.Contains(criteria.TicketId));

 }

 

 4) Create a second LINQ query that selects from the first one to sort and page the results.

 

 // calculate start row based on page parameters passed in

 int startRow = (pageNumber - 1) * pageSize;

 

 var output = (from p in matches

               orderby p.DateCreated descending

               select p).Skip(startRow).Take(pageSize).ToList();

 

 

Again, I can't emphasize enough how cool it is that LINQ doesn't query the database until we call the ToList() at the end of the second statement. This delay in execution is the magic that lets us create dynamic queries on the fly.

Have any cool LINQ tips of your own to share?

 

 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5