Tuesday, December 31, 2013

Dear #lazyplus: which app should I use over feedly?

Dear #lazyplus: which app should I use over feedly? I mostly like feedly but the missing offline mode is not cool. Whatever app it is should be able to easily import my feeds.

Monday, December 30, 2013

Joe Duffy recently introduced the “C# for Systems Programming” project.

Joe Duffy recently introduced the “C# for Systems Programming” project. I spent most of the past four years working on this project, and eagerly awaiting the day that I could talk about it with the community. There have been some requests to talk about the error model, which happens to be one of the areas I was most involved with. So here we go! :)

Like the rest of the language, the error model was designed with the goal of being safe, fast, and easy. By safe, I mean that the language should prevent as many bugs as possible. By fast, I mean that the error model should impose the smallest possible burden on the runtime performance of programs that use it. By easy, I mean that the error model should help programmers be more productive, rather than getting in their way.

C++ is the textbook example of a language with an unsafe error model. There are plenty of error conditions that lead to undefined behavior. Rather than preventing bugs, C++ causes them.

C is an example of languages with a slow error model. In C, programs are littered with branches to check for and/or recover from error conditions. This makes the fast path slower than it needs to be, although good compilers are familiar with C idioms, and can often arrange code so that CPU branch prediction does the right thing.

Java is an example of a language with a complex error model. Programmers frequently resort to using ‘RuntimeException’ subclasses, so as to avoid defining methods that throw ten different exception types. I think it’s fair to say that most programmers feel like Java exceptions are more burdensome than helpful, and this is a big part of why C# doesn’t have checked exceptions at all.

In my opinion, the defining characteristic of our error model (and this extends somewhat beyond the language) is the distinction between recoverable and unrecoverable errors. This distinction underlies a whole host of useful properties that I will discuss throughout this post.

Unrecoverable errors are designed for conditions that can’t really be handled appropriately from within a software component. Generally speaking, if an unrecoverable error is raised, there is a bug in your code. Null dereferences, out-of-bounds array accesses, bad downcasts, out-of-memory, contract/assertion violations… the list goes on. In all of these cases, when the error hits, your component immediately terminates.

Recoverable errors are designed for conditions that your program should be resilient too. In our language, as with C#, recoverable errors are handled with exceptions. In general, recoverable errors originate from interaction between multiple components or with a user. You wouldn’t want your web browser to terminate if it can’t reach a website because your network cable is unplugged! Nor would you want your parser to crash when given invalid input.

It’s possible to convert between these two worlds. For example, test cases can convert recoverable errors into unrecoverable ones, if those errors are truly unexpected. More practically, if one component fails in an unrecoverable way, an external component can observe and/or recover from the failure of that component. (Another way to put it is that all failures are recoverable, but the granularity is much coarser grained than in traditional systems.)

Here are some of the things that this distinction buys us.

- By definition, unrecoverable failures cannot be observed. This frees programmers from the burden of handling or compensating for these failures. You can write your programs assuming that none of these error conditions will happen. You don’t need to handle out-of-memory. You don’t need to use tricks to avoid catching NullReferenceExceptions. It’s much the same as how GCs make programs simpler by avoiding the need to free memory.

- Because unrecoverable failures lead to immediate component termination, they’re very easy to debug (when compiled in debug mode). We can preserve the precise state of a component at the time that it terminates, down to the very last register. This makes unrecoverable failures very easy to debug and fix.

- An optimizing compiler can take advantage of the semantics of unrecoverable failures to generate better code. If a branch leads to an unconditional failure, it can assume that branch is not taken. It can also violate the invariants of a failing program left and right, so long as those violations cannot be observed by external components.

Unrecoverable errors are ubiquitous. We do not impose any restrictions on their use. In fact, because they are so useful for debugging, we positively encourage them.

In contrast, recoverable errors are tightly controlled. If a method might raise a recoverable error, it must be annotated as throwing (the keyword we use is “throws”). In fact, if you call a method that might raise a recoverable error, the call must be annotated to indicate that it might throw (the keyword we use is “try”).

