spa posts

Fighting form spam

Cogneato has dozens of sites with openly submittable forms on them, and they have no doubt all had some level of problems with spam submissions. Bots, and perhaps people, like to share their links or services, try to hack sites, or whatever other nefarious or annoying purposes they may have through forms, which require some sort of server side processing, and will possibly result in human processing as well, such as with sent emails, database data, or comments on a website.

Spammers have gotten more sophisticated over time, and over the last year or two, have really started to hit Cogneato's sites hard and get past the protections we had in place. We've had to add protections on forms that didn't have them before, and use more techniques to attempt to detect spam. We've recently added a set of checks of the submitted form data and the submitter IP address that produces a score of "spaminess" that we can then use to block the submission if the score is above a threshold. That score script is the primary purpose of this post, but I will cover the other techniques we use as well.

Continue reading post "Fighting form spam"

Backbone: Maintain scroll position when going back

I've been spending a lot of time at work recently working on another phone app. Like our other apps, we're using Phone Gap to build an app with web technologies. Like one previous app, we're using Backbone, adding Marionette to help this time. Backbone apps are generally SPA's that rerender entire pieces of the HTML document when the underlying data changes. This can often be basically the entire content of the document when you change routes.

Because there is no page change, browers don't typically change the scroll position when you visit a new "page". So when you click a link at the bottom of one page, you may end up at the bottom of the new page you are loading. It's common to have apps set the scroll position to the top via JavaScript on page change, like window.scrollTo(0, 0);.

What happens when hitting the back button varies from browser to browser. Some, like Chrome, try to remember the scroll position for each fragment identifier (how Backbone handles routes by default), while others, such as Safari, do not. When they do not, it can be a usability problem working with lists of items. You might visit the detail page of one item by pressing a link in the list, then go back to the previous page wanting to look at the next one, only to find your place is lost.

Continue reading post "Backbone: Maintain scroll position when going back"

JavaScript: Callable namespaces and other namespacing options

It is a good practice to not pollute the global "namespace" (ie window in browsers) when creating JavaScript code, especially if it is to be reusable, to avoid collisions with other bits of code that may be used on a page. It is common to use objects as namespaces. You can say window.myLibrary = {} and then add whatever you want to that object with confidence of no collisions with other libraries as long as myLibrary isn't taken. Larger libraries will often have a namespacing function that will manage the creation of these namespaces, allowing them to be accessed if they already exist or created and then accesed if not, and easily handling multiple levels of depth. A simple example may look like the following:

namespace = function(_namespace, _scope){
	if(!_scope){
		_scope = window;
	}
	var _currentScope = _scope;
	var _identifiers = _namespace.split('.');
	for(var _i = 0; _i < _identifiers.length; ++_i){
		var _identifier = _identifiers[_i];
		if(!_currentScope[_identifier]){
			_currentScope[_identifier] = {};
		}
		_currentScope = _currentScope[_identifier];
	}
	return _currentScope;
}

Then you can do something like:

ns = namespace('myLibrary.mySubNameSpace');
jQuery.extend(ns, {
	'component1': function(){}
	,'component2': function(){}
});

I've been doing the more manual approach for my library, but have been desiring for a while to get more organized and streamline repetition by adding my own namespace function. I got to thinking about doing more with the namespace objects, so that they can perform operations on themselves once created. For example, they might be able to create and return sub-namespaces as well as easily extend themselves.

Continue reading post "JavaScript: Callable namespaces and other namespacing options"

</toby>