Grand Central Station

Just a quick post on a picture that I took last Saturday at Grand Central Station in New York:

Grand Central

Grand Central

This is an HDR image based on 3 exposures, bracketed around F7.1. So the shortest exposure was 0.6 seconds and the longest 10 seconds. I applied for a photo pass, but didn’t get one [not sure why: possibly because I only did it a week in advance]. As you’re not allowed to use a tripod without one, I propped my camera up on my hat and gloves on the ledge of the balcony – surprisingly effective. This was the day of the Snowstorm Jonas, so the outside light coming through the windows was pretty muted. There’s still a little bit of chromatic aberration though, possibly because I took this at 16 mm [on my 16-35mm F2.8].

I did take some pictures during the snow, but it wasn’t the sort of weather to be messing around with tripods. This is what a Prius looks like under a couple of feet of snow [taken on my phone]:

Snowy Prius

Snowy Prius

 

Cambodia Trip: From Crickets to Kettlegate

So: our most recent long haul trip was split across 4 venues: Siem Reap [4 nights]; Phnom Penh [2 nights]; Koh Kong [3 nights]; Kep [2 nights], and then finally back to Phnom Penh for the duration.

This is the first of what I promise to keep to two geeky departures, starting with camera gear. I radically over-packed, and took every lens I have – you know, just in case you miss something. This brainwave was partly inspired by the fact that my old Crumpler bag, a veteran of 8 years, finally gave up the ghost and my replacement Lowe Pro [Flipside 400 AW] had the extra capacity. I’d assumed that when we were in a riverside resort in Koh Kong, there would be wildlife to see. Wrong: we were told by one local person that the reason there is a dearth of wildlife – and occasionally eerily so – is that people were so desperate for food after the Khmer Rouge regime that they trapped wild animals to the point of picking the land clean of them. I used my walkabout lens [24-105] a lot, my wide lens [16-35] a little, and my macro once on a point of principle. Everything else was ballast. My wife also had some new kit to try out: her Olympus OMD EM-II. A great camera, but I find it puzzling that manufacturers think it’s a sane piece of economics to ship a complicated piece of kit with a soft copy of the 400 page manual.

We flew into Siem Reap from Singapore. The preceding long haul schlep with Singapore Airlines was pretty comfortable as 13 hour flights go, although memorable principally for our ordering a glass of wine 10 minutes before breakfast was served. To be fair, we didn’t know, and given the way events were to unfurl it’s a shame we didn’t fill our boots with booze on the first three days anyway [more on that soon]. Rather bizarrely, we also saw Richard and Judy, former doyennes of daytime TV, at Changi when we were transiting.

Siem Reap itself is unremarkable. Its rapid recent expansion to accommodate the Angkor complex tourism is reflected in the slightly wild west feel to the place. There is a pretty decent covered market, which we spent quite a while pottering around until the mix of jet lag and intense humidity forced us out of the place, and backpackers are well catered for in an area called Pub Street. We stayed in a hotel called the Hanuman Alaya Boutique. The room was great and the staff were really friendly, although it has to be said that the sound proofing between the rooms was non existent. They also plonked us in a room right across from reception which we considered changing for about 5 seconds: we were exhausted for the first few days and could have slept propped up in the corner of a train station.

We started our temple-fest on the second day with visits to the Angkors brothers, Thom and Wat. Even with a reasonably early start, they were both very busy, so much so that it was pretty impactful on the experience. No-one has a god-given right to visit these places, but if you’re expecting a tranquil sunrise experience, think again.

Angkor Wat

Whose leg?

Whose leg?

Big heads

Big heads

Early the next morning, we hit one of the highlights of our trip: ironically, this was a tranquil sunrise experience: the almost-deserted Ta Prohm,  of Tomb Raider fame. I’ve limited myself to two geek outs, and here’s the second. I really couldn’t get over this place. Anyone who has ‘invested’ as much time in computer games as I have is going to have the same, completely inverted reaction: it looks just like a scene from a whole genre of platformers. Take your pick: Tomb Raider, Prince of Persia, Drake’s Fortune. Someone from those design teams went to Ta Prohm, and you see it, in essence, again and again. Despite the lack of levers to open doors and raise water levels, it is an utterly fabulous place, and worth the journey to Cambodia in its own right.

Ta Prohm

...again

…again

That afternoon, we went on a boat trip through a canal system and out to the edge of Tonle Sap lake. This was a bit of a misfire, which continued for the rest of the day. While the scenery was interesting, once we got out onto to the lake, we did an about face and went straight back to the car. Stopping off at the floating village we chugged past would have been good.

Dignity just about maintained

Dignity just about maintained

It turns out we were supposed to do precisely that, but our guide who, with the benefit of hindsight, was  occasionally a bit pants, didn’t want to waste our time with all of that nonsense. Equally, we were supposed to go an a foodie tour of a street market, which seemed to surprise our guide. In the end, he sort of cobbled it together and, while I think my wife was a little disappointed, I quite enjoyed it. Recounting this does sound as if we were a little bit spineless, but we were still badly jet lagged and struggling with the heat. Also, you tend to find with these gigs you’re halfway through them before you realise it’s not what you expected.

We managed to squeeze in a couple of culinary treats at Street 60 market. I tried a variety of deep fried bugs. Here’s the role call:

  • Grubs: disgusting.
  • Grasshoppers: plausible but they were pretty big [about 3 inches], which is quite off-putting. I distinctly recall not wanting to bite the thing in two, in case there was any trailing gubbins. The main downside of trying to munch it down in one go was that I unwittingly started the process with a hind leg hanging out of my mouth.
  • What were described as water beetles, which were a little over an inch long. These looked like diving beetles to me. The procedure was to break the carapace off before eating. Disgusting.
  • Crickets. These were actually quite tasty. Slightly sweet, very crunchy and with a sort of nutty / meaty favour. They go well with beer, which is drunk over ice, apparently.
mmm

mmm

We finished the day with a Cambodian barbecue. It’s cooked on a very distinctive dome shaped metal cooking implement [dome facing up the ways, so convex], encircled in what could best be described as a soup moat. This sits directly on a burner. You place a broth in the moat to boil seafood [prawns and squid] and mushrooms. At the top of the dome, you put a lump of pork fat on to melt, which – well, in theory, stops the strips of very lean beef and fatty bacon from sticking to the surface. Very tasty indeed.

Shock, horror: I woke up the next morning feeling like death warmed up, and had to skip the main activity for the day which was a cooking class. My wife went, while I remained bed bound – or more precisely, within striking distance of the loo – pretty much for the rest of the day.

That set a precedent for about the next 5 days, with either one of both of us not feeling well enough to hit all the points on the itinerary. I’m going to skip forward a few days to the Friday of the first week, by which time we’d finished up site-seeing in Siem Reap and had flown back to Phnom Penh. That flight, on the Thursday, was awful: I talked fairly seriously with my wife about seeing if we could drive it, but the prospect of 5 hours in the car as opposed to 35 minutes in the air was a hard sell. We were getting ready to head out site-seeing on the Friday morning, and my wife felt really unwell, and nearly fainted on the way back up to the room for something [probably an emergency loo break]. Our guide turned up a few minutes later, took one look at us, and took us to a medical facility where we ended up spending the day doing various tests.

The conclusion was that we were both diagnosed with amoebic dysentery. When the doctor told us, the first thing that popped into my mind was Spike Milligan’s epitaph: ‘I told you I was ill!’ While we were plumbed in to various drips and waiting test results, we thought about pulling the plug and heading home on the spot. When things go wrong you suddenly realise you are a very, very long way from home. Then the doctor came in, told us that we weren’t that sick and [implicitly] that we should put up and shut up :).

Because I succumbed a day earlier than my wife, I missed about 2 1/2 days of sight seeing. That included everything we’d originally planned on doing in Phnom Penh, including the S-21 prison, and the Killing Fields.

We were just about to drive to our next destination at this point in Koh Kong, which is a floating ‘glamping’ hotel on the side of a river called the Preat. Before I get on to that I’ll just gloss over some of the sites we saw around Siem Reap on our last day [the Wednesday of the first week]. We had a look at Banteay Srei and Banteay Samre. Well, I think we did. We actually went to 3 temple ruins that day, but I was feeling awful and had to sit out one in the car, so I’m pretty hazy on the details.

Banteay

Banteay

Banteay

A couple of final points to tick off. The first is what caused us to get ill. While on the Monday night I did eat half a bag of bugs sold by some geezer at the side of a road, who was shooing still-flying varieties off his wares before flogging them, the timing is probably wrong. The incubation period is 2-4 days, apparently, which moves the unwashed amoebic finger of suspicion back a day or two [I ate the bugs about 8 hours before I started getting sick]. Our most likely candidate was a cheap and cheerful restaurant that we ate in on the Saturday in downtown Siem Reap, where we shared a starter of fresh spring rolls filled with salad and prawns. They were pretty good at the time.

And while we were still in rude health, we had a fantastic meal on the Saturday night in Siem Reap at a spot called The Chanrey Tree.

We transferred over to the 4 Rivers Floating Lodge in Koh Kong, after about a 4 hour drive from Phnom Penh and 20 minute boat transfer. The setting is stunning, and they have done a really good job with the setup. Although you have your own platform to lower yourself into the water for a swim, my wife was at the peak of her symptoms, and the thoughts of what the repercussions might be from glugging down a few mouthfuls of Eau de Mekong Tributary left us both erring on the side of caution. I did as much kayaking as my wife’s frayed nerves could cope with. Just to explain, I have a profoundly bad sense of direction – so what could possibly go wrong on a river that opens into the Gulf of Thailand?

4 Rivers Lodge

The food at the place was occasionally awful. They had one day where there seemed to be a complete meltdown in the kitchen: very long delays for food which really wasn’t great when it did arrive . I know this sounds like a very first-world moan, but the Lodge comes with a 5 star price tag, which sets expectations accordingly. That said, it was typical of an experience that we repeated in 2 or 3 of the places we stayed: there were aspects of the service which weren’t great, but the people working there were so friendly and trying so hard to be helpful, actually breaking the fourth wall to complain about something felt like we’d be walking up to Bambi and saying ‘Well fella, shame about your Ma!’, and kicking him in the head.

We had plenty of opportunity for excursions at the Lodge, but as my wife was feeling awful, we skipped on everything except a firefly spotting river trip after sunset on the first evening. Oh. My. God. I never fail to be gobsmacked at how lacking in basic common sense people can be, and yet still survive into adulthood. Case in point: a guy acting as spotter pointed at a tree with lots of fireflies. So 4 people of the be-beaded / new age / let’s-wear-something-wispy type [or, more simply, ‘idiots’] all immediately transferred to the other side of the boat, nearly capsizing it, to take pictures with flashes that weren’t going to come out anyway. They might as well have been using the flash to take pictures of frigging Jupiter.

Next pitstop was Kep, described as a sleepy seaside town, with little beyond a market and the deserted remains of houses used by senior officers of the Khmer Rouge as holiday boltholes. Sleepy it may well be for 51 and a half weeks of the year, but our visit coincided with the annual Water Festival, a national holiday when a sizeable chunk of the population cuts and runs for the coast for 3 days. It was mobbed. We stayed at a place called the Veranda Natural Resort. The room was bizarre: it was a hangar fitted out in a weird 1970s decor. It must have been the guts of 25 feet square, too much space to make use of. The bed had these shin-high shelves either side [beyond bruising, God knows what they were for], the safe was on the floor, there was no veranda [despite the name], and no kettle. We were so non-plussed by the tour of the room that we actually thought that they were trying to pull a fast one and queried it – and asked about the kettle [note the pattern]. The staff insisted it was the right room [correct] and admitted that there were more rooms than kettles and that they’d try to do something for us, although they were fully booked.

The next day, when we came back to the room to find it made up, a door which we’d thought was locked and assumed was adjoining, was lying open to reveal a small, well equipped kitchen. We were briefly sheepish, shuffled our feet and, uhm, didn’t talk about kettles again.

After a couple of days of downtime, we were starting to feel better and getting antsy to do something. We emailed our guide [the splendid Thea] and arranged to leave Kep a day early and head back to Phnom Penh. The adapted [post-illness] itinerary had us doing the transfer from Kep and site seeing all during the morning before our flight. Taking the extra day meant we could do it at our leisure.

A few of final thoughts on Kep: the market was actually pretty interesting, processing lots of crab that people were buying straight out of the water. They formed the main ingredient in a fantastic meal we had on our last night in a spot called the Democrat [anachronistically decorated with pictures of various US Democratic politicians]. I also spent an afternoon walking around the ‘Kep National Park’, right next to the hotel. I only got a couple of fleeting glances at some birds but I think there would definitely be stuff to see there, given a bit more time than I could throw at it.

[we were wearing shorts] IMG_7756

If this shot, which I took in the park, had a name it would be ‘I’ve dragged my macro lens 6000 bloody miles so I’m going to find something to take a picture of with it’:

Have Macro, will travel...

And so our final day in Phnom Penh. While it’s not super developed, we both really enjoyed it: we had a nice walk through the wide boulevards around the palace. We had a drink [soft, due to meds unfortunately!] in the Foreign Correspondents’ Club, had a walk around one fairly boutique-ey little Street 240, and went for a pretty fancy meal on our last evening at a spot called Malis.

Water Festival Traffic

We booked back into the same hotel that we’d stayed in earlier in the holiday: La Rose Suites. It was stunning: art deco styling, beautifully appointed rooms and the staff were fantastic. As my wife remarked, could you imagine leaving a hotel in London and being handed a business card on the way out with the comment, ‘don’t worry, if you get lost, give us a call and we’ll come and find you’.

The last morning, before we went to the airport, we went to the prison in Phnom Penh [S-21], and then finally on to the Killing Fields. I was talking about this at work today and surprised myself by  getting quite upset about it. The prison is full of pretty grizzly images. The Killing Fields [actually one of an estimated 250 or so where people were killed. I hadn’t realised] is just strange, poignant, and very moving. There are a myriad of large bones poking through the ground on the path you follow: what I did at the start, and what I think is a natural reaction, is to disassociate what you’re seeing from the remains of someone who was murdered, and simply try to identify what bones they are. What pulled me up short was finding – ‘finding’ is the wrong word. You don’t have to seek them out – teeth. I’m far from an expert but they looked like a child’s pre-molars to me, based on the size, shape and absence of root. Whoever it was they were young.

The only thing I felt like taking a picture of...

That was it. Reading this back, the holiday sounds like a series of disasters interspersed by car and plane journeys, but we actually had a really fun time. I’m the last person to make sweeping generalisations, but what the hell, it’s nearly Christmas, so I’m going to treat myself to one. I enjoyed Vietnam, but there were aspects of it that pushed my buttons. It’s impossible not to make comparisons with its neighbour, and I’d sooner go back to Cambodia.

Building an Electronic Programme Guide [part 3]

This is my third and final write-up on the development of an electronic programme guide app. As of part 2, the main scrolling view with the programme details, scaled to length, are displayed.

Next up I wanted to have the ability to display programme details. This seemed like it was going to be pretty straightforward: when building the per-programme view, I included a button, which is transparent, and has the same dimensions as the view itself. The first problem is associating the programme details with the button itself. There is plenty of discussion on StackOverflow about how to do this in the least offensive way. I went with a category and then object association. This allowed me to set the GUID as a property for the button.

I rebuilt the app, hit the button and… entered into a fortnight of debugging an EXC_BAD_ACCESS error. I knew what the problem was: the ARC memory management was dereferencing the button object once it was set. I tried lots of different options, such as adding the buttons to an array, set with various properties, and passing the array back to the main view controller. Nothing worked until I did more reading around the property attributes, and ended up redefining the Interface Builder defaults for the scrolling contentView to:

@property (nonatomic, strong) IBOutlet UIView *contentView;

That ‘strong’ means that everything in the view is held in memory. It has to be said that the app is very heavy on memory – as a direct consequence of that view object retention. It routinely occupies 63Mb in my testing.

Next up is the popup that is rendered. So finding the programme itself is pretty easy, using an NSPredicate based on the GUID. What proved a bit harder to deal with is if the main view [the ‘contentView’ for the scrollView] is zoomed. As you have to add the popup view to the zoomed parent, the former is going to inherit the zoom setting. I couldn’t think of an elegant way around this so I worked around it in stages. First off, the popup sits on a blurred view of the current background:

// This is quite neat: make a CGRect of the currently visible part of the scrollview:
CGRect visibleRect = [scrollView convertRect:scrollView.bounds toView:contentView];
visualEffectView = [[UIVisualEffectView alloc] initWithFrame:visibleRect];
visualEffectView.effect = blurEffect;
visualEffectView.frame = contentView.bounds;
[contentView addSubview:visualEffectView];

Next, I register the scrollView offset in a property:

scrollOffSet = scrollView.contentOffset;

…set the zoomScale to 1, and disable the ability to zoom:

[scrollView setZoomScale:1.0];
scrollView.scrollEnabled = NO;
scrollView.maximumZoomScale = 1.0;
scrollView.minimumZoomScale = 1.0;

Placing the programme details subview is then relative to the currently visible rectangle:

float xForLittleView = visibleRect.origin.x + 30 ;
float yForLittleView = visibleRect.origin.y + 100;

CGRect progViewRect = CGRectMake(xForLittleView, yForLittleView, 350, 500);

I then have to undo the various view settings when the button to dismiss the view is touched:

[visualEffectView removeFromSuperview];
[littleView removeFromSuperview];
scrollView.scrollEnabled = YES;
scrollView.maximumZoomScale = 2.0;
scrollView.minimumZoomScale = 0.8;
[scrollView setZoomScale:zoomScale];
[scrollView setContentOffset:scrollOffSet];

It’s all a bit clunky, but it works. I imagine that this sort of interface plumbing actually happens quite a lot behind the scenes. That said, I may have missed a trick to do it in an easier way.

I’ll call out two more details that I wrestled with. The first is a search facility on the programme title. I wanted the NSPredicate to support as many search terms as the user entered. My initial idea was to split the UITextField input on spaces, and then loop through the resulting array, appending to a stringWithFormat, where all but the first element would be in the form:

AND (title CONTAINS[c][/c] %@)

Having experimented with this, it appears that predicateWithFormat has to have the actual string passed to it, as opposed to a variable containing the string. Which I have to say strikes me as a little odd. The functional upshot of this is that I couldn’t support a variable number of search terms. I support up to three, and construct a separate predicateWithFormat for each possibility.

One final problem that I couldn’t find a fix for was implementing a UITableView’s delegates in a class that I pass the view into as a parameter. I couldn’t find a way of getting the cellForRowAtIndexPath delegate method to be called. The conclusion I came to with this was that it was setting the delegate to self, when ‘self’ was the custom object, rather than the view. It was largely a cosmetic thing [I’ve noticed that for complicated apps, I have a tendency to pile way to much code into the main viewController] so it was easily solved.

Here’s what may be the final version of the app looks like, showing a search result in the popup view, and the to/from dates for the EPG coverage:

Search Results

Search Results

The other buttons that I haven’t talked about explicitly are an ability to switch between days, and initiate a download of EPG data – but which are pretty straightforward. What’s still either ugly or hasn’t been fully implemented is the download progress indicator, and also the what’s-on-now quick look on the Apple Watch, as I want to have a mess around with something completely unrelated to this app: the motion detection capability.

I did add a quick fix to ‘justify’ the right hand side of the ‘table’ of programmes. Formerly they were falling off the contentView. I simply check if the rightmost width of the cell is going to be greater than the width of the contentView. If so, I set it to be the same as the width.

So that’s it. I have a pretty serviceable EPG app, which I use myself over the ad-funded variant I had before, which I guess is a fair indicator of utility. Main lesson learned: not knowing what those property attributes meant tripped me up really badly!