Our software development team recently encountered a problem debugging in Visual Studio. When they start the debug session, the browser session shows a blank page.

IE Blank page

We researched registry settings, Visual Studio settings, web.config, IIS Express settings, malware, IE settings, Chrome settings, and many other factors without success.

If you view the source on the blank page, you will see:

IEBlankpageViewSource

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<HTML><HEAD>
<META http-equiv=”Content-Type”
content=”text/html; charset=windows-1252″></HEAD>
<BODY></BODY></HTML>

Specified things we checked:
We verified that debugging was present in web.config:
<compilation debug=”true” strict=”false” explicit=”true” targetFramework=”4.0″/>

We verified our .net framework was installed correctly. It was in place as we expected.

We checked the Visual Studuio Tools->Options->Debugging->Enable Just My Code setting, but no luck.

We looked for web proxy settings such as Fiddler, but they were not present.

We did see an error “A first chance exception of type ‘System.UnauthorizedAccessException’ occurred in mscorlib.dll” but didn’t find any permission issues.

Solution:
In the end we discovered that the problem was caused by an app_offline.htm file. For some reason, the app_offline content does not render properly and the page is presented with blank content. This can occur in a project written in C# or VB.

We suspect that the UnauthorizedAccessException is the reason that the app_offline.htm content did not render, but don’t have any evidence of this.

Visual Studio app_offline_htm

NoSQL’s popularity has been on the rise over the last five years, with favorites like MongoDB, CouchDB, Cassandra, and Redis on the forefront. With NoSQL’s strengths in its fantastic performance and the ability to store and query denormalized data sets, there are a number of reasons to use NoSQL over SQL technologies like MySQL or Microsoft SQL Server.

Denormalized Data Structures

NoSQL allows developers to store denormalized data structures in document form. While many find this more enjoyable and easier to work with, there is a bit of an adjustment for someone come from a structured SQL background. For example, take a look at the following documents inside of the same MongoDB collection:

{
	firstName: "Kerry",
	lastName: "Ritter",
	city: "St. Louis",
	state: "Missouri",
	serverExperience: [
		"Apache",
		"IIS"
	],
	programmingLanguages: [
		"PHP",
		"C#",
		"JavaScript"
	]
}
{
	firstName: "Rob",
	lastName: "Wagnon",
	city: "St. Louis",
	state: "Missouri",
	serverExperience: [
		"Apache",
		"Nginx",
		"IIS"
	],
	databaseExperience: [
		"Microsoft SQL Server",
		"MySQL"
	]
}
{
	firstName: "Dave",
	lastName: "Mueller",
	city: "St. Louis",
	state: "Missouri",
	serverExperience: [
		"Apache",
		"Nginx",
		"IIS"
	],
	programmingLanguages: [
		"PHP",
		"C#"
	]
}

A similar normalized database structure similar to the following 7 tables:

Person (ID, FirstName, LastName, State)
ProgrammingLanguages (ID, Title)
ServerTypes (ID, Title)
DatabaseTypes (ID, Title)
Person_ProgrammingLanguages (PersonID, ProgrammingLanguageID)
Person_ServerExperience (PersonID, ServerTypeID)
Person_DatabaseExperience (PersonID, DatabaseTypeID)

So now, for just a basic structure, we have to put some effort in to create these tables and their relationships, while using MongoDB prevents this by allowing a denormalized document storage method.

The amount of tables grows considerably the more variable your data becomes; if we add a collegeDegreesObtained array to list the degrees held by each person, we would have to create two more tables: to manage the types of degrees and the connecting table between the degree and person. In NoSQL, we simply add an array to the document and we are done. We do not risk breaking any queries, having errors from NULL data, or having to manage default column values.

Key points:

  • Less work overhead for one-to-many relationships
  • Less work overhead for adding new data to an entity

Querying

Querying in MongoDB also tends to be a little simpler when doing the more basic lookups. For example, to find someone with the first name Kerry, we do the following:

db.people.find({ firstName: "Kerry" })

This translates to the following in SQL:

SELECT * FROM Person WHERE FirstName = "Kerry"

Not much difference in the amount of work. However, if we want to find someone with knowledge of the PHP scripting language and the Nginx server, we would do the following in NoSQL:

db.people.find({ programmingLanguages: "PHP", serverExperience: "Nginx" })

This would translate to the following query in SQL:

SELECT * FROM Person p
INNER JOIN Person_ProgrammingLanguages ppl ON p.ID = ppl.PersonID
INNER JOIN ProgrammingLanguages pl on ppl.ProgrammingLanguageID = pl.ID
INNER JOIN Person_ServerExperience pse ON p.ID = pse.PersonID
INNER JOIN ServerTypes se on pse.ServerTypeID = se.ID
WHERE pl.Title = "PHP" AND se.Title = "Nginx"

This example demonstrates the simplicity of querying MongoDB documents in comparison to querying complex relational data in MySQL. As stated before, SQL query size and overhead will grow much faster with new data, while MongoDB queries and documents will still relatively small and manageable.

Key points:

  • Simpler querying mechanism when searching for relational data (in SQL) values

Performance

