Pasting $('input[type="password"]').val() the console of a page with saved passwords has always amused me and the bookmarklet makes this easier to do on pages that don't have jQuery.
I sometimes actually want to see the password I'm typing, either because it's fiendishly complicated or for some reason I've messed up a bunch and want to verify my typing.
I wanted to play with SASS and CSS linear gradients. So I put together a tiny website and needed something to put up there on it.
This is a bookmarklet, hence the javascript: protocol. In order for the browser to not navigate to a new page, bookmarklets need to return undefined, hence the anonymous function.
document.querySelector and friends are very cool and they let you find elements jQuery style without needing to try and pull in jQuery to run your three lines of actual code.
Unfortunately, document.querySelectorAll doesn't return a real Array so you can't use Array.forEach and are stuck using JavaScript's built in for. Sad sauce!
Today's Code Snippet of the Day (CSOD) from The Daily WTF shows how not to validate a date. Inspired by boredom and the knowlege that I could do it shorter and better. I set about writing my own date parsing/validation routines as a form of Code Kata.
In Python, Take I
A first crack written in python:
date_pattern=re.compile(r'^(?P<day>\d\d)/(?P<month>\d\d)/(?P<year>\d\d\d\d)$')defparse_date(input):ifnotdate_pattern.match(input):raiseValueError("'%s' is not in DD/MM/YYYY format"%input)day,month,year=map(int,input.split('/'))d=datetime.date(year,month,day)ifd>datetime.date.today():raiseValueError("'%s' is in the future"%input)returnd
We validate the date against a regex so that we know what we're dealing with.
We split up the input string and construct the date.
We test that the date is not in the future, and return the result.
This implementation is better than the CSOD in a number of ways:
It uses a regex to validate the format of the input string with is so much more faster/expressive/productive that writing our own validation code.
We use the platform's built in Date object rather than storing and manipulating the year/month/day ourselves which helps to avoid all kinds of silly bugs.
Unfortunately, we still parse and construct the date ourselves, duplicating functionality present in the standard library.
In Python, Take II
A second attempt, this time we're going to rely on strptime rather than parsing the string ourselves:
defparse_date(input):d=datetime.datetime.strptime(input,"%d/%m/%Y").date()ifd>datetime.date.today():raiseValueError("'%s' is in the future"%input)returnd
This implementation is even better as it relyies on strptime to handle the parsing/validating and the only real code that we write is testing if the date is in the future which is our logic.
In JavaScript
An implementation in JavaScript because the CSOD was submitted in JS. This is essentially a transcription of the first Python implementation as none of the JS date parsing utilities seem to take a formate string:
date_pattern=newRegExp('^\\d\\d/\\d\\d/\\d\\d\\d\\d$');functionparse_date(input){if(!date_pattern.test(input)){alert("'"+input+"' does not conform to the dd/mm/yyyy format");}ordinals=input.split('/');d=newDate(ordinals[2],ordinals[1]-1,ordinals[0]);if(d>newDate()){alert("'"+input+"' is in the future");}returnd;}
It would be preferable to try and achieve the simplicity of the second Python implementation but that would require writing (or including third party code) comparable to strptime.
Aside
It is very, very, strange that months are 0 indexed while day and year are not in the Date constructor: