CNAME Flattening: RFC-Compliant CNAMEs at a Domain's Root - <AUTHOR> http://blog.cloudflare.com/introducing-cname-flattening-rfc-compliant-cnames-at-a-domains-root <comment><USER2> "The Inflexibility of DNS"

This problem would not exist if clients (eg. web browsers) supported SRV record lookups. The SRV fixes a missing abstraction by mapping names that users see (eg. foo.com) to actual server names (eg. webserv42.foo.com). Without SRV record lookups, web browsers must look up the bare domain, and expect to get an address, for this to work. CNAMEs were not designed to be used for this kind of situation; it's a square peg in a round hole.

This isn't due to the inflexibility of DNS; it's due to the inflexibility of clients that ignore newer advancements in the protocol.

Of course, this does mean that web hosts are stuck.

<comment><USER3> This idea that web browsers are silly and should just start using SRV records gets a lot of traction, and I would like it if it were true. Unfortunately, the SRV specification prohibits anyone from using SRV records for protocols where the protocol's definition does not specify the use of SRV records.

I.e. since HTTP does not specify the use of SRV records, web browsers are not allowed to use SRV lookups to locate HTTP servers.

The ones to blame are, instead, HTTP standards writers, which have not written a new HTTP standard taking advantage of the wonderful thing which SRV records are.

<comment><USER4> To be fair, the SRV spec, rfc2782, could have been written (or could be updated) to allow other, more flexible methods. Actually, that spec seems to contradict itself, saying first " _...for applications where the relevant protocol specification indicates that clients should use the SRV record..._ " but later on the same page " _The symbolic name of the desired service, as defined in Assigned Numbers [STD 2] or locally._ " At IANA [0] it appears that only three protocols actually use the assigned numbers infrastructure to handle this, but more _could_ , and in the absence of new RFCs clients could adopt a convention for determining "symbolic service names" for non-SRV-aware protocols.

[0] [http://www.iana.org/protocols](http://www.iana.org/protocols)

<comment><USER3> That's the wrong IANA link; you want this one:

[https://www.iana.org/assignments/service-names-port- numbers/...](https://www.iana.org/assignments/service-names-port- numbers/service-names-port-numbers.xhtml)

There are not three, but _thousands_ of protocol names registered.

<comment><USER5> You'll note http is specified there.

<comment><USER3> The list I linked to is a list of _all_ protocols known by IANA. Whether the use of SRV records is allowed by the individual standards is not recorded by IANA; one would have to search each individual standard to find out.

HTTP, notably, does _not_ specify the use of SRV records.

</comment></comment></comment></comment></comment></comment><comment><USER6> I wondered how this technically works, and the answer is over here: [https://support.cloudflare.com/hc/en- us/articles/200169056-C...](https://support.cloudflare.com/hc/en- us/articles/200169056-CNAME-Flattening-RFC-compliant-support-for-CNAME-at-the- root)

        CloudFlare uses CNAME Flattening to present a CNAME as an A record.

        The CloudFlare server generating the response follows the CNAME chain
        so that the response to the request from the client (for example, the
        browser) contains only non-CNAME data -- usually, an IP address. This
        effectively creates an A or an AAAA record. Without flattening,
        CloudFlare would serve the CNAME record directly to the recursor
        (the DNS resolver that translates the domain name to an IP address).

They just resolve the destination and serve it as an A record.

<comment><USER7> _> I wondered how this technically works, and the answer is over here:_

It was described in the article but perhaps not as clearly:

 _" What happens is that, if there's a CNAME at the root, rather than returning that record directly we recurse through the CNAME chain ourselves until we find an A Record. At that point, we return the IP address associated with the A Record."_

</comment></comment><comment><USER8> > _The problem stems from the fact that the DNS specification dates from 1987 > ... As a result, the DNS spec enshrined that the root record -- the naked > domain without any subdomain -- could not be a CNAME_

This isn't due to a lack of foresight in the spec, but people's misunderstanding of what a CNAME record actually means. A CNAME says that this name refers to the exact same thing as another name, including all subnames.

You _can_ CNAME the "bare" example.com to foo.example.org, but it would involve getting the .com nameservers serve that record _instead_ of NS records. By having NS and SOA records for example.com, you can no longer say that the two names are equivalent. Rather than having to define a merge algorithm (eg what happens if example.com and foo.example.org both have MX records?), the RFC simply rules out additional records on the alias.

<comment><USER9> Which makes me wonder what they're doing for record types other than A/AAAA. If you have "example.com. CNAME example.net." then which record does Cloudflare provide if both example.com and example.net each have an MX record, or a TXT record, etc.? Do you get the MX record from example.com if there is one and the MX record from example.net if there isn't?

<comment><USER10> They butchered it when allowed CNAME in the root breaking RFC and other things with it, so I would not be surprised that they don't do anything, but perhaps majority only cares about A/AAAA.

</comment></comment></comment><comment><USER11> This is a great example of marketing vs. technology. Cloudflare is amazingly good at marketing.

This technology is not new, revolutionary or different in any way from what a bunch of other providers do (including AWS, who they even mention in the blog post as what they are a solution for).

But yet they write it like they have solved a major problem in a new way.

Super props to the Cloudflare team! (I'm being sincere here, they did a great job with the marketing part of this product)

<comment><USER12> It is my understanding that the AWS solution only works when using Route53 with other AWS services like ELB and S3. We had a problem similar in the past and the solution was not pretty. I think they have solved the problem in a fashion that makes it easier for everyone to implement.

</comment></comment><comment><USER13>
      > if you signed up via a hosting partner then you may have gotten a
      > CNAME that...SNIP...will now resolve directly from your domain to an
      > IP address. This makes DNS resolution a bit faster and also better
      > obscures the fact that you're using CloudFlare.

To what end are we obscuring the use of cloudflare? And how useful is the "cloudflara obscura" if the responses are being served by the cloudflare machines listed in the NS records?

      dfc@fob-xray:~$ dig +short ns nasdaqprivatemarket.com
      jill.ns.cloudflare.com.
      igor.ns.cloudflare.com.
      dfc@fob-xray:~$ dig +short ns skyprep.com
      mark.ns.cloudflare.com.
      vera.ns.cloudflare.com.
      dfc@fob-xray:~$ dig +short ns econsultancy.com
      cody.ns.cloudflare.com.
      kay.ns.cloudflare.com.
      dfc@fob-xray:~$ dig +short ns jct.com
      ben.ns.cloudflare.com.
      iris.ns.cloudflare.com.

I am not trying to be nit picky. I am genuinely curious, DNS is one of those things I find very interesting.

<comment><USER7> _> "... better obscures ..."

In their defense, they didn't say it _completely* obscures the use of CloudFlare.

<comment><USER13> The real question is the first question: What is the point of obscuring? I probably should have skipped the bit about the effectiveness.

</comment></comment></comment><comment><USER14> It's disappointing that prior art isn't mentioned in the article. DNSMadeEasy's ANAME record does the same. I believe other providers like Route53 also call it an ALIAS record.

It's also good to know that GeoDNS resolution won't work as expected since the location of the resolver is going to be the DNS provider and not the client.

EDIT: Actually DNSMadeEasy claims that the resolution is done locally in each of their region so the issue is somewhat mitigated.

<comment><USER15> AWS Route 53 aliases aren't ANAME/ALIAS -- they appear to only let you point a record at an AWS address, not any arbitrary IP. (Correct me if I'm wrong.)

<comment><USER16> Disclaimer: I work on Route 53.

You can ALIAS to record sets within your own zone too, which can contain any arbitrary IP. This is useful when composing routing types (e.g. weighted plus latency). But we don't support ALIASing to record sets hosted on other DNS providers.

It is possible to ALIAS to a CloudFront distribution though, and that CloudFront distribution can in turn use any arbitrary name as its origin. It's also possible to ALIAS to an S3 bucket, which can be configured with a redirect to any name of your choice.

Remote DNS-level ALIAS is something that we're always considering, and we're interested in feedback. If we support it, it's unlikely our 100% availability SLA will apply, that there may be inter-operability issues with CDNs (though we recently announced our support for edns-client-subnet: [http://aws.typepad.com/aws/2014/04/improved-cloudfront- perfo...](http://aws.typepad.com/aws/2014/04/improved-cloudfront-performance- with-edns-client-subnet-support.html)) and incompatibilities with our future DNSSEC support.

</comment></comment></comment><comment><USER17> This is good news, I recently had to migrate off of CloudFlare because of issues with CNAME records on my root[0]. I might switch back as my site is static and could benefit from being behind CF.

[0] [http://joshstrange.com/why-its-a-bad-idea-to-put-a-cname- rec...](http://joshstrange.com/why-its-a-bad-idea-to-put-a-cname-record-on- your-root-domain/)

HN discussion: [https://news.ycombinator.com/item?id=7293512](https://news.ycombinator.com/item?id=7293512)

CF CEO commenting about CNAME flattening 28 days ago: [https://news.ycombinator.com/item?id=7295215](https://news.ycombinator.com/item?id=7295215)

</comment><comment><USER18> A comment on the article makes a good point that this seems to break resolution of IPs based on geography. Perhaps CloudFlare takes this into account with their caching mechanism, but this is unclear.

<comment><USER13> Google DNS and OpenDNS also cause some serious problems with geographic results. My go to example is www.netflix.com. I live in NY and Google DNS always points me to us-west instead of us-east.

      dfc@fob-xray:~$ host www.netflix.com # local unbound dns
      www.netflix.com is an alias for www.us-east-1.netflix.com.
      www.us-east-1.netflix.com is an alias for www.us-east-1.prodaa.netflix.com.
      www.us-east-1.prodaa.netflix.com has address 18.104.22.168
      www.us-east-1.prodaa.netflix.com has IPv6 address 2406:da00:ff00::6b14:f251

      dfc@fob-xray:~$ host www.netflix.com 184.108.40.206 # 184.108.40.206 Gives same response
      Using domain server:
      Name: 188.8.131.52
      Address: 22.214.171.124#53
      Aliases:

      www.netflix.com is an alias for www.us-west-2.netflix.com.
      www.us-west-2.netflix.com is an alias for www.us-west-2.prodaa.netflix.com.
      www.us-west-2.prodaa.netflix.com has address 184.108.40.206
      www.us-west-2.prodaa.netflix.com has IPv6 address 2620:108:700f::3270:5f36

<comment><USER19> Strange, 188.8.131.52 appears to be anycast and resolves to a east coast server for me, so I correctly get us-east-1 for netflix when I query it

FWIW, Google has proposed a solution to this problem: [http://tools.ietf.org/html/draft-vandergaast-edns-client- sub...](http://tools.ietf.org/html/draft-vandergaast-edns-client-subnet-01)

</comment></comment></comment><comment><USER20> > "The supply of IP addresses is limited"

s/IP/IPv4/

<comment><USER21> In practice today, IP basically is just IPv4. And that won't really change until IPv6 is supported by more than a comparatively small handful of networks and users.

<comment><USER20> True, but CloudFlare should be a company driving v6 forward, i.e. mentioning that the address problem only exists in v4.

Make people aware that v4 is history and present. Sure, we currently have to deal with it, but v6 and v4 should be treated equally. Esp. when talking about problems v6 solves.

<comment><USER22> They are driving ipv6 forward, they will transparently provide AAAA records for sites they host unless you opt out, and also support ipv6 only backends which they will provide ipv4 for.

</comment></comment></comment></comment><comment><USER23> This doesn't seem very... sane. It does work, but the explanation is wobbly at best. This appears to be a King Kong defense converted into a sales tactic.

In their theoretical problem, foo.com needs to be moved to somewhere else in a hurry to reduce an unpleasant load level. No problem--you simply change where foo.com points to. Normal people change the A record and call it a day. Why would you want to involve a CNAME in this? Perhaps if you needed to direct the query to some other server because it's managed by some other entity.

But wait... This requires the other entity to serve your DNS records. Not exactly a problem--even though it rather uncomfortably resembles a horizontal referral--so long as we exercise restraint, it only slows down the query a little bit. So now the lookup goes to the server your domain (foo.com) is hosted on, and needs to goes to the other server to get the foo.com.fancynametheycanmove.webprovider.com, except no... that won't really work because your DNS provider hosting foo.com would need to allow you to put CNAMEs at the root of the zone, and CNAMEs are singleton records.

The solution? Why it's to use webprovider.com to host your foo.com DNS as well! Then they can do this because their magic DNS server does all those other lookup steps for the querying client. But wait... if they're going to be hosting the foo.com zone, _why don 't they just change the A record in the first place?_ Why on /earth/ would it be useful to involve a bunch of CNAME jumps in that? For that matter, how is this even slightly usefully different than a _normal_ global traffic manager issuing different responses for DNS based on load and server pool configuration that for the love of all that is holy I hope they already know about if they're trying to run a "cloud provider".

The reason we don't have CNAMEs in the root of zones isn't "because the standards are old" it's because CNAMEs are supposed to be a one-off which should be used sparingly because they can be used to create never-ending chains of indirection which cause _serious problems_ for nameservers doing recursive resolution for their users. AOL used to regularly break nameservers all over the place with their casual use of endless loops of CNAME records.

<comment><USER24> Any number of companies these days don't provide you with an A record for the root ...Heroku, Amazon's ELB, etc etc etc ...the list goes on. We're solving a real problem considering how popular those services are these days. Perhaps it's not an issue for your setup, but for anyone using those names servers (among many others) it's a very real issue when you'd typically need to use a CNAME if you want to use the root vs. the antiquated WWW.

<comment><USER23> No, this completely _not_ about the presence or lack of a 'www'.

I'm saying it's pointless to even ramble on about CNAMEs when the conditions necessary for this to /even work/ mean it would be just as easy to return an abstracted A record that points to the right/active resource in the first place... Like GTMs generally do /already/. When the query comes into the GTM for loadbalancedsite.com, the response isn't fixed--the GTM has already been keeping track of which nodes are up and/or potentially closest to the requestor and it simply hands back an A record with a reasonably short TTL without anyone having to pat themselves on the back for being 'clever'.

</comment></comment></comment><comment><USER25> Other people had this problem to. Great to see that cloudflare solves such problems.

[http://translate.google.de/translate?sl=de&tl=en&js=y&prev=_...](http://translate.google.de/translate?sl=de&tl=en&js=y&prev=_t&hl=de&ie=UTF-8&u=http%3A%2F%2Fwww.eklenet.de%2Farchives%2FMailserver- ignorieren-MX-Eintraege%2C-wenn-ein-CNAME-gesetzt-ist-29.html&edit-text=)

</comment><comment><USER26> somewhat similar to dnsmadeeasy ANAME which has been going for years?

<comment><USER4> Do clients have to know how to deal with ANAMEs? If so, this seems more backwards-compatible.

<comment><USER26> no they just exist on the server, and are mapped by their service, no client change (otherwise it would be a bit pointless...)

</comment></comment></comment><comment><USER27> If you don't want to use CloudFlare as your DNS provider, you can use [https://www.rootredirect.com/](https://www.rootredirect.com/) to point your root domain to your ELB or other CNAME-based load balancer.

Disclosure: I own rootredirect.com.

</comment><comment><USER28> This is a great hack, but whoever explained C pointers to the copywriter did a bad job. Maybe they confused in-process pointers with kernel virtual memory management, but the operating system doesn't reach into a process's address space and move memory blocks around and rewrite pointers. A language runtime or a memory management library can do that, but it's a little more complicated than pointer-to-a-block-that-gets-moved. It's more like using indirect or doubly indirect pointers and stuff.

Grokking pointers is hard enough as is. I weep for all the wannabe systems programmers who will get confused by this otherwise very nice announcement.

</comment><comment><USER29> But why use CNAMEs in the first place when you don't have to?

or am I missing something?

<comment><USER12> When using a service like the AWS load balancer all you get back is an A record. You don't have a direct IP address to point to so you have to use a Cname

</comment></comment><comment><USER30> This is a really well written blog post. Great work cloudflare team.</comment>


Show HN: Hacker News Fantasy Betting League, 55Prophets - <AUTHOR> https://itunes.apple.com/us/app/id622424094

<comment><AUTHOR> We built 55Prophets to be a new entertainment app, somewhat similar to fantasy sports, but available for any topic. We're calling it a "fantasy betting" application where you can create and/or join leagues about any number of topics, such as sports, tv shows, politics, or technology. You start each league with 10,000 prophits (our fantasy currency) that you can use to make bets.

To help demonstrate the concept, we created a Hacker News Predictions League and added some questions. For example, you might make bets on questions like:

* Will Facebook announce any acquisition of a YC company before Aug 1?

* Which will be the next tech company to announce an IPO?

* Will San Francisco change its law to make AirBnB rentals explicitly legal by Aug 1?

You can also submit your own questions for other people to bet on.

You can download our app from the app store here: [https://itunes.apple.com/us/app/55prophets/id622424094?ls=1&...](https://itunes.apple.com/us/app/55prophets/id622424094?ls=1&mt=8)

Once you have it installed, you can point your mobile browser to <http://55prophets.com/deep_link/leagues/25/join> and it will open up the HN league in the app.

We'd love for you all to check it out and give us any feedback you have. Thanks!

</comment><comment><USER2> Do they have a web version? Many of us don't use iPhone..

<comment><USER3> Unfortunately, not yet, but we definitely hope to eventually. We just recently finished up the initial version of the iOS app, which was our first priority. Don't have the manpower yet to take it more than one step at a time :)

<comment><USER2> Is it legal? Which currencies/methods to deposit and withdraw? Bitcoin would be nice! There's a similar service at <http://bitbet.us/browse>.

<comment><USER3> Currently, everything is based on virtual currency, so it isn't really gambling. It's primarily meant to be about entertainment, not about gambling with real money.</comment></comment></comment></comment>


3 Powerful Observations on Raising VC in SV as a First-Time SV Founder - <AUTHOR> https://blog.trytomo.com/3-powerful-observations-on-raising-vc-in-silicon-valley-as-a-first-time-sv-founder-256ef3b174a5 <comment><AUTHOR> Love to hear your thoughts and experiences!</comment>


Aziz V. Trump: CrowdJustice Launches in the US - <AUTHOR> https://www.crowdjustice.org/blog/launching-in-the-us/ <comment><USER2> I've got a good feeling about this suit. The Supreme Court precedent on this is quite clear: permanent residents have a right to due process before they are excluded from entering the United States:

> This Court has long held that an alien seeking initial admission to the > United States requests a privilege and has no constitutional rights > regarding his application, for the power to admit or exclude aliens is a > sovereign prerogative. As we explained in Johnson v. Eisentrager, 339 U. S. > 763, 770 (1950), however, once an alien gains admission to our country and > begins to develop the ties that go with permanent residence, his > constitutional status changes accordingly. Our cases have frequently > suggested that a continuously present resident alien is entitled to a fair > hearing when threatened with deportation, and, although we have only rarely > held that the procedures provided by the executive were inadequate, we > developed the rule that a continuously present permanent resident alien has > a right to due process in such a situation.

 _Landon v. Plasencia_ , 459 U.S. 21, 33 (1982) (citations omitted).

That applies even after leaving and returning to the country:

> Any doubts that Chew recognized constitutional rights in the resident alien > returning from a brief trip abroad were dispelled by Rosenberg v. Fleuti, > where we described Chew as holding "that the returning resident alien is > entitled as a matter of due process to a hearing on the charges underlying > any attempt to exclude him." 374 U.S., at 460.

The wrongfulness of excluding permanent residents at the border without individualized process is so plain that the White House ultimately backed away from that interpretation of the order last night. But in the meantime, CBP violated the Constitutional rights of a number of green card holders.

Also, the facts are bad for the government: [https://www.crowdjustice.org/case/dullesdetainees](https://www.crowdjustice.org/case/dullesdetainees) ("We filed originally on the evening of January 28th, asking Judge Brinkema to issue a Temporary Restraining Order to stop deportations from Dulles and to ensure those detained were provided lawyers. That order was granted almost immediately, but Customs and Border Protection officers at Dulles refused to comply.").

It is very possible that even individual CBP officers will be held liable for those violations. Ordinarily, officers are protected by qualified immunity for actions taken under the color of law. But qualified immunity does not apply where the right was not "clearly established." Usually, that is a big hurdle in these sorts of lawsuits, but here there is squarely-applicable Supreme Court precedent.

<comment><USER3> Due process may still hold true (idk, inal, sounds about right) but there are a number of long-standing regulations governing re-entry. Let's not overlook the fact that there _are_ regulations in the US regarding re-entry for green card holders which sound very reasonable to me - especially when compared to immigration law in other countries.

* have abandoned or relinquished your status as a lawful permanent resident

* have been absent from the U.S. for a continuous period of over 180 days

* engaged in illegal activity after leaving the U.S.

* left the U.S. while in removal or extradition proceedings

* committed one of the crimes named in § 212(a)(2) of the I.N.A. (such as one crime of moral turpitude (CMT), a drug or trafficking crime, multiple crimes, prostitution, money laundering, security violations, and so on), unless later granted relief under Section 212(h) or 240A(a)...

* are attempting to enter at a time or place other than as designated by immigration officers.

* if you have any criminal violation on your record, you should not leave the U.S. without consulting with an experienced immigration attorney first.

* it's a crime for immigrants not to submit immediate notifications to U.S. Citizenship and Immigration Services (USCIS) of their changes of address.

The one that confuses me a bit is " _are attempting to enter at a time or place other than as designated by immigration officers_ ".

Now, the issue of allowing re-entry from a very limited list of countries that are hotbeds of religious terrorism when the vetting process is suspect. That's the focus here.

<comment><USER4> Here's a good article on the legal fine points:

[http://mimesislaw.com/fault-lines/trump-exceeds-his- plenary-...](http://mimesislaw.com/fault-lines/trump-exceeds-his-plenary- immigration-authority/15790)

<comment><USER2> That's an excellent article, thanks.

<comment><USER4> All I do is follow Popehat and read every link he warmly retweets. Seems to be working well. :)

</comment></comment></comment></comment></comment><comment><USER5> Any advantage to donating via crowdjustice.org instead of directly at LAJC's site? [https://www.justice4all.org](https://www.justice4all.org)

</comment><comment><USER6> CrowdJustice brings to mind angry mobs and vigilantism. No doubt a good cause but odd optics...

</comment><comment><USER7> just in general it would be interesting to see a collection of law suits that the billionaire president lost. probably not much of this public (and most processes might have ended with some kind of settlements)

</comment><comment><USER8> Yemen is not in Africa.

<comment><USER9> Hi, Julia, CrowdJustice CEO here - have edited for clarity.

Happy to answer any questions! And can pass on specific questions about the case to LAJC too.</comment></comment>


Ownership is Theft: Experiences Building an Embedded OS in Rust (2015) [pdf] - <AUTHOR> https://sing.stanford.edu/site/publications/levy-plos15-tock.pdf <comment><USER3> I'm an embedded Rust developer, and was a little confused by this paper until I noticed it was written in 2015. There are now solutions to a number of the problems they pose both at the language level and the library level:

Here's one in particular:

        In principal, this would allow us to statically allocate
        a buffer sized for each particular closure.

        Unfortunately, there is no size_of keyword in Rust,
        and static initialization cannot invoke functions—
        in this case the function size_of<T>() -> usize provided
        by the Rust core library.

This can be solved by using the lazy_static crate:

[https://github.com/rust-lang-nursery/lazy-static.rs](https://github.com/rust- lang-nursery/lazy-static.rs)

From the description in the README:

        Using this macro, it is possible to have statics that
        require code to be executed at runtime in order to be
        initialized.

Hey look, it's exactly what they need! It's also "no_std" compatible and can work just fine in a kernel-like context.

Take this paper with a grain of salt: it's a bit dated at this point, and there are solutions for a number of the problems posed.

<comment><USER4> Note that lazy-static does not "statically allocate a buffer" for all definitions of "statically allocate": lazy-static computes it's value on first use, and must use dynamic alloc space (ie: malloc/box)

Also, lazy-static has been around for a long time. Releases first occurred in 2014! I'd be surprised if it had not been considered.

<comment><USER3> Well, their original stated problem was just invoking size_of() at runtime, which lazy-static solves.

That said, Rust supports custom allocators now:

[https://doc.rust-lang.org/book/custom-allocators.html](https://doc.rust- lang.org/book/custom-allocators.html)

Write your own allocator and use Box.

<comment><USER5> I think you misunderstand what 'statically allocate' means. That means a size known at compile time, so that the space for that variable can be assigned in the memory map of the executable. Anything involving a 'custom allocator' is doing runtime memory allocation.

</comment></comment></comment></comment><comment><USER6> I feel that some of these issues occur due to an over-reliance on object- oriented practices, in particular 'encapsulation' of state into objects and triggering side-effects in callbacks. The usage of Rust brings painpoints to the fore, but I'll argue that the code is better done otherwise, independently of borrow checker.

For instance in the 'Callback through closures' example, there is code like:

        setTimeout(|| {
          activityLed.toggle();
        }, 2000);

First, in an embedded system, you cannot have multiple sources of truth. So its not just because of Rust ownership reasoning that `activityLed` cannot be shared between callbacks - if multiple events is to be considered for a given output they should be syncronized explicitly.

Instead I think the code should be more like the following, which models calculation of new state as a pure function. Side-effects are separated out by storing the desired effect as data, dedicated function for realizing. Time is just data, time-based logic without depending on hidden state.

This increases testability significantly. And it can be fully reasoned about by Rust, no conflicts with the borrow checker.

        # for each tick
        # calculate new state
        if (now >= state.toggleLedTime) {
          state.activityLed = !state.activityLed;
          state.toggleLedTime = now + 2000;
        }
        # and realize it
        updatePin(config.ledPin, state.activityLed);

<comment><USER7> the updatePin call, shouldn't be inside the if body?, or i'm missing something?

<comment><USER6> Because it sets what is stored in `state` it does not have to be. It _could_ be inside the if, but there two major reasons why it should not:

1) Testability. With it separated, we can write automated tests for our state calculation logic that are hardware independent, like 'normal' code. We just need to create `currentState` data, pass it into our `calculate()` function, and verify the new `state` returned. This can run both on our host-system, and on-target. We can even build simulations if we want, [http://www.jonnor.com/2017/03/host-based-simulation-for- embe...](http://www.jonnor.com/2017/03/host-based-simulation-for-embedded- systems/) (shameless plug).

2) Deterministic execution time. Many embedded systems have soft or hard real- time constraints, action must _always_ be performed within X microseconds. The more branches we have the harder it is to reason about whether we can keep this guarantee. By eliminating branches we are executing our 'worst case' always, giving it much more testing.

<comment><USER6> This assumes that the call to updatePin is idempotent (calling multiple times with same inputs does not do anything). An update of a I/O pin usually is, but other hardware (or APIs...) might not be.

In this case the realization of the state should still be in a separate function for testability. But it can take both `newState, currentState` as arguments, and then do:

        if (newState.thingon != currentState.thingon) {
          nonIdempotentUpdate(newState.thingon);
        }

If the device is latency critical, then the functions should be tested in all its permutations. You can use generative techniques like fuzzing to generate the `state` inputs.

<comment><USER8> componentDidUpdate for embedded systems?

</comment></comment></comment></comment></comment><comment><USER9> The whole execution contexts thing is sort of based off an assumption that the unique-&mut stuff has to do with thread safety. It doesn't. In fact, it had no bearing on thread safety in Rust for the many years before scoped threads were made possible by removing the 'static bound on Send.

[http://manishearth.github.io/blog/2015/05/17/the-problem- wit...](http://manishearth.github.io/blog/2015/05/17/the-problem-with-shared- mutability/) details why it's necessary.

The article does sort of mention this (and I have talked with the authors about this before) but IMO it underrepresents the importance of it.

One thing I did discuss with one of the authors at one point was swapping around the guarantees a bit -- allowing multiple &mut for cases not involving any form of runtime typing (enums and vectors are both cases of runtime typing -- in a vector the number of elements is runtime dependent). This would create a significantly different language and be incompatible with the vast majority of the ecosystem; however, it would still be safe, and has the potential to be useful. I even started hacking on a fork of the compiler that does this, but never got the chance to finish it. The idea in essence is not too hard to implement.

<comment><USER10> I get a 404 on that link.

<comment><USER9> Try now.

Octopress does this stupid thing where it generates post URIs based on the local timezone, and I published my last post whilst in Taipei so all the URLs broke. I need to figure out how to patch the code to fix this :|

</comment></comment></comment><comment><USER6> From the abstract:

"...embedded platforms are highly event-based, and Rust's memory safety mechanisms largely presume threads. In our experience developing an operating system for embedded systems in Rust, we have found that Rust's ownership model prevents otherwise safe resource sharing common in the embedded domain, conflicts with the reality of hardware resources, and hinders using closures for programming asynchronously..."

<comment><USER11> "... In addition, we draw from our experience to propose a new language extension to Rust that would enable it to provide better memory safety tools for event-driven platforms."

I believe this part also warrants mention. Not only did they share their findings as experts in the field, they also did the extra work of detailing improvements.

My take away is that its painful to make embedded systems in Rust now but its promising enough to make it worth the effort for the embedded community to help guide Rust's development.

<comment><USER12> Not my field but I don't understand the rationale behind choosing Rust. Given the performance and security concerns wouldn't Ada be the natural choice here? It may not be the most fashionable language but it seems I read about security problems with embedded and IoT devices on a daily basis. Why not choose a language designed for this problem?

<comment> vertex-four Ada isn't actually particularly safe in any reasonable sense - or rather, it provides enough escape hatches with little obvious marking that it's costly (in terms of time spent in code review) to ensure safety. Safety of existing Ada programs is primarily a result of the engineering practices that went into them, more than the language itself.

<comment><USER13> Nonsense. The designer looked at almost every spot where coding mistakes were leading to crashes or corruption. Then, made those safe-by-default wherever possible. They're described in modern form in the book below by Barnes. The effect was confirmed when defects dropped to around half what Mitre et al had been observing on C projects. There was only one case study I saw where Ada made no difference whose control group was C++. An anomaly that might have been same system reimplemented by same people, easily-correct system, or just both super-talented. So, it is a safe language with only exception being temporal safety w/out a GC. Rust delivers on that.

[http://www.adacore.com/uploads_gems/Ada_Safe_and_Secure_Book...](http://www.adacore.com/uploads_gems/Ada_Safe_and_Secure_Booklet.pdf)

Also, SPARK Ada can straight-up prove common errors don't exist in that code with an automated prover. Most engineers would spend quite a bit of time doing that with pencil-and-paper examination or human-driven provers:

[https://en.wikipedia.org/wiki/SPARK_(programming_language)](https://en.wikipedia.org/wiki/SPARK_\(programming_language\))

</comment></comment></comment></comment></comment><comment><USER14> Actually it is quite disappointing to read this paper.

The problems they mention and run into, have already been examined and dealt with in embedded Schemes, such as BIT, PICBIT and PICOBIT.

PICBIT [http://www.iro.umontreal.ca/~feeley/papers/FeeleyDubeSW03.pd...](http://www.iro.umontreal.ca/~feeley/papers/FeeleyDubeSW03.pdf) (see the GC section)

PICOBIT [http://users.eecs.northwestern.edu/~stamourv/papers/picobit....](http://users.eecs.northwestern.edu/~stamourv/papers/picobit.pdf) (not as relevant in that hard decisions/tradeoffs examined in predecessor PICBIT)

BIT (1995) [https://github.com/melvinzhang/bit- scheme](https://github.com/melvinzhang/bit-scheme)

<comment><USER13> I'm upvoting it only because the links might interest embedded developers. You're comment might be missing the point, though, where they're leveraging Rust for it's safety that requires no GC with its CPU or memory overhead. Non- determinism, too, unless using a real-time GC.

</comment></comment><comment><USER15> It seems that, for this very tiny OS, they're trying to do real work in interrupts. Most OSs do that, including UNIX/Linux. This has the problem that you can't block the interrupt while waiting for some thread to clear a lock.

QNX, though usually sends a message to a thread in a process when an interrupt comes in. The interrupt is processed slightly later. QNX has no interrupt lockouts longer than a few microseconds, because it's not doing much from interrupt code except sending messages. QNX also has a strict real-time priority system, so this doesn't hurt interrupt processing latency. So everything running in a thread uses the regular locking mechanisms, rather than depending on interrupt lockout.

Something like that might be a better fit to Rust's locking model. Either that, or the language has to know about interrupts, as in Modula I.

<comment><USER16> And that's the way to do it if you value latency rather than simply maximizing throughput. In real time situations latency is usually the more important factor.

One thing about those interrupt messages ('signals') in QNX parlance, they get processed before any other messages.

<comment><USER15> QNX has bounded latency. A standard test in the real time world is to hook a square wave generator up to an input that cause an interrupt, and run a program which gets activated by the interrupt and turns on an output. You watch the input and output signals on an oscilloscope. If there are any outliers, it's not real time.

(A QNX rep once told me they'd had problems with x86 boards that did things in "system management mode", stealing CPU cycles from the real work and messing up the response time. They had a quiet blacklist of unacceptable embedded boards.)

Linux has a long history of long interrupt lockouts. It's gotten better.[1] The phrase "95% real time" is used. Kernel drivers can lock out interrupts, so you have to watch for drivers that are not real-time qualified.

That's the trouble with doing real work in an interrupt handler. Usually you have to activate a thread after an interrupt anyway, so there's no overall performance gain in doing work at interrupt level.

[1] [http://events.linuxfoundation.org/sites/events/files/slides/...](http://events.linuxfoundation.org/sites/events/files/slides/Real- Time-Linux-Comparison-Bridgers-ELC2015.pdf)

<comment><USER16> > A QNX rep once told me they'd had problems with x86 boards that did things > in "system management mode", stealing CPU cycles from the real work and > messing up the response time. They had a quiet blacklist of unacceptable > embedded boards.

Ah, so that was the source of QNX informally suggesting we stick to certain brands of motherboards. I always wondered about that, since it _seemed_ to work ok. I guess they didn't want to alienate those vendors outright so they chose to informally promote the ones they were sure were good.

95% real time is funny. It's real time or don't bother. I worked with and for the QNX dealership in NL long ago.

<comment><USER15> Yes. Some boards emulated a hard drive using flash, with BIOS code stealing cycles from the main CPU with code in system management mode. This caused what looked like random CPU stalls at the OS level.

</comment></comment></comment></comment></comment><comment><USER17> This paper is pretty old at this point; today the project has evolved into [https://www.tockos.org/](https://www.tockos.org/)

The authors have been meaning to write a follow-up paper describing how they overcame the problems here, but haven't just quite yet. That slightly different design is what became Tock.

<comment><USER18> Was the "Execution contexts" feature outlined in the paper implemented?

<comment><USER17> The language was not changed; there were some misunderstandings about the finer points involved here, and their design was changed instead. So overall the idea was implemented, but in already-existing Rust rather than changing the language.

</comment></comment></comment><comment><USER19> > First, a linear sequence of asynchronous operations does not appear in a > linear piece of code. Instead, it is spread across a series of many small > functions.

Largely unrelated to Rust, but I want to point out that that is a powerful insight. It took me a while to internalize that. Once you see it, you'll understand why asynchronous, callback-based programming is usually inferior to other models (green threads, channel, lightweight processes and yes, threads). There are some exceptions for course, say when callback chains are short, like a web proxy, in the an embedded world, or a short demo code someone pasted on SO.

Another way to think about it is that "an sequence of callbacks forms an ad- hoc execution context, like a thread almost, except it is spread all through various functions, not very well specified, not in one single place".

Now perhaps in this style you can avoid CPU locks, but if callbacks are used for concurrent IO, you are back to the the need to protect global data from concurrent modifications. For example, if a callback chain starts, say cb1, cb2, cb3 but stops at cb2 while it was modifying some global data. Then another user request (or other such event) comes and it starts running cb1, cb2, cb3. It will possibly start modifying the same global data before it was in a consistent state. Next thing you know is you need something like a lock or semaphore. And sure enough such a thing exists, here is an example in Twisted: [http://twistedmatrix.com/documents/8.1.0/api/twisted.interne...](http://twistedmatrix.com/documents/8.1.0/api/twisted.internet.defer.DeferredSemaphore.html)

</comment><comment><USER20> _" Garbage collection, for example, introduces nondeterministic delays. Automatic memory allocators complicate common kernel optimizations such as slab allocation"_

No no no. Badly designed GC, for sure. But for any modern, thought-through GC this is not true.

And in any case, the Linux kernel uses ref-counting all over the place, which is the worst form of GC - slow, hard to debug, full of potential places to trip you up and cause a leak or a security bug, ...

<comment><USER21> Can you give me an example of a language with GC that doesn't introduce non- deterministic delays?

<comment><USER18> The Nim programming language's default GC[1] allows you to specify an upper bound delay time that it should not exceed.

1: [https://nim-lang.org/docs/gc.html#realtime-support](https://nim- lang.org/docs/gc.html#realtime-support)

<comment><USER21> According to the docs "These procs provide a 'best effort' realtime guarantee...Tests show that a 2ms max pause time will be met in almost all cases on modern CPUs"

So suitable for soft realtime like games, but not actually non-deterministic.

</comment></comment></comment></comment><comment><USER22> I've been curious to see how something like tokio[1] and futures[2] would work on a microcontroller. These both seem like good fits for event-based work.

[1]: [https://tokio.rs/](https://tokio.rs/)

[2]: [https://github.com/alexcrichton/futures- rs](https://github.com/alexcrichton/futures-rs)

<comment><USER23> There is some discussion on that here: [https://github.com/rust- embedded/rfcs/issues/23](https://github.com/rust-embedded/rfcs/issues/23)

</comment></comment><comment><USER24> This is a really good article, and I admire the authors for the work they put in. But I can't shake the feeling that what they want to accomplish could be done with a library rather than a language extension. Can anyone explain why their issues couldn't be resolved with a particularly clever mix of traits and macros?

<comment><USER17> It can, and it was. See my other comments in this thread.

</comment></comment><comment><USER25> "Our proposal for execution contexts in Rust is similar but considers execution threads, instead of object graphs, as the unit of isolation. Rust's low-level interface, safe memory management, and large community make it a particularly good fit for operating system development. If future language development can address the challenges we have demonstrated, Rust should be well positioned to support the next generation of correct embedded operating systems."

</comment><comment><USER26> Hmm the callback issue is exactly what I have run into while trying to wrap libsoundio. The user has to provide a read or write callback, but there's just no ergonomic way to actually do that nicely. At least I can't think of one. Maybe I just don't know the right combination of Arc, RefCell, etc.

</comment><comment><USER27> Is the title an allusion to Proudhon's succinct quote: "Property is theft!"?

<comment><USER28> _Proudhon 's_ quote? It's everyone's quote!

<comment><USER29> Well played. :)

</comment></comment></comment><comment><USER30> Mods, can we get a [2015] in the title? Both the OS described within and Rust itself have progressed significantly since this paper's original release. :)

EDIT: In particular: the people behind this recently began offering an IoT development board, "Hail", that runs Tock (the OS from the OP): [https://www.tockos.org/blog/2017/introducing- hail/](https://www.tockos.org/blog/2017/introducing-hail/) (discussion on /r/rust, with authors present: [https://www.reddit.com/r/rust/comments/61257c/introducing_ha...](https://www.reddit.com/r/rust/comments/61257c/introducing_hail_an_iot_development_board_that/) )

EDIT 2: I see that the title has been updated, thanks. :)

</comment><comment><USER31> Sorry, but you're rather sure of yourself when it's not clear whether you understand the constraints kernel writers are operating under. On many platforms simply enumerating valid RAM addresses where a heap may be constructed, let alone mapping them, is going to require considerable effort. It will inevitably be necessary to use memory somewhere off the stack to achieve that effort. Yet it will also be very difficult to write a custom allocator for that environment.

One choice, for example, would be to rely on the bootloader's handling of .bss sections to allocate a temporary 'heap'. Haven't tried it, but it probably gets the job done well enough to bootstrap a real dynamic allocator. The point is, though, you can't just say "throw lazy-static and a custom allocator at the problem". Note, for example, my proposed solution requires writing the custom allocator entirely outside of Rust, since it can't access any Rust statics. It also requires two implementations of the custom allocator - <USER2> for bootstrapping, and the other after bootstrapping. These will have to be dynamically selected between at runtime since (AFAIK) Rust is hardly going to support static switching between them. Then you have to consider interoperability between them.

Finally, not all kernel designs are prepared to do any kind of dynamic allocation at all: microkernels which hand all available physical memory to userspace for management there cannot dynamically allocate (except, perhaps, for O(1) of allocation in a small, _static_ heap - but at that point, what's the point?).

<comment><USER3> You are making the exact same strawman argument as the post I was responding to. I gave a specific example of how lazy-static solves a specific problem mentioned in the paper, and as far as I can see nothing you have said refutes that.

Clearly YMMV as to whether or not you can support a kmalloc()-style API. If you can, allocators will be great for you, and if not they are worthless.

I didn't mean to imply Rust has one-size-fits-all solutions to these problems. Rust provides a lot of solutions to various problems, and it's up to you as the Rust developer to figure out which ones are applicable to your problem at hand.

<comment><USER31> So what you're saying is, "if your use-case doesn't support kmalloc then shut up and go away, no statics for you!"? That's ridiculous, inappropriate, and generally unhelpful.

<comment><USER3> No, again that's a strawman. To explain it for the third time: I was addressing a specific complaint made in the paper and providing a solution. So far I have not seen any counterarguments against this specific solution to this specific problem.

Later I pointed out allocators are a great solution if you're able to use them. Again, if you can't, I'm afraid you're out of luck and I apologize this solution doesn't fit your needs.

You can, of course, still make statics, you just won't be able to use Box to conveniently allocate buffers in an automatic and type-safe way.

Also check out UnsafeCell if you want to assert as the developer on behalf of your program that you're accessing data in a memory safe way.

</comment></comment></comment></comment><comment><USER32> Property is theft!</comment>


Link Prediction in Knowledge Graph – Intuition Behind TransE - <AUTHOR> http://pyvandenbussche.info/2017/translating-embeddings-transe/ <comment><AUTHOR> In this post I present Translating Embeddings (TransE), a method for the prediction of missing relationships in knowledge graphs. I focus on presenting the intuition behind this method by the help of explanatory animations.</comment>


Ask HN: Bootstrapped founders, how do you conduct market research? - <AUTHOR> <comment><USER2> Just look for things people would throw money at. This can be anectodal or with data.

Things with a high CPC are good targets. Things that have a lot of users but are built terribly or neglected are also good.

</comment><comment><USER3> You talk to people. Friends or friends of friends. No formal research. Then you try to reach similar people and learn more on the go. It takes time but if you succeed you both know your customers and a way to reach them

</comment><comment><USER4>
      check, if the product/service solves my purpose

      quick search for users# like me (profession or personality)</comment>


Which Framework should we build our Web app on? - <AUTHOR>

My co-founder and I have a concept for a web service solution that we would like to begin developing.  We have not been involved in development or hands-on programming for about 5 years.    Our first step was to align with a developer I know from my corporate past.  Our young start-up is now faced with a difficult decision, which framework do we build our web service on?  We are intending on building content management system for a niche market.  Our developer is recommending drupal but I am worried about building on a GPL license as it would close the door on an acquisition.  Does HN have any suggestions?  I heard Ruby on Rails has scalability issues.  Microsoft is inherently more expensive.  I would love your thoughts and I appreciate your time. <comment><USER2> It sounds to me like you're worrying about problems you don't have. You're talking scalability and acquisition before you have a single line of code, let alone any users.

<comment><AUTHOR> Excellent point but isn't it prudent to take these factors into consideration before choosing a path? We don't want to dwell on the irrelevant but we would like to make a sound decision based on where we envision the product going. Do you have any words of wisdom for choosing a framework? Any recommendations?

<comment><USER2> Worrying about scalability and acquisition is not prudent at this stage, it's a waste of time IMO. Odds are that nobody will use your CMS.

That being said, my advice is to get something up and running now and fail fast. I'm not a 37signals fanboy, but I think you should read: <http://gettingreal.37signals.com/toc.php>

Your problem right now is to figure out what customers want. You need a product up and running. If you have a (good) HTML/CSS/JS/PHP developer on board who knows Drupal, he can probably get a Drupal+CCK prototype of your customized CMS up and running in a couple weeks, if not _days_. Who cares if Drupal isn't your long term solution? It just doesn't matter.

<comment><AUTHOR> I am a huge fan of the 37signals content. As opposed to failing fast, we are attempting to do it right quickly. Some failures are the nature of the business but we are doing are best to take all parameters into consideration when making decisions.

Thank you very much for your response. We truly appreciate the perspective and reminder that building products for and engaging customers is more important than the framework.

<comment><USER2> Glad I can help. Just to be clear about one point: I'm not suggesting that you intentionally fail. Rather, I'm just suggesting you lower the cost of failure.

</comment></comment></comment></comment></comment><comment><USER3> Oh and BTW, I've been on Rails for about a year and it's been excellent. Support from the Ruby community (blogs, presence on Stack Overflow) has been excellent, and so many of the gems/plugins have been so good. Not to mention, Ruby is a __fun __language to program in (at least for me).

</comment><comment><USER3> If you're not tech-minded, and the developer that you already have wants to use X, you should go with X. This increases the likelihood you have to spend big $$$ changing systems away from a GPL system so you can make even more $$$ from an acquisition.

<comment><AUTHOR> Thanks alot for the comments and RoR suggestion. I am not sure I totally understand the second piece of the post. Are you stating that we will have to spend $$$ now transitioning to a new framework or were you saying that we would have to transition to a new framework before the big sale?

<comment><USER3> the latter: transition to new framework before big sale.

<comment><AUTHOR> Thanks for the feedback everyone! Your wisdom is truly appreciated. We had a discussion with our developer and gave him the opportunity to choose except for GPL frameworks.</comment></comment></comment></comment>


The Massacre at Monkey Hill - <AUTHOR> https://priceonomics.com/the-massacre-at-monkey-hill/ <comment><USER2> "Born in South Africa, where baboons were regarded as a pest, he had spent his teenage years shooting the animals for bounty and dissecting their bodies for fun. This odd adolescent hobby notwithstanding,..."

Completely changed the tone of the article from describing a scientist that misjudged the data, to a psychopath that used the data to justify his warped sense of the world.

</comment><comment><USER3> [https://priceonomics.com/the-massacre-at-monkey- hill/](https://priceonomics.com/the-massacre-at-monkey-hill/)

"Taking a cue from German zookeepers, the London Zoological Society designed an outdoor enclosure called Monkey Hill in 1924"

I'm confused, why would someone call a primate enclosure 'Monkey Hill in 1924'? Unless they meant: In 1924 and taking a cue from German zookeepers, the London Zoological Society designed an outdoor enclosure called Monkey Hill. "Ape and monkey society is built on violence and sexual dominance" and young human society is based on football and cock-blocking.

<comment><USER4> indeed, football and cockblocking are pillars</comment></comment>


Instructable: How I discovered Instructables' email database had been stolen - <AUTHOR> http://www.instructables.com/id/How-I-discovered-Instructables-email-database-had/

<comment><USER2> I used to create separate email addresses like the author. Then I realized it's a waste of time. Some will get used for spam - but what's the use of knowing the address came from site X? Either the site operator sold the addresses, the site got hacked, or they were otherwise compromised.

Either way you need a good spam filtering setup.

Incidentally, I don't see why the author thinks a PDF exploit was used. There are quite a few other exploits.

<comment><USER3> _Some will get used for spam - but what's the use of knowing the address came from site X?_

A couple of years ago, I used TaxACT's website to file taxes. After I began receiving several spam messages a day using the unique email address I signed up with (I have read on third party websites that someone stole their email distribution lists), I realized I needed to find someone new to use to file taxes online, since it was clear that I could not trust TaxACT to protect my personal information.</comment></comment>


Hackathons as a Service - <AUTHOR> http://123shipit.blogspot.com/2013/02/hello-world.html

<comment><USER2> Serial hackathoner here. This misses the point of hackathons. A hackathon lets you dedicate time to building hacks you think are cool, learning new things, and meeting and making friends with other hackers. This is just programming quickly with little sleep.

Moreover, hackathoning as a lifestyle is a poor decision- you can only take so much pizza and caffeine every single weekend.

<comment><AUTHOR> Thanks for your insight from a serial hackatoner perspective. It`s true, there is no way we can make "commercial hackatons" day after day, that would miss the point. But to make from time to time fast MVP with client, it doesnt sound so bad IMO

<comment><USER3> That's not a hackathon; it's poor planning and obscene expectations. Once again a word has been coopted and loss all meaning by corporate interests.

</comment></comment></comment><comment><USER4> My experience with Hackathons has often been that in the days immediately following the hackathon you have to invest a LOT of time to clean up the mess.

Everything that was done post-haste, not documented, not version controlled, so on and so on.

To make the project usable, manageable going forward, requires plenty of effort to now redo or improve upon the messy state left from the hackathon.

Certainly I can agree that there are some gains made from the hackathon environment that are lost working in a normal business environment and pace (lets say iterating faster on product while its in infant stages). However, I'm not sure that many of the principles apply after that, when having to continue maintaining and collaborating on a more mature product.

<comment><AUTHOR> The hard truth is that 9 of 10 applications (commercial or start-ups) are just mistakes. So whats the point of delivering well documented and beautiful designed app that nobody use? That is why i think that hackatons in order to deliver good enough product and test your hypotesis does make sense. If it`s a market fit, then i agree - lets clean up the mess and develop it in normal way

<comment><USER4> Certainly agree on high failure rate. Unfortunately for most, that is not achieved in the span of a hackathon, or using the style of hackathon development, which cannot be sustained.

It often takes months to reach product-market fit... and if you have a team of people working on an app together, and you are having customers sign up and use your app, you need it to look beautiful, and your ability to collaborate with colleagues over those months needs to be functional.

</comment></comment></comment><comment><USER5> I think thats a very interesting idea. If the market is there, it could be very good for both hackers and the company.

<comment><AUTHOR> Thanks for insight! I hope that somebody somehow will test this hypotesis :)

</comment></comment><comment><USER6> Thanks again to the OpenBSD team for creating something that inspires everyone else! ( hackathons )</comment>


Crate is to sharing files, what Dropbox is to storing them. - <AUTHOR> http://thestartupfoundry.com/2011/02/10/crate-is-to-sharing-files-what-dropbox-is-to-storing-them/

<comment><USER2> Something slightly screwy in the workflow for me.

I drag and drop and upload (in Kubuntu, from Dolphin to FF4.0b12pre) without a problem but then I'm presented with this page, <http://lts.cr/i/7a78c5>.

The page shows me an address and a sign up form ... but aren't I trying to share the file, isn't that the _raison d'etre_? I was expecting the main action then to be emailing, tweeting, facebooking or otherwise sending the link on to whomever I'm sharing the file with. It even says underneath 1-visit, 2-upload, 3-share ... not 3-login. Just seems odd and disruptive to the flow.

Apart from that I'm mighty impressed, despite initially thinking (as others have) it has nothing over Dropbox I think that it is something that I'll use. Not sure if I'd pay for it though ...

</comment><comment><USER3> I work with some nontechnical users who occasionally need help getting too- big-for-email files to somebody. Thinking of them, I tried this out.

Dragged a 280MB file onto the big orange box, and got a Mac-style indeterminate progress indicator. OK. Make coffee, check the weather, type this post up to here, and still all I see is the same spinning indeterminate progress indicator. No actual indication of progress, what is happening, or when/if it will be done.

I'm pretty sure those users I mentioned would by now have, a.) created another browser window and tried again, b.) clicked on the spinning wheel a few times to try to elicit some kind of feedback from the app, and then c.) closed the windows and given up.

</comment><comment><USER4> I really don't understand any advantages of Crate over Dropbox, which also has file sharing through URLs and folder sharing.

I asked this question the last time Crate was on HN and got a vague response.

<comment><USER4> I actually can see the use-case of _asking_ someone for a large file. Having them download Dropbox is a pain, but something that is one-time use would be ideal.

<comment><USER5> Yeah, that's definitely one of the things we're going to be adding to the service.

Person 1: "Hey, send me that file, use this: _url_ " Person 2: "Oh!" _drag and drop_

All updated in real time (so you could potentially link a whole group of friends something and see them all drop in files for an event or some-such). Perhaps a school trip or something to that extent.

</comment></comment></comment><comment><USER6> Can't you also share files with a url through Dropbox? And get 50GB for $9.99/month?

<comment><USER7> Dropbox temporarily stops the downloads if a link becomes too "popular".

I assume Crate would not do that.

<comment><USER8> I kinda doubt that, for $9/month, Crate wants to act as a CDN for your hugely popular feature-length HD film.

I don't see anything about limits in their TOS, but the strong implication is that the service is for sharing with friends, and I don't see any guarantees either. Dropbox is pretty lenient about bandwidth, and I imagine Crate is too.

</comment></comment></comment><comment><USER9> It's fascinating to me that they're profitable already. I can't imagine it being easy to get users to pay for file sharing.

<comment><USER10> I suspect there are more people with largish files they need to send someone, and there's never really been a free/easy way to do that.

<comment><USER11> Yep, you nailed it. A lot of our paid users use Crate as a replacement for FTP to send large files around the office or their friends.

</comment></comment></comment><comment><USER12> This is a great little site. I know that you are saying that the files will last forever but is there a imgur like deletion that the owner of the file can delete the file after they no longer want it up?

<comment><USER5> Yup, there is.

</comment></comment><comment><USER13> I went to their site at <http://letscrate.com> ... I don't like that I have to drag a file from my folder to the browser to upload it ... doesn't seem like normal workflow .. but it could catch on I guess.

Would be really cool if I just clicked and my OS file selector opened up for me to select a file ...

</comment><comment><USER14> How does this differ from <http://getcloudapp.com/>? Genuinely curious.

<comment><USER15> This is my first time seeing either, but I can tell that if I sent someone a link to Crate and and a link to CloudApp and told them to share a file with me, I'd have to spend a few minutes explaining how Cloud works, how to install it etc. With Crate pretty much anyone should be able to figure it out without hand holding.

</comment></comment><comment><USER16> Cool. Did you do any kind customer development? Analyze any problems, etc?

</comment><comment><USER13> Do you get a custom url with a paid account?</comment>


Delorean – datetime conversions in Python - <AUTHOR> http://delorean.readthedocs.org/en/latest/index.html <comment><USER2> I'm not a fan of the name (or the entire syntax really, but the non- descriptive name is the worst bit). python is generally pretty self- documenting, but calling 'Delorean' to convert times is totally obscure. using datetime and pytz.timezone is a few too many steps at times, but at least it is readable. This is just magic.

`return utc.localize(datetime.utcnow()).astimezone(est)` is maybe a little annoying to type out, but it's obvious what it does. `return Delorean(est)` doesn't make any sense at all.

<comment><USER3> > but calling 'Delorean' to convert times is totally obscure

Unlike calling 'pickle' to serialize...

<comment><USER4> Although now we make and eat pickled vegetables because we like the taste, pickling was originally developed in order to enable vegetables to store longer. Calling a serializer "pickle" isn't unreasonable.

<comment><USER5> It's not unreasonable, but it's still obscure. Calling a time utility Delorean isn't unreasonable, despite also being obscure.

</comment></comment></comment></comment><comment><USER6> Every time I do something involving with timezones in Python I find myself having to figure out the API again from scratch - it just doesn't fit in my brain. Having read the docs for this it appears to cover everything I ever want to do in a much more obvious way. Thanks very much!

<comment><USER7> Thank you!

</comment></comment><comment><USER8> Slightly off topic: does anybody know why timezones are not firmly isolated within the presentation layer (more specifically, in the string formatting functions) rather than being part of the datetime object? (datetime in Python, DateTime in C#).

In other words why this sentence could be wrong: _Timezones are a presentation-layer problem!_ <http://news.ycombinator.com/item?id=5083321>

<comment><USER9> It's because timezones can be part of business logic. For example if you want to start trading at 9 London time, whether London is GMT or GMT+1 at the moment.

<comment><USER10> Or put more simply -- recurring events :)

</comment></comment></comment><comment><USER11> This is very similar to Arrow. Take a look at the arrow project: <https://github.com/crsmithdev/arrow> You guys did almost the same sort of thing. Maybe I'm wrong and you've enhanced the functionality set even more but it could be very well worth your efforts to combine forces.

<comment><USER12> oh, thanks. that looks very good. simpler than this one, i think (at least, i can understand arrow immediately from that page).

</comment></comment><comment><USER13> I like all of the functionality it provides. Your project is similar in idea to my own, <https://github.com/sbuss/wtftz>.

I also have a half-working website at <http://wtftz.com> for easy timezone conversions

</comment><comment><USER14> [after reading the very first code example]

There is a better way to write it:

      from datetime import datetime
      from pytz import timezone, utc

      EST = "US/Eastern"

      now = datetime.utcnow().replace(tzinfo=utc) # now in UTC
      return now.astimezone(timezone(EST)) # now in EST

There is no DST transitions in UTC so localize()/normalize() are unnecessary here.

The code still is not pretty and error-prone in general but there are already libraries that wrap it into easy to use interface e.g., times, arrow. They are better target to compare itself against.

</comment><comment><USER15> I believe someone is working on writing up a more detailed post about this, but I'll throw the sanetime library out there. It's pretty slick and even has built in Django support.

<https://github.com/HubSpot/sanetime> <https://sanetime.readthedocs.org/en/latest/>

<comment><USER7> what do you mean builtin django support? its just times.

<comment><USER15> You can use SaneTimeField to store sanetime objects in your Django app.

<comment><USER7> -.-

</comment></comment></comment></comment><comment><USER16> From the docs looks like a quality solution to a real faff in python. Kudos.

<comment><USER7> Thanks! I have few of the improvement suggested by others in issues.

So I welcome any feedback people may have :)

</comment></comment><comment><USER9> The combination of datetime, date until and pytz is annoying, but its not clear from your example whether you're better. Why not try using you example to show many of the nuanced issues with computers representing time (that many don't know about) and how your API helps.

For example: is it 5:30 in Phoenix, Arizona?

Sorry, can't look in detail at your API - on my phone.

</comment><comment><USER17> First, I'd like to encourage the author - please keep iterating and keep the functionality coming. There is certainly a lot that can be done to make working with dates easier.

That said, this is just not very impressive right now. The dateutil module is much more useful: <http://labix.org/python-dateutil>

<comment><USER7> I appreciate the encouragement. What would be much more useful is some actual feedback. :)

I have baked in some of the niceties of dateutil into Delorean, such as rrule and parse.

<comment><USER18> Please don't make it too much like dateutil; using that module requires too much doc study. I usually end up just building a few functions from scratch that do precisely what I want with datetime alone.

<comment><USER7> Which is the reason I abstracted many of the more complex features into easier, less complex and easily groked API.

</comment></comment></comment></comment><comment><USER19> I think times is a much more idiomatic and simple library to understand and use. Has one simple principle. Store all date as utc and convert to/from user's timezone only at the time of presentation.

<https://github.com/nvie/times/>

</comment><comment><USER20> Arrow looks really good for this sort of thing, it's based on momentjs, which is very very nice.

[Edit add link] <https://github.com/crsmithdev/arrow>

</comment><comment><USER21> This is great! I recently worked on a feature that had to do some funny time zone conversions - having this lib definitely would have helped.

</comment><comment><USER22> Not to be confused with this Delorean: <https://github.com/bebanjo/delorean>

</comment><comment><USER23> vote up if you came here wanting to know what the BTTF connection was</comment>


A better way to read HN on the iPad - Happy Thanksgiving From Onswipe - <AUTHOR> http://blog.onswipe.com/news/a-better-way-to-read-hacker-news-on-the-ipad-happy-thanksgiving-from-onswipe

<comment><USER2> It took me > 60 seconds to figure out how to turn the page. My feedback is this: I hate it. When I'm using my ipad, every blog that has onswipe enabled leaves me frustrated. The UX feels slow, choppy, and unnecessary.

I don't understand what problem is trying to be solved. Browsing web pages on the ipad is a pleasant experience. I can scroll with my finger. With onswipe, I can no longer scroll with my finger. Why was that a problem? that's not a problem. It doesn't need solving. Please tell us explicitly the value you are trying to add, because I cannot see it.

<comment><USER3> _"The UX feels slow, choppy, and unnecessary."_

While I am glad people are experimenting with new UI metaphors and reading experiences, every product I've seen from Onswipe has been, as you say, slow and choppy. And not just a little slow or a little choppy, I'm talking unusably so, often to the point where it crashes my browser.

I get the impression they aren't testing this stuff at all on the first generation iPad.

</comment></comment><comment><USER4> I have to say that I'm a little bit baffled by things like this or recent updates to Flipboard that introduce "features" that I can't imagine anybody asking for.

Why show articles in a grid instead of a list? A list makes the hierarchy clear, and is easy to parse.

Why have articles text on multiple columns instead of one? Multiple columns are a left-over from print newspaper who had to use them for practical reasons. I personally find them less readable than a single column (except maybe for very short articles).

Why prevent me from zooming in or out to adjust the font size? This is actually one of the coolest thing about browsing the web on the iPad, and you break it.

I think it's a shame, because I really like some of the other features, like the preloading of the content, and stripping away the ads and distractions.

<comment><USER5> Hey, so this was just one of many layouts and it seemed to be the "cleanest". There's a straight up list layout that we have that would have worked as well, which I almost went with.

We've thought about font resizing, but do you think that's needed when everything is "in focus". ie- no need to zoom in away from ads or to see the rest of the article.

<comment><USER6> Yes, it's needed. People with less than perfect vision appreciate being able to zoom in on small text to make it more readable.

A few other things that are needed (and work in the non-Onswipe version of pages):

1\. Rotating the iPad to landscapes houldn't trigger a choppy relayout that takes five seconds. It should show the exact same content as in portrait mode, zoomed to fill the width of the screen. Users can then decide whether to zoom out and show more content, or stay zoomed in to take advantage of the increased horizontal resolution.

2\. The back button should work. Pro tip: If I tap the back button 20 times, and nothing happens until the 20th time, the back button is broken.

</comment></comment></comment><comment><USER7> Have you guys not noticed that every time someone posts a link to an onswiped article, half the comments are about how shitty onswipe is?

<comment><USER5> You either love it or hate it. The tech crowd seems to be more towards a hate level due to certain expectations. Overall, >95% of readers using an Onswipe experience opt to keep it the default.

<comment><USER8> I've not encountered a single blog owner at Wordpress.com who opted to keep it once they found out it had been forced on them and checked out the user experience it provides.

As far as certain expectations, I admit to that: I expect to read small blogs without my browser crashing and without jerky scrolling. If you think those expectations are only of the tech crowd, you are delusional.

If 95% of the readers on Wordpress.com opt to keep it that is most likely due to the fact that you don't provide an opt out. All you provide is the ability to temporarily turn it off for that one session, and that is at the bottom of the page, so if you can reach that without a crashing there is not much point to turn it off. Also, if you are in landscape mode the opt out is often not clickable because your software scrolls back to move it off the page, and clicks are not recognizes during that auto scrolling. Put an to out at the top, with an option to permanently opt out, and let's see if that claimed 95% holds up.

Months ago, you said several times that you would be fixing these problems with the Wordpress.com version of OnSwipe. We are still waiting.

<comment><USER9> > I expect to read small blogs without my browser crashing and without jerky > scrolling. If you think those expectations are only of the tech crowd, you > are delusional.

This should be the mobile web developers creed, their Hippocratic Oath.

</comment></comment></comment></comment><comment><USER10> If you look at my previous comments, you'll see that in all my years at HN have never written a negative rant on a product. Till today.

Onswipe is so bad. It makes me want to throw my iPad against the wall. Even the "Show original article " link takes 30 taps to work. Arrrgh. Slowest, nastiest, crashing thing I have to encounter. It hurts that magazines like slate use it because it means I can't read the article.

One interesting thing is that swipe will increase pageviews but lowers the experience because people like me will repeatedly load the page after it crashes and hit the "view original version".

Just writing this post has got me in hives. Please just destroy this software, it would make the world a better place.

</comment><comment><USER11> Onswipe is horrible. Either use native scrolling or web-scrolling. Don't fake it. It doesn't work, fails in the most crappy ways. Just stop.

</comment><comment><USER12> Takes over 20 seconds to load, then crashes safari on a first gen iPad. I loathe on swipe. It is not the way I want to experience the web.

</comment><comment><USER9> You know, just because I own a first generation iPad doesn't make me not worth supporting. I hate this attitude that devs are taking. Oh, I'm serving content to an iPad, well then let me grind the hell out of that CPU/GPU with this overly intensive site.

I like HN on an iPad as it is. It DOESN'T serve me some choppy, overly animated version of the site. HN loads on an iPad 1 in a split second. I have the Safari Reader feature if I don't like the article layout. I'll never use this. Furthermore, it's projects like this that give web apps a bad name in general.

</comment><comment><USER13> I've sent so many complaints to onswipe-powered sites I've lost count. The iPad lets me view HN perfectly well - not only can it render large sections of text just fine but it can zoom and pan intuitively enough for even my mum to feel at home. And if I really tire of the cruft there's always the built-in Reader function.

Tl;dr Dislike.

<comment><USER9> On top of all that, it's FAST. There is nothing futuristic or complimentary about waiting a full five seconds for an action or animation to complete.

</comment></comment><comment><USER14> Visually it looks very interesting (similar to flipboard) however it sounds like from the ultra negative comments that the experience may not be ideal. Changing it to a scrolling version of the same layout opposed to swiping could probably alleviate a lot of the pain felt here.

I'm interested in what technology you used to scrape the articles from Hacker News? There is no official api so it would be interesting to hear the process you used, Thanks!

<comment><USER15> <http://www.hnsearch.com/api>

</comment></comment><comment><USER16> Why would you forbid other clients than iPad to browse into your site? I think you should warn the user that it may not be optimized but let the user in. It's irritating, the web should be open.

<comment><USER5> The tech is made specifically for touch enabled devices right now. Other tablets don't have market share, so we're focusing on the sector of the market that's 97% of readers. Once we nail that, we'll spend time on another tablet browser when it gains market share.

<comment><USER17> Yeah, that seems perfectly reasonable for me. But once again, you could just state that _it may break_ and is not made for your browser, but there is no reason to not show the content, and more drastically, even forbid entrance.

</comment></comment></comment><comment><USER5> Direct link when on iPad: <http://onswipe.com/hackernews>

Let me pre-empty where I know there's going to be some dislike as a lot of the HN crowd just wants the normal non-swipeable web. Most of that frustration comes from a > year old version powering Wordpress.com (which we're upgrading). Would love to hear feedback on _this_ specific version of our platform. Most articles in this version should render well, except those that aren't really news or blog content (ie- direct link to webpages).

<comment><USER18> Is there a way to see comments or is this articles only?

Thanks!

<comment><USER5> Just articles since this is focused more on reading, sorry :/. That kind of sucks though, since the big value of HN happens to be the discussion. In reality this is meant to be: you want to read all the awesome content making the HN front page without clutter and in one place for your iPad, go to this url.

</comment></comment></comment><comment><USER19> onswipe - the iPad's Flash

</comment><comment><USER8> I sent feedback to Apple, noting how some sights use user agents to recognize iPads and give a degraded experience, even though one of the points of iPad is that it provides the real web, and asking for some kind of user agent setting option so we could tell those sites we are on a desktop.

<comment><USER20> I'm sure there is a custom web browser in the app store, which is a webkit but with a variable user agent.

<comment><USER13> I haven't had chance to double check this, but my experience has been they find ways around user agent. Eg spoofing desktop Safari in iCab didn't help. YMMV.

<comment><USER21> I use a proxy to strip out this crapware. Even worse are the sites which advertise their ipad/iphone app aggressively.

</comment></comment></comment></comment><comment><USER22> From my experience landing on sites that have Onswipe turned on, a fair number of these sites don't have content that look good with the Onswipe theme. The reason seems that when the owner of the site is preparing the content, they use the normal theme to see how everything looks, and it probably looks good. They can't ensure that everything looks nice with Onswipe on because most people are probably preparing content on a non touch screen browser and aren't taking the time to use an iPad to verify the content they just posted looks nice with Onswipe.

Is there a way for content owners to know how things will look on an iPad without one?

</comment><comment><USER23> The main problem with most sites on the iPad and even more so on the iPhone/other phones is that with font is too small and the text doesn't use the full browser width. (Zooming means you have to constantly swipe left and right). [FYI I have perfect eyesight AFAIK]

I don't want a new UI, just people to fix their sites for the above.

</comment><comment><USER24> I have found Flipboard + the @newsyc20 Twitter feed to be an ideal way to read Hacker News.

</comment><comment><USER25> <http://ihackernews.com> is a bit nicer

</comment><comment><USER26> On my iPad 1 when I rotate to change the display orientation it crashes Safari. Even going landscape to landscape crashes Safari.

</comment><comment><USER27> I think the Hacker News HD application is great.

</comment><comment><USER28> There are times when you believe in your product and know what's best for the customer. This shouldn't be one of those times. Don't ship junk.</comment>


Java Leads Programming Language Popularity, by books sold? - <AUTHOR> http://blog.jelastic.com/2012/05/29/java-leads-programming-language-popularity/ <comment><USER2> There's probably a property of programming languages that connotes to the ratio of books needed to code written which Java scores highly in. That and the huge number of people forced to learn Java and buy books on it.

At the opposite end would be languages that are easier to work with, have incredibly good online documentation, and/or for which a book industry has not yet materialized.

<comment><USER3> It's hard to find any language that has better online documentation than Java.

Java as a language is dominant in universities (for debatable reasons) and in average-boring-industry shops and at high-scale shops, both for very good reasons. There's going to be a lot of books sold because of that.

<comment><USER4> > It's hard to find any language that has better online documentation than > Java.

I don't see how <http://docs.oracle.com/javase/6/docs/api/> this is better documentation than <http://docs.python.org/library/random.html> or <http://perldoc.perl.org/perlretut.html>

Java docs are mostly a dump of class hierarchies with some comments documenting the functions. Python and Perl docs are written as user guides compared to Java api dumps.

<comment><USER5> In addition to the API documentation, there's the "Java Learning Trail", which is a set of step-by-step tutorials with numerous screenshots and tons of example code:

<http://docs.oracle.com/javase/tutorial/java/index.html>

Additionally, if you actually page through the Java API documentation, many packages contain overviews describing rationale and how everything fits together- hardly a "dump of class hierarchies with some comments". For example,

[http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/doc- fi...](http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/doc- files/FocusSpec.html)

Personally I think having _both_ a tutorial and browsable API documentation is preferable to dealing with unstructured prose for everything.

<comment><USER4> > In addition to the API documentation, there's the "Java Learning Trail", > which is a set of step-by-step tutorials with numerous screenshots and tons > of example code:

If you are already a programmer, you will be able to complete this tutorial in less than 2 hours <http://docs.python.org/tutorial/>, and can start programming Python. Want to learn Perl? <http://www.perltutorial.org/>. This _tutorial_ thing isn't something that is unique to java, and personally, I find the Perl and Python versions higher quality compared to Java's tutorial.

> Personally I think having both a tutorial and browsable API documentation is > preferable to dealing with unstructured prose for everything.

Unstructured prose for everything? What are we talking about? How is <http://docs.python.org/library/random.html> (description, methods and usage, example code) unstructured prose? When it comes down to which doc is better, it comes down to personal preference. But _Java has the best online documentation_ is far from the truth.

</comment></comment></comment></comment></comment><comment><USER6> Java remains at the top, just behind C, of the trusted TIOBE index: [http://www.tiobe.com/index.php/content/paperinfo/tpci/index....](http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)

This is not a surprise at all.

Java is huge. Sorry to everyone who doesn't like it. It's just a current fact of the industry.

</comment><comment><USER7> I find this statistics to be interesting because technically, outside Android, there's probably not too many new books about Java published by O'reilly unlike in the early 2000 when Java for the web and enterprise exploded.

On the flip side, Head First Design Patterns, Head First OOP, Head First Software Development are all using Java and the Head First series seems to replace the "For Dummies" series for beginner's book (don't get me wrong, I love Head First series because the series attempts to write book from a different angle and it does make sure you remember what you read, just like in the classroom).

Last but not least, O'reilly has the best selection of JavaScript books out there compare to other publisher.

[edited typo :)]

<comment><USER8> _Head Fist Software Development_

I know this is a typo but this is a book that really begs to be written.

<comment><USER9> It's not a typo. <http://shop.oreilly.com/product/9780596527358.do>

<comment><USER10> The link describes it as "Head First Software Development". The OP described it as "Head Fist".

</comment></comment></comment></comment><comment><USER11> One obvious reason for this would be that colleges/universities very often teach Java as the main language and will usually encourage students to buy at least one or two books on the subject.

Another reason is that Java projects will often use some fairly heavy frameworks like hibernate, which can be great to work with if you really understand how they work. The best way to do this is to make sure you have the definitive book on your shelf as you are in for a world of pain if you just try to "wing it" like you would with PHP.

<comment><USER12> And also Java is very popular in large corporations (at least in my experience in the Financial Services sector). These companies have large staffs and lots of money. They'll send whole teams to training classes (which includes books).

While working for these large companies I thought the whole world was Java/Spring/Hibernate. Now that I work on my own (and have started spending more time on HN) I see there is a totally different picture for the startup/consulting world.

BTW, scanning GitHub to determine language popularity seems ridiculous to me. What percent of larger corporations use GitHub (less then 5% I would guess).

</comment></comment><comment><USER13> It's sad that learning from books doesn't work like osmosis.

If the amount of books i've bought would equate with the number of books I've read I probably would be a more rounded coder...

Is it common to have atleast 5 times the amount of unread coding books in comparison to the read ones?

There are surely lots of Java books bought by students who drop out after the first semester...

</comment><comment><USER14> I don't think these results correlate _at all_ to the popularity of a given programming language in use in the field.

For instance, pretty much ever since the language's ascendance to popularity, a visit to the bookstore will yield a veritable WALL of Java books, most of them bound for obsolescence within a year, or two, max. Sure, this happens with other programming languages too, but the constant churn of frameworks, libraries and infrastructure that happens in the Java world is a boon for book publishers.

</comment><comment><USER15> Interesting trends, which likely match reality wrt the the decline of visual basic and perl, and the rise of python <http://radar.oreilly.com/upload/2012/03/Lang_allYears.jpg> It also shows the ruby market cooling off, which is consistent with recent stats for open source commit numbers.

</comment><comment><USER16> I can't tell the difference between Ruby, VBA, Perl, and SQL at first glance... instead I have to count columns and figure out where a language is

</comment><comment><USER17> err...no <http://en.wikipedia.org/wiki/Betteridges_Law_of_Headlines></comment>


Resurrecting the Flower Crowns of Old Ukrainian Wedding Photos - <AUTHOR> http://www.atlasobscura.com/articles/resurrecting-the-incredible-flower-crowns-of-old-ukrainian-wedding-photos <comment><USER2> I am from Western Ukraine and while I have seen women wear crowns of woven flowers I didn't know that there was such a beautiful wedding tradition. Or the fact that it's being resurrected for the sake of peacefully asserting Ukrainian nationalism in the face of armed conflict and occupation by Russia.

</comment><comment><USER3> > Now, when the country is again fighting against Russia—the conflict between > Ukrainian forces and Russia-allied separatist that started in 2014 is still > ongoing, despite an official ceasefire—these wreaths are doing the same > symbolic work.

It is not true. Russia invaded directly into Crimea and East Ukraine, with very little help from locals. Moreover, Russians says on video that locals don't want to war. 70% of people in East Ukraine are Ukrainians, anyway. Official version was that Russia need to protect Russian-speaking Ukrainians from other Ukrainians, because they will kill them.

<comment><USER4> Oh but they do burn people alive, don't they?

I think it's still quite possible to find Odessa videos on Youtube..

<comment> Const-me There're results of international investigation on Odesa tragic events: [https://www.coe.int/en/web/kyiv/report-on-investigations- of-...](https://www.coe.int/en/web/kyiv/report-on-investigations-of-odesa- events) As you see, the report doesn't support your accusation "they do burn people alive".

</comment></comment></comment><comment><USER5> The headdresses are cool, but the models wearing them also have a story. The modern models all look over eighteen. As they are wearing wedding garb, the photographer chose adult women. Young, but still adults. The 'models' in the historical photos are not. They are children by today's standards. Also, they are much more robust people. They are round-faced well-fed healthy people. The modern models are much thinner, with very different faces despite the obvious racial similarity. You see this in nearly every historical recreation. No matter how we try, our modern sensibilities are very difficult to overcome.

<comment><USER6> I pretty much agree, though their Instagram has a wider variety of models (by age at least) [https://www.instagram.com/third_roosters/](https://www.instagram.com/third_roosters/)

Also their Facebook page: [https://www.facebook.com/TretiPivni/](https://www.facebook.com/TretiPivni/)

</comment></comment><comment><USER7> Beautiful culture. It appears that headdresses are so much more than simple ornaments in pretty much all cultures. When I got married, as a Vietnamese male, I also wore the headdress.

I think there's much more to Ukraine than what we read or don't read on the news.

As someone from the outside looking in, my heart breaks for many friends in Ukraine who lost their homes. I wrote this for my Donetsk friends who had to uproot: [http://nguonthieng.com/thirty-ba-muoi/story-of-the- wind.html](http://nguonthieng.com/thirty-ba-muoi/story-of-the-wind.html)

</comment><comment><USER8> Oh my, I wish it was Indian feather crowns, at least there wouldnt be so much hate in comments russian vs ukrainian</comment>


Clean Tech Startup EnergySavvy Offering $10k Referral Bonus - <AUTHOR> http://www.energysavvy.com/blog/2011/02/18/10k-for-10-days-energysavvyy-referral-bonus/

<comment><USER2> I'm curious - who else is crowd-sourcing the headhunter business like this? Is this unusual (at least in this economy)?

<comment><USER3> It is becoming very common, I have seen this several times in the past few months. The funny part is they would have more success if they considered remote development because they would increase the pool of available talent. With tools like Skype and Basecamp it is like having the developer in the next cube. I am still surprised by people crippling their search for talent when all the tools are available to them to support an organization that can go after the talent no mater their location.</comment></comment>


Hot New Domaining Trend: Backwording - <AUTHOR> http://logistiklabs.blogspot.com/2008/02/next-hot-domaining-trend-backwording.html Featured at TrendHunter.com and AdCult.com. Can't afford a million-dollar premium domain name? Why not own the next best thing, the reverse spelling of it. It's called Backwording and it's the newest domaining phenomenon that is changing the landscape of the Internet. <comment><USER2> Beware of porn spam pop-up.</comment>


Xerox could have conquered the personal computing market (2012) - <AUTHOR> https://hbr.org/2012/10/big-companies-cant-innovate-halfway <comment><USER2> Nope: The keyboard made the product disgusting to Suits.

[https://rrandyrrodent.tumblr.com/post/186454963342/why- the-x...](https://rrandyrrodent.tumblr.com/post/186454963342/why-the-xerox- parc-alto-failed)</comment>