HNHacker News
TopNewBestAskShowJobs

zinxq

1,899 karma · joined January 24, 2008

submissionscomments
zinxq··on MailCatcher runs a super simple SMTP server
Mailinator.com has a free version .. just use any inbox @mailinator.com and voila!
zinxq··on The Perfect Laptop
Everyone should experience the x220 keyboard. It's probably the best laptop keyboard I've experienced.

The x230 onward is also extremely good.

The trick for me is key travel. I bought a new Thinkpad that had 1.3mm of travel and instantly hated it. 1.5mm feels so so much better (not to mention 1.8mm). No new thinkpads have above 1.3mm I believe (in the pursuit of thinness).

zinxq··on Making Games
I posted something along the lines of "games are too easy to make" on reddit and got expectedly lambasted. My fault, don't tell people with new found ability that the only reason they have it is because it's 100 times easier than it used to be.

A long time ago, I got interested in computers to make games but immediately veered into other kinds of software. No worries - I always planned that once I was "done" in the application/startup space, I'd head back and make those games.

Sadly - I waited too long. Like music, books, or photography - the supply-side is so inundated with content that the market is more about marketing than creation or merit. Mind you, never did I expect or even care if I made money. That was never the goal. But now I realize just to get some people to play my game would be a huge undertaking requiring tons of luck - just to rise above the noise. That was the deal breaker - I don't care about making money - but I do care about eventual players, at least if something will take months or years* to create. I wanted to make games, not do marketing.

The bright side is there's no shortage of fun games to play. I'll stay on the player side of the equation!

*Wouldn't be surprised if something like ChatGPT allows games to be made in days in the semi-near future. If so, I just might make games anyway - still not for money, and now not for players - but just to finally let those ideas out of my head.

zinxq··on Open-source disposable email service
Mailinator of course still works this way too. It has private domains, but it still fully supports public,free,disposable addresses @mailinator.com.

Just enter any inbox you want at the top of the homepage.

zinxq··on Remembering Bob Lee
Oh yes - Our system ended up being good for several hundred or several thousand (don't recall) transactions per second.

Bob called me after Zuck's announcement that the system hit a peak of (wait for it), 5 transactions per second. And that for only a very short time. The system was mostly only loaded with a transaction every few seconds (or maybe even minutes)

The Ruby version would have been fine. Heck, we probably could have just printed the transactions to some screen and have someone write them down at that speed.

We did have a good laugh though.

zinxq··on Remembering Bob Lee
People loved Bob, it was truly just a magic he had.

In 2010, Zuck gave a lot of money to NJ schools. For reasons completely unknown to me, Bob, who was at Square at the time, was given the task of writing the code to accept the donations that would be given from the public alongside Zuck's gift. For reasons also completely unknown to me, Bob called me and asked me to help write the code. We had something like 3 days. I was working at my own startup at the time but was excited to go work on this one-off with Bob.

We had worked together at Google and spent a lot of time in the Java community thereafter. We were both Java geeks at the time, but I was confused why he couldn't find anyone at Square.

In any case - I went to Square each day for 3(?) days. I remember that we didn't need to process the transactions (thank goodness), but we just needed to validate and log them which made the problem much much easier. Bob insisted we write each transaction to 3 different machines for redundancy. He also insisted we used fsync which ensured the disk writes actually happened and didn't just get left in an output buffer. He was absolutely right, but I remember being saddened how much slower it made our system.

We finished the system with time to spare. Unbeknownst to me (and maybe Bob I guess) another team at Square also implemented the system in Ruby in competition with us. I recall them being rather "anti-Java" at the time.

In any case, we then benchmarked both systems and unsurprisingly, the Java version was many times faster than the Ruby version (in transactions stored per second). Of course, apart from fsync, this was also not just Java code - it was CrazyBob's Java code which wasted nothing. I really had a blast working on that project with him.

I now realize I really don't know so many finer points of why many of these decisions were made. If any early Square folks were there for this, I'd be interested in what you remember.

zinxq··on Replacing my MacBook Air M1 with a ThinkPad T480
Last year I upgraded to a Thinkpad Carbon. Almost immediately, I couldn't stand the keyboard. This sent me down a rabbit-hole of what was wrong with the keyboard (as it looked almost identical to my previous Thinkpad).

The answer is that Thinkpad has slowly evolved their keyboards to be slimmer. Reducing the travel on the keys with each step.

Some of the new ones are down to 1.3mm of travel. I realize this is a personal preference, but I noticeably make more errors under anything less than 1.8mm of travel.

Hence, I got rid of the Carbon and bought a Thinkpad T14 Gen 2 which is pretty much the latest model with 1.8mm. The Gen 3 was available, but they trimmed it down to 1.5mm.

I realize this is a pretty picky hill to die on, but I can't express how significant it is for the reliable use of keyboard for me. I'll be buying T14 Gen 2's until I die it seems from here on out. Everything else about the laptop is just fine. Runs any linux I throw at it, 4k screen if desired, all the upgrade-ability I might want.

(If you get lucky, you can even find one with a proper Ethernet port. Some come without because apparently during the chip-shortage, they removed that feature)

zinxq··on How the McMurtry Electric Fan Car Clocked a 7.9-Second Quarter-Mile
The human is starting to look like the weakest link.

For such a closed track (known route to the centimeter, guaranteed no obstacles, etc) - a Self-Driving version of this could do it a good deal faster.

zinxq··on Graduate students question career options
A Ph.D. really is about the journey. I'd be surprised if anyone ever thought it represented more money. It's unlikely to matter for that.

The time I spent getting a Ph.D. was one of the best times of my life. Not just the work, but the environment, the other people in the same situation, and the personal growth. I pursued it because 1) I really did love learning about Computers, and 2) I just loved the University environment. Every time I "graduated" I just signed up again for the next degree.

