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"
I think I saw the ISS (space station) tonight, on the day the Space X Dragon capsule docked with it.
Continue reading post "#2879"
in
www
comment
pingback
problem
spam
wordpress
Welp, got my first pingback / trackback spam since I closed regular comments about a month ago.
Continue reading post "#2019"
For some reason, I got a bunch of calls from unknown numbers today (yesterday).
Continue reading post "Post 1988"
in
toby
electricity
problem
sparks
storm
weather
wind
On my Friday commute home from work, it suddenly began to rain and bluster.
Continue reading post "#1873"
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"
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"