2 weeks Ago

Greg Proops on San Francisco

Published by marco on in Fun

Transcribed from Clasps:

“The beach in San Francisco is not like Brian Wilson’s endless-fucking-summer beach.

“Beaches in southern California, people go to ‘em and they’re surfing and they’re having picnics.

“Or if you go to a beach in Hawaii, people are playing volleyball or – what do you call those boards that you stand on and you have a stick and you look like a douchebag? What are those? – paddleboards. Yeah. Those are awesome, right? And people are out there doing that and shit.

“Anyways, in San Francisco, the beaches in San Francisco are dirty, the fence is crumbling, the concrete abutment is falling apart, there’s parts that are taped off with police tape and shit, the sand is repulsive and it’s not a beach that you go to to hang out all day in the sun and take your clothes off … it’s a beach [where] you put stones in your pockets and grouchily walk out into the water and say goodbye to this world. No one goes to the beach with a beachball and goes like this [vogues with beachball]. No. You go with a joint and a six-pack. And you sit there. And then when dark comes, you set fire to you car.”

3 weeks Ago

Are you ready for ReSharper 9? Not for testing, you aren’t.

Published by marco on in Programming

We’ve been using ReSharper at Encodo since version 4. And we regularly use a ton of other software from JetBrains[1]—so we’re big fans.

How to Upgrade R#

As long-time users of ReSharper, we’ve become accustomed to the following pattern of adoption for new major versions:

EAP

  1. Read about cool new features and improvements on the JetBrains blog
  2. Check out the EAP builds page
  3. Wait for star ratings to get higher than 2 out of 5
  4. Install EAP of next major version
  5. Run into issues/problems that make testing EAP more trouble than it’s worth
  6. Re-install previous major version

RTM

  1. Major version goes RTM
  2. Install immediately; new features! Yay!
  3. Experience teething problems in x.0 version
  4. Go through hope/disappointment cycle for a couple of bug-fix versions (e.g. x.0.1, x.0.2)
  5. Install first minor-version release immediately; stability! Yay!

This process can take anywhere from several weeks to a couple of months. The reason we do it almost every time is that the newest version of ReSharper almost always has a few killer features. For example, version 8 had initial TypeScript support. Version 9 carries with it a slew of support improvements for Gulp, TypeScript and other web technologies.

Unfortunately, if you need to continue to use the test-runner with C#, you’re in for a bumpy ride.

History of the Test Runner

Any new major version of ReSharper can be judged by its test runner. The test runner seems to be rewritten from the ground-up in every major version. Until the test runner has settled down, we can’t really use that version of ReSharper for C# development.

The 6.x and 7.x versions were terrible at the NUnit TestCase and Values attributes. They were so bad that we actually converted tests back from using those attributes. While 6.x had trouble reliably compiling and executing those tests, 7.x was better at noticing that something had changed without forcing the user to manually rebuild everything.

Unfortunately, this new awareness in 7.x came at a cost: it slowed editing in larger NUnit fixtures down to a crawl, using a tremendous amount of memory and sending VS into a 1.6GB+ memory-churn that made you want to tear your hair out.

8.x fixed all of this and, by 8.2.x was a model of stability and usefulness, getting the hell out of the way and reliably compiling, displaying and running tests.

The 9.x Test Runner

And then along came 9.x, with a whole slew of sexy new features that just had to be installed. I tried the new features and they were good. They were fast. I was looking forward to using the snazzy new editor to create our own formatting template. ReSharper seemed to be using less memory, felt snappier, it was lovely.

And then I launched the test runner.

And then I uninstalled 9.x and reinstalled 8.x.

And then I needed the latest version of DotMemory and was forced to reinstall 9.x. So I tried the test runner again, which inspired this post.[2]

So what’s not to love about the test runner? It’s faster and seems much more asynchronous. However, it gets quite confused about which tests to run, how to handle test cases and how to handle abstract unit-test base classes.

Just like 6.x, ReSharper 9.x can’t seem to keep track of which assemblies need to be built based on changes made to the code and which test(s) the user would like to run.

 Abstract tests cannot be executed Here are the concrete test instances

