jbackus

Joined 14 years ago

Karma
536
Submissions
112
Member since
Nov 26
Co-Founder of Cognito (YC S14).

Twitter: http://twitter.com/backus

View on Hacker News

Recent submissions

Comment · 5 years ago
Very nice. I've been using https://screenotate.com/ for years in part because of the nice OCR support
Comment · 5 years ago
Having your business beholden to any app store is a bit scary, but Google's chrome web store is probably the most precarious. As far as I can tell, almost every negative action taken against you is done in an automated fashion, with basically no human recourse beyond knowing someone on the inside or hoping for a negative PR cycle.

At least with the mobile app stores, a good review process with some human recourse is baked into the incentives of the platform, since lots of money is involved.

With the Chrome web store, you get the feeling it is just there because Google capitulated in the past, acknowledging that browser extensions are necessary to be a mainstream browser. Beyond that, it seems to be moderated with two goals: reduce overhead cost and mitigate any security threats.

The result is the complaints you hear from every extension developer:

* Google arbitrarily blocks a decent % of updates, because of automated flagging

* Google removes extensions with basically no recourse, often for unclear reasons

* Google itself (if I remember correctly) even recommends using a Google account separate from your personal/work email, since often these automated suspensions take down the account connected to it too

Don't get me wrong, browser extensions have a lot of power and that's often an issue (malware, browser history collection, phishing, etc). Still, building an extension for Chrome involves the constant reminder that you are under the thumb of a big monolith organization that is indifferent to you.

Comment · 5 years ago
Nope. If you read the post, you'll see he mentions that it isn't related to uglification. It's a definition of unicode characters
Comment · 5 years ago
Another cool way you could do this: Ruby methods can ask for their caller_locations. They work like this:

    # Source

    $ cat example_for_hn.rb
    def foo
      bar
    end

    def bar
      baz
    end

    def baz
      (c1, c2) = caller_locations.first(2)
      puts "Parent caller:      '#{c1.label}' in '#{c1.path}'"
      puts "Grandparent caller: '#{c2.label}' in '#{c2.path}'"
    end

    foo

    # Demo

    $ ruby example_for_hn.rb
    Parent caller:      'bar' in 'example_for_hn.rb'
    Grandparent caller: 'foo' in 'example_for_hn.rb'
So, you could define a method decorating class method like so:

    module Shitlist
      def shitlist(method_name, whitelist)
        original_method = instance_method(method_name)
        undef_method(method_name)

        define_method(method_name) do |*args, &block|
          call = caller_locations.first
          passes_whitelist = whitelist.any? do |label, file_pattern|
            call.label == label && call.absolute_path.end_with?(file_pattern)
          end

          unless passes_whitelist
            fail "Shitlisted method! Permitted callers: #{whitelist}"
          end

          original_method.bind(self).call(*args, &block)
        end
      end
    end
and then extend classes with it to use the decorator:

    class Example
      extend Shitlist

      def not_on_shitlist
        qux
      end

      def baz
        qux
      end

      def qux
        puts 'Only some methods can call me :)'
      end
      shitlist :qux, 'baz' => 'shitlist.rb'
    end
