Back in Poland?

Nah... Just kidding. I'm in Reading, UK again this week.

Today's "find a place for dinner" mission needed a little more thought given last night's disaster with Mexican cuisine. Because my hindsight is ever so powerful, I was able to assess my mistake simply by making the observation that the Mexican community is mostly non-existant here, at least from where I'm sitting. It should have been obvious that the chances of finding a great Mexican restaurant were slim.

Armed with that knowledge and the fact that I've run into more Polish people that I can count, I quickly came to the conclusion that Polish cuisine might be a good bet. Google helped out and suggested I try Gospoda. Gospoda sits in the middle of what looks to be a run-down Polish community, one that reminds me of Chicago's "Polska dzielnica". What I do remember about the Polish community in Chicago was the great food and hospitality. Would Gospoda up my record to .500?

Menu

My Polish is still good enough to read this menu, but after a discussion with a guy at the bar (half English, half Polish), I realized that they serve much more than what you see here.

Flaczki

Best Flaczki I've had in a long time, maybe ever.  Sorry Mom.

Dinner

The Schabowy Kotlet was also great, but I'm not ready to give it the top prize.

All-in-all, a much better effort tonight. Some may be offended by the cash-only service, but me being a Pole myself I know that there isn't one on the planet that likes to pay taxes.

Tomorrow is my last night I'll have to do Indian.  You can't come to the UK and not have Indian food, that much I know. .667 is a good record for three days work.

 

Hello Wokingham Berkshire

Wokingham
Or should I say 'Ello!!!

I'm staying in Wokingham, Berkshire, commuting to Reading everyday to work with a client.  I flew in yesterday and haven't really been funcitonal until now given the jetlag and such.  I finally feel about 70%. Another day and I'll be 100%.

Wokingham is really small, but I've got everything I need. It has very interesting architecture, where 17th century buildings don't look out of place. There are many pubs, one on just about every corner, sometimes two or three.  I'm not really a beer drinker, but I'll visit a pub or two before I leave to be sure.  I'm thankful that everything is in walking distance, because if I were to drive a car around here there is no way I'd survive.  Just walking down the street is dangerous. As I cross the street I look left when I should be looking right.  I'd better figure that out soon.

Off to Reading tomorrow.

 

Scala IDE Beta 2 Seems to Work!

In the last year or so I've been working to Scala. Initally when I came across Scala, there was an Eclipse plug-in that was supposed to be the development environment for Scala. Back then, I tried it and it worked, but only for very trivial cases. It was in its infancy. Surprisingly, as the language matured, the IDE seemed move in the wrong direction, progressively getting worse and worse. In fact, the last time I remember taking it for a spin, I couldn't even create an empty Scala project. Nothing worked. I since then have been working with emacs ENSIME and sbt. I've been satisfied with that environment, but I'm always wanting more.

A few (maybe a dozen or so) months have passed since I've looked at the Eclipse environment for Scala, so I figured I'd give it a try today.

I downloaded a fresh copy of Helios, installed the plugin and off I went.  Very surprisingly, it worked.  Well, the following file did.

It's a trivial example to be sure, but this much code never worked for me in any of the previous releases. This is fantastic news, because one of the things that will help with Scala adoption, and particularily in adoption from Java developers who are already on the JVM, is a development environment that the community is comfortable with.

Kudos to the Scala IDE team.

Here's the code from the demo if you want to try it yourself.

package euler

import scala.actors.Actor
import Actor._

object Euler011 extends Actor {

  type Matrix = Seq[Seq[Int]]
  case class CalculateMaxRequest(matrix: Matrix, from: Actor)
  case class CalculateMaxReply(matrix: Matrix, max: Int)

  var count = 0