To be fair, we have some abstract base classes in our unit fixtures. For example, we define all ORM query tests in multiple abstract test-fixtures and then create concrete descendants that run those tests for each of our supported databases. If I make a change to a common assembly and run the tests for PostgreSql, then I expect—at the very least—that the base assembly and the PostgreSql test assemblies will be rebuilt. 9.x isn’t so good at that yet, forcing you to “Rebuild All”—something that I’d no longer had to do with 8.2.x.

TestCases and the Unit Test Explorer

It’s the same with TestCases: whereas 8.x was able to reliably show changes and to make sure that the latest version was run, 9.x suffers from the same issue that 6.x and 7.x had: sometimes the test is shown as a single node without children and sometimes it’s shown with the wrong children. Running these tests results in a spinning cursor that never ends. You have to manually abort the test-run, rebuild all, reload the runner with the newly generated tests from the explorer and try again. This is a gigantic pain in the ass compared to 8.x, which just showed the right tests—if not in the runner, then at-least very reliably in the explorer.

 Huge scrollbar in the unit-test explorer The unit-test explorer likes to expand everything

And the explorer in 9.x! It’s a hyperactive, overly sensitive, eager-to-please puppy that reloads, refreshes, expands nodes and scrolls around—all seemingly with a mind of its own! Tests wink in and out of existence, groups expand seemingly at random, the scrollbar extends and extends and extends to accommodate all of the wonderful things that the unit-test explorer wants you to see—needs for you to see. Again, it’s possible that this is due to our abstract test fixtures, but this is new to 9.x. 8.2.x is perfectly capable of displaying our tests in a far less effusive and frankly hyperactive manner.

One last thing: output-formatting

Even the output formatting has changed in 9.x, expanding all CR/LF pairs from single-spacing to double-spacing. It’s not a deal-breaker, but it’s annoying: copying text is harder, reading stack traces is harder. How could no one have noticed this in testing?

 Output formatting is double-spaced

Conclusion

The install/uninstall process is painless and supports jumping back and forth between versions quite well, so I’ll keep trying new versions of 9.x until the test runner is as good as the one in 8.2.x is. For now, I’m back on 8.2.3. Stay tuned.


[1]

In no particular order, we have used or are using:

  • DotMemory
  • DotTrace
  • DotPeek
  • DotCover
  • TeamCity
  • PHPStorm
  • WebStorm
  • PyCharm
[2] Although I was unable to install DotMemory without upgrading to ReSharper 9.x, I was able to uninstall ReSharper 9.x afterwards and re-install ReSharper 8.x.

1 month Ago

The last offensive play by the Seahawks in Super Bowl XLIX

Published by marco on in Sports

The article The Corruption of Football by Joshua Sperber (CounterPunch) offers a far better analysis of the final offensive play by the Seahawks—the one that led to an interception—than I could ever have hoped to make.

Sperber starts off by dissecting Emmitt Smith and Dave Zirin’s supposition that foul play must have somehow been involved. That is, “[t]he theory of foul play of course presupposes that Carroll made not only the wrong call but a completely nonsensical one that could only be attributable to corruption […]”. The NFL is certainly not a shining beacon on the hill and it’s very easy to suppose that something shady was going on—especially when the alternative is to suppose that everyone in the Seahawks organization is a moron and that even a relative tyro like yours truly could have made a more sensible call—namely, to run the ball with Marshawn Lynch, as Seattle had done on nearly every other play that game.

Sperber makes a strong case that passing on that play seemed stupid only to people who weren’t actual students of the game.

“Seattle had three plays to score a touchdown and, with 26 seconds remaining in the game, lacked the time (with only one timeout) to run on all three plays. The only question was when the Seahawks would pass, and it was entirely correct to pass on second down, as a second down run, assuming it was unsuccessful (as was Lynch’s earlier 3rd and 1 run), would have dictated a third down pass forfeiting any element of surprise. By passing on second down against a Pats’ defense playing run, Seattle had an excellent opportunity to win the game. And the odds were astronomically high that the pass would have ended in either an incompletion (stopping the clock, as they needed to do) or the game-winning touchdown. In fact, this season it has been statistically riskier to run from the one-yard line than to pass.”

