certbot \ --pre-hook "systemctl stop apache2" \ --post-hook "systemctl start apache2" \ --authenticator standalone \ --installer apache \ -d johnflinchbaugh.com \ -d www.johnflinchbaugh.com \ -d blog.johnflinchbaugh.com
18 September 2018
Months ago, I started setting up LetsEncrypt using certbot on my Debian web server. It hosts multiple virtual hosts, so I setup 2 different sets of certificates: one for hjsoft.com/www.hjsoft.com and the other for johnflinchbaugh.com/www.johnflinchbaugh.com/blog.johnflinchbaugh.com.
On Debian,
at least when I got started,
it was recommernded to have certbot
shutdown your apache2
and let it start its own temporary web server
to verify the LetsEncrypt setup (--authenticator standalone
).
The other trick is
to register multiple domain names
for one certificate by repeating the -d
option.
I did this with this invocation:
certbot \ --pre-hook "systemctl stop apache2" \ --post-hook "systemctl start apache2" \ --authenticator standalone \ --installer apache \ -d johnflinchbaugh.com \ -d www.johnflinchbaugh.com \ -d blog.johnflinchbaugh.com
I got it started a couple months ago,
but I didn’t know how to setup multiple domain names,
so I was always getting errors
that this certificate was for a different name:
johnflinchbaugh.com
instead of www.johnflinchbaugh.com
, etc.
That’s all sorted out now, and all my sites should be SSL all the time.
For more information on setup, certbot has a great set of guides based on your OS and web server.
22 September 2010
The new K-Prep website is implemented in Grails now, so I was looking for a Groovy way to let the computer do the heavy lifting of figuring out dates for each week (starting with the first Monday) of the school year and matching them to a list of themes.
I got the algorithm working in about 8 lines of Groovy code, and then generalized it a bit more for you here to allow you to ask for any day of any week of any month. e.g. 3rd Wednesday in December.
To get the date for the 3rd Wednesday in December, my call looks like this:
dayByWeek(2010, DECEMBER, 2, WEDNESDAY, 0)
And the implementation looks like this:
import static java.util.Calendar.* def dayByWeek = { year, month, week, day, shift -> def c = Calendar.instance c.minimalDaysInFirstWeek = c.firstDayOfWeek + 7 - day c[YEAR] = year c[MONTH] = month c[WEEK_OF_MONTH] = week + 1 + (shift?:0) c[DAY_OF_WEEK] = day c.time }
The shift
parameter allows me to optionally start a theme on the previous week in cases where that day is the end of the previous month. The static import allows me to conveniently refer to the Calendar constants without qualifying them, and finally, setting the minimalDaysInFirstWeek
allows days early or late in the week to still be found when the Calendar would have otherwise preferred a longer week to start searching.
26 February 2010
Way back in the day, when I used to shoot at clubs and raves, I'd always want a way to share the images with the people I'd meet, but exchanging email could be a bit cumbersome or just be a deterrent.
While I'm not out clubbing these days, I'm still often out at various events, so I still need a quick and easy way to point people to the images, so I just added the Event Code box to the photo site.
While I'm out shooting, I can create an event code (from imagination or using my phone), and then write that short code on my business card to hand out. Then it's really easy for someone to hit my site, punch in the code, and get right to the photos on Flickr or in the Gallery.
It's just one of those little things I've wanted for a while, and now I've finally added it.
12 January 2010
I built out the initial iteration of my photography website a couple months ago, and I've been coming back to it recently to put some enhancements into place. I really must get the photography blog up and running, but until then, I poke around at doing the simpler things -- like a convenient copyright taglib.
I beat people at work over the head with TDD all the time, so I obviously want to follow my own example. I started out searching around a bit on unit testing custom taglibs in a Grails project. I didn't come up with much, and what I did find wasn't really exercising the parameters that come into a taglib closure.
Let's start out asking Grails to create a shell of a taglib for me in the conventional locations:
% grails create-tag-lib copyright
Now I have a shiny new test/unit/CopyrightTagLibTests.groovy
and a grails-app/taglib/CopyrightTagLib.groovy
, and they're empty.
I want to be able to use it like this in my GSP:
<g:copyright startYear = "2009">John Flinchbaugh</g:copyright>
I'll be giving it a start year, it should use the current year as the end year, and the body is the name to whom it should attribute copyright. If the current year and the startYear match, then it should display only one. Let's get that down in the unit test. Fortunately, the tag name used in the GSP is just the name of a closure in the taglib.
Taglibs take a map of attibutes and a closure for the body of the tag, and they render their output to the out
property. My first assumption says we should see the current year only and the body text when no tag attributes are specified (empty map). I cheat a little and just derive the current year in the test to form my expectation instead of trying to inject the current date.
void testCopyrightNoStart() { tagLib.copyright([:]) { "xyz" } def expectedDate = Calendar.getInstance().get(Calendar.YEAR) assertEquals("Copyright ${expectedDate} xyz", tagLib.out.toString()) }
Next, I assume if the startYear
is specified and it matches the current year, it'll only display one year, and not a range. Make special note, the value of the startYear
attribute being passed into the copyright
method is a String
. When taglibs are called by the GSP engine, they will pass in String
values, so do yourself the favor and make sure you're doing that here.
void testCopyrightStartThisYear() { def expectedDate = Calendar.getInstance().get(Calendar.YEAR) tagLib.copyright( startYear: "${expectedDate}") { "xyz" } assertEquals("Copyright ${expectedDate} xyz", tagLib.out.toString()) }
I do a little math for the test of the full functionality and pass in last year for the startYear
and demonstrate the taglib in all its glory -- showing a range of years.
void testCopyrightStartLastYear() { def expectedDate = Calendar.getInstance().get(Calendar.YEAR) tagLib.copyright(startYear: "${expectedDate - 1}") { "xyz" } assertEquals("Copyright ${expectedDate - 1} - ${expectedDate} xyz", tagLib.out.toString()) }
I like to nail down expectations about what would be misuses as well, so I'm going to say that a bad startDate
will still run fine, and it'll just be shown in the output of the taglib.
void testCopyrightBadStart() { def expectedDate = Calendar.getInstance().get(Calendar.YEAR) tagLib.copyright(startYear: "badYear") { "xyz" } assertEquals("Copyright badYear - ${expectedDate} xyz", tagLib.out.toString()) }
Now that I have all my tests done up front, let's run grails test-app
to see what we have! All my shiny new tests fail spectacularly, because I've not written the taglib yet, so let's go write enough of this new copyright
closure on the CopyrightTaglib
to get these tests to pass.
I address one test at at time, starting with just giving myself an empty closure assigned to copyright
, and adding and modifying bits of the taglib code until it passes all my tests. That's how I know I've done everything I wanted and nothing unnecessary.
class CopyrightTagLib { def copyright = { attrs, body -> def thisYear = Calendar.getInstance().get(Calendar.YEAR) as String def startYear = attrs.startYear ?: thisYear out << "Copyright" if (thisYear != startYear) { out << " ${startYear} -" } out << " ${thisYear} ${body()}" } }
And there it is, some simple taglib code which satisfies my every expectation as laid down in the tests. The last thing to do, is go add my shiny new taglib to my footer.gsp
and I'm done. The code for the test and taglib are available in their entirety here: copyright.zip.