I never thought much about "using it" after I got it. I think it got me a higher starting title at a company or two and impressed a few (probably easily impressed) people along the way. I think the most measurable* impact however was listing it on my dating profile.

Again - it was a journey worth taking without much thought of the destination.

*Note, I said "measurable", not "good" or "bad"

zinxq··on 12,000 Facebook employees, 15% of its workforce, may lose jobs amid quiet layoff
>I don’t think many of these people will have trouble finding a job. After all - they most likely grinded the fuck out of leetcode and system design to get in. That type of persona to do hundreds of problems doesn’t easily waver in the face of minor adversity.

Not sure you meant it, but this is an inadvertent attestation for "leetcode". As in, it's not about the leetcode, it's about the type of person that masters the leetcode.

zinxq··on SurrealDB – Document-graph database, for the realtime web
In the context of "History doesn't repeat, but it rhymes", this is just what happened when Java appeared. Everyone noting it was written in Java (as, believe it or not, it was the cool new language).

It might have actually been worse, because there was a strong penchant for naming products starting with a "J" to indicate the fact (i.e. JNotepad, JDatabase, etc).

It might actually be a good marketing technique to get other Rust aficionados to try your product. But otherwise, there isn't any real value now that "write once, run anywhere" doesn't just belong to Java anymore.

zinxq··on Don’t call it a comeback: Java is still champ
Edit: My bad - unfortunate wording. I didn't mean this as negative at all. It's cool (if niche) ability.
zinxq··on Don’t call it a comeback: Java is still champ
Indeed. Shutoff Garbage collection completely and it can work. (And make sure your Java code creates no garbage - which is a new type of programming in and of itself)
zinxq··on Show HN: MiniMail – Disposable Email Service for Everyone
To be fair, Mailinator https://www.mailinator.com has been around since it's inception in 2003. It offers other services now, but the "disposable email" part is still there as it was from the start.
zinxq··on Achieving 5M persistent connections with Project Loom virtual threads
I think we're in agreement. Ignoring under the hood - Loom's programming paradigm (from the viewpoint of control flow) is the Threading programming paradigm. (Virtual)Thread-per-connection programming is easier and far more intuitive than asynchronous (i.e. callback-esque) programming.

I still attest though - The 5M connections in this example is still a red herring.

Can we get to 6M? Can we get to 10M? Is that a question for Loom or Java's asynchronous IO system? No - it's a question for the operating system.

Loom and Java NIO can handle probably a billion connections as programmed. Java Threads cannot - although that too is a broken statement. "Linux Threads cannot" is the real statement. You can't have that many for resource reasons. Java Threads are just a thin abstraction on top of that.

Linux out of the box can't do 5M connections (last I checked). It takes Linux tuning artistry to get it there.

Don't get me wrong - I think Loom is cool. It's attempted to do the same thing as Async/Await tried - just better. But it is most definitely not the only way to achieve 5MM connections with Java or anything else. Possibly however, it's the most friendly and intuitive way to do it.

*We typically vilify Java Threads for the Ram they consume. Something like 1M per thread or something (tunable). Loom must still use "some" ram per connection although surely far far less (and of course Linux must use some amount of kernel ram per connection too).

zinxq··on Achieving 5M persistent connections with Project Loom virtual threads
Loom sets out to give you a sane programming paradigm similar to what threads do (i.e. as opposed to programming asynchronous I/O in Java with some type of callback) without the overhead of Operating System threads.

That's a very cool and a noble pursuit. But the title of this article might as well have been "5M persistent connections with Linux" because that's where the magic 5M connections happen.

I could also attempt 5M connections at the Java level using Netty and asynchronous IO - no threads or Loom. Again, it'd take more Linux configuration than anything else. If that configuration did happen though now you can also do it in C# async/await, javascript, I'm sure Erlang and anything else that does Asynchronous I/O whether it's masked by something like Loom/Async/Await or not.

zinxq··on Ask HN: Where can I see many examples of real companies' software architecture?
Here's a video of the technical (and product) evolution of Mailinator.com - and how each influenced the other.

https://www.youtube.com/watch?v=BqNfHsZ3QUc

zinxq··on The harsh truth of video games programming
This also increases the sheer quantity of "not good" games. And the ability for copycats to copy games in record time.

Relevant Escapist video about out-of-control rampant copying in Mobile Gaming: https://www.youtube.com/watch?v=Q30qZSEnI9Q