If I run this example (full source:
https://git.io/JLOdV), the non-whitelisted caller throws an error:

    $ ruby shitlist.rb
    Only some methods can call me :)
    Traceback (most recent call last):
      2: from shitlist.rb:44:in `<main>'
      1: from shitlist.rb:25:in `not_on_shitlist'
    shitlist.rb:13:in `block in shitlist': Shitlisted method! Permitted callers: {"baz"=>"shitlist.rb"} (RuntimeError)

---

Of course, you might not want this hijacked method with tracing inside something performance critical. You could always configure the implementation to be a no-op in production.

Comment · 6 years ago
I had the privilege of seeing Jeffrey do multiple live performances of his software (demoed @ 9:20) at different Internet Archive events while he was the artist in residence.

Each time, I got the delightful feeling that I was witnessing something special (and, of course, very weird in a good way). The performance is legitimately "live" in that he's creating new images from scratch, and it seems clear that he's able to build up this rich imagery from what seem like a handful of solid composable building blocks in his software.

I always found those performances inspiring in a similar way to how I feel the times I have visited DynamicLand. A wonderful blend of the physical medium and alternative ways of thinking about computers that produce such an interesting result, making me glad people like this exist in the world.

Comment · 6 years ago
Yeah, I don't remember any of the Ruby tooling ecosystem maintainers having nice things to say about the various syntax changes they've added over the years. I don't blame them.

These changes are always justified with a hand wave and a reference to "developer happiness" and ergonomics. I think that justification is seen as insulting when all the static/dynamic analysis tools obviously actually deliver a lot of value to Ruby devs, and yet the basic tooling to support this ecosystem (robustly parsing, traversing, annotating, rewriting, and unparsing an AST) is not provided by the language.

Comment · 6 years ago
Yeah. Been years since I even played with it, but even in 2016 I remember Ripper being completely unusable, failing to parse plenty of normal Ruby syntax. The Parser gem also maintains a separate parser for every Ruby version, so you can a program using Ruby 2.5 but tell it to parse code according to Ruby 2.2 syntax. It's also just way better built, tested, and has other nice features like tools for rewriting ASTs.
Comment · 6 years ago
Ruby's parser is notoriously complex; if I remember correctly, only a few members of the core team even know how to maintain it without introducing regressions.

The craziest part of this is that Ruby does not provide a full featured Ruby parser, so its entire static and dynamic analysis ecosystem depends on a (actually very high quality) 3rd party parser, begrudgingly maintained by someone who (AFAIK) doesn't even write Ruby anymore: https://github.com/whitequark/parser

When I see new language features like this, I think of how Ruby's entire tooling ecosystem depends on the dramatically underfunded (and therefore primarily goodwill) efforts of high output maintainers like whitequark and a few others. Ruby's highly dynamic and untyped nature means these tools are all the non-runtime guarantees you can get, basically. Epitome of digital infrastructure.

Consider asking your company to fund some of these people:

* https://github.com/whitequark (maintains parser)

* https://github.com/sponsors/bbatsov (maintains RuboCop)

* https://github.com/sponsors/mbj (maintains unparser and mutant)

---

As context, I know this stuff intimately because I used to contribute heavily to most static and dynamic analysis tools in the Ruby ecosystem (https://github.com/backus?tab=overview&from=2017-12-01&to=20...) and used to track new ruby changes really closely: https://cognitohq.com/new-features-in-ruby-2-4/

Comment · 6 years ago
I'm building Jam (https://jam.link/) to tackle this problem. You can think of it as a consumer password manager built specifically for sharing.

It's fully frontend encrypted, so Jam doesn't know what logins you save and it can't read your secret credentials. The cryptography is based on 1Password's design (https://1password.com/files/1Password-White-Paper.pdf). I'd be happy to share details if people are curious.

Jam's focus on sharing comes through, right now, in the UI and default behavior. For example, when you save a new login, your friends in the system can proactively request access. To visually illustrate that: If I save a new login to Jam (like so https://i.imgur.com/syM2bep.png) then my friend gets a notification about that account, can see what it is (https://i.imgur.com/ZUKwfBB.png) and can request access (https://i.imgur.com/3SCcBm5.png).

It's in private beta right now, it's free to use, and I'm looking for as much feedback as possible. I'm happy to add people from HN right away, just email me at john at jam dot link

Comment · 8 years ago
Author here, thanks for reading!

Regarding "decentralization can only exist to circumvent the law", I don't think that in the long term (>5 years out). I touched on this a bit in another comment: https://news.ycombinator.com/item?id=17641098

Regarding privacy, I'm with you there, but I'm very skeptical that very fuzzy privacy concerns can switch enough people away centralized systems with network effects (FB, Twitter, Reddit, YouTube). I think these systems will see adoption from a few groups:

- Privacy advocates and people otherwise interested in the tech by itself - Ostracized groups. For example, see how Voat (not a decentralized system, but an example of a Reddit clone with a ideological mission) wound up as a hub for the alt-right. - The most extreme people trying to boycott platforms like Twitter. For example, people demanding way more censorship from Twitter that are trying to make Mastodon happen because it has content warning stuff and other anti-harassment stuff from what I've heard - Communities that are forced out by the law, like r/DarknetMarkets moving to Dread: https://medium.com/@jbackus/minimum-viable-decentralization-...

So, subcommunities definitely will exit I think but whether they go to other centralized systems depends on UX (which is harder with decentralization) unless a legal reason makes decentralization the only option.

Comment · 8 years ago
Author here. I'm mainly writing about decentralization that is supposed to be mainstream while also looking for historical examples. With that in mind, I've looked at:

- Dozens of file sharing apps and their protocols (focus on Napster, Gnutella, FastTrack, and BitTorrent) - Tor, I2P - Tor hidden services - Original p2p Skype

If we generalize "decentralization" into "creative uses of distributed systems and/or cryptography for the sake of privacy and resilience" then we can include a bit more:

- PGP - Willfully blind centralized systems like mega.nz

Then finally if I dip into older attempts that IMO didn't get real adoption, we can include some other interesting examples:

- Freenet - Tribler - Mojonation

There are systems like Diaspora and Mastodon, but they're too close to the present IMO to use as historical examples. There are also obviously decentralized/distributed systems that serve as the backbone of the internet and I do want to allocate more time to learning these deeper, but they don't feel the same.

---

Anyways, I'm not even really disagreeing with you but mainly trying to point out that I'm trying to draw from as much as possible. The original Skype stands out as a case where it seems to have no relationship with the law (https://twitter.com/backus/status/1014726515592818688).

If you have examples (failed or successful) that you recommend looking into, I'm all ears. As I've pointed out in a few other places, my point regarding the law isn't to say that this is all decentralization will ever be for. Instead, I'm saying this seems like the main point in the past for mainstream applications. Maybe decentralized apps will work as well as centralized apps in the future, but it seems like this might be far enough out that it would be incredibly risky for a startup to decentralize today when it doesn't need to.

I could say more, but this is already a lot. Thanks for reading my article!

Live from the official Hacker News API

A modern reader for Hacker News · SvelteKit + Skeleton