1. 39

The weekly thread to discuss what you have done recently and are working on this week.

Be descriptive, and don’t hesitate to ask for help!

  1.  

  2. 13

    Strangeloop prep, two kinds:

    1. Improving the talk. I’ve recorded myself rehearsing and have been sending the video to friends to get feedback on both content and presentation.
    2. Making as much candy as I can.
    1. 10

      work: adding support for UDP Options to FreeBSD while trying not to mangle the network code too much.

      !work: More work on drivers for my GPD Pocket. I figured out the ACPI junk to get most of the power related stuff attaching to i2c buses described there, but I have hit a snag with ig4 where it times out transfers. While avoiding looking at that I found OpenBSD has a driver for the gpio(chvgpio) so I am porting that to FreeBSD now.

      1. 4

        What are you planning to do for the Broadcom wireless?

        1. 3

          I am using a tiny usb dongle right now, tear downs have shown there is no way to replace the internal card. The wireless is the same as the pi3(though pci) and there is an effort right now to add support for the colocation controller on the soc. It might actually be a card that sees support in the next year or two.

          1. 4

            The corresponding Linux brcmfmac driver is ISC licensed.

      2. 9

        Some of my tools were lacking in terms of documentation (they had only a README) and installing instructions (something like “compile it, copy it to your path”). I’m creating man pages and homebrew formulas to make them easier to install. They are listed here, each with a short explanation.

        1. 4

          Oooh! chen looks really useful. I keep trying to use qmv for that but it uses tabs to present two columns in my editor and expects 8-space tabs, whereas I only have 2-space tabs so the formatting is all weird. Just editing the name in-place and having the tool figure it out makes it much easier. Much thanks (both for authoring tool and posting about it)!

          1. 3

            Use qmv -fdo (destination only format).

            1. 3

              Glad you find it useful! I wasn’t aware of qmv, it looks like a very powerful tool, extremely configurable. I didn’t know renaming files was a pain point for me until a few days ago, when I read about Roamer and realized mass renaming with a text editor was a thing. Now I find myself using chen many times a day :-)

          2. 9

            Getting things together to do a RUN BSD t-shirt print run. :)

            1. 1

              RUN BSD t-shirt

              Are these the american apparel shirts ala RUN DMC?

              1. 1

                Correct. EuroBSDCon is coming up and there are 60+ shirts ordered in 2 days so far. Will be closing the window today.

                Similar to this shirt: http://teehunter.com/tee/run-bsd-parody-design-for-unix-hackers-sysadmins/

                But for almost cost.

            2. 8

              At work, I’m hopefully making my first job offers as a manager. With some sleuthing, you can probably find the postings if you’re interested in doing fun things with big data, cloud-based command and control systems, and healthcare.

              Outside of work, I’ve been automating some plain text accounting financial reports for myself and my non-profits. If you’re adept at writing Regex state machines for parsing files, I’d love to have your help implementing ledger support for Rouge, the library that Gitlab uses for syntax highlighting. I’m experimenting using Gitlab as a “continuous reporting” mechanism for organizational finance.

              1. 2

                How big is your “Big Data”?

                1. 1

                  We’re mostly 4V for real. We’re processing double digit TB daily right now, iirc, and that will grow 100x in the next ~year, if sales just stop. It’ll grow more if they don’t! We’re working on scaling to handle it.

                2. 1

                  I’m also working on implementing a Rouge parser for ledger plain text accounting format, so that Gitlab will syntax-highlight my Ledger files.

                  I could use some pointers with the regex state machine logic: https://github.com/jneen/rouge/issues/766

                3. 7

                  I’m working on https://www.helmspoint.com , where you just have to upload weights and declare the architecture of a machine learning model to deploy it as a web API.

                  1. Configuring Kubernetes to run on cloud provider.
                  2. Writing blog post on the different ways to share ML datasets.
                  3. Figuring out whether people actually want what I’m building.
                  1. 7

                    Rolled a new release for my game. The most notable changes are:

                    • Player physics for walking around the terrain. You fall through the world when your FPS drops too low and I haven’t bothered debugging that yet.
                    • Extremely basic multiplayer (you can see each other walking around). It’s been in for quite a while but I haven’t enabled it in releases because my god the the BSD sockets API is a load of shit. It’s so hard writing socket code that works on Windows/OSX/Linux/OpenBSD because every platform is picky/lenient about different things and there’s no way to know without testing everything everywhere.
                    • Moderate renderer overhaul. I build lists of render passes and their draw calls so I can submit them all at once at the end of the frame, rather than submitting them immediately. The big advantage is that I can now map a single UBO at the start of the frame and copy everything into that, which entirely eliminates any uniforms related book keeping code (no need to store locations or allocate/delete individual UBOs). It also opens the door to draw call sorting optimisations and a multithreaded renderer, but those are less important IMO.
                    • New skybox shader. My old one was hacked together in an evening and not at all grounded in reality, so I got rid of it and did a Hosek-Wilkie sky like everyone else. It doesn’t seem to play nice close to or below the horizon but I haven’t investigated yet.
                    • Updater fixes. The game should finally be able to update itself to the next version without manual intervention. rename on Windows fails if the destination file already exists, so I had to replace that with MoveFileEx and MOVEFILE_REPLACE_EXISTING. Apparently RegSetValue is broken too so it wasn’t updating the installed size.

                    Next up is fixing all the bugs I didn’t fix so I could knock out a release and making the game work with UAC enabled. I’d also like to throw out my terrain tiling/streaming system and implement cdclipmaps from SIGGRAPH’s ocean rendering talk. My entire terrain easily fits into VRAM so clipmaps will be far simpler.

                    1. 3
                      • Re: player going through terrain: are you using fixed timesteps for your physics? That sounds like an issue I had a long time ago now
                      • Re: ocean rendering: have you considered the projected grid method? It’s been used in a few games and there’s some research around it as well. I think it was introduced by Hinsinger et al. in Interactive animation of ocean waves
                      1. 1

                        Not using fixed timesteps, good call!

                        I don’t actually have an ocean yet, I’m considering using clipmaps + their geomorphing for static terrain rendering because it seems simpler to implement than LOD selection logic.

                        (You should submit that paper as a story btw)

                      2. 2

                        I could be wrong, but my intuition on the player physics (especially if you rolled your own) is that between timesteps your collision object is “tunneling” to the other side of the plane for the terrain–the hint for me being that it only happens at low framerates.

                        Look into “swept volume” collision detection or GJK.

                        (there’s also a lot of good stuff here)

                        1. 2

                          I’m already doing continuous collision detection so it shouldn’t be a tunneling issue. My code for stepping a player forward in time is quite messy so I expect it’s just some typo, which is why I don’t want to debug it. It’s going to be a slog :<

                          1. 1

                            :(

                      3. 7

                        I’m getting ready to launch my CUDA as a service startup Veeocho.

                        1. 6

                          Two things:

                          1. Cutting my teeth on “real compiler” tech (beyond just simple hand-written stuff that is unlikely to scale as a single developer to a full language) with flex and bison
                          2. Continuing to help prepare for freenode #live
                          1. 4

                            Hand written parsers scale better than flex/bison in my experience.

                            1. 3

                              I was never a fan of the compiler-compiler approach (flex/bison, happy, etc.) since it seems like a heavyweight hack to work around the lack of meta-programming in some languages (and without (ab)using the C preprocessor).

                              These days I tend to use either parser combinators or PEGs (e.g. OMeta) when I need to lex/parse/etc. Whilst these could be described as DSLs, they’re at least embedded in the host language rather than running externally and dumping code to a file.

                              1. 2

                                Maybe when you’re experienced, and the parser is the main part of the project. Really, this is just because I need parsers more, but I don’t have the CS fundamentals background to write efficient, sensible, and clean parsers on my own. It’s far easier for me to express a grammar than to implement it.

                                1. 2

                                  I basically just followed the example on this page https://en.wikipedia.org/wiki/Recursive_descent_parser and found it a bit easier to understand than bison (and you eliminate a dependency).

                                  Heres my if statement parser for my self hosting C compiler:

                                  https://github.com/andrewchambers/c/blob/master/src/cc/parse.c#L1275

                                  Its quite doable with a bit of practice.

                            2. 6

                              Crash testing the hell out of my rust bw tree, and hopefully improving performance 2-4x in the next week! It’s fun to be in the release engineering phase of this thing that I’ve learned so much while building. Also trying to think of a better name, as rsdb competes on google with the racial slur database, and isn’t so memorable. If anyone has interest in high performance storage, lock-free algorithms, formal methods, or higher level MVCC / multi-operation transactions, I’d love to work with more people! There’s plenty to go around, and I am happy to mentor anyone who would like to get involved :)

                              1. 1

                                What kinds of durability/atomicity guarantees do you have (or want to provide)? I might have a use case for something like this in an information retrieval database, but I’d say that’s probably a year away at this point.

                                (N.B. To calibrate, I’ve never used RocksDB and I’ve never heard of Deuteronomy, but I’m familiar with LSMs.)

                                1. 1

                                  I’ll shoot you an email!

                              2. 6

                                I’ve begun the process of leaving management to return to coding. And in the process, have discovered that writing web apps has changed a lot, and that I’ve forgotten a lot of IntelliJ’s useful shortcuts. So I’ll be relearning all of that this week, I guess.

                                1. 5

                                  Decided doing a puppet upgrade sensibly was far too much effort and cut a new branch in my config repo that just expects the latest (5.x) version of puppet installed and bumps all the vendored modules I use to their latest stable versions too. Also moving it from puppet agent (from a puppetmaster) to puppet apply, rsyncing the config into each node before applying.

                                  This week will be spent running through all the existing zones, tweaking the modules I’ve written to run under puppet 5 & doing lots of --noop runs to make sure it doesn’t change owt. Oddly therapeutic.

                                  1. 5

                                    On my personal projects:

                                    Finally got around to setting up an automated backup for my little DailyNotes site. Set up a cron-triggered script to dump the PG database, gzip it, and send it off to S3, with a custom account that only allows writes and only to the right bucket. Probably no big deal to most Linux/shell gurus, but felt nice to me to finally get that worked out.

                                    I’m also working on setting up my own Lobsters instance for a personal project. Going pretty well, almost done getting all the basics sorted out. Relatedly, the number of ways to set up Linux services is kinda baffling. It seems that there are at least 3 systems. There’s upstart, which is what I have my other apps on my other server running on, and had a decent set of scripts to control. There’s also whatever it is that uses the /etc/init.d directory and sudo service nginx start commands - I’m not sure what it’s called, but nginx and mysql seem to run under it by default. And then there’s the new systemd, which seems to have replaced upstart on Ubuntu 16+, even though the upstart /etc/init directory and pile of scripts are still there. So I ended up having to sort out a new systemd control script to get it running. I guess I can see they replaced upstart with systemd, but what’s this third system, and why does it still work?

                                    1. 4

                                      There’s also whatever it is that uses the /etc/init.d directory and sudo service nginx start commands - I’m not sure what it’s called … what’s this third system, and why does it still work?

                                      That’s the ol’ venerable System V init system (SysVinit), which many distributions still have around for backwards compatibility with things that expect it, and/or because some service configurations haven’t yet been ported to the thing supposed to replace it (for Ubuntu, that was once upstart, now systemd). I think it is planned to be eventually removed on Ubuntu, at least from the default install.

                                      1. 1

                                        Thanks, that at least gives something to search for. They seem to be kinda integrated, asking for nginx status using the service syntax outputs a systemd-like response.

                                    2. 5

                                      Nothing lobsters would appreciate. Too much left wing, public sector, administrative and politicky.

                                      1. 5

                                        We (as in the NTK – National Library of Technology) have partnered with the IPR (Prague Institute of Planning and Development) in order to procure a system for the procurement-related agendas and have agreed to develop and release it as open source. We are holding the public consultations tomorrow. Tender will follow afterwards.

                                        You do not really see public agencies partnering up for anything, especially not creating free software, so it is kind of special for us here.

                                        1. 2

                                          Good luck! :)

                                        2. 4

                                          Can there be a thing such as too “much left wing” ;-?

                                          1. 3

                                            I was told all good things in moderation is best approach. Getting overloaded from normal left-wing dilutes the impact on target audience while extreme-left creates stronger resistance across the board. So, yeah, there’s a such thing as too much (insert topic or style).

                                            1. 1

                                              “All good things in moderation” is obviously wrong. What is the right amount of moderation for racism? What is the right amount of moderation for sexism? What is the right amount of moderation for murder, or rape? If bad things don’t require moderation, why do good things? In other words, what is the moderation of well fed children? Or good education? ;-)

                                              1. 1

                                                It’s a general rule. Like all of them, it will have exceptions. Your new examples, though, aren’t activities in general but rather forms of harm. Two of those are also felonies with provisions for severe sentences. It’s a non-sense test of my claim about moral people doing “left-wing” too much to go straight to how much evil people should do their evils. Im against evil and doubt evil will listen to decent folks admonishing their indecency. It’s off-topic to this tangent.

                                                Back to your original statement I replied to: “Can their be too much (non-harmful activity)?” Yeah, you can burn out on or go bankrupt doing too much of anything. Might also get bored with it depending on how your mind works. So, best to do everything in moderation with that rule modified to suit your needs, resources, and preferences.

                                                1. 1

                                                  Of course I believe in moderation. My original statement was rather cheeky. However, you have to be careful because “use moderation” is often a tool used to justify apathy, or write off people affecting real change. Yes moderation, until not moderation.

                                                  1. 1

                                                    Cool, cool. I agree with you there. That is something to watch out for. Good you’re already not overdoing it as that’s all I meant by it.

                                          2. 3

                                            Some of us might be, if you want to share. :-)

                                          3. 5

                                            Extending pglite with a tmp mode and the ability to run as a command wrapper – pglite starts the database, runs the wrapped command and then shuts everything down (exiting with the exit status of the wrapped command).

                                            1. 3

                                              Oh my god where have you been all my life. <3

                                              Holy shit that’s a handy script. Please continue! :)

                                            2. 5

                                              Taking a poke at fuzzers, in particular afl.

                                              Surprisingly simple to use, surprisingly effective.

                                              Highly recommended.

                                              1. 3

                                                Fuzzers are great. Last week at work I wrote a dead simple fuzzer (<100 lines) and found a bug that, if released, would have slowed a component of our storage service to a crawl. It likely would have been caught in pre-release QA, but it’s nice to catch that sort of thing early.

                                              2. 5

                                                Currently setting up my new blog and integrating all the parts of the Hugo workflow in Emacs! It was about time for me to do this. Also been learning Idris lately and maybe I’ll try to experiment a bit with Assembly code in Go.

                                                I should also wrap up my bachelor for September and its dissertation for October. It’s going to be a fun month.

                                                1. 5

                                                  Today’s a holiday for me, so I am going to a botanic garden to see some plants and plantings. For the rest of the work week, I’ll be continuing to write scrapers as well as beginning to work out some standardization and tests for handling a bunch of fixed-width and CSV data pipelines.

                                                  Outside work I’m going to do some Elixir hacking and maybe get back to coming up with a test to catch the bug I found in CPython so I can get my pull request approved.

                                                  1. 4

                                                    work: Continue my work to port HRAN theano to tensorflow.

                                                    personal: Re-reading the Rust book. I’m on chapter 4, and it’s been awesome experience.

                                                    1. 4

                                                      Main stuff - working on my startup (in stealth mode) - learning some react, playing with firebase.

                                                      Other than that, continuing to work on my side project : https://discoverdev.io : A daily curated list of engineering blog posts! This was simply to get myself acquainted with web dev - a purely static site hosted on netlify! (I use jinja2 and python to generate the website).

                                                      Btw, my first post on lobste.rs! Hi everybody :)

                                                      1. 3

                                                        working on my startup (in stealth mode)

                                                        Usually, “stealth mode” is kinda a red flag outside of a few niches. You should talk about what you’re working on–least of all because you might find out somebody is already doing it.

                                                        Don’t spam it here though–there is https://barnacl.es/ for good feedback. :)

                                                        1. 1

                                                          Before going stealth mode, assess whether your startup is doing something patentable or that requires enormous labor/cost to build. These justify stealth mode. If not, then the advice of startup factories such as Y Combinator (eg Slack, Uber) is to be open and focus on execution.

                                                          Openness gets more people exposed to your ideas which provides feedback you use to improve your offering with rapid iterations. You’ve gone so far so fast that, by the time they want to copy you, the competition will be way behind you in terms of features, market share, and branding. The result is called the First Mover Advantage. About every billion dollar firm I know of started by racing to be the First Mover grabbing all the marketshare.

                                                        2. 4

                                                          I’m trying to port the Swift parser from C++ to Swift and have been loving it so far.

                                                          1. 1

                                                            Interesting, does Swift have safety guarantees, or is it “much more likely to be safe” like Go or C++?

                                                            1. 3

                                                              Swift is basically an ML variant, but has some backwards-compatibility stuff and some auto-unwrapping of optionals syntax that may decrease safety vs, say, SML. YMMV

                                                              1. 1

                                                                What safety guarantees exactly do you have in mind?

                                                                1. 5

                                                                  I should have said memory safety: http://www.pl-enthusiast.net/2014/07/21/memory-safety/

                                                                  Parsers in C are notorious for having memory safety issues. It’s basically guaranteed that any sufficiently complicated parser in C will have memory safety problems.

                                                                  Here’s one I found in Brian Kernighan’s awk:

                                                                  https://github.com/andychu/bwk/blob/master/test-results/asan.log

                                                                  Java and Python are safe. C++ is not but it helps you more than C. Go helps you too, but I’m pretty sure there are some memory safety issues. So I was wondering where Swift stands.

                                                                  EDIT: some info about Go and memory safety: https://insanitybit.github.io/2016/12/28/golang-and-rustlang-memory-safety

                                                                  1. 3

                                                                    Given this definition Java is also memory unsafe - you can crash jvm with data race. Since this is crash and not unhandled null pointer exception I would assume that given enough time it’s possible to exploit that in more interesting ways.

                                                                    1. 2

                                                                      It’s not fully safe because they still want to allow you to be able to do some fringe stuff but the main path and idiomatic code is memory safe by default using constructs like if let the_variable = some_optional {/*use the unwrapped the_variable here*/}

                                                                      you can force memory unsafe by force unwrapping it with ! like let somevariable = some_optional_returning_function()! but that can crash if some_optional_returning_func is null.

                                                                      1. 1

                                                                        Isn’t that basically fromJust with an unfortunately convenient syntax?

                                                                        1. 1

                                                                          I don’t believe so. fromJust looks like it throws an error if the maybe item is nothing(i only played around with haskell years ago and i am no expert on it though). the if let ... { pattern is used all the time as a guard on values. you can also chain the if let values together to get one block with all the values you need guaranteed to be non null.

                                                                          like

                                                                          if let x = y,
                                                                             let z = x.something(),
                                                                             let w = someRandomoptional(),
                                                                             let stringrep = w as String? {
                                                                          // only called if all the values above are non-null. 
                                                                          // guard statements are useful too and are put at the top of the function 
                                                                          // to early exit if the function can't deal with the null values. 
                                                                          print(x)
                                                                          print(z)
                                                                          print(w)
                                                                          //...
                                                                          }
                                                                          

                                                                          This is a conditional binding for the duration of the scope of the block. the nullability of objects in swift are very important. you can also call items conditionally too.

                                                                          let foo = bar() // bar returns an optional object
                                                                          foo?.setVal("xyz") // will not crash if foo is nil.
                                                                          // syntactic sugar for
                                                                          if foo {
                                                                          foo.setVal("xyz") 
                                                                          }
                                                                          
                                                                          1. 1

                                                                            Sorry, I should have quoted the part I was referring to:

                                                                            let somevariable = some_optional_returning_function()!

                                                                            The force unwrapping operator ! will crash if the value if nil, similar to how fromJust crashes on None.

                                                                            1. 1

                                                                              Gotcha. yeah that’s basically fromJust but more convenient.

                                                                        2. 1

                                                                          If it crashes on null, then that’s considered memory safe behavior. C is unsafe because dereferencing null is undefined. The program can use the value at address zero, or anything else.

                                                                          I googled and found this:

                                                                          https://developer.apple.com/swift/blog/?id=28

                                                                          A primary focus when designing Swift was improving the memory safety of the programming model. There are a lot of aspects of memory safety

                                                                          So my takeaway that it’s like Go or C++ – more likely to be safe but not guaranteed like Java or Python.

                                                                          1. 1

                                                                            Yes, it’s technically possible to use pointers and Swift is in fact fully interoperable with C, but it is not the path of least resistance. A pointer and its related operations are encapsulated in a struct of the type UnsafeMutablePointer, where:

                                                                            You are responsible for handling the life cycle of any memory you work with through unsafe pointers to avoid leaks or undefined behavior.

                                                                            To address your first comment, I didn’t use any of those unsafe pointers in the implementation I’m writing in Swift while the original C++ parser is a jumble of moving pointers, so yes I expect the Swift version to be safer.

                                                                            1. 1

                                                                              As a default the swift compiler will not let you do bad things unless you ask to.

                                                                              you can declare things as explicitly unwrapped from optional sources. so something like a link to an object in a window would be typically explicitly unwrapped which means that you are guaranteeing that the value will never be null and you are smarter than the compiler. (if the value of a linked storyboard component was ever null it would be a problem) another time they are used if you are sure that the value of it will not be null before using it but you don’t want to set the value of it at initialization.

                                                                              They designed swift so you can do anything that c can do including bit tweaks and pointer wrangling but it’s a much, much safer paradigm where you do have to go off the rails and make explicit choices to subvert your application. It does make parsing json data more annoying but more safe.

                                                                      2. 1

                                                                        it depends on what you mean. Their philosophy is to deliberate and make a decision on each potential safety issue that achieves a good balance between performance, convenience and safety.

                                                                        E.g., it forces you to handle all potential nils explicitly in your code but it doesn’t do anything about array access at compile time. But if you go out of bounds your program will crash (I think it does bounds checking at runtime and deliberately crashes it to avoid undefined behaviour).

                                                                        1. 1

                                                                          Sorry I should have said memory safety (see sibling comment). As long as it crashes on null pointers and OOB, that is memory safe. Whereas a C program can just keep going and do whatever.

                                                                    2. 3

                                                                      Implemented an octree in C just to see how it would play out, thinking about trying to make a little lego-type game with it. I’m thinking about starting up work again on my little x86 kernel, and seeing if I can get the APIC/SMP stuff working. Also continued doing some investigations into a bug I found in some macOS GPU drivers, hoping to turn it into an exploitable bug.

                                                                      1. 3

                                                                        Writing a SMT solver… in OCaml. Taking this as an opportunity both to see how far I can push performance in OCaml for such CPU-intensive programs, and to get a better understanding of MCSat (an new-ish approach to SMT).

                                                                        1. 3

                                                                          It’s approaching time for the second release of Myrddin. I’m tying up a whole bunch of loose ends.

                                                                          1. 3

                                                                            I’ve been having fun reverse engineering a neat little mobile game I’ve been playing. Not for any bad reasons (eg; cheating), I just kinda decided on it as a fun little challenge.

                                                                            I got stuck for a week or so because all the game files are encrypted on disc and, as I believe it uses websockets for requesting updates, I couldn’t see any requests besides boring HTTP requests when fetching event webpages.

                                                                            I realised earlier today though that duh, I should capture packets during an update (cleared the game data on my rooted S4 test phone and reinstalled) and voila, a bunch of references to a Cloudfront server. Found out where the update manifest was for this particular instance, wrote a Python script to parse + download each file and I’ve been looking through the unencrypted files (as they only get encrypted on disc it seems).

                                                                            Figured out that the _SND.pkg files are cough sound files waiting to be changed to .mp3 and a bunch of them have Adobe Media Encoder metadata so I’m about to see if I can’t figure something out for the rest. All in all, pretty fun and a good excuse to learn some new stuff.

                                                                            1. 3

                                                                              I’m trying to define our architecture…thing. I work for a growth-stage company, so while our product has shown itself to be useful and has been sold to customers, its organisation, design etc is not very future-proof to the point where it’s not really present-proof any more. We need to bake some strategic thinking into our software design, data architecture, team organisation etc, but it doesn’t naturally “fit” into our way of working.

                                                                              We follow Spotify’s tribes/chapters/guilds model. Architecture has so far been a guild because it cross-cuts the chapters and tribes, but that gives it the air of a special interest group, not a strategically important function.

                                                                              If anyone has any good recommendations or resources for me to use, I’d gladly welcome the help :)

                                                                              1. 3

                                                                                Spent yesterday helping @uwe with reshuffling and completely rewiring a rack. I have some sparc64 machines in there. (This picture was taken before rewiring the chaos :)

                                                                                And I’ve been looking into some annoying scanning problems in OpenBSD wireless. Already got some of these fixes committed.

                                                                                1. 2

                                                                                  I’m trying to plan out how much sunlight our new flat will have. Two balconies, one is north-east facing, the other south-west. We’re pretty north (Warsaw, Poland), and there isn’t much sun in the winter, but we’d still like to have a greenhouse of sorts on the north-east facing one.

                                                                                  1. 2

                                                                                    Adding proper conditionals and looping to smolforth: https://gitlab.com/technomancy/smolforth This requires allowing each word to have distinct behavior at compile time vs runtime.

                                                                                    I wrote a Forth a few years ago in C, and it’s been long enough that I’m having to rediscover a number of techniques. But also implementing it in Lua (with data structures and closures) is vastly different from doing it in C, and obviously all the existing literature is about doing it in C.

                                                                                    I am integrating it into my programming adventure game for use controlling the in-game rovers over simulated SSH connections: https://gitlab.com/technomancy/bussard

                                                                                    1. 1
                                                                                      1. I started the ‘Machine Learning’ and ‘Deep Learning’ course on coursera simultaneously, but it seems like it is more that I can handle at this point. So I dropped the ‘Machine Learning’ course after week 2. Still working on the ‘Deep Learning’ course.
                                                                                      2. Reading David Nasaw’s biography of Joseph P. Kennedy - ‘The Patriarch’