[HN Gopher] My thoughts on writing a Minecraft server from scrat...
___________________________________________________________________
My thoughts on writing a Minecraft server from scratch in Bash
Author : jscob
Score : 369 points
Date : 2022-02-15 15:16 UTC (7 hours ago)
(HTM) web link (sdomi.pl)
(TXT) w3m dump (sdomi.pl)
| Brian_K_White wrote:
| You can read and write binary, including null, in pure bash,
| without even subshells, let alone external processes like dd and
| xxd.
|
| This is a driver/client for a vintage portable disk drive that
| has an rs232 interface. Any disk drive obviously has to handle
| arbitrary data including binary including 0x00.
|
| It's entirely in native bash with no external tools and not even
| any subshells. It does have to call stty and mkfifo once at
| startup, but that's just startup like to open the serial port,
| not part of the work.
|
| https://github.com/bkw777/pdd.sh
|
| The gimmick for reading nulls is not exactly efficient. Basically
| you read one character at a time and look at the errorlevel from
| read to detect the difference between "got nothing" and "got
| 0x00"
|
| It's fine for this case because the drive is so slow and small
| that even the entire disk is only 200k max. Making bash read one
| byte at a time for 200k is still nothing today but only because
| hardware is insane today.
|
| But it's possible. And the beginning of the post does say "as a
| thought experiment".
|
| Similarly, you don't need xxd to convert back & forth between raw
| binary and text encoding.
|
| My own similar thought experiment included the idea that, if I'm
| not going to use any external process I can possibly avoid and
| only use internal bash features, on the flip side of that, I will
| squeez bash for all it's worth, allow every bashism possible.
| dolmen wrote:
| Using awk is cheating.
| NieDzejkob wrote:
| I'm sure patches are welcome.
| blurker wrote:
| I am in awe. Also, I think your are a huge masochist! It's like
| wood working with cutlery. But it's actually really informative
| about some advanced bash knowledge. Kudos!
| js2 wrote:
| Where there's a will, there's a way. I once needed to do network
| calculations where I only had some very limited tools, so I used
| awk to convert 32-bit ints to a 32-character ascii bit string of
| "1" and "0" and the converse function, then wrote and, or, and
| not functions that worked on the ascii strings.
|
| https://gist.github.com/jaysoffian/e41ca479d70e60efe59fded93...
| gorgoiler wrote:
| The _one thing_ that people who understand bash have in the
| forefront of their minds is error handling.
|
| You can be a wizard in bash if nothing ever goes wrong. Functions
| calling functions calling functions. It's basically programming.
|
| Until something goes wrong. Then there's nothing you can do.
|
| Anyone who has ever set-dash-ee'd and then seen a function
| execute without set-dash-ee when used in an _if_ context knows
| what I mean.
| xg15 wrote:
| That's why the cool kids today use set -euo pipefail.
|
| Or set -x if you're debugging.
| naniwaduni wrote:
| That ... doesn't solve the problem GP is noting.
| gorgoiler wrote:
| You may have missed my point.
|
| Set -e is not global. It only applies in some cases. In other
| contexts (inside a function when called as if <function>)
| errors will not be caught and once you realise that you
| realise there's no hope of writing error proof logic in bash.
| xg15 wrote:
| Ah, I'm sorry. I didn't realize the problem with functions
| and indeed misunderstood.
|
| I mean, while it's amazing what you can do with bash, I'd
| be wary to use it for "production" stuff. So far, I mostly
| used it for "toolbox" type if stuff that is only supposed
| to be used by the devs. For that purpose, it worked well
| though.
| fao_ wrote:
| I'm surprised this person didn't switch to using wcalc, instead
| of awk. For comparison:
|
| fao_@blob:~$ time $(echo '' | awk '{print (2*-1)}' >/dev/null)
|
| real 0m0.006s user 0m0.006s sys 0m0.000s
|
| fao_@blob:~$ time $(wcalc '2*-1' >/dev/null)
|
| real 0m0.005s user 0m0.001s sys 0m0.005s
|
| I'd imagine you could use something like xargs to insert the
| number so that wcalc can interpret the bits for you
| folmar wrote:
| The results you post don't seem to differ much, do you mean the
| difference is bigger as the inputs get larger? Spawning an
| extra subshell inside 'time' seems strange, as does using echo
| instead of </dev/null.
|
| Also: people wiriting things in bash usually try not to rely on
| utilities that are not present by default, and wcalc is not.
| arendtio wrote:
| This reminds me of the xmpp chat bot written in sed:
| https://github.com/horazont/xmpp-echo-bot
|
| While I admire the skill involved, I keep wondering what drives
| people into starting such projects :D
| chaps wrote:
| At one point I've had a NBT parser implementation implemented
| almost fully, but I decided it was not worth the hassle to finish
| it. The code is currently lost, due to my extensive use of tmpfs
| as a project directory, and a system crash.
|
| Hah, are you me? I also lost some Minecraft server management
| stuffs written in bash in a tmpfs dir. It was years ago, but I
| 100% feel your pain.
|
| Also, well done! This looks like it was a lot of fun.
| rootsudo wrote:
| this is so cool.
| userland_tech wrote:
| Not as cool as this :) but I recently released an app for running
| Minecraft servers from your phone. CraftBox:
| https://play.google.com/store/apps/details?id=tech.ula.craft...
| lsferreira42 wrote:
| I just love this, this is why i love programming and writing a
| forking minecraft server in C was one of the most fun things i
| did in computing, i still have the source for that experiment,
| good times!
| ShortStretto wrote:
| Projects like this make me warm inside. Lovely work.
| mmastrac wrote:
| This is pretty wild. It could actually be useful as a quick and
| dirty lobby that doesn't require a full server.
| puyoxyz wrote:
| true, but better projects for that already exist
| stnmtn wrote:
| Reading stuff like this makes me think about how much more...
| "Fun" game programming is than the stuff I do in web dev.
|
| These problems (yes, self-constrained) look like so much fun to
| solve, in a way that "I did xyz thing in pure CSS" is just less
| so to me.
|
| Maybe It's that I miss rapid cycle of Completely Lost -> Earth-
| shattering Realization of How To Make This Work that the first
| ~1-2 years of my programming journey was full of
| _hl_ wrote:
| What's next, a database in pure bash? It's really impressive what
| some people can do with a couple of shell scripts.
| Izkata wrote:
| From a quick search didn't find anyone going all out, but did
| find this that could be used as a starting point:
| https://matt.might.net/articles/sql-in-the-shell/
| Klasiaster wrote:
| Besides the nostalgia, the website font is so easy on my eyes I'm
| considering to give up space and start to use it as well
| zymhan wrote:
| > The code is currently lost, due to my extensive use of tmpfs as
| a project directory, and a system crash.
|
| As if the project wasn't enough of a challenge on it's own, let's
| throw in some russian roulette!
| mig39 wrote:
| Appreciate the QR code! I scanned it. You should too.
| h2odragon wrote:
| gloriously insane. So how do we represent /proc in such a way as
| to make interacting with it through minecraft useful?
|
| "psDoom" was great fun now i see "tunnel through the DB's page
| tables searching for a more direct route to the application
| engine"
| netr0ute wrote:
| > So how do we represent /proc in such a way as to make
| interacting with it through minecraft useful?
|
| Not exactly what you wanted, but Hajime can already query info
| from /proc to make it accessible from within Minecraft.
|
| https://github.com/Slackadays/Hajime
| touisteur wrote:
| Such a fan. 'The code is currently lost, due to my extensive use
| of tmpfs as a project directory, and a system crash.'
|
| And I was sad to see some things farmed out to awk. I mean what's
| next? bc? ed? ;-)
| chairmanwow1 wrote:
| I think the first Q in the FAQ warms my heart:
|
| > Q: Why?
|
| > A: Because I could. And it was fun!
| asddubs wrote:
| my full question was actually "why would you do that to
| yourself?"
| r3trohack3r wrote:
| I've found bash to be a pretty fulfilling language to work
| in.
|
| I fed The Linux Documentation Project and Pure Bash Bible
| into my Anki decks which was really a turning point in
| writing bash for me.
|
| It's pretty amazing how much can be accomplished in a
| relatively small amount of bash.
| Nuzzerino wrote:
| Can you give some examples? I've personally found bash to
| be among the most difficult to work with. If I need to do
| something in bash I'd rather keep it as a lightweight
| wrapper around a ruby script or something, though I know
| that isn't always an option
| [deleted]
| fabiomaia wrote:
| If you are manipulating files and processes, bash is a
| very natural and succint language to do so. Programs are
| much more elegant than a generic programming language.
| bradwood wrote:
| Bash is about pipelines which is a rather functional
| concept. If you can exploit these you can write succinct,
| readable and effective bash IMHO. If you're just
| stringing together a lot of conditionals it gets ugly
| fast.
| munk-a wrote:
| I haven't worked extensively in Bash alone but I did work
| extensively in Make for a while and I can say with
| confidence: the specialized old tooling languages are
| extremely good at what they do, Make goes out of its way to
| make building things extremely slick. These language tools
| were designed to tackle every problem in their realm
| because, for a lot of people, there wasn't an alternative -
| their structure shows clear and careful design intent.
| MaxLeiter wrote:
| the best praise I've received for something I worked on was:
| This is an absolutely batshit crazy idea. I love it.
|
| Sometimes its just fun to do something that's ridiculous. We're
| all talking about it here, aren't we?
| Waterluvian wrote:
| I was expecting this to just be "the netcode was written in Bash.
| For the actual game state management, we just use existing X."
| But no, it looks like they've covered ALL of that.
|
| Wow.
| rightbyte wrote:
| I guess inline awk is fair game.
| unixhero wrote:
| and sed
| baq wrote:
| There's a fine line between classy masochism and utter
| batshit insane lunacy, sir.
| Waterluvian wrote:
| It's such a nebulous thing, eh? I'd say `Awk` (like curl,
| sed, grep, etc.) is part of the Bash toolkit. But then why
| isn't Python?
|
| I guess the idea is that Bash is about piping together these
| small programs that typically take stdio and produce stdout.
| I think these have a name.. like GNU-style programs or
| something.
| maccolgan wrote:
| It's called UNIX scripts, GNU is Not Unix.
| xg15 wrote:
| Anime avatar, uwu - und completely insane networking projects.
| Glad to know hacker culture is alive and well xD
| oh_sigh wrote:
| anime avatars and uwu are as much a part of hacker culture as
| burritos are
| bobthebuilders wrote:
| anime has been a part of hacker culture since a while now
| TadeusTaD wrote:
| I dare say it's a part of the hacker culture for as long as
| both coexist
| bozhark wrote:
| Ghost in the fucking she'll yo
| dijit wrote:
| There's definitely a strong correlation among certain
| segments of hacker culture.
|
| There's a lot of furries too.
|
| Might be confirmation bias, we see the people that stick out,
| but to say there isn't a large cohort that strongly
| identifies with anime is just wrong.
| maccolgan wrote:
| >There's a lot of furries too.
|
| Wrong part of the internet.
| detaro wrote:
| Nope. Internet infrastructure almost runs on furries
| nowadays.
| bozhark wrote:
| Furries run them tubes
| xg15 wrote:
| owo.
| bobobob420 wrote:
| out of touch with new gen
| oh_sigh wrote:
| nope.
| weakfish wrote:
| bobobob420 wrote:
| fair enough
| daptaq wrote:
| > uwu
|
| Debatable part of hacker culture. I'd say it's more a part of
| postmodern culture.
| bloqs wrote:
| alexjplant wrote:
| The Fixedsys-esque font in conjunction with the Anime aesthetic
| seems to tilt more towards vaporwave IMO.
| chasil wrote:
| I notice that the author is going into awk for floating point
| processing. The 1993 language standard for the Korn shell brings
| floating point into the language as a native data type. This
| advanced version of the Korn language does not appear to be under
| active maintenance, but it will likely be much, much faster than
| handling floating point in awk. Unfortunately, none of the BSD-
| licensed clones of Korn support the 1993 standards (including
| floating point).
|
| I also see that the author is having some trouble reading
| individual bytes. Perhaps these shell tricks might be useful.
|
| http://www.etalabs.net/sh_tricks.html
| TkTech wrote:
| > As in my opinion the wiki page doesn't explain it well enough
| to quickly comprehend, here's another drawing:
|
| Contributions welcome :) Our wiki is open and anyone can edit. If
| you can ELI5 something to make it easier to understand, go for
| it.
___________________________________________________________________
(page generated 2022-02-15 23:00 UTC)