When introducing this error model, we discovered something that we didn’t really anticipate. Some types of failures are ubiquitous. But in our system, all of those ubiquitous failures are unrecoverable. This means that recoverable failures -- i.e. errors that programmers need to handle -- simply don’t happen all that often. I would estimate that fewer than 10% of methods written in our language are “throws” methods. This means that over 90% of methods in our language cannot be observed to fail. Compared to traditional languages, where virtually any line of code can produce an observable failure, I think this is a remarkable result.

It might sound burdensome to have to annotate every throwing method and method call. Isn’t that even worse than Java’s already verbose system? But because so few methods are throwing, we’ve found that developers don’t mind the annotations. In fact, they come to really appreciate being able to tell, at a glance, which parts of their program might fail.

There’s another big way that we were able to make our language less verbose than Java. Because recoverable failures are so rare, most methods that can fail can only fail in a single way. Therefore, there’s no need for complex exception hierarchies. You can simply declare that your methods throws, without needing to list any exception types. If your methods throws, your caller will know why. We do allow you to be more specific about the exception types that your methods throw, but we’ve found that only a tiny portion of throwing methods (which are already a tiny fraction of all methods) use this functionality. The general case is not burdened by this, in the way that it is in Java.

Next, I want to shift gears and talk about the contract system. Methods may declare that they have preconditions and/or postconditions. Also, programmers may declare point-in-time assertions. Preconditions are checked before a method starts running; postconditions are checked after it finishes running (assuming that it does not terminate exceptionally). Preconditions and postconditions may also be discharged statically by an optimizing compiler; however, under no circumstances will a precondition or postcondition be bypassed.

Preconditions and postconditions are treated as part of a method signature, not as part of its implementation. They follow the usual C# visibility rules; any types or entities that are referred to by a contract predicate must be visible to any callers of the method. (Note that this rule permits some implementation flexibility. A compiler is free to generate contract checks in the callers, rather than in the callee. In certain circumstances, this can lead to faster code, or contract checks that are easier to optimize away.)

As described in the “Uniqueness and Reference Immutability” paper, our language has excellent support for understanding side effects at compile time. Most contract systems demand that contract predicates be free of side effects, but have no way of enforcing this property. We do. If a programmer tries to write a mutating predicate, they will get a compile-time error. When we first enabled this feature, we were shocked at the number of places where people wrote the equivalent of “Debug.Assert(WriteToDisk())”. So, practically speaking, this checking has been very valuable.

Also, because of the strength of the type system with respect to side effects, typical contracts in our language are different than they are in other languages. For example, a common pattern in some contract languages is “ensures old(x) == x”, i.e. an assertion that some value did not change during the execution of a method. In our language, those types of properties can be guaranteed statically. Instead, contracts are largely used to constrain inputs and outputs in ways that the type system is not rich enough to describe, such as by requiring that numbers are within a certain range, or that references are non-null.

To match programmer expectations, preconditions and postconditions are designed to satisfy the Liskov substitution principle. An override of a method cannot strengthen preconditions, and it cannot weaken postconditions. In practice, we found that it was simpler for overrides to just inherit the preconditions and postconditions of the method being overridden. Most languages don’t support contravariant inputs or covariant outputs/returns, even though it would be sound to allow it; in the same way, we found that programmers generally want their contracts to match, and that the benefits of variance weren’t worth the complexity cost.

Note that there are some subtleties with respect to interface methods. One method on a concrete class might satisfy multiple interface methods. However, what happens if those interface methods have different contracts? For postconditions, there is no problem -- we can simply check both sets. For preconditions, we could check the logical “or” of the preconditions, but that’s unlikely to be what anyone wants. Instead, we employ the following rule:

- When such a method is called through an interface, we check the contracts for that interface method.
- When such a method is called directly, we allow the user to specify what contracts should be checked.

This is not an entirely satisfying answer. A better approach might be to require -- and statically check -- that the methods all have the same contracts. However, it turns out to be very difficult to verify the equality of two contract predicates in a repeatable way. I’m happy to describe the challenges here if anyone is curious; maybe one of my readers will have a solution that we didn’t think of!

We played around with object invariants, but they are not currently supported by the language. As the joke goes, if you ask ten software engineers when invariants should be checked, you’ll get twelve different answers. Here are some approaches we considered:

- Invariants should be checked on every field write.
- Invariants should be checked on entry and exit to every method.
- Invariants should be checked on entry and exit to every method with a certain accessibility.
- Some combination of the above; e.g., invariants should have accessibility qualifiers, which designates how and when they’re checked.

Every one of these choices was surprising to at least half of the developers we queried. Therefore, by the principle of least surprise, we decided to omit the feature.

Whew! Let’s recap:

- Errors can be either unrecoverable or recoverable.
- Errors never lead to undefined behavior.
- Unrecoverable errors help programmers find and fix bugs.
- Recoverable errors help programs observe and recover from failures that are beyond their control.
- Unrecoverable errors are ubiquitous. Recoverable errors are tightly controlled and sparingly used.
- Preconditions, postconditions, and assertions help programmers specify their program behavior.
- The type system helps to avoid common pitfalls when writing contracts and assertions.
- Compilers can use the semantics of the error model to generate highly optimized code.
- Every feature is designed to be as reliable and as boring as possible.

As always, I eagerly await your questions and feedback. :)

Saturday, December 21, 2013

Anti-gentrification demonstrations in SF, anti-gentrification demonstrations in my home town.

Anti-gentrification demonstrations in SF, anti-gentrification demonstrations in my home town.
O_o is it Google's, Apple's and Twitter's fault in Hamburg as well?
Of course, the German demonstrators don't stop at just throwing in a single bus window :/

In much better news, I heard that the new grand coalition government in Germany wants to get rid of the real estate agent bullshit that makes the tenant pay the agent for essentially doing zero work – so at least for Hamburg there is some hope for some things to actually improve in terms of rental market.
21DEC2013 Rote Flora 15 11Uhr1of9
http://www.youtube.com/watch?v=rvQGQhxfDhc&feature=youtu.be

http://www.cryptofails.com/post/70546720222/telegrams-cryptanalysis-contest


http://www.cryptofails.com/post/70546720222/telegrams-cryptanalysis-contest
http://hannover.ccc.de/~nexus/whistle.en.html
CC Andreas Wenk

Google60 - Search Mad Men Style


http://www.masswerk.at/google60/

Excellent post about security in general and the telegraph app in particular.

Excellent post about security in general and the telegraph app in particular.
http://www.cryptofails.com/post/70546720222/telegrams-cryptanalysis-contest

Thursday, December 19, 2013

Dear V8 engineers:

Dear V8 engineers:
What are the current rules that enable V8 to lazily parse a function?
Concretely speaking, in:

var foo = {
  bar: function() { … super long body… }
};

Can I expect initial parsing the function to be very fast and actual parsing of the body to be delayed until foo.bar is called?

Monday, December 9, 2013

The next phase of the post-Snowden-revelations-world begins.

The next phase of the post-Snowden-revelations-world begins.

The undersigned companies believe that it is time for the world’s governments to address the practices and laws regulating government surveillance of individuals and access to their information.

While the undersigned companies understand that governments need to take action to protect their citizens’ safety and security, we strongly believe that current laws and practices need to be reformed.

Consistent with established global norms of free expression and privacy and with the goals of ensuring that government law enforcement and intelligence efforts are rule-bound, narrowly tailored, transparent, and subject to oversight, we hereby call on governments to endorse the following principles and enact reforms that would put these principles into action.

http://reformgovernmentsurveillance.com/
http://reformgovernmentsurveillance.com/

Sunday, December 8, 2013

Friday, November 29, 2013

The 1st annual thanksgiving grey hoodie selfie.


The 1st annual thanksgiving grey hoodie selfie.

Tuesday, November 26, 2013

Nice

Nice
http://david.li/waves/
Also David Li Somebody stole your domain!
http://david.li/waves/

#shutupandtakemymoney


#shutupandtakemymoney

Although I would have preferred to sleep until the alarm rings :/

Monday, November 25, 2013

Scrolling at 60fps

Scrolling at 60fps

For a while people recommended to use a "noHover" class during scrolling to avoids paints that kill 60fps. Turns out that doesn't actually work because adding the noHover class causes a full style recalc which will likely completely annihilate your frame rate.

Today I saw this article, which tries to use pointer events instead to avoid the problems http://www.thecssninja.com/javascript/pointer-events-60fps
… and, indeed, it achieves great frame rates. Unfortunately it is even more broken, since it will block all clicks on your site within half a second after you stop scrolling. That might be quiet a few clicks. Fortunately we have found a way to avoid that problem:

The key insight is to use a cover div on which you toggle pointer events (or you just move it in and out of view using translate during scrolling). Then, when the user clicks the coverDiv during scrolling you can use document.elementFromPoint to get the real target:

var doc = e.target.ownerDocument;
var copy = doc.createEvent('MouseEvents');
copy.initEvent(e.type, true, true);
var realTarget = doc.elementFromPoint(e.clientX, e.clientY);
realTarget.dispatchEvent(copy);

Unfortunately there is one problem with this approach:
It doesn't work across iframes – it could be made to work in same origin iframes, but it can't be made to work with cross origin iframes. So, i.e. a click on the +1 button or a like button on your site may still be "eaten"

… which is why people should not use such hacks and instead ask browser vendors, to simply not paint during scrolling if they think that painting during scrolling is bad – which incidentally I did do :)

Saturday, November 23, 2013

#programmingliterature


#programmingliterature  
via Mike MacCana

Monday, November 18, 2013

Client-side MVC


Client-side MVC

I think this is the best slide I've ever made :)


I think this is the best slide I've ever made :)
Will be in a internal presentation at Google on the browser's event model and how it relates to the new framework we're using.
For context, the guy is Sven Marquardt (https://www.google.com/search?q=Sven+Marquardt) bouncer of what is probably the most famous club in the world, the Berghain in Berlin, and also awesome artist.
I definitely remember standing in front of him when I went to Berghain for the first time and I literally thought I was somehow transported into From Dusk Til Dawn. Luckily he didn't call malte.stopPropagation() :)

CC Joe McCann

Thursday, November 14, 2013

Really hard to imagine there used to be a freeway on San Francisco's waterfront.

Really hard to imagine there used to be a freeway on San Francisco's waterfront.
http://lostsf.wordpress.com/2010/11/07/the-elephant-obstructing-beauty-the-embarcadero-freeway/

You know I get terrorism and that stuff – I don't have to agree but there is an argument for secrecy in that area.

You know I get terrorism and that stuff – I don't have to agree but there is an argument for secrecy in that area.
What I don't get is why treaties regarding copyright have to be negotiated in secret. I suppose all the negotiating parties have modern parliamentary democracies where the usual law making process does usually come with transparency; inter-country treaties – especially on something civil as copyright – should be no different.
https://action.eff.org/o/9042/p/dia/action3/common/public/?action_KEY=9357
https://action.eff.org/o/9042/p/dia/action3/common/public/?action_KEY=9357

Wednesday, November 6, 2013

Tuesday, November 5, 2013

Duck typing


Duck typing

Monday, November 4, 2013

The German anti-artist alliance GEMA wins Youtube music award for most popular music video in Germany.

The German anti-artist alliance GEMA wins Youtube music award for most popular music video in Germany.

#theonion   #sadness  

http://www.der-postillon.com/2013/11/youtube-music-awards-gema-hinweis.html

Friday, November 1, 2013

Wow. Very accessible and thorough overview of the state of the NSA revelations by The Guardian.

Wow. Very accessible and thorough overview of the state of the NSA revelations by The Guardian. 
http://www.theguardian.com/world/interactive/2013/nov/01/snowden-nsa-files-surveillance-revelations-decoded#section/1
h/t Chris Williams 
http://www.theguardian.com/world/interactive/2013/nov/01/snowden-nsa-files-surveillance-revelations-decoded#section/1

Wednesday, October 30, 2013

We're doing it

We're doing it
Friday March 7th 3pm - 7pm at Adobe, of course :)
http://dhtmlconf.com/
http://dhtmlconf.com/

H.264 is evil like radioactive cereal for cute baby kittens, but it does deserve a prettier website.


H.264 is evil like radioactive cereal for cute baby kittens, but it does deserve a prettier website. Thanks Cisco for open sourcing anyway, I guess.
http://www.openh264.org/

Tuesday, October 29, 2013

Monday, October 28, 2013

This just in. The web platform is now featuring a URL parser.

This just in. The web platform is now featuring a URL parser.
https://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#interface-url
That is, if you are running Chrome Dev Channel.
John Hjelmstad who may find this useful.
https://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#interface-url

This.

This.
http://wedontneeddst.com/


Why TF does this have a Flash style preload? Please don't do that!!!
http://wedontneeddst.com/

Sunday, October 27, 2013

This is what I found after googling for rhyme metre in rap music. Awesome research paper.

This is what I found after googling for rhyme metre in rap music. Awesome research paper.
http://www.mtosmt.org/issues/mto.09.15.5/mto.09.15.5.adams.html

Video stores are a complicated concept.

Video stores are a complicated concept. Just like this music playing thing where you can't press the back button to hear the song again.
https://www.youtube.com/watch?v=26eQ3QpNB6Q&feature=youtube_gdata_player

Today I turned 33; only 31 years until a nice round birthday.

Today I turned 33; only 31 years until a nice round birthday.
http://xkcd.com/1000/
http://xkcd.com/1000/

Wednesday, October 23, 2013

So, basically, most of the world's news organizations got to be racist for a few days and it turns out they were...

So, basically, most of the world's news organizations got to be racist for a few days and it turns out they were just being racist. I hope they learn something from this tragedy for the family.
"DNA tests have proved that a seven-year-old girl taken from a Roma family in Dublin on Monday is their daughter."
http://www.bbc.co.uk/news/world-europe-24645947
http://www.bbc.co.uk/news/world-europe-24645947

My friend Mikeal Rogers is trying out a new conference format.

My friend Mikeal Rogers is trying out a new conference format.
http://jsfest.com/ – San Francisco, March, 2014
Tickets are only $80
http://jsfest.com/

Tuesday, October 22, 2013

Wednesday, October 16, 2013

Absolutely loved this talk by Jan Krutisch at JSConf EU 2013 and I'm super bummed I didn't get to see it live: Jan...

Absolutely loved this talk by Jan Krutisch at JSConf EU 2013 and I'm super bummed I didn't get to see it live: Jan Krutisch: JavaScript Patterns For Contemporary Dance Music -- JSConf EU 2013 If anything check the beginning for the most badass opening of a conference talk ever.
This may be the first time with anything music-making-related that I'd say that this is something that I might actually be able to do myself. Personally I'm also suffering from the "flute playing in elementary school" trauma that Jan alludes to. Could be that that is a northern German thing.
Using procedural code to make music using stuff like mod operators to hit the right beats and Math.sin to bring in some variation together with realtime feedback definitely seems super accessible to me.
CC Lasse Wassermann who will likely enjoy this as well.
http://www.youtube.com/watch?v=X41IwSyU-BM

Sunday, October 13, 2013

Today my 6 months old son opened his changing table restraints.

Today my 6 months old son opened his changing table restraints. I won't be as proud of him again until he circumvents our internet parental control to watch porn (or whatever 14 year olds aren't supposed to do in the society of 2027).

Wow http://banksy.co.uk/

Wow http://banksy.co.uk/
via Guillermo Rauch 
http://banksy.co.uk/

#oneweirdtrick

#oneweirdtrick
http://gigaom.com/2013/10/13/this-simple-trick-turns-chrome-into-chrome-os-on-windows-8/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+OmMalik+(GigaOM:+Tech)

Sunday, October 6, 2013

Today I made my favorite German dish: Bratkartoffeln which just translates to "fried potatoes".


Today I made my favorite German dish: Bratkartoffeln which just translates to "fried potatoes". They are really hard to make and I'm far from perfect but I'm slowly discovering the secrets:
- start by frying fatty bacon, then remove the bacon pieces from the pan and fry the potatoes in the bacon fat. Later add them back (you take them out, so they don't burn in between).
- The smaller the potato pieces the more fat can stick to each piece (this is also why McDonalds fries have so many more calories than Burger King fries). You want them to be so greasy that after dinner the next thing you want to do it to eat a dish washer tab.

Thursday, October 3, 2013

"The tomato salad tastes awesome" – "Oh, those are actually small pieces of raw tuna" #momentsatthegooglecafe

Thursday, September 26, 2013

XKCD picking a fight? :)


XKCD picking a fight? :)
"Functional programming combines the flexibility and power of abstract mathematics with the intuitive clarity of abstract mathematics."
http://xkcd.com/1270/

How Many People Are In Space Right Now?


http://www.howmanypeopleareinspacerightnow.com/

Sunday, September 22, 2013

I wanted to do this for a while! Thought it was unfair to talk about making steak all the time and not invite people.

I wanted to do this for a while! Thought it was unfair to talk about making steak all the time and not invite people.
Bring a +1 and a non-meat dish and some drinks.
events/c6ql2lu97h6aogi7c6i94sq6go8?authkey=CNbb1MC26NTQ7QE

Saturday, September 21, 2013

The New Super Mario Busters 2 - A Ghostbusters 2 / Super Mario Bros. Mashup


http://www.youtube.com/watch?v=9JWCvjA6Wic

Opening of JSConf EU 2013 caught on video by Gilles Ruppert. Awesome energy in the room.

Opening of JSConf EU 2013 caught on video by Gilles Ruppert. Awesome energy in the room.
I always wanted to have these 1 cubic meter containers at a party and finally made it happen (aren't conferences really parties?). The 36 of them just stood in the room like ugly decoration and we told nobody why. It was only to the end of this clip that we turned them on for the first time. Seems like the effect worked wonderfully :)
JSConfEU 2013 Opening (1 minute)
http://www.youtube.com/watch?v=9WoQ4sJPGEw

Thursday, September 19, 2013

TIL about the lazyload and postpone attributes.

TIL about the lazyload and postpone attributes. Apparently this is in IE11 (to some degree CC Rey Bango) and Yandex is interested in implementing it for Blink.
Apparently the spec isn't quite ready yet, but nonetheless I'm super excited about exposing request priorities to the web platform
https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/ResourcePriorities/Overview.html
https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/ResourcePriorities/Overview.html

This may deserve a LOL.

This may deserve a LOL.
http://www.artfido.com/blog/nyc-artist-shows-us-what-famous-celebrities-would-look-like-as-normal-people/#.Ujc8a-Kstgk.facebook

Monday, September 16, 2013

Setting up the JSConf stage.


Setting up the JSConf stage.

Good bye Berlin. It was a blast.


Good bye Berlin. It was a blast.

One the of things one has to realize when running a large event (such as JSConf EU last weekend) is that things will...


One the of things one has to realize when running a large event (such as JSConf EU last weekend) is that things will go wrong all the time. It is impossible to change it – but the good thing if one manages those problems well, the audience never realizes things went wrong because they didn't know how it was supposed to be in the first place or you managed to make it go away really fast.
The attached picture is a great example of the latter case but also awesome science: A person was cleaning the glass table top and it suddenly disintegrated with a loud boom.
Does anyone have a good link for the underlying physics?

Sunday, September 15, 2013

My little family conference JSConf in Berlin has an awesome stage this year.


My little family conference JSConf in Berlin has an awesome stage this year. The screen is 10 meters by 6 meters with a 21k ansi lumen projector and the cubes on the side are so called IBC containers (1 cubic meter) illuminated by LEDs.
Also check out the intro video JSConf EU 2013 Intro

Wednesday, September 11, 2013

If you ever go to Germany do not let yourself distract with the Bavarian atrocities like Bratwurst, Schnitzel and...


If you ever go to Germany do not let yourself distract with the Bavarian atrocities like Bratwurst, Schnitzel and Sauerkraut. Döner is what you want. I'm on a Mission to eat at least 7 on the 7 days I'm in Germany. This was #2 in the decomposed version: The Döner Teller from an upscale (As far as Döner places go) venue in Kreuzberg.

Love the new #manualawesome (Is that what we call it?) image editing tools.


Love the new #manualawesome  (Is that what we call it?) image editing tools. This black & white plus lots of grain is a perfect expression of how my brain feels after the second night of jet laggy 1 hour of sleep.

Monday, September 9, 2013

My most important advice in case you ever want to run your own conference: Get tape in the color of your logo!


My most important advice in case you ever want to run your own conference: Get tape in the color of your logo!
Leaving for Berlin and  2013.jsconf.eu tonight and getting super excited!

Sunday, September 8, 2013

Today I'm providing this excellent entry point into the Wikipedia vortex free of charge. You're welcome!

Today I'm providing this excellent entry point into the Wikipedia vortex free of charge. You're welcome! 
http://en.wikipedia.org/wiki/Hydrofoil 
#TheFirstShotIsAlwaysFree  
http://en.wikipedia.org/wiki/Hydrofoil