There are a number of benchmark studies out there demonstrating the speeds of various NoSQL implementations vs SQL implementations. While we do not have any formalized studies, I did some testing personally and found that when inserting millions of documents into MongoDB and inserting a corresponding row into Microsoft SQL Server table, MongoDB took under half of the time. Querying was a similar story; MongoDB cut about half of the time to find a piece of data in a very large dataset. However, MongoDB eats up a lot of memory, so make sure to be cautious of that.

If you are not sure whether NoSQL will offer you performance advantages, simply search the web for comparisons and you will find a number of them.

Key points:

  • NoSQL typically offers better performance and speed
  • NoSQL tends to use and require a lot of RAM, so be cautious

Drawbacks

There are some drawbacks to using NoSQL; it is not a perfect solution to everything. Each implementation has its own issues. In our development of a genealogical search, we used MongoDB and found these issues.

Disk space consumption: MongoDB tends to take up a lot of space in comparison to the amount of data. There are some solutions to this problem (TokuMX, which will be discussed in a later blog), but MongoDB itself isn’t the most space-efficient solutions.

Document size restriction: The max size of a MongoDB document is 16MB. This was a particularly complex issue to work around if your document is a company with an array of subdocuments containing information on employees. If that list gets too large, you will have to split the company document and then re-connect them with an aggregation pipeline.

Pagination using skips and limits have very bad performance: Say your company has 10,000 people subdocuments. To skip the first 9000 is a serious performance hit as it seems to run your query parameters against each row. This is a completely ineffective method for paginating large datasets, but there are some workarounds, such as using a $gte parameter on the last page’s item ID.

When to use NoSQL

While this choice is always up to the project’s needs and the developers, NoSQL should very much be considered if the data is going to be very relational. Also, NoSQL can have some great performance benefits when used correctly. If you’ve never worked with NoSQL before, its barrier to entry is relatively low and implementations like MongoDB have great communities who can help you when you’re stuck.

WordPress

Our WP development team ran into a problem with the Media File Manager plugin by Atsushi Ueda in which the code was attempting to read from an array index that did not exist. This resulted in a Notice level error from PHP, and thus broke the file manager.  We think this utility is very useful to our CMS development, so we investigated a fix.

WordPress

 

Here is the issue we ran into:
Notice: Undefined offset: -1 in /path-to-wordpress/wp-content/plugins/media-file-manager/media-relocator.php on line 236

Line 236 contains the following:
$dir1[$i]['thumbnail_url'] = mrelocator_path2url($dir . $dir1[$min_child]['name']);

Solution

Change this to the following to resolve the issue:
if (isset($dir1[$min_child])) {
$dir1[$i]['thumbnail_url'] = mrelocator_path2url($dir . $dir1[$min_child]['name']);
}

 

References

Keywords

WP, plugin, PHP, CMS development

For information about how Acumen can help with your Software needs, contact us today!

 

 

Our PHP development team encountered many situations where remote connections to mysql take 5 seconds to return responses.  In some cases, we’ve rebuilt servers after tearing our hair out.  This has happened on Windows, Linux, PHP, apache, WordPress, joomla, Zabbix, and so many cases it makes me want to scream.  Of course, people love to point to Windows as the problem.  Lots of other people say optimize mysql.  Others say to configure your long_query_time parameter and check the logs.  None of this matters, because it isn’t Windows, it isn’t Linux, it isn’t PHP, it isn’t apache, it isn’t WordPress, it isn’t Zabbix, and it isn’t an optimization issue.

It is a reverse DNS problem.  Not a DNS problem, a reverse DNS problem.  A reverse DNS problem on your mysql server.  Which is absurd.  Why on earth would mysql server check for reverse DNS?  Why?

Because mysql wants to look at the host name for GRANT lookups.  Jeez.  Who cares.  I’d rather just fail the security than have all my applications wait five or ten seconds for every operation.

Solution

You can do one of two things to fix this:

1. Work with your network administrator to create reverse DNS PTR records.  Maybe you can get this done, maybe you can’t.

1b.  Create a host entry in the hosts (/etc/hosts or c:\windows\system32\drivers\etc\hosts).  This is good for both forward and reverse DNS.  Just never forget that you made it three years from now when you rename servers.

2.  Configure mysql with skip-name-resolve as described here.  For people that can’t control their reverse DNS PTR records – or can’t get help having them configured – this is the best option.

Want to make this really crazy?  If you have a multiple subnet network work with multiple DNS servers for hundreds of domains and split-horizon DNS for internal networks, you may have the extra fun of configuring conditional forwards for reverse DNS.  If you want to know how to do that, just ask in the comments.  (It’s not hard, so google may have already helped you.  You just have to know you need it.)

My apologies that this is an unusually snarky post.  It’s only consumed 80+ hours cumulative of my life.

Keywords

MySQL, PHP Development

DNN Navigation

DNN Navigation logo

Our CMS development team was working on a dotNetNuke site with a Navigation bar and added it to all pages. I then edited the Navigation bar, pulled off the Display on All Pages check box in the Settings dialog box, and then rechecked it. It would not display on all pages after this. This is apparently a bug in the DNN system and this is the workaround.

