Snow 2.0
It snowed again last night and when I woke up the snow was still fresh. Taking more pictures seemed like the right thing to do:
A search for meaning in the noise.
It snowed again last night and when I woke up the snow was still fresh. Taking more pictures seemed like the right thing to do:
There was some snow in Brooklyn Heights last week. Here are some pictures from when the snow was still fresh:
I took my new phone out for a walk and took some pictures of the neighbourhood to see how the camera held up. Here they are:
I've recently been messing around with Scala and figured I'd tackle a problem I've already solved in other languages. Here is the template kata implemented using a regex to match the placeholders:
class Template(val tmpl: String) {
def render(context: Map[String, Object]): String = {
return """\$(\w+)""".r.replaceAllIn(tmpl, m => {
context.getOrElse(m.group(1), "").toString()
})
}
}
Here's a couple things I like:
Here are the tests written in a BDD style using ScalaTest:
import org.scalatest.FlatSpec
import org.scalatest.matchers.ShouldMatchers
class TemplateSpec extends FlatSpec with ShouldMatchers {
val EMPTY = Map[String, Object]()
private def test(tmpl: String, expected: String, ctx: Map[String, Object] = EMPTY) {
new Template(tmpl).render(ctx) should equal (expected)
}
"A template with no tokens" should "return a blank string if the given string is blank" in {
test("", "")
}
it should "return a non-blank string unchanged" in {
val identity = "hello, world"
test(identity, identity)
}
"A template with one token" should "replace missing values with the empty string" in {
test("$name", "")
}
it should "replace the token with value from the context" in {
test("$name", "Aaron", Map("name" -> "Aaron"))
}
it should "leave the rest of the string unchanged" in {
test("Hello $name!", "Hello Aaron!", Map("name" -> "Aaron"))
}
"A template with two tokens" should "replace each token its value from the context" in {
test("Hello $name! It is a $attitude day.", "Hello Aaron! It is a wonderful day.", Map(
"name" -> "Aaron", "attitude" -> "wonderful"
))
}
it should "replace each missing value with the empty string" in {
test("Hello $name! It is a $attitude day.", "Hello Aaron! It is a day.", Map(
"name" -> "Aaron"
))
}
it should "replace adjacent tokens with their respective values" in {
test("$me$you", "AaronJohn", Map("me" ->"Aaron", "you" -> "John"))
}
it should "replace every occurrance of each placeholder" in {
test("$a-$b-$a-$b", "AAA--AAA-", Map("a" -> "AAA"))
}
}
They're a little verbose, but as I mentioned in a previous post, you can extract documentation from tests like these:
TemplateSpec:
A template with no tokens
- should return a blank string if the given string is blank
- should return a non-blank string unchanged
A template with one token
- should replace missing values with the empty string
- should replace the token with value from the context
- should leave the rest of the string unchanged
A template with two tokens
- should replace each token its value from the context
- should replace each missing value with the empty string
- should replace adjacent tokens with their respective values
- should replace every occurrance of each placeholder
To the right: the phones I have acquired since moving to New York City (I had a phone before I moved to NYC, but I left it in Canada):
Yes, that's a crazy number of phones, but I've come to terms with the fact that I will own way too many shiny things with screens.