[HN Gopher] JS1024 Results - 1k JavaScript Demos
       ___________________________________________________________________
        
       JS1024 Results - 1k JavaScript Demos
        
       Author : KilledByAPixel
       Score  : 155 points
       Date   : 2020-08-01 13:21 UTC (9 hours ago)
        
 (HTM) web link (js1024.fun)
 (TXT) w3m dump (js1024.fun)
        
       | ggregoire wrote:
       | I'm not into graphics/games development so that might be why, but
       | I had never heard of Shaders (the third category), which doesn't
       | look at all like JavaScript.
       | 
       | Demo: https://js1024.fun/demos/2020/12
       | 
       | Source code: https://js1024.fun/demos/2020/12/source
       | 
       | Shaders: https://developer.mozilla.org/en-
       | US/docs/Games/Techniques/3D...
        
       | jjcm wrote:
       | I really appreciate how well documented a lot of the source files
       | are. There are a lot of cool golf hacks/tricks in these!
       | 
       | i.e.: https://js1024.fun/demos/2020/16/source
        
         | lifthrasiir wrote:
         | Besides from being one of the winners (AquaPop1K), I also had a
         | pleasure to read every single source code to rate submissions
         | (as every submitter could rate other entries). I recommend to
         | do the same if you have time.
        
       | lifthrasiir wrote:
       | Post-mortem writeups by submitters:
       | 
       | Frank Force: https://frankforce.com/?p=7617 (1st place)
       | 
       | Raimon Rafols:
       | http://blog.rafols.org/index.php/2020/07/21/javascript-ballo...
       | (10th place)
       | 
       | Mattia Fortunati: https://www.mattiafortunati.com/detective-moji-
       | postmortem-a-... (16th place)
        
         | vanderZwan wrote:
         | > Frank Force
         | 
         | Hey, that's the guy who did Bounce Back[0] for JS13K! He's got
         | some pretty cool stuff on his website
         | 
         | EDIT: Wait a minute, that's KilledByAPixel, who submitted this
         | link
         | 
         | [0] http://frankforce.com/?p=6936
        
         | dietrichepp wrote:
         | I haven't written a post-mortem but I'll take a quick stab
         | here, and post a more polished post-mortem on my website later.
         | 
         | My demo is Star Traveler, which placed #1 in the 2D Canvas
         | category. The GitHub repository is here:
         | https://github.com/depp/demo-traveler
         | 
         | Source code: https://github.com/depp/demo-
         | traveler/blob/trunk/src.js
         | 
         | What I like about 1K demos is that you can make them in a
         | relatively short amount of time--something like a week or so,
         | without taking time off. After a week of work I was happy with
         | what I had written, out of space, and had diminishing returns
         | when I attempted to reduce the size. By comparison, JS13K can
         | be a lot more work.
         | 
         | The first thing I did was set up a development environment
         | which would reload in the browser every time I saved changes.
         | The development page showed the number of bytes left at the top
         | of the screen and put the exact, submission-ready code in an
         | iframe. Saving changes would trigger everything to be minified
         | and packed again. Packing is done with Terser -> RegPack. No
         | potentially incompatible techniques like method hashing were
         | used, but that's probably because I didn't see a size
         | improvement when I tried them. There are some custom
         | transformations on the code during compilation, mostly so I
         | could have ESLint watch my back.
         | 
         | The demo itself has three parts to it. Most of the objects are
         | rendered by callback functions, and there's a big array of
         | callback functions in back-to-front order. The function
         | closures contain any generated data necessary for drawing the
         | data. The parts are:
         | 
         | 1. Mountains and clouds, which are just simple midpoint
         | displacement fractals. The mountains were flipped upside down
         | and stretched to make clouds. Various techniques for generating
         | a fractal were tried, a recursive functional approach ended up
         | being the smallest.
         | 
         | 2. Stars, which are just randomly placed in 3D space and
         | randomly resized each frame to make them twinkle.
         | 
         | 3. The planet, which is drawn separately. The submitted version
         | draws it over the clouds. This was fixed in the repo, but not
         | re-submitted.
         | 
         | Notes on technique:
         | 
         | - Path2D turns out to be a very efficient way to specify a path
         | for a Canvas. It uses an SVG path string to specify the path,
         | which is more compact than using .moveTo() and .lineTo(). There
         | is room for improvement.
         | 
         | - The 'color' function is a beast, it lets you represent an RGB
         | color as a 3-digit number from 111 to 999, and calculate things
         | like gradients. There was a lot of tweaking to get colors that
         | I liked.
         | 
         | - Did a lot of inlining and un-inlining of functions at the
         | end. For example, if a function f(x) is defined like f(x) = 4 *
         | ..., then you can move the constant out of the function, or
         | into the function from the call sites.
         | 
         | - Checked the minified code to see how functions were being
         | emitted. If they were emitted as (x) => { a; b; }, I would try
         | to change the code so they could be emitted as (x) => (a,b).
         | 
         | - RegPack gives you limited space savings for repetitive code,
         | so use it.
         | 
         | - If you need local variables, just add arguments to your
         | function and use those.
        
       | LeonM wrote:
       | That 'Wetlands' demo (winner in shader class) is completely
       | borked in my browser (FF 79, Linux).
        
       | smusamashah wrote:
       | I though this is same as https://js1k.com/ it's not
        
       | chrismorgan wrote:
       | "Shedding snake" reminds me of a game I made on my Casio
       | CFX-9850GB+ Color in high school. It started out as snake, but
       | keeping track of the positions of the snake's pixels in an array
       | or matrix, even if treating it as a ring buffer so you weren't
       | constantly shuffling all the values in it, was really slow, so
       | that by the time the snake was even six pixels long there was not
       | the slightest bit of challenge to it because it was moving less
       | than two pixels per second (and by ten, below one). So I turned
       | it into what I called Snail Trail, with it just laying down
       | pixels behind it and never keeping track of them, because you
       | could query "is this pixel filled?" much more rapidly (and it was
       | O(1) rather than O(n2) or worse). That was much faster, and I
       | rapidly worked out the optimal strategy. A year or two later I
       | transferred it to someone's newer model of calculator which was
       | generally about six times as fast, and... yeah, I had to insert
       | busy loops to make it playable!
       | 
       | I had good times with that calculator. 32KB taught me frugality
       | not unlike that needed for competitions like JS1024, and how to
       | find that there was a character/instruction akin to a semicolon
       | in Python that took one byte, where the new line
       | character/instruction took two bytes. (I only obtained a manual
       | for the calculator after having it for two years. Figured out one
       | or two new tricks after that, but I'd worked almost everything
       | possible out by trial and error.) So power efficient, too: I
       | changed the four AAA batteries only twice in more than three
       | years of _very_ heavy usage (looking back on it, I probably got
       | more than 200h of life from each set), while all the rest of the
       | class that had the newer, faster version (except one other who
       | had the same model as me) would need to change them around once a
       | term, and they didn't use their calculators even a _quarter_ as
       | much as me. I'm going to guess figures of a CPU 6x as fast and
       | power consumption 30x as high. And those newer ones were even
       | only monochrome rather than three-colour LCD.
       | 
       | Then after I left they shifted to CAS calculators and battery
       | life was a zillion times worse again. And laptops, phones and
       | such will be even worse still. Ah well.
        
         | skitter wrote:
         | Same for me, except with the FX-9860GII and for the 'trails'
         | feature originally being a bug in my ring buffer that triggered
         | when it grew.
         | 
         | It definitely was fun to experiment within such constraints. I
         | can't remember being very concerned with program size, although
         | after a certain size there was a boundary the jump statements
         | weren't able to cross any more. Only having global one-letter
         | variables and no function calls (and a 21*7 character screen)
         | also made the code hard to read/write, but it was a fun puzzle
         | and I ended up writing a ray caster (god it was slow),
         | something akin to the game Concrete Jungle and a complete
         | 2-player implementation of Settlers of Catan, amongst other
         | things. Not sure if my math teacher was a fan of me not paying
         | attention in class though.
        
           | chrismorgan wrote:
           | I say 32KB, but the actual usable space was more like 20KB,
           | due to things like 4KB for a screen buffer if you went
           | graphics mode rather than text mode, which I did for some
           | things and needed to do if ever actually graphing, however
           | much if you used lists or matrices, _& c._ Anyway, I kept
           | writing programs (sometimes games, sometimes useful things
           | like automating the techniques we learned, such as a surd
           | simplifier or a quadratic solver or a prime checker), so
           | every so often I'd run out of space and rename a multi-letter
           | program down to one letter to save a few bytes, or comb
           | through a program to find ways of saving a few more bytes. I
           | certainly spent _many_ hours coming up with clever ways of
           | saving single bytes. It was good fun. Even sold a few
           | programs to other students for a few dollars if they had the
           | necessary transfer cable. Occasionally I'd regretfully delete
           | a program if it was no longer pulling its weight.
           | 
           | I definitely never tried a ray caster or anything that
           | complex. I can imagine that taking literally hours to render
           | a single frame, if I even coded it right.
           | 
           | I kept my calculator in my pencil case, so I always had it
           | with me in classes. I think all the teachers (definitely not
           | just maths) were pretty much resigned to me using it when I
           | finished my work in their classes (or if I didn't want to do
           | it and reckoned I could get away with it). Having three elder
           | siblings that would read books or used calculators under the
           | desk certainly helped. One teacher complained volubly about
           | the first couple of us for this very reason (and I was very
           | probably worse than them), but by halfway through my
           | schooling he said to my mother once that he always loved
           | having Morgans in his class. This amused mum greatly.
           | Stockholm syndrome, we decided.
        
         | Extigy wrote:
         | My lockdown project has been hacking up my CFX-9850G
         | calculator. So far I have physically removed the ROM of the
         | calculator and replaced it with a new ROM (I was able to get
         | old-stock chips from aliexpress) flashed with a patched version
         | of the original OS that includes a new BASIC command to jump to
         | a fixed location in RAM and start executing whatever is there.
         | This means I can write and run arbitrary machine code in the
         | calculator's RAM by abusing the built in backup feature. The
         | Hitachi CPU in the calculator is quite strange but by working
         | with the little information I can find online [1] I have
         | written an assembler and linker for creating compatible machine
         | code from a custom assembly language. The resulting code runs
         | much faster than in BASIC because it doesn't have to be
         | interpreted. Here [2] is a video of the calculator jumping into
         | RAM and running a Game of Life program that I wrote when Conway
         | died. I'm currently writing code to run the 3-colour display
         | for a replacement Forth-like shell/OS with the aim to
         | eventually get to the point where I can replace the calculator
         | ROM completely with my own. Writing my own mathematical
         | functions for a calculator is fun when (AFAIK) the CPU itself
         | lacks even multiplication opcodes.
         | 
         | [1] http://martin.poupe.org/casio/ [2]
         | https://youtu.be/cTB5YM898g4
        
       | jacquesm wrote:
       | Bad time to have your cert go bad on you.
        
       | tyingq wrote:
       | The site is unusable in portrait orientation on a phone. You
       | can't see the [X] to dismiss the pop up divs unless you rotate
       | the phone to horizontal.
        
       | vesinisa wrote:
       | I only get a secure connection error with Firefox 79 (on
       | ArchLinux) when trying to connect to that domain. The certificate
       | configuration seems to be missing some intermediate certs:
       | 
       | https://www.sslshopper.com/ssl-checker.html#hostname=js1024....
       | 
       | https://www.ssllabs.com/ssltest/analyze.html?d=js1024.fun
        
         | malinens wrote:
         | Alway there is that one arch guy in the comments
        
           | Tajnymag wrote:
           | Having the same error on Firefox Preview
        
         | vesinisa wrote:
         | Same thing with Firefox for Android ..
        
       | fasfsafsa wrote:
       | i fucking hate javascript
        
         | speedgoose wrote:
         | I like poneys.
        
       | nlh wrote:
       | There's something ironic about a site hosting intentionally tiny
       | snippets of code that's crashed / sluggish under the social media
       | hug of death...
       | 
       | BUT - the few that I've managed to see are super cool, so when it
       | comes back to life it's worth checking out!
        
         | jakear wrote:
         | Question for people that run websites that have been "hug of
         | death"ed: would your website be able to be statically hosted on
         | something like github pages, if no why not -- if yes why do you
         | choose not to, given it is free and would make all scaling
         | troubles go away (or so I've heard).
        
           | chrismorgan wrote:
           | There are two reasons why sites fall over in cases like this:
           | CPU saturation, where the solution is better caching (which
           | includes going fully static), and network saturation, where
           | the solution is either to get fatter pipes or to reduce the
           | data transferred. Hugs of death are normally due to CPU
           | saturation.
           | 
           | But in this case, I suspect that the server is just
           | saturating its network connection because of poor treatment
           | of images.
           | 
           | I have JavaScript disabled so maybe it's loading more if you
           | have JavaScript enabled, but when you exclude images, it's
           | only transferring about 152KB. Images are where it goes
           | wrong: it's serving up a large number of images, and some of
           | them are unreasonably large and high quality (like 34k place,
           | a 1000x1000 PNG of a fractal being shown at 400x400), and
           | most significantly it's using quite a few multi-megabyte
           | GIFs, which is flatly stupid and wrong and they _deserve_ to
           | have their site fall over for pulling that.
           | 
           | So the end result is at least 20MB. 20MB = 160Mb, and if your
           | server has only a one gigabit link (very common), you can
           | suddenly only cope with about six visitors per second (though
           | in practice things will start falling over before that, maybe
           | round down to five), which is not quite enough for the peaks
           | you'll get when high on HN, and it becomes a bit of a
           | cascading problem, kinda like a capacitor but bad.
           | 
           | The solution is to treat the images properly: actually
           | _compress_ them, use videos instead of GIFs, that sort of
           | thing. I reckon 3MB total is readily attainable here, which
           | would allow you to serve 40 visitors per second, which is
           | probably enough.
           | 
           | So yeah, putting your pages on a platform with really fat
           | pipes will solve problems like this after a fashion, but I'd
           | argue that it's not really _solving_ them, it's just letting
           | you get away with doing a bad job and shifting the burden
           | onto users.
        
             | lifthrasiir wrote:
             | There was 5MB preview image limit for each submission. I
             | was a bit surprised when my preview image went straight
             | into the listing after review. The organizer was a bit
             | struggling with the website (for example, there was no
             | HTTPS for the first days of the contest and multiple people
             | helped to get it working), hopefully next time it will
             | improve.
        
           | detritus wrote:
           | You're assuming everyone expects to get Hug'o'Deathed. I
           | suppose a site like the one here should expect a higher
           | bandwidth around competition and announcement time, but for
           | independent people who happen to get picked up on
           | HN/Reddit/etc?
        
           | dna_polymerase wrote:
           | Sure most websites could easily served as static files on a
           | server, but advocating for everything to be hosted on a
           | single proprietary service is not a good idea.
           | 
           | But hosting an Apache or nginx to serve static files is easy
           | enough and a single $5 or $10 instance on any hosting service
           | out there could easily survive a HN frontpage.
        
             | jakear wrote:
             | Not advocating for any service in particular (though
             | disclaimer I do work at msft), I'm honestly wondering why
             | someone would choose to ship a website as a server running
             | on a hardware time slot rental with all the setup, cost,
             | inscalability, and management that requires, as opposed to
             | a free cdn that gives you a website with only some
             | markdown.
        
               | lifthrasiir wrote:
               | Mainly because it was not a mere markdown. You can't see
               | right now, but it had submission forms with previews and
               | rating forms. Yes, you can route dynamic parts to
               | elsewhere, but it was not really static for a while.
        
           | hombre_fatal wrote:
           | > if yes why do you choose not to
           | 
           | Because there's more work in caching your dynamic server/CMS
           | to static files and often isn't trivial. And the dynamic-
           | rendered CMS is enough 99% of the time. You act like it's
           | just a button you press, and you're wondering why people
           | don't just press it.
           | 
           | It's also not a money-making venture. So you have very poor
           | ROI on making your charity site endure the rare hug of death.
           | It goes down? Oh well. It'll come back up. It's also the
           | reason you're using some cheap CPanel setup, not deploying to
           | a $5 VPS.
        
             | kristopolous wrote:
             | Cloudfront & friends are pretty easy and cheap to do.
             | 
             | I was expecting an expensive hassle, but was happy to be
             | wrong on that.
        
             | jakear wrote:
             | Sure I can understand not migrating existing dynamic
             | websites to a static deployment model - don't fix what
             | isn't broke. I suppose the question is more about
             | greenfield projects, where in my experience writing a
             | couple markdown files and pushing them to github and
             | checking the "serve this" box is easier than managing a
             | server.
             | 
             | > It's also not a money-making venture. So you have very
             | poor ROI on making your charity site endure the rare hug of
             | death. It goes down? Oh well. It'll come back up.
             | 
             | This is a very strange statement to me. My impression would
             | be that if you're running a charity site (or any site that
             | makes money from being visited), you would want it to
             | absolutely not go down during a hug of death, as that's
             | money out of your pocket at a time when it's getting a ton
             | of free publicity. Why make the site in the first place if
             | you aren't expecting it to provide value to either you or
             | the viewer?
        
               | hombre_fatal wrote:
               | >where in my experience writing a couple markdown files
               | and pushing them to github and checking the "serve this"
               | box is easier than managing a server.
               | 
               | Making a site is more than "just some markdown files".
               | Can you show me what you're talking about? Maybe I'm
               | missing it. If you mean static-site generators (they
               | aren't just a couple markdown files), they are very nerdy
               | and have pretty bad UX for most people. I don't even use
               | them. They are effectively developer-only, for one.
               | 
               | > This is a very strange statement to me.
               | 
               | Well, this is how things work. This goes back to the
               | parable of the lumberjack who didn't have time to sharpen
               | his axe, or the guy who didn't have time to write a
               | shorter letter.
               | 
               | You just want to get something online that others can
               | modify. Any additional second your pour into it is
               | probably a waste of time. A niche website like JS1024 is
               | down? Maybe nobody really cares. Maybe the only person
               | willing to host this just does things this way. Oh well.
               | 
               | Edit: Your confusion here reminds me when I got my first
               | dev job and was confused why the other developers never
               | wanted to improve these obvious problems in the code. Or
               | use new patterns. Or learn new things (16+yo VBScript
               | app, the website was one 500k line switch statement
               | running on IIS). "Doesn't anyone care?!" But as I got
               | older, "I can't be fucked" or "cbf" made a lot more sense
               | to me. Don't underestimate how often "cbf" answers your
               | questions. ;)
        
           | clddd wrote:
           | Cloudflare is free, and will take most of the hit if you can
           | serve a reasonable amount of it yourself.
           | 
           | Just gotta make sure its setup to cache your html
        
         | SimeVidas wrote:
         | The website is loading megabytes of images from its own domain
         | without a CDN. R.I.P. web server.
        
       | throwaway_pdp09 wrote:
       | It's slow AF because the smallish images are in fact much larger
       | but shrunk and many animated on top of that. So far that page has
       | pulled 15MB down and is still going.
       | 
       | Edit: up to 24.5MB now.
       | 
       | Edit: 34.5MB now and still going
       | 
       | Edit: 44.4MB and still going. It's clearly slowing down badly.
       | I'm killing it.
        
       | flywheel wrote:
       | If you enjoy this kind of thing, check out the wizardry/madness
       | over at https://www.dwitter.net/ - javascript animations in 140
       | bytes (the size of a tweet, hence the name, "dwitter").
        
       ___________________________________________________________________
       (page generated 2020-08-01 23:00 UTC)