Hacker Newsnew | past | comments | ask | show | jobs | submit | netcoyote's commentslogin

Thank you for a great comment; I learned two new words today!


Git is a DVCS, but many companies have a build server/cluster that depends on Github or Codeberg being available.

Teams I've worked on for the last several decades aim to push 10-20 builds per day to external alpha testers, so any downtime in Github is going to be an impediment.


My first programming position was a summer job while in college. I worked for a small company that specialized in Stage 1 research grants, and they had secured funding from NIH (USA - National Institutes of Health) to build a prototype food logging app for OS/2, to be used by consumers to log their meals.

Food logging is a ridiculously complicated task. Starting from "I ate chicken with rice, some salad, and some ice cream", this leads to myriad questions:

- What part of the chicken? Breast is lower fat than thighs.

- Did you remove the skin?

- How much chicken did you cook? Did you eat all of it, or leftovers?

- Did you cook it in oil? How much oil? What kind? Cooking temp & duration?

- You added some spices, right? What kind? How much?

- What kind of rice? White, Brown, Arboreal, Jasmine? White rice is basically sugar, might as well have a can of Pepsi.

- Was your salad a real salad with vegetables, or a tepid Caesar salad of iceberg lettuce, cheese and croutons. Did you have dressing? I hope you had vinagrette, but probably ranch.

- Be honest, you horked down the entire container of ice cream, didn't you.

- etc.

My job was to build an app that made it easy for a family member to log their consumption for everyone in the family, in just a few minutes, because the longer it takes, the less likely it is that they'll log anything.

I was given the source code to a previous project from another Stage 1 research grant that had a food/nutrition database (using BTrieve, a Terminate-and-Stay-Resident DOS application).

At the end of the summer, I had a working program that showed it was conceptually possible to do this, if you were a really good typist. While it was a Windows GUI app, using buttons and dropdowns was way too slow for data entry, so the app was designed to make it easy to enter data by typing and tabbing.

I convinced them to use MS Windows 3.0 instead of OS/2 because even then it was clear (even to me, a dumb college kid) that no one would ever use OS/2 in the home market.

Re-envisioning the problem as one where users take pictures is a big step forward, but there's still going to be a whole lot of approximation on calories and nutrition because it's necessary to guess what's inside the food concoction.

On the other hand, just using an app like this to track is great for users just to create more visibility and awareness of what they're actually eating.


One of the tricks that we can use as good managers is code ownership. The folks who wrote the code are the ones who get to fix the bugs in the code.

While they’re busy fixing their own problems, the teams that wrote outage-free code get first dibs on writing new systems.

On the (online game) teams I worked on there are an infinite number of new & exciting systems needed, so this approach means that the best developers are the ones building them.


Great as long as no one ever leaves, but the second someone does suddenly I’m being punished for owning their idiocy. And people are always leaving


Especially the kinds of people people who tend to create such monstrosities- they either move up or move on (to the next victim)


The concept of the responsible party bearing the costs is a good one, but if we're honest about who that is, it's often going to be company leadership.

The person who made the breaking change is often diligently following instructions to get it done as soon as possible.


That’s an extremely game centric point of view. Game devs more than just about anyone else are strongly identified with their code and have an artist attitude about. In a non game environment the psychology is different.


That's a great point, and a fair criticism!


Tools I’ve built for myself:

- sandvault https://www.codeofhonor.com/projects/sandvault/ runs agents in a separate macOS user account, hardened with sandbox-exec. It also supports headless browsing and iOS Simulator from inside the sandbox for testing web and iOS apps.

- clodpod https://www.codeofhonor.com/projects/clodpod/ agents run inside a macOS VM.

- git-multi-hook https://www.codeofhonor.com/projects/git-multi-hook/ git only allows one script per hook event; this is a dispatcher that discovers and runs every script in a hooks dir, in parallel, for both global and repo hooks.

- TubeGate https://www.codeofhonor.com/projects/tubegate/ Chrome extension to block YouTube videos based on keywords (like “sponsored”).

- push10k https://www.codeofhonor.com/projects/push10k/ iOS app to track my progress toward 10,000 push-ups.

My blog is AI-coded: Zola static site, Sveltia CMS, Cloudflare Pages/Workers, with GitHub Actions handling builds and syndication. https://www.codeofhonor.com


Wait. You worked on Guild Wars, Starcraft, Warcraft, and Diablo?

This place is incredible.


Guild Wars was one of the most fun games ever. The crazy combinations of skills you could try in the random arena were so much fun.

Guild Wars 2 and most other games are pure slop.


They did announce Guild Wars 3 last Friday btw. Not set to release until 2027.

Also Guild Wars 1 has been receiving new content updates this year.


I just found your blog yesterday reading up on the stories of how Warcraft and Starcraft were made!! Have been hacking on small games and a tool to build 3d environments for a while and get very inspired by hearing stories from back in the day. Thanks for making everything public. I really enjoy your writing.


Thank you, glad you enjoyed the articles. I wish I had the motivation to write more!


I'm sure it will flow when the time comes :P

For me.. the most interesting part of the whole Warcraft saga would be more discussions around the arguments/design decisions of.. "we should include ___."

For example... War2 stuck with two races (and introduced alliances w/ other races like elves) instead of adding new races. How did you get to that decision? did you do any prototypes? Was it just a pure argument? What did you find in the process?

That kind of behind the scenes design discussion is rarely surfaced (and often messy) but is as interesting (to me) as the technical decisions.


One more idea.. You've worked across great companies and great games. If you were going back now to your former self striking out to ship your first commercial game, what are the 3-4 pieces of wisdom you wish you'd internalized back then?


Cool but mate, this is just not true:

>>Some content-management software (CMS), like WordPress, requires using the same presentation layer that the CMS uses

Headless wordpress has been a thing for quite a while and it’s trivial for a use case like this


You are correct, I will amend that. I do think that locks you out of a lot of the plugin ecosystem if using it as a static site generator, yeah?


As a developer who deploys wordpress often, I can tell you that if you have the resources (experience and time) to setup a headless wordpress you probably don’t need 99% of plugins. The really important ones (ACF Pro, cookies-stuff, SEO etc) are compatible with headless. I regularly deploy non headless high impact wordpress sites with about 6 plugins max. Theme is custom developed as a skeleton starter plus custom fields. I feel you though, it’s imperfect but so far I haven’t found an alternative for client work especially that beats the WP ecosystem


This sounds like it's worth a blog post. I'm sure lots of folks, including me, would be interested in the details of which plugins to maximize utility, and what the deploy process looks like. Cheers!


Thanks to Push10K now I am on my 160th day of streak and 13,135 pushups (or my own version of equivalents) so far. It is the best thing I did after feeling like Glutton after dinner last Christmas.


That is awesome! Congratulations on completing so many — and such a big streak! Good luck on your journey to the 20k, and let me know if you need any features to make it work for you.


> - git-multi-hook https://www.codeofhonor.com/projects/git-multi-hook/ git only allows one script per hook event; this is a dispatcher that discovers and runs every script in a hooks dir, in parallel, for both global and repo hooks.

Newest Git supports hook events.


You are correct: git 2.54 supports multiple hooks via a the git repo and global configuration files.

Git-multi-hook predates that, but I updated it to use the new 2.54 config-based format.

The significant advantage of git-multi-hook is that they all run in parallel. I run eight hooks on precommit, so parallelism is a big win.

I will update the README to make note. Thanks!


git-hook documentation says that hook events can be configured to run in parallel.


Here's what gemini says about running hooks in parallel:

> Native Git traditionally executes hooks sequentially. However, you can achieve parallel execution by leveraging dedicated third-party hook managers or using built-in shell background processing

.. and that's what git-multi-hook is: a third-party hook manager, that uses shell background processing :)


Just out of curiousity, what are the 8 hooks you run?


The precommit checks I run are:

- end-with-blank-line: normalize file endings

- find-do-not-commit: do not commit files that include "DO NOT COMMIT"

- lint-code: run `$REPO/scripts/lint` if it exists

- lint-nodejs: run `$REPO/{pnpm/yarn/npm}` lint if `package.json` exists

