• 3 Posts
  • 275 Comments
Joined 3 years ago
cake
Cake day: June 14th, 2023

help-circle
  • SIMD is pretty simple really, but it’s been 30 years since it’s been a standard-ish feature in CPUs, and modern compilers are “just about able to sometimes” use SIMD if you’ve got a very simple loop with fixed endpoints that might use it. It’s one thing that you might fall back to writing assembly to use - the FFmpeg developers had an article not too long ago about getting a 10% speed improvement by writing all the SIMD by hand.

    Using an NPU means recognising algorithms that can be broken down into parallelizable, networkable steps with information passing between cells. Basically, you’re playing a game of TIS-100 with your code. It’s fragile and difficult, and there’s no chance that your compiler will do that automatically.

    Best thing to hope for is that some standard libraries can implement it, and then we can all benefit. It’s an okay tool for ‘jobs that can be broken down into separate cells that interact’, so some kinds of image processing, maybe things like liquid flow simulations. There’s a very small overlap between ‘things that are just algorithms that the main CPU would do better’ and ‘things that can be broken down into many many simple steps that a GPU would do better’ where an NPU really makes sense, tho.


  • I learned z80 assembly back when the cutting edge of technology was a ZX Spectrum, and 68k assembly when I upgraded to an Amiga. That knowledge served me quite well for my early career in industrial automation - it was hard real-time coding on eZ80’s and 65c02 processors, but the knowledge transfers.

    Back in the day, when input got mapped straight into a memory location and the display output was another memory location, then assembly seems like magic. Read the byte they corresponds to the right-hand middle row of the keyboard, check if a certain bit is set in that byte, therefore a key is held down. Call your subroutine that copies a sequence of bytes into a known location. Boom, pressing a key updates the screen. Awesome.

    Modern assembly (x64 and the like) has masses of rules about pointer alignment for the stacks, which you do so often you might as well write a macro for it. Since the OS doesn’t let you write system memory any more (a good thing) then you need to make system calls and call library functions to do the same thing. You do that so often that you might as well write a macro for that as well. Boom, now your assembly looks almost exactly like C. Might as well learn that instead.

    In fact, that’s almost the purpose of C - a more readable, somewhat portable assembly language. Experienced C developers will know which sequence of opcodes they’d expect from any language construction. It’s quite a simple mapping in that regard.

    It’s handy to know a little assembly occasionally, but unless you’re writing eg. crypto implementations, which must take the exact same time and power to execute regardless of the input, then it’s impractical for almost any purpose nowadays.



  • You’d assume that, but then you’ve not had the misfortune of using Google Cloud. “Because fuck you, that’s why.” – Sundar Pichai.

    The big benefit of AWS Linux and Azure Linux is they start up really really quickly on their respective platforms, so if you’ve an app to run that’s fairly platform agnostic then it’s easy to deploy at scale. If it’s not very platform agnostic then you’re in for a world of pain. AL2023 in particular seems to just rename all the packages differently from any other distro just for the fun of it.


  • I have a Tuxedo Pulse 14 gen 3 as my personal laptop, was looking for something with a bit more display resolution than my old 1080p machine, but did not like the price of 4K laptops.

    It has been superb for over a year now. Came with Tuxedo’s own Linux, which looked pretty but wasn’t for me. Installed Arch on it, has been rock solid. Is a great machine for coding on, makes a great job of running Dwarf Fortress and less stressful 3D games - Crusader Kings 3 and Disco Elysium run great, for instance. Battery life impressive too.

    Been quite robust, too - heard complaints that the lid can get a bit loose but mine’s fine. All the rubber feet have come off the bottom, but that’s probably because I use mine on my lap. They prefer that you install their own fan control app rather than eg. just providing drivers so that you can set it up in CoolerControl, but it works fine.

    All in all, good machine. Better than the ThinkBook that it replaced, and those are fine laptops.




  • Yeah, mine was similar. Had some old Win95 machines from work that were getting thrown away; scavenged as much RAM as possible into one case and left Red Hat Linux downloading overnight on the company modem. Needed two boxes of floppy disks for the installer, and I joined up a 60 MB and an 80MB hard drive using LVM to create the installation drive. It was a surprisingly functional machine - much better at networking than it was as a Win95 computer - but yeah, those days are long gone.


  • Enough of that crazy talk - plainly WheeledDeviceServiceFactoryBeanImpl is where the dependency injection annotations are placed. If you can decide what the code does without stepping through it with a debugger, and any backtrace doesn’t have at least two hundred lines of Spring boot, then plainly it isn’t enterprise enough.

    Fair enough, though. You can write stupid overly-abstract shit in any language, but Java does encourage it.



  • Well now. My primary exposure to Go would be using it to take first place in my company’s ‘Advent of Code’ several years ago, in order to see what it was like, after which I’ve been pleased never to have to use it again. Some of our teams have used it to provide microservices - REST APIs that do database queries, some lightweight logic, and conversion to and from JSON - and my experience of working with that is that they’ve inexplicably managed to scatter all the logic among dozens of files, for what might be done with 80 lines of Python. I suspect the problem in that case is the developers, though.

    It has some good aspects - I like how easy it is to do a static build that can be deployed in a container.

    The actual language itself I find fairly abominable. The lack of exceptions means that error handling is all through everything, and not necessarily any better than other modern languages. The lack of overloads means that you’ll have multiple definitions of eg. Math.min cluttering things up. I don’t think the container classes are particularly good. The implementation of pointers seems solely implemented to let you have null pointer exceptions, it’s a pointless wart.

    If what you’re wanting to code is the kind of thing that Google do, in the exact same way that Google do it, and you have a team of hipsters who all know how it works, then it may be a fine choice. Otherwise I would probably recommend using something else.


  • I feel that Python is a bit of a ‘Microsoft Word’ of languages. Your own scripts are obviously completely fine, using a sensible and pragmatic selection of the language features in a robust fashion, but everyone else’s are absurd collections of hacks that fall to pieces at the first modification.

    To an extent, ‘other people’s C++ / Bash scripts’ have the same problem. I’m usually okay with ‘other people’s Java’, which to me is one of the big selling points of the language - the slight wordiness and lack of ‘really stupid shit’ makes collaboration easier.

    Now, a Python script that’s more than about two pages long? That makes me question its utility. The ‘duck typing’ everywhere makes any code that you can’t ‘keep in your head’ very difficult to reason about.


  • Frezik has a good answer for SQL.

    In theory, Ansible should be used for creating ‘playbooks’ listing the packages and configuration files which are present on a server or collection of servers, and then ‘playing the playbook’ arranges it so that those servers exist and are configured as you specified. You shouldn’t really care how that is achieved; it is declarative.

    However, in practice it has input, output, loops, conditional branching, and the ability to execute subtasks recursively. (In fact, it can quite difficult to stop people from using those features, since ‘declarative’ doesn’t necessarily come easily to everyone, and it makes for very messy config.) I think those are all the features required for Turing equivalence?

    Being able to deploy a whole fleet of servers in a very straightfoward way comes as close to the ‘infinite memory’ requirement as any programming language can get, although you do need basically infinite money to do that on a cloud service.




  • addie@feddit.uktoMemes@sopuli.xyzRIP obsolete tech
    link
    fedilink
    arrow-up
    3
    ·
    9 months ago

    We used to do that in industrial automation. If you make any changes to the PLC / HMI / SCADA software, burn a DVD with what you changed and leave it next to the rack. No danger of bringing in viruses on a USB stick (the whole system was air-gapped) and you’d still have a backup available.


  • CMake, which is kind of the universal standard build system for C++ now, has “fetch content” since v3.11. Put the URL of a repository (which can be remote, but also local, which is handy) and optionally the branch / commit ID that you’d like, and it will pull it into your build directory automatically. So yeah, you can pull anything nefarious that you’d like. I don’t think most people would question pulling and building a library from Github as part of the build, especially if it had a sensible name for the task at hand.


  • addie@feddit.uktoBuy European@feddit.ukNut nut
    link
    fedilink
    arrow-up
    3
    ·
    11 months ago

    They’re occasionally the crisp of choice in pubs; an excellent accompaniment to an 80/-. Suppose there’s worse criteria for your pub crawls. But aye, a weird omission - you’d be thinking there’s plenty of wagons on the Stranraer ferry that could bring a few palletloads over.


  • A binary tree is one way of preparing data, usually for sorting. Each node can have a left, right, or both, children.

      A
     / \
    B   C
       / \
      D   E
    

    “Inverting the tree” means swapping the children for each node, so that the order that the nodes are visited is reversed. Depending on whether you want to copy the tree or swap it in place then the algorithm is different. C++ provides iterators too, so providing a “order reversed” iterator can be done efficiently as well.

    You’re going to have to visit every node and do at least one swap for every node, and an efficient algorithm won’t do much more than that. Bring unable to do it suggests that the student programmer doesn’t understand stacks or recursion yet, so they’ve more to learn.


  • Lunacid is awesome - old-school dungeon crawling with slick controls. The speed and smoothness makes fighting all the old enemies new again.

    The Kings Field games are… very hard to love. They’re old-school dungeon crawlers with the most awful, clunky controls that you can imagine. They’re all “pre-Miyazaki” FromSoftware games; don’t expect many Souls-like touches. Getting killed by a skeleton because you can’t turn round to face it in time, or falling down a hole because judging how far you’ve walked forward is difficult? Far more likely.

    A Lunacid follow-up with a little more Ultima / Wizardry about it would be amazing. Bit more environmental variety, a few more RPG trappings, and for the love of all that is holy, a minimap. But I can’t see how that would be better done in Sword Of Moonlight rather than just adding them to their existing engine.