HN user

sillysaurus3

15,505 karma

"Nobody exists on purpose."

sillysaurus3 at gmail.

https://news.ycombinator.com/item?id=16089930

Keybase username "sillysaurus". Hit me up to chat! I'm happy to hear from you.

Posts148
Comments3,850
View on HN
github.com 7y ago

A modern annotated code companion to Paul Graham's “On Lisp”

sillysaurus3
17pts0
www.thelocal.se 7y ago

8yo girl finds 1,500-year-old Viking sword in lake

sillysaurus3
1pts0
randomascii.wordpress.com 8y ago

Stupid Float Tricks (2012)

sillysaurus3
8pts0
www.jofreeman.com 8y ago

The Tyranny of Structurelessness (1973)

sillysaurus3
115pts20
en.wikipedia.org 8y ago

Pointing machine

sillysaurus3
41pts3
wiki.luajit.org 8y ago

New Garbage Collector for LuaJIT 3.0

sillysaurus3
1pts0
www.youtube.com 8y ago

AI learns to play pool [video]

sillysaurus3
2pts0
www.youtube.com 8y ago

[video] AI learns to play snake using Genetic Algorithm and Deep learning

sillysaurus3
1pts0
gist.github.com 8y ago

Show HN: Puzzle.js

sillysaurus3
2pts0
swtch.com 8y ago

Regular Expression Matching Can Be Simple and Fast

sillysaurus3
3pts0
www.youtube.com 8y ago

YouTube suspends Cody's Lab for making video about homemade gunpowder

sillysaurus3
28pts11
techcrunch.com 8y ago

Google Has Acquired YouTube (2006)

sillysaurus3
2pts0
www.catb.org 8y ago

Release Early, Release Often (2000)

sillysaurus3
1pts0
bitcointalk.org 8y ago

Why Proof of Burn cannot work cleanly in practice

sillysaurus3
2pts0
www.reddit.com 8y ago

Critical Electrum vulnerability

sillysaurus3
7pts0
www.webgraphviz.com 8y ago

WebGraphviz: Graphviz in the Browser

sillysaurus3
171pts21
news.ycombinator.com 8y ago

Ask HN: Which technology wasn't as big of a deal as you thought it would be?

sillysaurus3
2pts2
www.youtube.com 8y ago

The Gene Patent Question [video]

sillysaurus3
1pts0
blog.evanyou.me 8y ago

First Week of Launching Vue.js

sillysaurus3
2pts0
medium.com 8y ago

Fast Source Map Generation for React Native

sillysaurus3
1pts0
news.ycombinator.com 8y ago

Ask HN: What to do about the destabilizing effect of Bitcoin?

sillysaurus3
5pts1
danlec.com 8y ago

As much Stack Overflow as possible in 4096 bytes (2014)

sillysaurus3
1pts1
www.stuartcheshire.org 8y ago

It's the Latency, Stupid (1996)

sillysaurus3
3pts3
rauchg.com 8y ago

Principles of Rich Web Applications (2014)

sillysaurus3
2pts1
www.strikemag.org 8y ago

On the Phenomenon of Bullshit Jobs

sillysaurus3
5pts0
izbicki.me 8y ago

Turning an AK-47 into a serving ladle

sillysaurus3
1pts0
en.wikipedia.org 8y ago

Tinkerbell effect

sillysaurus3
1pts0
mobile.abc.net.au 8y ago

North Korea: Where can its missiles reach?

sillysaurus3
2pts0
mnn.github.io 8y ago

ClojureScript + VueJS: Why so painful?

sillysaurus3
3pts1
news.ycombinator.com 8y ago

Ask HN: Why is #e#x+e#s+e-e#l-e a valid number in Racket?

sillysaurus3
2pts2

Anyway, I thought this was a solved problem on both Windows and OSX since they both have conventions for self-contained applications, while linux does not.

This is mistaken for Windows. Even if programs are run from Program Files, they will often source their DLLs from other locations.

The Little Typer 8 years ago

So many assumptions are embedded in your comment. Firstly, it's not proven that piracy affects sales. Quite the opposite: it usually raises popularity for an item, because – if it's good – people sing its praises, which leads to more sales.