- lint-shellcheck: shellcheck all the files that have no extensions or end in `.sh` that have a shell-shebang

- lint-swift: run swiftlint

- prevent-commit-secrets: run ripsecrets to avoid committing secrets and credentials

- validate: run `$REPO/scripts/validate` if it exists

By default all of the scripts check the files in the git staging area, but they can also be run standalone to check everything. You can find them here: https://github.com/webcoyote/git-multi-hook. Glad to take suggestions for more.


I see how it is.


I would love to see the push10k on android playstore/fdroid. It looks so inviting and motivating that I searched for equivalent alternatives for android but found none! Would you, maybe, publish it there as well, pleeeease?


Thanks for the push10k app, I didn't know I was looking for something like this


Glad you’re enjoying it. It started as a tool for my own motivation, and I’m so glad it’s helped you too :)


I grew up playing Warcraft II. Thanks for all of those great times.


Glad you enjoyed playing. It was an amazing journey building the game, and I’m grateful so many folks appreciated the experience we created.


revenue != margins

There are 20,000 games released per year that split all that revenue, minus the cost of building those games.


My point was we know those are decent margin industries and video games aren't any more expensive, but anyway you usually look at 20% margin in the industry give or take 10% depending on the scale and particularly advertising costs at large scales.


There must be something in the air, because I just migrated away from WordPress & Bluehost too: https://www.codeofhonor.com/blog/migrating-away-from-wordpre.... I'm so much happier with the site.

The solution I'm using is certainly not as mature and featureful as WordPress, but I don't have to patch it for security holes so frequently either.


I've tried a lot of editors, including Zed, and always come back to Sublime Text.

I use it every day. The #1 reason is because it never loses unsaved files (though I'm still working on breaking the habit of typing a few characters and pressing Ctrl-S). Column editing! Macros! Record/Playback! Configuration! Plugins! Responsiveness! Low resource utilization! Etc!

Why wouldn't I pay for it? I've bought all four versions. The author deserves to be paid.

I guess the question is: why don't you want to pay for it? Assuming here that you're a professional coder being paid a reasonable, US-equivalent salary. I understand not everyone fits that situation; plenty of us pirated software as starving college students / interns, folks in other countries don't get the same pay for the same work, etc.

We should all want to pay the authors of great software. We're on HN, which is a celebration of creating great code and awesome businesses.

"Pay him. Pay that man his money" - Teddy KGB


> never loses unsaved files

This is a big one indeed. I keep many unsaved tmp notes and pastes open all the time. Sublime Text also have it's super smooth pane and window management, so easy to select many tabs, drag and drop tabs to windows etc. Never mind what is unsaved and not. Everything always there on open anyway.

I think this is a highly requested feature in Zed as well, but not sure if they are actually working on this or not.


One of the fun features that I developed for Warcraft (the RTS) was to fade the screen to grayscale when the game is paused.

Since the game uses a 256 color palette, it was only necessary to update a few bytes of data (3x256) instead of redrawing the whole screen, so the effect was quick.

I also used this trick when the game stalled due to missing network packets from other players. Initially the game would still be responsive when no messages were received so that you could still interact and send commands. After a few seconds the game would go into paused state with grayscale screen to signify the player that things were stuck. Then several seconds after that a dialog box would show allowing a player to quit the game.

This was much less disruptive than displaying a dialog box immediately on network stall.


One of my favourite things of being on HN is reading comments like this. Namely, devs who worked on games I played growing up. I absolutely love hearing stories from their past about little technical nuances like this comment. The more technical / specific, the better.

I'd honestly love to compile a book of "war stories" told by devs like netcoyote.

Maybe I will.

Net, if you're interested, hit me up.


This is a great idea, but respectfully, if you're going to get traction you need to be the one instigating getting people to talk to you. Have a pitch, have an explicit ask, and be willing to put effort into making it happen.

Fantastic idea though, you should do it.


There are a few of these floating around for older games, but the world needs more:

Ara technica has a war stories feature on game development.

https://arstechnica.com/video/series/war-stories

For apple 2 games John Romero did a podcast. It’s decent but he seems to have stopped doing them.