zinxq··on Ask HN: How much equity to accept as the sole tech co-founder in this case?
This is the right answer.

The biggest thing they're bringing to the table is the (supposed and impending) funding. The idea itself is nearly worthless until executed.

Good Tech Founders ARE the hardest founding team members to find.

If you accept notably less, you're always a lesser member of the team. The best founding team keeps equity and salary equal. That's the least chance for friction and resentment.

zinxq··on Ten Years of ThinkPadding
with Nix .. there is no "transition" .. only "do"
zinxq··on An Interview Question I Got Asked While Interviewing for Back End Java Developer
You cannot solve this problem with "volatile" as you answered.
zinxq··on Mozilla's Firefox Relay to be added to disposable-email-domains blacklist
Great!
zinxq··on Mozilla's Firefox Relay to be added to disposable-email-domains blacklist
> perhaps because mailinator stopped offering that service

That is untrue. Mailinator definitely still supports pointing any domain to it's MX records and will allow all incoming email (modulo DoS protection, abuse, etc). Such email will arrive in the respective Mailinator inbox (i.e. bob@yourdomain.com goes to the "bob" inbox)

zinxq··on Mozilla's Firefox Relay to be added to disposable-email-domains blacklist
The real fallacy falls to companies that equate email with identity. They were never the same thing.

The discontent comes when companies rely on that as fact, and someone comes along and via masking or disposable or lots of other ways (even just signing up for a new email at yahoo or hotmail or proton or tutanota or..) , shows them it isn't true.

zinxq··on Heroes of Might and Magic
I played HOMM3 for 5 hours straight when I first encountered it. I know that sounds like nothing, but unbeknownst to me, installing it had reset my graphics drivers to set my monitor's refresh to 50Hz.

50Hz is one of those things you can see if you look at it in your peripheral vision, but not so much straight on.

After 5 hours I was screaming in pain my eyes hurt so bad. I couldn't figure out why they hurt and I couldn't stop playing either.

zinxq··on Writing a self-modifying x86 factorial program
Came here to hope someone wrote this. Wasted many hours of my young life trying to figure out why my self-modifying assembler program worked perfect in the debugger but not without it.
zinxq··on Why general inheritance is flawed and how to finally fix it
The term "general inheritance" was not familiar to me as "inheritance across package structures". However, my OOP design intuition feels pretty good about that idea.

This quickly devolves into the inheritance vs. composition argument which isn't where I thought the Author wanted to go (but then sort of ended up going there). I agree with other commenters that it's an overstated idea. Inheritance is ridiculously useful in the right design structure, as is Composition. They both have a place. (Incidentally, bad Inheritance design usually looks very ugly very fast - bad Composition is often less glaring).

I find that years of designing in OOP has led me to build designs that have a goal of preventing me from making future mistakes and correctly consider implications of my code.

I find that my most immediate designs tend me towards Abstract Classes and Interfaces. While I usually get credit for "programming to the Interface" for this, that's not what usually led me there.

I like abstract methods. They (i.e. the compiler will) FORCE me to think about something if I ever decide to create another subclass of the Abstract class. The Author points out the "forget to call super" bug which is particularly nefarious and I avoid it at all costs. I can do that by providing a final concrete method which calls the abstract method. Let the subclasses implement that and never worry about super.

Anyway - governing inheritance across package hierarchies seems like a reasonable guideline. As for Inheritance vs. Composition, I don't favor either. When designing a class structure, I just make my best guess (as we'd all do) and find the structure quickly evolves on it's own. Usually, this ends up in a blend of shallow Inheritance trees with logical composition. There's always multiple Class Structures that will work - my goal is to find a reasonable one of those.

zinxq··on Ask HN: Has Google search become quantitatively worse?
There's a whole class of searches that no longer have value because of SEO. Try "best exercise bike" or anything that can be similarly monetized and you will of course end up at a well-crafted page designed to monetize you.

My deepest apologies for saying this, but for any type of query that has a monetization angle, I now add "site:www.reddit.com" to the query to find actual discussion about it.

Normal Reddit disclaimers apply as much of what you find is garbage but at least if you search "best exercise bike" confined to reddit you'll get real opinion not hellbent on monetizing you.

zinxq··on Caddy – Open-source web server with automatic HTTPS
Good lesson here really. Nginx is an awesome, powerful tool but quite often, you don't need something that sophisticated. Also, because of it's abilities (and legacy) it's a learned skill to configure it.

Caddy just "works" (the advent of Certs that "just work" with LetsEncrypt helped enable that).

That fills a real and important use case.

zinxq··on I analyzed SaaS billing dark patterns
At this point, it's a long evolved set of heuristics based on any available data. Some quick rules around IP, Country, and email provider gets you a fair bit of the way there. But like any heuristic system that evolves, tweaking can get you to something that's "good enough".

The next step would be an AI system (like the very impressive Stripe Radar (which admittedly is in a different context)) but we're not ready for that, nor would it bring us significant value over our current system. And again - we pipe things to human for things in the grey area.

Page 1 of 5Next →