HNHacker News
TopNewBestAskShowJobs

zemo

3,233 karma · joined March 19, 2010

engineer at Whatnot, working on the discovery team. Previously: some games stuff, went to grad school for game design, worked on a bunch of startups. I wrote the multiplayer server for all of the Jackbox games.

Hacker School (recurse center) batch[1]. My great grandfather was a clown named Zemo.

[ my public key: https://keybase.io/jorelli; my proof: https://keybase.io/jorelli/sigs/qfLefSRzpZuCMRmTbonOu98s-GSF80avwYxBcf7K-84 ]

submissionscomments
zemo··on Codeberg – Fast open source alternative to GitHub
Are they crawling the internet looking for all the publicly available code that exists or are they just training their model on the code that people upload directly to their servers?
zemo··on Codeberg – Fast open source alternative to GitHub
> Why is their UI (which is Forgejo, fork of Gitea) such a blatant clone of GitHub’s?

because their project goal is to iterate on the ownership model, not to iterate on the web design.

I use a self-hosted forgejo instance now (as of like, a week ago, let's see if I stick with it haha). I like GitHub the piece of software just fine, but I don't like the idea of my code training copilot. I think the design of GitHub is fine and people already know it, so I like that. If the reason you would want to not use GitHub is the design, gitea or forgejo will probably not be to your liking.

zemo··on Push notifications are now supported cross-browser
I turn off all push notifications everywhere that aren’t direct messages from a person I know, but even still, I think you’re missing the point entirely here. You can’t watch a livestream on your own time, it being live is the whole point.
zemo··on SVB Hall of Shame
seeing this here is funny because there are a lot of HN users that are VCs that don't know how to code :)
zemo··on Not by AI
a lot of people in this thread seem to have no understanding that some people enjoy the act of writing or of painting by hand. Every framing in here to the tune of “everyone will use AI” is nakedly utilitarian. Sometimes people pain pictures or write not just because they enjoy the act. Sometimes people paint pictures or write because they want to communicate; not everyone will feel like they’re communicating from themselves when the words or pictures come from a machine. Generating content from a dataset is a way of exploring the dataset; generating content from within is a way of exploring yourself. They are simply different.

and fwiw, a lot of the assumptions in here are akin to saying at the dawn of photography that nobody would ever paint any more. Photography of course replaced certain entire categories of painting, but didn’t erase painting from the face of the earth altogether. Of course there are far more photographs than there are paintings, but volume alone is not the totality of meaning.

Generated content is strictly culturally regressive anyway. After a hundred years of ChatGPT will people still be writing prompts with “in the style of [person who produced all of their work before the year 2000]”? That would be a sad and boring future.

zemo··on Tech entrepreneurship and shifting sentiment
> When I started Kapwing in 2017, it was cool to be a tech entrepreneur.

by 2017 Shark Tank was eight years old and Gwyneth Paltrow was a judge on apple’s short lived startup show that flopped. I really don’t know how much more obvious it could be that the trend had already jumped the shark in 2017.

zemo··on RustPython – A Python-3 (CPython >= 3.11.0) Interpreter written in Rust
do you work in games
zemo··on I_suck_and_my_tests_are_order_dependent
> Set the state to a known state

how do you guarantee that the state that you set as the initial state is reachable in your system?

zemo··on I_suck_and_my_tests_are_order_dependent
have fun testing a stateful system without order-dependent tests
zemo··on ChatGPT Plus
if you ask it a question and it gives you a confident answer that's 100% wrong that's a terrible experience and a non-working product. "it's not a bug in the traditional sense" is technically correct but missing the point entirely.
zemo··on Ask HN: Is programming culture immature?
it's almost like programming culture is intentionally immature because it keeps people focusing on things like which programming language they should be using instead of asking whether or not they should be surveilling their users.
zemo··on Product Red
capitalist realism at its finest
zemo··on Migrating from Warp to Axum
that’s not what the Axum example does. The function you’re linking turns an opaque run of bytes into an http request object. What the Axum example does is turn an http request object into a value of some other type T.
zemo··on Migrating from Warp to Axum
it’s a thread on an article about moving away from warp. I have a handful of warp services currently and we’re actively moving those services away from warp for other reasons. I’m not going to try to convince everyone at my org to stay on warp, it has the issues this article mentions.

My argument is not that it’s impossible, it’s that the whole value proposition of these frameworks is that they make you jump through fewer hoops than building on top of Hyper yourself, but it looks like a lot of the problems that I’ve encountered with Rocket are being replicated with Axum. There’s a very good chance we -will- move our services to Axum, I’m just not confident that this is really stable ground.

As for the specific example, I think you’re missing the forest through the trees. I used that specific example because it’s in the article and it’s in Axum’s readme, so it’s safe to assume that people discussing the article would be familiar with that case.

zemo··on Migrating from Warp to Axum
no that's ... a pretty extreme misreading of what I'm saying. I'm not saying "I don't want any abstraction", I'm saying "I don't think this abstraction is a very good one, I think it has problems, and I don't think I would rewrite my existing services to use this framework as a result". Here, I'll provide two high-level alternatives.

Here's some pseudo-code of an endpoint that can accept json or form data as an alternative to the Json<T> abstraction that Rocket and Axum both currently utilize:

    async fn handler(thing: Thing) {
        // the Thing is read from the request by a request decoder.
        // The request decoder is chosen from a set of available
        // request decoders based on the Content-Type header.
    }

    let mut app = App::new();
    app.register_decoder(jsonDecoder);
    app.register_decoder(formDecoder);
    app.post("/thing", handler);
    app.run()
> You rejected ancestor's suggestion of using Request<Body>... which is exactly what is provided by Go.

That's not really accurate. net/http provides an abstraction that has survived for a decade that has been leveraged by a lot of tools to make middleware interchangeable. For example, gorilla/mux uses the net/http standard, that has worked great for me for like 8 years running (unfortunately, that project lost its maintainer). The argument I'm making is that not all abstractions are equally good; Json<T> is an example of an abstraction that is used in Rocket that I have found to be cumbersome and Axum is repeating that abstraction. It's one of the very first examples in their docs. Why couple handler logic to request encoding? I think that abstraction is wrong, I don't think it will withstand the test of time, and in another year or two, will be back at it, updating our Axum services to use [some new thing].

So instead of the core abstraction being "every endpoint accepts whatever type it wants", the core abstraction could be "every endpoint accepts one value of the same type":

    async fn handler(req: Request<Body>) {
        // req.decoder looks at the content-type header and
        // picks from a list of registered decoders. If
        // the client picks an unsupported decoder it fails.
        let dec = req.decoder()?;
        let thing = dec.parse::<Thing>()?;
    }

    let mut app = App::new();
    app.register_decoder(jsonDecoder);
    app.register_decoder(formDecoder);
    app.post("/thing", handler);
    app.run()
So a really cool, useful, powerful, and general abstraction that I love in Rust is the string parse method: https://doc.rust-lang.org/std/string/struct.String.html#meth...

I honestly would rather have that for HTTP requests than making an assumption about the content encoding in the handler's signature.

> (Well, you didn't really respond to the content of my comment at all, but nevermind.)

I mean my argument is "a thing that is trivially expressible and easy to do in other stacks has poor ergonomics in this framework" and your response is basically "ok so take the product of all of your endpoints and all of your encodings, ez pz", which ... is also not ergonomic? Literally the opening prompt was me saying I think that coupling the encoding to the endpoint's logic means you'd have to write another endpoint and that feels wrong to me, so ... you're just telling me to do the thing that I specifically said is the thing that makes me think this abstraction is weak.

zemo··on Migrating from Warp to Axum
> I'm not sure of your use case where clients can send any format they want and the HTTP server is supposed to know and handle any format automatically (form, json, querystring, etc)

Any server that has clients that aren't fully under your control that you can't force-update, where the clients today and the clients yesterday encode their requests differently.

I mean, it's the entire purpose of the `Content-Type` header. The whole concept is that the server has a set of encodings that it can understand, and the client can pick between them.

This isn't a new idea. Here it is in RFC 2068, from 1997: https://www.rfc-editor.org/rfc/rfc2068#page-116

These concepts have existed for decades.

In your comment, you make an implicit assumption: the assumption is that the person that writes the server is in control of the client. When we make tools that make it easier to construct software that assumes the server operator is in control of the client but do nothing to make it easier to build software in which the server operator is not in control of the client, we are making a political choice to place power in the hands of server operators at the expense of end users. That's not a political choice that I'm comfortable with.

zemo··on Migrating from Warp to Axum
1, 3, and 4 are already there, they're just a part of Hyper, not Axum/Warp/Rocket. 2 is basically the thing that Axum/Warp/Rocket provide. Hyper is kinda like net/http and Axum/Warp/Rocket are more feature rich. The thing is, they're super early. They don't remind me of the pared-down quality simplicity of the Gorilla Toolkit or even the feature paradise of Gin.

Honestly it a lot of the Rust http frameworks strike me as eerily similar to either Falcore or Revel. Falcore was a very early Go http application framework built by ngmoco, a now-defunct game company. Falcore didn't really gain a lot of traction, partially because it provided abstractions that weren't very ergonomic. It's whole thing was that the core abstraction was a modular pipeline. https://github.com/ngmoco/falcore

I think most people know Revel, it's a little less obscure. It's philosophically the precursor to Gin.

zemo··on Migrating from Warp to Axum
not really, point 2 isn't in the standard library.
zemo··on Migrating from Warp to Axum
I spent ten years writing Go HTTP servers and the abstraction used in net/http has served me well for a decade straight. I’ve been writing http servers in rust for 3 months. Rocket provides an abstraction with a lot of holes that makes me jump through a lot of hoops to do things that have been trivial and common in http programming for over a decade. I’ve written stuff using only Hyper, it’s very manual. Warp has the problems the article describes. With Go, I used the standard library HTTP implementation for a decade and was happy the whole time. I also wasn’t experienced with Go going into it, it was how I learned Go.

Axum and Rocket have the same general thrust, the abstraction being that you define types to see a thing that’s not an HTTP request. That’s the abstraction that I think is incorrect. That design strategy is actively making things complicated for me on a daily basis at my dayjob writing services in Rust.

I want something higher level than Hyper but with a different theory of abstraction than Rocket or Hyper want to provide. The theory of Rocket’s abstraction is that the framework handles the http request and response for you, what you see is something else. That’s not the toolkit I’m looking for. The toolkit I’m looking for makes it easy to interact with http request and response streams instead of making it easy to hide their existence.

zemo··on Migrating from Warp to Axum
https://news.ycombinator.com/item?id=33721070

same line of reasoning as here

zemo··on Migrating from Warp to Axum
sure you can get the underlying request, but if that’s the answer to everything that the framework author didn’t think of, that’s just an admission that the abstraction is wrong, which is kinda what I’m getting at. The entire conceptual model that views the Json<T> type as a handler argument type and then parsing the body based off of that is what Rocket does too. I think the entire strategy is conceptually incorrect. Axum may do Rocket better than Rocket, but if it’s using the same conceptual model, it seems like a lateral move. I’m looking for a new abstraction and conceptual model, not a better implementation of the same concepts or the same concepts with a larger pool of maintainers.
zemo··on Migrating from Warp to Axum
I have a handful of services, some in Warp and some in Rocket, and I dislike both of those frameworks. I've been looking into axum so this is a nice read.

Honestly I don't think that Axum is right either. So for example, this:

    async fn create_user(
        Json(payload): Json<CreateUser>,
    ) -> impl IntoResponse {
         let user = User {
            id: 1337,
            username: payload.username,
        };
        (StatusCode::CREATED, Json(user))
    }
For context, if you haven't checked out Axum, this is from the Axum docs.

Rocket has a similar thing with its request guards, it has a similar json type that you put into the signature of a handler function and it automatically plucks the value from the body and parses it as json.

What's weird to me is that it's coupling the request and response format to the logic. What if a client wants to post this as a form body? Write a separate endpoint? What if some old clients put the arguments in the query string? When I see this snippet as one of the intro examples for Axum, it feels like a red flag to me.

zemo··on Big changes ahead for Deno
can't say that I agree, it's in response to this:

> It's also interesting to note how the tone changes after receiving funding.

seems on-topic to me.

zemo··on Ask HN: Bluetooth kinda sucks. Why don't we have something better?
it’s just so device-specific. My JBL speaker, aftershokz bone conducting headphones, and iPhone all play nicely and I don’t have any problems. My Windows machines consistently have problems with bluetooth, but poor quality is a standard of the Windows experience so it doesn’t surprise me. My Sony stereo receiver is always a nightmare to pair.

Honestly the JBL Charge speaker has the best and simplest solution to this: it just lets two devices pair to it simultaneously.

zemo··on Ask HN: Bluetooth kinda sucks. Why don't we have something better?
I bought a stereo receiver because it has bluetooth up and down and I preferred that to the proprietary protocol used by Sonos. I actually bought a Sonos first and returned it because I hated it so much. The latency makes it completely unusable for half of the desired applications though. So … not “so good” but “the one thing with Bluetooth that I found at the time”.
zemo··on Ask HN: Any solo game developers here?
it’s Unity with the HDRP render pipeline, which isn’t supported in WebGL.
zemo··on Ask HN: Any solo game developers here?
here's a solo game project I just stopped working on, a short puzzle-platformer: https://jordanorelli.itch.io/the-seal

It has a full game loop but is very small. It takes 10-30 minutes to play through depending on how quickly you see through the puzzles. Right now I only have a Windows build :\

I worked on that for a few months full time, but have to get back to earning an income so I'm not working on it at the moment, interviewing instead. I did the game design MFA program at DePaul to find a group of people to learn to make games with, it was a lot of fun. I think without doing a program like that I would have wound up yak shaving in circles and making a bunch of tools instead of ever making any games.

zemo··on A weird epic ramble about Etsy homepages from the middle 2000’s
the story is probably 2008 or so, maybe a little later but not by much. The author was long gone before any of the changes you're talking about happened. Etsy was still very handmade for many years after this story takes place. It wasn't until after the IPO (2015) that activist investors pushed out the folksy leadership and installed a more corporate CEO (2016) that changed everything and made it suck.
zemo··on Tell HN: You can't hire because you don't post salary ranges
> No need to waste time with 7 rounds of interviewing only to find out the salary is 50% of what I currently make.

I'm currently interviewing and this has come up in the first-round phone screen stage with everyone I've talked to.

zemo··on AOL 3.0 reverse engineered
right but that wasn't what AOL was trying to build; it's what happened in spite of their efforts, not because of them. Notice the prominent "channels" and "what's hot" buttons in the second screen shot? They're given a higher position in the ui hierarchy than "internet" for a reason. They were trying to create an experience where all of the content came from AOL itself. "Channels" were their content pipelines, they were hypermedia but everything within the content network of channels was created by AOL itself. It would be like someone hearing about the web and thinking that the way to "win" the web would be to "own all of the web pages".
← PreviousPage 7 of 27Next →