https://appletimewarp.libsyn.com/ Or YouTube

Ted dabney experience has a lot of interesting interviews with older arcade game designers:

https://www.teddabneyexperience.com/episodes


Gamasutra's "Postmortem" series was great: https://web.archive.org/web/20210823172711/https://www.gamas...


Sid Meier's Memoir! is exactly that, Sid Meier wrote a memoir which is indeed mostly war stories of his involvement in making games.


Wow, thank you for sharing. If I could upvote your comment twice, I would. I'm going to enjoy this series.


Oh, and I forgot to mention that pause had to be synchronized across the network, so the pause button would pause for all players.

And in the "this is why we can't have nice things", that also introduced problems, because we didn't want a player who was losing to keep pausing the game until the winning player quit out of frustration, so I think we kept a per-player pause counter, which would only be restored if other players also paused? (I don't quite remember all the details, just that we had to prevent yet another abuse vector).


I remember something like this back when playing StarCraft (maybe Brood War, it's been a minute) online.


Palette rotation was also heavily used by Ultima & Origin games up to U8 - Pagan


Omg I love this! I have been finding excuses to do little animation engine features that arent on the critical path of development for the sake of creative self-indulgence. Such features shipped was alpha channel based fading using the fundamental opengl fade parameter (under the hood its a linear interpolation of alpha values over 256, pieced together over a provided pair of timestamps).

I tell you what I'll do today on my dev time, I'll try implementing grayscale without aby research on pause and then compare notes (I'm assuming this wc code is available somewhere, which may be a bad assumption)


WC code is likely not (legally) available, but Wolfenstein and Doom both did similar palette tricks and are documented in the Black Books for each - https://fabiensanglard.net/three_books_update/index.html

Code for those is available.


Oh rad! Thanks for the heads up. I'll do a post-dev comparison to see what I land on and what was done here.


While I don't have the original code, it's something along the lines of this:

    // for each palette entry:
    pal.r = pal.b = pal.g = (byte) (0.299 * pal.r + 0.587 * pal.b + 0.114 * pal.b)


So I was able to create all the bits necessary to introduce the palette change in a similar manner (3x256 changes) on the triggerz and at the moment of truth instead of grey I got a GREEN and PURPLE fadeout (I wasnt sure if you meant rbg or rgb for the ratios so i tried both).

I also tried 128 across the board for grey, and it just made a dull fade which may be the best I can do with my method.

I think it may simply be because rather than have palletes controlled by rgb, I load predrawn sprites using sfml's sprite and texture classes. So the default rgba is 255,255,255,255 - so I have a sidequest to figure out the RIGHT WAY of applying rgb changes to predrawn sprites.

It may very well be a simple matter of "sfml does it differently" or perhaps having grey variants of all sprites and toggling. I feel there has to be a way to accomplish the fade to grey programmatically. Fun little dive tho! I'll have to post an update when I figure it out.


From my recollection of doing fun palette stuff back in the DOS VGA days, I'm betting it was more like:

    pal.r = pal.g = pal.b = (77 * pal.r + 150 * pal.g + 29 * pal.b) >> 8;
Hardware floating point was rare before the 486 DX and Pentiums. Not to mention that Integer<->FP conversion was slow. And division of any kind has always been slow. So you'd see a lot of fixed-point math approximations with power-of-two divisors so that you can shift-right.


I havent gotten behind the console, but thats like, exactly what I was gonna do, except precompute like 5 or 6 tween values for r,g,b between 255 and the target for greyscale.

But rather than do that and cache them for timing triggers, I kind of like the scaling down by multiplication approach.

Edit: manipulate the rgb values that is - I wouldnt have converged on those hard values on my own.


This was a neat design choice I remember it well.

And also that my “sound card works perfectly!”


I so hate the videos YouTube shows me that I wrote a plugin to place a white box over videos called TubeGate [0], which I open-sourced [1]. It does keyword-based filtering so you can tell it to hide "sports", "politics", etc.

[0]: https://chromewebstore.google.com/detail/tubegate/aokfpmegea...

[1]: https://github.com/webcoyote/tubegate


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: