Red Country
Review:Good end for the pentalogy. |
Review:Good end for the pentalogy. |
Review:I had a a hard time getting to the end of the book, and it turns out it's not even a real end, just setup for a sequel. |
I am preparing to open my cheap site-and-blog-hosting service to the public at some point, so I needed to do some groundwork into deployment. Consider that the host that will run it will have very limited resources, so I needed to find lean and cheap solutions when possible, but at the same time, I want to achieve reasonable reliability and ease of deployment.
Since this is a testing server, I want it to have git master deployed. I don't want automatic deployment, but I want to deploy often, meaning several times daily.
I preferred simple tools instead of complex tools, lightweight tools with just enough features instead of heavier, more fully-featured tools. Your choices on each step could and probably should be different than mine, depending on your situation, requirements and personal preferences.
So, here's my notes from how it's done currently. This is not meant as a HOWTO, just a description of what seems to be working well enough so far.
Working late last night in Alva I wanted to do something that sounded trivial:
When the page loads, get the current date and time, and if a certain input is empty, put it there like this:
28/05/2013 23:45
So, how hard can that be, right? Well not hard, but...
Getting the current date-time is easy: now = new Date();
So, is there something like strftime in Javascript? Of course not. You can get code from the usual places and
have a untested, perhaps broken, limited version of it. And I am not about to add a strftime implementation to use it once.
Sure, there are a number of Date methods that convert to strings, but none of them lets you specify the output format.
So, let's try to do this The Javascript Way, right?
To get the elements I want to put in the value, I used accessor methods. So, obviously, these should give me what I want for the string, right?
now.getDay(), now.getMonth(), now.getYear(), now.getHour() now.getMinute()
Well, they are, at the date mentioned above, respectively: 2, 4, 113, error, error
Ok, the errors are easy to fix from the docs. It's actually getHours()
and getMinutes()
, so now we have 2, 4, 113, 23, 45 and of those five things, the last two are what one would expect, at least. Let's go over the other three and see why they are so weird:
Date.getDay()
returned 2 instead of 28Because getDay()
gives you the week day and not the day of the month. Which is absolutely idiotic. So, you have to use getDate()
instead. Which means the name is a lie, becasue the logical thing for getDate()
to return is the whole date.
Date.getMonth()
returned 4 instead of 5Because getMonth()
returns months in the [0,11] range. Which is beyond idiotic and bordering in evil. Come on, Javascript, people have been referring to may as "5" for nearly two thousand years now! What other language does this? Anyone knows one?
Date.getYear()
returned 113 instead of 2013Because it uses offset-from-1900. Which is amazing, and I had never heard of a language doing in a standard type. Because why? So, use getFullYear()
instead.
Now, armed with the right 5 numbers, let's format it. Does Javascript have the equivalent of sprintf or format ? Of course not. In JavaScript, without 3rd party modules, you create strings by addition, like a caveman. Again, I know I could add a format method to the String prototype and make this work, but I am not adding an implementation of format or sprintf just to use it once!
So, this produces that I want:
now.getDate()+'/'+(now.getMonth()+1)+'/'+now.getFullYear()+' '+now.getHours()+':'+now.getMinutes()
Unless... the day or month are lower than 10, in which case it's missing the left-padding zero. Luckily, for the purpose I was using it, it worked anyway. Because OF COURSE there's no included function to left-pad a string. You have to do it by addition. Or, of course, add a 3rd party function that's out there, in the internet, somewhere.
I used to manage a large number of QMail installations. And because Qmail was ... weirdly licensed, I wrote a set of plugins that ran on top of a patch called Qmail-SPP. I pretty much stopped doing that years ago because life took me in other directions, and forgot all about it.
That collection is called ra-plugins and I had not touched it since late 2008.
And today... I got a patch with two whole plugins to add to it so that it makes Qmail handle email addresses more like Gmail does (aliases using user+foo and making user.foo the same as userfoo).
So, I got them, added them, fixed a few simple building issues, updated the libsmtp it uses internally for one of the plugins to a later version, and there it stays, perhaps not to be touched until 2018.