Solution

Go to Admin – Recycle Bin and Click “Empty Recycle Bin” button.

Then go back to the Module – Settings and recheck “Display on All Pages”. It should work.

References

I found help here.

 

See our CMS Development Page for more information on how we can help you!

Our ecommerce team discovered that there’s a strange little feature in the Cart Viper shopping cart category listing that caused me about half-an hour worth of frustration. It’s actually documented in the tool itself but it was difficult to fully understand.

In this case I wanted the DNN Menu module to be available to non-authenticated and unverified users. It’s easy to make the module header appear in the sidebar but the Categories list proved more difficult.

Cart Viper

Solution

Within the documentation for the tool it tells you to leave all Role Options for the module blank to have it show up for all users. I didn’t want the Menu List to show up for all users, just select User Roles including Unverified and Non-Authenticated. Thus I checked those two Roles and several others. The Category list showed up when I was logged in as an administrator but once I logged out the categories vanished.

Finally I simply followed directions by unchecking all roles and it worked. Not that big a deal but somewhat frustrating. Apparently there is a bug somewhere in the viewing for Unverified and Non-Authenticated users. Easy to fix in the end.

Keywords

DNN, dotnetnuke, cart viper, shopping cart, ecommerce

 

Take a look at our CMS Web Development Page and see if we can help you!

GP Dynamics

After rebuilding the SQL Server and restoring databases due to a catastrophic hardware failure that even corrupted the redundancies, once users tried to open certain smartlists, they received the following error window:

GP Dynamics

Then, after getting the message multiple times, the smartlist data finally showed, but it was a major nuisance for the users.

After troubleshooting, I found the issue to be because in the new install of SSRS, I had set it to run on a domain service account. After trying some other potential solutions, I found that setting the SSRS service to run as NETWORK SERVICE ceased the copious number of error messages received.

See our Network Services page for more information on ways we can help you!

Very often, programmers come from a mathematical background where they have frequently dealt with operators and operations and but find it confusing to use these same terms in the context of programming. I had that problem one time myself. Since then, I have spoken of how the methods of a class are operations upon the data of a class and been asked to define the term, even though I should have recognized the uncertainty that the term brings to discussions and preemptively addressed it myself.

In the context of computers, on definition of operation is the execution of one computer instructions. These instructions, or collections of instructions, usually manipulate one or more pieces of data. For example, one instruction might load the integer value stored in a memory location into a registry of the processor. Another instruction might load another integer into another memory location. A third instruction may add the two values together and store the sum in yet a third register. A fourth instruction may place the calculated value in to one of the first two memory locations, or place it in yet another memory location. When programmers talk about operations, they are ordinarily talking about a collection of fundamental processor operations that do something identifiable. Even very simple things like multiplication (a logical, programmatic operation) may take many processor operations from the standpoint of the processor.

In common usage of the term operation, we are not referring to individual atomic processor instructions, but the overall activity of a function or a line of code. For example, if we have the following code:

1. Dim I, j, k as Integers

2. I = 1

3. J = 1

4. k = I + j

Lines 2 and 3 each have 1 operation. In each of these lines, the value of 1 is copied into the memory locations named I and j. The equals sign is the assignment operator that takes the value of the expression on the right side of the equals sign (the value 1 on both lines) and copies it to the storage location identified (by friendly name, not by memory address) to the left of the equals sign (or assignment operator). It may take more than one computer instruction to execute these instructions, but we as programmers view it as a single operation.

Line 4 has two operations. There is an operation that adds I and j together, and another operator that assigns the result to the memory address (identified by the variable k) to the left of the equal sign. The plus sign is an operator that takes two integers and adds them together. The plus sign is also used as an operator for other data types, but if I and j are not types that the plus sign recognizes as types that the plus sign can use in any operation, an error will result at compile time. The equals sign is again recognized as the assignment operator.

We say that the plus sign operates on I and j, and the equals sign operates on the result of I and j (stored as an intermediate result in a register) as well as k.

So when we say that a method DoSomething(int I, int j) is an operation of the class which contains it, we are saying that DoSomething is a function that operates on I and j (and other variables that may be visible within its scope).

n operator is merely a shorthand way of representing common functions. For example, instead of writing k = I + j, most languages would let us have a function that operates on I and j that might look something like k = i.Add(j).

Google Analytics

Google Analytics - Official Google Logo

Internet Marketers depend upon Google Analytics to make SEO and PPC decisions. Google is now in the process of moving everyone away from Google Analytics to an updated tool called Universal Analytics.

This tool includes many new features that make tracking site visitors even easier which will help you understand your Internet Marketing efforts in greater detail.

It has a number of benefits including the ability to connect multiple devices, working with user sessions, and engagement by User ID.

The new tracking code is much more flexible, which allows you to track websites.

Now also mobile app tracking and other digital devices like game consoles. It’s much easier to setup the tool particularly for cross-domain tracking.

It’s easier to exclude particular referrals and search terms. You can create your own custom dimensions and metrics.

It’s not difficult to transfer over to the new Universal Analytics and you shouldn’t postpone the move.

If you need help our SEO Department is waiting for you call!