Ok, fine. But he could have chosen a better passing play, couldn’t he? That is a valid point, apparently. Here’s Sperber addressing the kind of passing play Seattle chose.

“Insofar as Carroll should be criticized, it is not that he elected to pass but that he should have called for a relatively safer pass, for instance either to the corner of the end zone or out of a bootleg. Nonetheless, the interception did not result from a coach’s decision but from a weak play on the ball by Seattle receiver Ricardo Lockette and a remarkable (and devastating if he had been wrong) gamble and play by Patriot rookie defender Malcolm Butler […]”

Seattle just got very, very unlucky whereas, at the same time, the Patriots got very, very lucky. Maybe Seattle had just used up all of their luck two plays previous where Kearse managed—against nearly all the laws of physics—to keep the ball bouncing only on himself and to finally catch it while lying on the ground.

If you want outrage, be outraged that “Seattle’s Jeremy Lane gruesomely broke his arm” and “Patriot receiver Julian Edelman stayed in the game after receiving a vicious and illegal (but not penalized) helmet-to-helmet hit”, neither one of which was even mentioned during the broadcast.

Instead, the NFL announcers conspicuously drew attention to the concussion that Seattle’s Cliff Avril sustained and for which he was removed from the game. Lane and Edelman’s injuries weren’t obvious, so they were quietly taken away, while Avril was blown across the field, his case could not be ignored and was instead taken as an example of the NFL’s focus on safety.

Sean Carroll on Physics and Death

Published by marco on in Science & Nature

This is a video by the always-interesting and funny Sean Carroll on physics (naturally) and on things that we know about life, death, entropy and the afterlife. It’s a really interesting talk that is very technically deep while still being more accessible than other, similar talks.

Emperor Has No Clothes Award Acceptance Speech by Sean Carroll (YouTube)

Near the beginning, he addresses heaven and the afterlife and the explanations that non-scientists have embraced.

What to make of the evidence for an afterlife?

Some ill-defined metaphysical substance, not subject to the known laws of physics, interacts with the atoms of our brains in ways that have thus far eluded every controlled experiment ever performed in the history of science,

–or–

People hallucinate when they are nearly dead.

He goes on to present entropic concepts, the heat-death of the universe and other deep-time themes that you may know from such hard-science authors as Greg Bear (The City at the End of Time), Gregory Benford (Deep Time) and Greg Egan (Diaspora).

Human Rights Watch is not credible

Published by marco on in Public Policy & Politics

HRW is clearly in the pocket of the U.S. government. From a recent tweet, which linked to the article Saudi Arabia: King’s Reform Agenda Unfulfilled (HRW),

“King Abdullah’s reign brought about marginal advances for women but failed to secure the fundamental rights of Saudi citizens to free expression, association, and assembly. […]”

 King Abdullah's Twipitaph from HRW

The verb employed here is not accurate. You cannot fail at something without actually trying it. In the main tweet, they do it again, characterizing a purely imaginary “reform agenda” as “unfulfilled”.

I suppose this tweet could be just misconstrued as misguided and uninformed, but isn’t HRW supposed to be on top of exactly the type of regime led by King Abdullah for 14 years? What exactly are they for, if not that?

Let’s take a look at another twipitaph, this one for Hugo Chavez and linking to the article Venezuela: Chávez’s Authoritarian Legacy (HRW)

“After enacting a new constitution with ample human rights protections in 1999 – and surviving a short-lived coup d’état in 2002 – Chávez and his followers moved to concentrate power. They seized control of the Supreme Court and undercut the ability of journalists, human rights defenders, and other Venezuelans to exercise fundamental rights.”

This is a pretty harsh characterization of a regime that made forward strides in many, much more social ways.

Oh right, HRW is a propaganda arm of the U.S. government. So they write hagiographies of official U.S. allies that ignore all manner of anti-democratic policies while denouncing official enemies of the U.S. that emphasize all manner of slanderous and largely unfounded accusations.

The point is to make sure the reader gets the right impression.

Saudi Arabia good; Venezuela bad?

Not exactly.

The lesson instead is what the U.S. says, goes.

And the U.S. wants any country that even think of having an anti-capitalist and pro-socialist component to think again.

And HRW is here to help in whatever way it can.