You didn't respond to my actual comment. Again, it is victimless because no one would've bought the overpriced book except for those who have $40 to throw away on a lark.

If we focus on making a quality product at a reasonable price, sales follow. The fact that technology has reduced this price to near $0 is unfortunate but is merely a consequence of computers.

I get that technology is often upsetting, but why take it out on users? The way to win is to pay attention to trends and adapt, not wish the world were different.

Riddle me this: Why did people write books before there was an economic incentive for them to? The crux of our disagreement appears to be this: it wouldn't hurt the world for us to return to those times. And technology seems to make this inevitable.

I wish I could get paid to write programming languages all day, but many people wish they could be paid for many things that are not feasible. Are you so sure your book would have maid those thousands of dollars in an era before it was possible to widely distribute it? Who would buy it? And moreover, who would hear about it and how?

https://www.gnu.org/philosophy/right-to-read.en.html

Of course, Lissa did not necessarily intend to read his books. She might want the computer only to write her midterm. But Dan knew she came from a middle-class family and could hardly afford the tuition, let alone her reading fees. Reading his books might be the only way she could graduate.

It's always interesting to watch Stallman's writings become reality.

In fact, this is so prescient as to be worth quoting in full:

Programmers still needed debugging tools, of course, but debugger vendors in 2047 distributed numbered copies only, and only to officially licensed and bonded programmers. The debugger Dan used in software class was kept behind a special firewall so that it could be used only for class exercises.

It was also possible to bypass the copyright monitors by installing a modified system kernel. Dan would eventually find out about the free kernels, even entire free operating systems, that had existed around the turn of the century. But not only were they illegal, like debuggers—you could not install one if you had one, without knowing your computer's root password. And neither the FBI nor Microsoft Support would tell you that.

Substitute "Microsoft Support" for "Apple". We even have officially-licensed and bonded programmers now: The $100 developer ransom.

Lissa did not report Dan to the SPA. His decision to help her led to their marriage, and also led them to question what they had been taught about piracy as children. The couple began reading about the history of copyright, about the Soviet Union and its restrictions on copying, and even the original United States Constitution. They moved to Luna, where they found others who had likewise gravitated away from the long arm of the SPA. When the Tycho Uprising began in 2062, the universal right to read soon became one of its central aims.

You claim you are a victim. Yet you refuse to acknowledge that there are people who can't afford your work who would otherwise be enriched by it. Of the two victims, it's hard to say which is worse. Especially given that people will continue writing books even when there is no incentive to.

The Little Typer 8 years ago

If I understand your position correctly, you feel that even if someone does not have $40 or would not have paid $40 for something that can be freely copied, it is both immoral and unethical to ignore the author's wishes and copy it anyway. Even though you as the author are unaffected by this action. You also feel that it's justifiable to seek out people who do this and tell them that they should not do this, i.e. how to live their life.

Is that an accurate summary? I am trying to respond to the strongest possible interpretation of what you're saying.

What is the difference between someone doing this, which is an illegal victimless crime, and recreational drug use, which is also an illegal victimless crime? Why is one immoral and unethical, but not the other? Furthermore, why is it justifiable to believe that it's an important right to be able to ingest whatever you want into your body as long as you're not harming anyone else? And are you sure the same argument doesn't apply to this case?

The Little Typer 8 years ago

People put a lot of energy into programming languages, but they don't expect to get paid anything for it. Why is it different when it comes to publishing a book?

That may sound like a dismissive question, but it's at the crux of our disagreement. If we can resolve that, we might be able to see eye to eye.

The Little Typer 8 years ago

I'd be happy to debate, if you're interested. But in the meantime it appears that the anger is misplaced; direct it at the fact that we have this wonderful tool that destroys class barriers and makes knowledge free to all.

You act as if I have $40. Would it surprise you to learn my power was cut off within the last few months?

Another point: "Stealing" implies something was lost. The words are still there, even if I have copied them.

The game industry and the iPhone app store have proven that when you price something closer to $1, it will generate exponentially more revenue than $40.

The Little Typer 8 years ago

Technology destroyed the market, not users of it.

I think you could've made the same sort of argument against movies or music before netflix and napster, but here we are, and the markets still seem thirsty for new content.

The Little Typer 8 years ago

Another way of phrasing that: The book costs as much as work that took dozens of people years to make.

Also if you were to somehow poll everyone reading this and ask "Did you buy this book?" you'd get some number, x. But if the book were priced at $5, then $5y would be much greater than $40x.

I bought a bamboo fineline pencil for $50 the other day. It's a tool that will serve me for at least a year. It's unclear whether this book would.

I want work like this to exist, and for the author to be rewarded for it. But ultimately, in an era when words are infinitely and instantaneously copyable, the economic value of words seems to drop.

Given the choice between stealing knowledge and not stealing knowledge, when you wouldn't have paid for it anyway, where's the harm?

The correct response is to laugh at them and move on. And mock them on HN.

It's worth being aggressively negative toward such companies, because negotiating to your market value is step one in leading a good life. The fact that they would have you not do this means they don't care about the quality of your life, so you shouldn't care about their company.

Another answer to the Fermi paradox is that a Kardashev Type 4 civilization is able to harness the power of an entire universe. We wouldn't be able to detect this by definition, since they exist outside of our perceived reality.

At first glance, this seems to be a useless theory, since it's not refutable. But it lends itself to a belief system: by studying the universe, we gain an understanding of whatever created it. This is helpful as a motive: a reason for studying any of this at all, in absence of economic or social incentives.

This seems important. As the centuries tick by, and as we confirm and re-confirm that we are indeed alone and that we do indeed have a mostly-complete model of physics, there will become less and less incentive to analyze the corner cases. It's costly, and takes decades. But at one time, it was costly and took decades to build a cathedral. Yet we accomplished these impressive feats due to a shared belief system.

The reason I brought this up is that we often like to believe there is an advanced alien civilization tucked away in some corner of some galaxy, sending out messages via gravitational waves or neutrinos. But why do humans find this idea so seductive? It's because of an underlying loneliness: we want to believe that we are connected with the universe in some fashion, that our existence has a point, and that there is reason to do anything at all in a universe that will exist long after we've gone, long after our solar system and sun has gone. Because if there were an alien civilization, at least we would not be so alone.

In that context, a solution to Fermi's paradox is simply to believe that our very universe exists due to some higher-order phenomena not knowable within our reality. And by studying the laws of physics, we gain a glimpse into the boundary between our universe and its hypervisor.

Not quite true. You can serialize a closure. Emacs lisp does so in a pretty interesting way: a closure is just `(closure ((a . 1) (b . 2)) (lambda (x) (+ x a b)))`.

The point is, if you can serialize closures, I think you can serialize continuations.

That’s one option. But the unfortunate conclusion of that choice is that continuations leak a lot of memory. One shot continuations are better, since it frees up the variable references.

Simple, but missing many parts. For example, what happens to variables on the stack? The heap? What does it mean to continue execution from “here” — from this point in time? Does that mean file handles will be closed or re-opened to match the current state of the program?

These questions usually have straightforward answers, but some are counterintuitive.

The reason it's difficult to make elisp fast is because the language defaults to dynamic scoping rather than lexical scoping. That means any function that uses `let` is no longer making a tailcall. Meaning you have to restore the value of each variable after you call whatever function would have been the tailcall.

Stuff like that adds up. It's why Lua is so fast compared to JS, too.

Yes, but it can’t easily interop with the host language. Elisp saves the stack, which you can’t do in JS. That means you can’t cross JS -> elisp boundaries with your longjmp without some pretty awful hacks.

  function foo() {
    return doSomething();
  }

  async function doSomething() {
    ...
    throw ScanError();
  }
Spot the bug? That's an async function. Every JS programmer worth their salt will tell you how many times they've been annoyed to discover a missing await, and that the promise is failing mostly-silently (or worse, it works by accident until it doesn't, since that code will work fine most of the time).

Well JS does provide this via exceptions.

Second it's totally crazy that emacs depends on longjmp

It's not crazy.

  function bar() {
    [1,2,3].forEach(x => {
      if (x == 2) /* return from bar...? */
    }
  }
Why can't you write this code? I mean you "can":
  function bar() {
    let tag = [];
    try {
      [1,2,3].forEach(x => {
        if (x == 2) { tag.value = x; throw tag; }
      }
    } catch (e) {
      if (e === tag) {
        return e.value;
      }
  }

But holy crap that's terrible. EDIT: I also forgot to rethrow the error, showing just how easy it is to screw up.

Just write it as a for loop, then. Well sure, except for the hundreds of libraries that don't support that style. What do you do when you want to return prematurely from the iterator functions you pass to them? Now you can't just make a for loop unless they provide Symbol.iterator. And 9 times out of 10 they give you a promise, meaning you're forced to convert your code to async style.

It's a huge mess, and longjmp saves you a lot of headaches in disciplined situations. Every tool has its place, and it's strange to argue that a computer should be able to do less, not more.

The goal is to save you time in the long run. And those 5 lines better be exactly right, or you'll waste a lot.

In this case, I'd like to write blocking-style code.

longjmp, however, is a crucial missing facility in JS. Emacs relies on it heavily in its design -- it's how catch / throw work, and it's why you can do things like

   (catch 'foo
    (map (fn (x)
           (if (= x 42) (throw 'foo x)))
      values))
Without longjmp, you can't do that. Just as you can't in JS.

So what? Well, that means you can't write emacs, because you're limited to what JS provides you. An entire class of software is beyond your ability to write, because you cannot provide the same features that other runtimes give.

This gets me started on the lack of any kind of reasonable error definitions in JS. In elisp, you define errors. Imagine you want to write some code that parses some parens -- it turns "(a b (c))" into ["a", "b", ["c"]]. What do you do when your program encounters "(a b" and then the end of the string? Throw a scan error!

Not in JS. It's considered poor manners to throw errors to the people using your library. Worse, it's a pain in the ass for users to catch and respond to errors. If you use someone's library, you usually don't expect to have to wrap it in a try-catch. And the code is massive:

try { operation } catch (e) { if (e instanceof ScanError) { do something else } }

Contrast that with elisp:

  (condition-case nil
    operation
    (scan-error do something else))
There's no contest. It's way easier to write the latter than to use the tools JS gives you. But it's a cultural difference, and culture is slow to change.

That's why webassembly at least gives an escape hatch.

https://kottke.org/18/06/a-sad-update-about-a-scissors-maker...

The cultural pressure not to fail is so immense that it drives people insane. I watched it firsthand with my friend's father. He mismanaged the business into the ground and never really got over that. Trying again doesn't even come into his mind.

And that same mentality is very often the way we bring up children. Play it safe. Get a good job. Prioritize work over your own desires. Sacrifice yourself for others. And whatever you do, make sure it goes well.

That's just not possible, and for good reason: some things happen now, and some things happen later, and if you need ultra-fine-grained control over what happens when, then you need to be very explicit about what's happening and how and when.

Green threads. No silver bullet, but sometimes you upgrade your pistol.

JS needs greenthreads. There's no reason you shouldn't just spin up a thread for every blocking context. This is arguably what async/await already does, but you don't have control over the toplevel loop. Point out where your while (userIsOnWebsite) { ... } loop is. :)

Having a toplevel loop is very important for simplicity -- but even moreso for what you mention: having ultra fine-grained control, and not constantly fighting with the underlying scheduler / ecosystem.

Now, what do you do when you want to return from that function after loadRealImage() finishes?

  function loadImage(src) {
    loadRealImage(src).then(img => /*... return img from loadImage ...?*/);
  }

"Just make it an async function." Well yes, but then the async nature contaminates the rest of your code. You have to make sure to set up a toplevel try-catch for every one of your async chains, for example.

What do you do when you want to have an async generator? That is, you want to both await on something, and yield N values from the function. JS makes that difficult.

There are all kinds of limitations like this, and everyone has their own favorite hacks around them. But they're hacks, not unification. And yes, hacks can be effective, but a unified framework can be tactical.