  def execute() {
    val input = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 " +
                "08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 " +
                "62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 " +
                "13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 " +
                "37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 " +
                "28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 " +
                "84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 " +
                "54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 " +
                "63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 " +
                "78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 " +
                "35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 " + 
                "94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 " + 
                "55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 " + 
                "07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 " + 
                "47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 " + 
                "35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 " + 
                "57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 " + 
                "73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 " + 
                "36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 " + 
                "73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 " + 
                "01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 " + 
                "48"
    val intArray = input split " " map (_.toInt) toList
    val array2D = (intArray grouped 20 toList)
    val sliced = array2D.map(row => row.sliding(4, 1).toList).sliding(4, 1).toList
    val matrices: List[Matrix] = sliced flatMap (_.transpose)
    count = matrices.size
    println("We have " + count + " matrices to process, each using an actor")
    for (matrix <- matrices) {
      val calculator = new MaxProductCalculator
      calculator.start()
      calculator ! CalculateMaxRequest(matrix, this)
    }
  }

  var max = 0
  override def act() = loop {
    react {
      case CalculateMaxReply(matrix, maxProduct) =>
        max = if (maxProduct > max) maxProduct else max
        count -= 1
        if (count == 0) {
          println("Found it.  The answer is " + max)
          exit()
        }
    }
  }

  class MaxProductCalculator extends Actor {
    override def act() = loop {
      react {
        case CalculateMaxRequest(matrix, actor) =>
          actor ! CalculateMaxReply(matrix, calculateMax(matrix))
          exit()
      }
    }

    def calculateMax(matrix: Matrix) = {

      def calculateDiagonals(matrix: Matrix) = {
        var leftTotal = 1
        var rightTotal = 1
        val end = matrix.size - 1
        for (i <- 0 to end) {
          leftTotal = leftTotal * matrix(i)(i)
          rightTotal = rightTotal * matrix(end - i)(i)
        }
        (leftTotal, rightTotal)
      }

      val horizontal = matrix.map(_ product).max
      val vertical = matrix.transpose.map(_ product).max
      val (left, right) = calculateDiagonals(matrix)
      val products = horizontal :: vertical :: left :: right :: Nil
      products max
    }

  }

}

object Runner extends Application {
  Euler011.start
  Euler011.execute
}

Dear TELUS

March 21, 2010

TELUS Client Care
PO Box 7575
Vancouver, BC
V6B 8N9

To Whom it May Concern,

I wanted to write this letter to express my extreme frustration and disappointment with TELUS. I have been a long-time customer, 20 years of phone services plus High-Speed Business Internet services since the day they were introduced.

On Thursday March 17 2011, I decided to move from Bell's TV Satellite service to TELUS' Optik TV service. I spent 90 minutes on the phone with a very friendly customer services representative and completed the order, signing up for a three-year contract for Internet + Optic TV. As I was putting in the order, I cancelled my Business Internet service to make room for the new services.  The order was scheduled to be completed today, March 21st, at 8:00am.  The Internet service was turned off as scheduled, Monday morning around 9:00am.  We were told it'd probably be very close to 8:00am because we were the first appointment, so I booked the morning off from work to be home during the installation. 8:00am Monday morning arrived and nobody. We waited until 10:00am, then we called TELUS. The CSR told us to be patient and that it shouldn't be too long now. Two hours later, I called again. This time, the CSR decided he'd investigate by calling dispatch to find out what's going on. To his surprise and mine, the order was not sent to an installer. The CSR said that we had been given high priority and someone would be coming to install the service "within an hour or two". I called my office and booked the rest of the day off.  Two hours later, at 2:30 pm, the same CSR called to inform us that there had been a mistake with our order and nobody was able to help us today. The order would have to be rescheduled for the next available time, Friday March 25th.  Really?  Wow.

I took the day off work, had my working Internet turned off, and now I'm basically told to reschedule five days later. Obviously, that is not acceptable. The lack of competence that TELUS continues to show is remarkable. TELUS should thank its "lucky stars" that the CRTC is in place to protect TELUS' membership in a duopoly, essentially guaranteeing revenue. In a competitive market, I'm sure it wouldn't survive. It's unfortunate that there is no real competition and that my only other choice is Shaw, who I'm sure is similarly incompetent.

Maybe one day I'll be lucky enough to own a business where being incompetent is profitable.