1. 1

    It might be good, but the way they demanded donations in the early days put me off it for life.

    1. 22

      Isn’t it possible to extend some forgiveness? They are trying to fund their development, and they are doing it with one hand tied in their back by making it open source. That level of polish is hard to reach without some sort of consistent funding.

      1. 3

        I would argue that; for what they were going for; it is only fair. I can imagine without donations they saw the death march the project would be on.

        Besides, as qqlq said, free as in beer vs free as in speech.

        1. 2

          That article seems to confuse free as in beer with free as in speech.

        1. 6

          I think the term is “necessary condition”. I haven’t done the calculation, but I suspect the latter is equivalent to

          a AND (b OR (c AND (d OR e)))

          And, since you don’t care about the overall result of the expression of a is false, then you can consider

          a IMPLIES (the rest)

          At which point a is a necessary condition

          (Edited, and I haven’t checked my sources, sorry)

          1. 5

            I think the term is “necessary condition”

            Yes

            I haven’t done the calculation, but I suspect the latter is equivalent to

            a IMPLIES (b OR (c AND (d OR e)))

            No, because “not a” satisfies “a implies *”

            You could factor a out though, “a and (b or (c and (d or e)))”

            1. 3

              Saying “a IMPLIES (the rest)” is saying that a is sufficient for the rest to be true. It doesn’t mean that a is a necessary condition.

              1. 1

                Ah, yes — I did have that backwards.

                Let P = (a AND b) OR (c AND ((a AND d) OR (a AND e))

                It can be derived that P → a, and that a is a necessary condition of P.

                a → P would indeed say that a is a sufficient condition for P, and that is definitely not the case.

              2. 2

                That would be true if a is false.

                1. 1

                  a IMPLIES (the rest)

                  You mean, like in a IMPLIES (a AND (b OR c))? If so, this is not true in case of a = true, b = c = false, in which case the expression is simplified to true IMPLIES false, which is false.

                1. 2

                  The reMarkable seems a great device for people who want to read from a non-backlit display. However, I heard in a (Dutch) review that, although the reMarkable is quick to respond to the user’s writing, in general it’s not the most responsive.

                  I don’t mind a backlit screen, and went for an iPad Air (the 2019 model) with a Paperlike screen protector and an Apple Pencil. The Paperlike adds a texture that provides much needed friction for writing. In combination with GoodNotes (for writing) and MarginNote 3 (very similar to liquidtext for reading and studying), it’s a great tool for writing and reading.

                  1. 20

                    I thought this was going to be about CPU activity but it’s regarding the network activity from each system. Unsurprisingly Windows is more “chatty”, but to be honest, less so than I expected and there aren’t really any surprises. A few notes from skimming the article as to some connections the author seems unsure about:

                    home.lan
                    This is presumably the default DNS domain for Windows when not connected to a corporate domain. The Windows DNS client appends the primary DNS domain of the system to unqualified queries (see DNS devolution for the grotty details).

                    As for the queries, wpad will be Web Proxy Auto-Discovery (which is a security disaster-zone, but that’s another story), the ldap one is presumably some sort of probe for an AD domain controller, and the rest I’m guessing are captive portal or DNS hijacking detection, which could be either Windows or Chrome that’s responsible.

                    Intel
                    No chance this is Windows itself. Pretty much guaranteed to be the Intel graphics driver, specifically the Intel Graphics Command Center which was probably automatically installed.

                    Microsoft
                    The 4team.biz domains are definitely not Microsoft but some 3rd-party vendor of software within that ecosystem. So it turns out there’s at least one legitimate company out there that actually uses a .biz domain!

                    The rest are largely telemetry, error reporting, Windows updates, PKI updates (CAs, CRLs, etc …), and various miscellaneous gunk probably from the interactive tiles on the Start Menu. Microsoft actually does a half-decent job these days of documenting these endpoints. A few potentially helpful links:

                    1. 2

                      There was another thing that surprised me, namely that Windows appears to connect to a Spotify-owned domain. I asked the author if he had installed Spotify, which he hadn’t.

                      1. 4

                        Isn’t there a tile for Spotify in W10 by default?

                      2. 2

                        I thought that a bunch of these are moving to dns-over-https with some built-in resolution servers which would then completely bypass his private dns server?

                      1. 6

                        I agree with many of hello’s ideas. However, I came across this point on their GitHub wiki that I do not understand:

                        “ Run as root the whole time; or, at the bare minimum, have root-equal rights for the user”

                        On macOS, I can do all my work without root privileges. Sure, to manage some parts of my system I do need admin privileges. However, I’m more often asked for my credentials by 1Password than I am by the operating system.

                        1. 4

                          Code running as my user can read (or destroy) all my private files, emails, ssh keys, passwords, use my web sessions & access my git repositories, etc.

                          If it also has root access, it can also fix my printer drivers.

                          At least for me, a separate root user offers no protection that I find meaningful or useful.

                          1. 4

                            On my Mac, I run with an “Admin” account, which in Unix terms is a user account that’s a memeber of the “admin” group, but in practice it makes life a lot easier on MacOS; for one thing /Applications is writeable for me without elevating privileges. When I do need to elevate privileges it’s more often than not as easy as putting my finger on the fingerprint scanner. Even though I don’t actually run as root, it doesn’t feel like the system is in the way. Try changing something in /usr/local/ from a Linux or *BSD.

                            Hello seems to have it as a goal to make it easy to install software. Running everything as root is one way of doing that… I would prefer if they choose a more secure way to do that, but on the other hand I see the difficulty in matching Apple’s permission system where I as a user have nearly full reign of my machine while an app I download from the internet cannot even sniff around my home directory without begging me for permission, even though it is running with my uid.

                            Obligatory XKCD: https://xkcd.com/1200/

                            1. 4

                              I mean, I think it’s questionable whether running an interactive session as non-root is more secure than running it as root. A virus could just modify ~/.profile or whatever to hijack su/sudo and thus get superuser privileges. I think the sudo dance is a bit annoying and most likely unnecessary.

                              1. 5

                                It’s worth noting that, on macOS, everything installed from the app store runs sandboxed and so can’t modify ~/.profile. When an app presents an open or save dialog box, that box actually runs as a separate process and the sandbox framework updates its access control lists based on what’s selected. Applications can’t access anything in the file system that they aren’t explicitly allowed to. If anything running in the sandbox is compromised or malicious, there’s a fairly limited amount of damage that it can do.

                          1. 2

                            Good to keep an eye on this project. I am currently running a matrix homeserver with the mautrix-whatsapp bridge but would like to try XMMP and compare these setups. However, the (then) lack of a bridge like this one held me back.

                            1. 2

                              For me the problem isn’t so much that designers and authors use custom fonts and CSS-styling. Form has function too. It’s just very unfortunate that all that takes megabytes of data and gigabytes of RAM to handle.

                              1. 8

                                I don’t get why email and calendar functionality have to be in the same application. Especially in Outlook where switching from your calendars to your emails resets the calendar position. I lose oversight quickly.

                                I much prefer having separate applications for PIM tasks and use my window manager to switch tasks.

                                1. 7

                                  They have to be integrated, because so much of calendaring is accepting or sending invites via email. Even small inconsistencies between the two causes pain. However, you’re right they don’t literally have to be the same window.

                                  1. 3

                                    Same here, and KMail and KOrganizer work just fine for me.

                                    1. 2

                                      They don’t, though lots of people get meeting invites through email so it’s nice to have some integration

                                      However, on Linux Lightning is the only “legit” calendar app I could get working (on Ubuntu 19.10/20.04) , and thunderbird is still really the most usable mail client on Ubuntu…. though I have also had issues with Thunderbird

                                      Email has always been a bit of a pain, but really unfortunate that there still aren’t world class clients that don’t end up with some game breaking bugs.

                                      Right now I’ve reverted to just pinning multiple Gmail/calendar tabs because it’s ended up being a better experience

                                    1. 17

                                      I use DOOM Emacs, after a lot of deliberation. I’d used a vanilla Emacs config for the good course of 4 years before realizing that DOOM did everything I was already doing, and doing it faster.

                                      My config is literate, and tangled automatically by DOOM’s doom command-line utility. You can find the entire config here if you’re interested.

                                      Also, if you’re planning on using any form of language server via LSP mode, I’d recommend building the Emacs 27 pre-release: its native JSON parser makes it far faster.

                                      1. 10

                                        I also migrated from my own bespoke literate Emacs configuration to doom. It’s feature rich and fast. It feels like I switched from Linux from Scratch to a regular distribution.

                                        1. 8

                                          I too did the great migration from vanilla Emacs to Doom recently, and wrote about it: https://blog.jethro.dev/posts/migrating_to_doom_emacs/

                                          I don’t really miss my old config, but haven’t fully gotten used to the keybindings in Doom.

                                          1. 5

                                            +1 to DOOM. I switched from Vim to Emacs in maybe ‘15 for the Clojure support (CIDER is a must-have) and maintained my own config because I didn’t see anything attractive I wanted to adopt at the time. I recently decided that my homebrewed config was far too slow and a pain to maintain and made the switch to DOOM which has been almost entirely win. I’ve ported a few bits here and there forwards, but overall with evil-mode turned off I find even stock base DOOM excellent.

                                            1. 3

                                              Ok, DOOM is fast, but your config could be just as fast. I mean, I managed to pull of those those startup times and loadings (with margin of error of few or tens of mili seconds which are tolerable).

                                              People just don’t read documentation of use-package. (or aren’t using it at all which is even worse) I made my config lazy in mathematical sense, don’t load anything unless I start using it. Rest are minor tweakings and tricks but you get the idea. With a bit of work your config could be just as fast. If you must have vim configs than it’s fine, I’ll choose DOOM over spacemacs any time of the day.

                                              1. 3

                                                Yeah I’m another doom emacs convert. I started off working with a literate emacs config. It was painfully slow no matter what I did. Doom starts almost as fast as vim, even faster once the daemon is running.

                                              1. 3

                                                It’s good the author addresses the value of pinning channels, such as nixpkgs. Otherwise the dependencies aren’t really deterministic as nix will use the latest version.

                                                For me the biggest advantage of nix is that I can keep globally installed packages down to a minimum. Build dependencies are only installed/updated upon entering a nix shell.

                                                1. 2

                                                  Initially I though this was just being overly cautious, especially for ad-hoc development environments for e.g. other people’s projects not catered for nix. In reality though, both projects and nixpkgs quickly advance enough to make this a legitimate problem. I’ve since started taking pinning more seriously and do for most of my projects. Especially considering an upgrade is a relatively easy task.

                                                  For my $HOME I’ve recently moved to https://github.com/rycee/home-manager - which is sweet. But still try to keep both my global system, and user environment down to a minimum. Nix shell (combined with direnv) makes adding whatever extra tools you need very easy imo.

                                                  1. 2

                                                    Thanks for the nice article!

                                                    In reality though, both projects and nixpkgs quickly advance enough to make this a legitimate problem.

                                                    I have encountered the same (in particularly nixpkgs-unstable) and have also started pinning in projects. Until flakes are adopted, I am using niv, which is really nice for adding package sets, pinning them, and updating them.

                                                  2. 1

                                                    For me the biggest advantage of nix is that I can keep globally installed packages down to a minimum.

                                                    Why is that an advantage? It would be a nightmare to me.

                                                    1. 3

                                                      I go for a middle ground here. I basically have no system packages. This is just to keep the /etc/nixos/configuration.nix down to a minimum. Two reasons for wanting that: it requires superuser to change and more importantly it’s not portable to non-NixOS systems.

                                                      I use home-manager to port my user profile across systems. I install quite a bit of software in my user profile of course. That’s everything from editors, language servers, browsers, shell utilities, and whatnot. I also have one version of python, node, and the likes for the occasional time I need to just try stuff in a repl or other tiny experiments. However, my threshold is really low for just doing echo "use_nix -p <pkgs...>" > .envrc into a directory to give me a quick and dirty local environment to contain deps. I don’t really care that much about garbage collection and disk utilization, but having these experiments local somewhere ensures that the tools pulled in for the session are wiped at some point.

                                                      For projects I actually work on, I always try to define my dependencies locally to that project. For projects which aren’t mine and where I don’t want to force nix on the upstream, I have a nix-utils repository where I gather .nix files which I symlink or import in the other projects.

                                                      I try not to be too opinionated on this. I always assess the situation, or adapt over time. There’s no point in insisting on whats better or worse. I just want “shit to work”, while not feeling I’m compromising ergonomics.

                                                      1. 1

                                                        Applying updates is faster (less to download/install), smaller attack surface, smaller rootfs size. Just to name a few of by reasons..

                                                        1. 1

                                                          None of those things are true. The question was not about the benefit of using less software, it was about the benefit of having less global software. In the end, the amount of software you need is approximatively constant irrespective of the way you manage it. If anything, managing non-global software requires slightly more software to manage (exactly what the blog post is about). In practice, it might require even more than that since you would be more likely to use different versions of the same software simultaneously.

                                                          1. 1

                                                            In practice, it might require even more than that since you would be more likely to use different versions of the same software simultaneously.

                                                            Yes, but there is great thing in that - you have reproducible builds. So no more problems when for example for some developers application stopped working because they have updated DB already and some are still using old version. Think about it as a Docker-like library isolation, but without Docker. So no more problems with OpenSSL version mismatch, no more problems with custom patches to the software (as these can be stored in Nix derivations), etc. Ok, you in theory use more disk space (which can be optimised anyway) but you gain the option of making application building everywhere without worry for small but annoying incompatibilities.

                                                            1. 1

                                                              You don’t need to use NixOS to have reproducible builds.

                                                              You don’t need to use NixOS to use Nix.

                                                              You don’t need to avoid installing global packages in order to have reproducible builds. Especially on NixOS.

                                                              1. 1

                                                                Of course you do not need NixOS for that, I never said anything like that. Just Nix (with or without NixOS) make it simpler.

                                                                Of course you do not need NixOS to use Nix, I use Nix on my macOS.

                                                                Of course you do not need to avoid global installations to have reproducible builds, just do not having to do so make it less error prone (as it will not accidentally use globally installed package).

                                                            2. 1

                                                              In the end, the amount of software you need is approximatively constant irrespective of the way you manage it.

                                                              A competent package manager that can correctly handle dependencies will get you a long way towards this without requiring a lot of extra software.

                                                              None of those things are true.

                                                              Do you think that downloading/applying 100MB of update > applying 1GB+ of updates, or that having extraneous libraries/services installed reduces the attack surface of your system, or that somehow a rootfs that is tens of GB in size is < a rootfs measured in hundreds of MB?

                                                      1. 2

                                                        This post was also featured in the 200th episode of CppCast starring Herb Sutter.

                                                        1. 4

                                                          This book comes at a great time. I’ve been asked to develop a course on functional programming and was thinking of using OCaml (or Reason) for the same reason as the authors indicate: it doesn’t take functional programming to the extreme as Haskell does but is sufficiently different from more mainstream languages that mix imperative and functional aspects.

                                                          I enjoy writing Haskell but teaching it will require an introduction to concepts from category theory (monoids, monads, etc.) that I fear may distract students from learning to reason as a functional programmer.

                                                          1. 10

                                                            I enjoy writing Haskell but teaching it will require an introduction to concepts from category theory (monoids, monads, etc.)

                                                            If this were true there would be like three Haskell programmers. I don’t know OCaml so it’s hard to make a case either way, but judging from what you’ve said here, I think your students would benefit if you were to go the Haskell route because these concepts that you mention are actually extremely useful–as programming constructs.

                                                            I think functional programming is somewhat of a misnomer, maybe ‘algebraic’ programming would be more fitting, because the point is really to promote as many constructs (not just functions, but state, I/O, maybe even types) into first-class objects in the language, and do so in an organized (algebraic) manner. If you just do some functional data pipelining but slip into implicit state and I/O whenever you want, you’re not really forced to expand your comfort zone, and that’s what teaching “functional programming” is supposed to be about. Learning about maps and folds and all that is fun but honestly you can do that in JavaScript nowadays.

                                                            1. 3

                                                              I think your students would benefit if you were to go the Haskell route because these concepts that you mention are actually extremely useful–as programming constructs.

                                                              If they want to continue learning (or start working) after the course they may be better off with a grounding in Haskell than OCaml. It seems like Haskell probably has a bigger community, more resources and jobs etc…

                                                              I’d also mention Elm as a candidate language, I’ve not used it but I’ve seen people refer to it as a gateway or stepping-some to Haskell. I’m not sure of the students background, but if they learned a bit of Elm they’d be able to build websites, which is neat.

                                                              1. 4

                                                                Elm’s a good suggestion. The language is smaller and its compiler is very helpful. The application domain of Elm, websites, fits with the theme of the semester the course will be a part of. But I’ll have to investigate whether it suits the course’s goal (see next paragraph).

                                                                Haskell may be more popular language (I don’t have any numbers though but it’s certainly the language I hear most about). The aim of this introductory course is to teach students concepts such as pure functions, algebraic data types, recursive algorithms, commonly used functional data structures, etc. With that knowledge, it should be easy to learn a new functional language.

                                                            2. 4

                                                              it doesn’t take functional programming to the extreme as Haskell does but is sufficiently different from more mainstream languages that mix imperative and functional aspects.

                                                              There’s at least two theories of learning: gradual steps toward something; immersion. I’m not sure one is better than the other when we’re talking about a new paradigm. I lean toward immersion but it can overwhelm. Lots of programmers are also casual learners with no intent to fully immerse to try something. So, having a language for each style makes sense.

                                                              Ocaml lets imperative programmers gradually pick up elements of functional programming. It can generate interest that might make them jump to full-on functional programming like Haskell offers. I think it’s great to have a book that teaches them that within Ocaml that they already know.

                                                            1. 17

                                                              I don’t consider Emacs Lisp, vimscript or even TeX to be DSL’s. They are fairly general purpose programming languages. Is C a DSL for building compilers and operating systems? Is PHP a DSL for building websites?

                                                              1. 3

                                                                They may not be DSLs formally, but informally, at least in my experience, most Emacs users don’t view the code in their .emacs file as a full-blown programming language . Instead they learn the “magic words” required to set something to a value they want, copy that to a file, save that file, and more often than not restart Emacs and get the correct font color or whatever. Realizing you can apply the change directly by executing that line is next-level understanding.

                                                                1. 2

                                                                  Xmonad uses Haskell for its config file. Dues that make Haskell a dsl too?

                                                                  And restarting emacs is not a bad idea since you start from amino good state. Making changes on the fly works until it doesn’t. Especially for ui changes on the gui client. Even switching default themes often leads to unexpected results.

                                                                  1. 2

                                                                    (I’ve deleted my previous reply because I wrote it just before going to bed, having drunk a beer - not a good lobste.rs moment).

                                                                    Having thought about this some more, I’m going to go beyond personal preference and experience and say that Emacs Lisp is a Domain Specific Language - it’s a language specific to the domain of Emacs editor programming.

                                                                    And Wikipedia agrees with me!

                                                                    From that article:

                                                                    The line between general-purpose languages and domain-specific languages is not always sharp, as a language may have specialized features for a particular domain but be applicable more broadly, or conversely may in principle be capable of broad application but in practice used primarily for a specific domain.

                                                                    This fits elisp to a T.

                                                                    I wouldn’t say Haskell is a DSL just because it happens to be used as a configuration language for a specific application. If in 20 years the only place where Haskell is still used is in xmonad, then it would be a DSL.

                                                              1. 5

                                                                I teach networking at a university. I like The TCP/IP Guide. As the name implies its focus is on the TCP/IP stack and its protocols. However, the problems the layers and protocols address are treated more generally. That makes it a great fit for the software engineering program the course is a part of.

                                                                1. 15

                                                                  For those interested in pursuing this idea even firther, may I recommend Type Driven Development with Idris by Edwin Brady.

                                                                  Idris uses dependent types that allow the state types to carry additional information. I implemented a system for handling files where the open file state type conveys in what mode the file was opened. This prevents code that tries to write to read-only files from even compiling.

                                                                  It also prevents duplicate code as the read function is automatically available for any file that’s opened in a mode that allows reading.

                                                                  1. 5

                                                                    F* also supports dependent and refinement types, if you like F# but also want to take it a little deeper down the functional rabbit hole.

                                                                    1. 1

                                                                      You don’t necessarily need to use dependent types for that. In Rust, you can use tagging through generics for that.

                                                                      Some state machine libraries rely on that.

                                                                      Not to take away the point, dependent types make that a lot easier. The strategy can (and should) be followed in other languages, though.

                                                                    1. 2

                                                                      In Emacs, I use the built-in Leuven theme. It has excellent support for org-mode.

                                                                      1. 2

                                                                        I don’t think Leuven is built-in; it’s on melpa. But I was going to agree that it’s probably the best (most complete and consistent) light theme for emacs.

                                                                      1. 9

                                                                        Interesting article. My suspicion of deep learning was always around lack of symbolic capabilities. There is an article I recently posted that outlined all the issues with the first AI winter and the current bubble seems to be committing the same kinds of mistakes. Researchers are fooling themselves into thinking they’re addressing real issues about intelligence when in reality they’re just building better amd better pattern matchers. Nothing wrong with that approach but the hype doesn’t line up with reality and that’s usually when bubbles pop.

                                                                        1. 5

                                                                          Exactly, most of what passes for AI really is just function estimation. In that context the term AI is a misnomer.

                                                                          1. 7

                                                                            But to be clear, we’ve had some pretty good success with function estimation being applicable in the real world, e.g., voice recognition and translation. It simply is not the magic sauce that people want to believe that it is.

                                                                            1. 4

                                                                              The current “AI” techniques can work, but still not be intelligence.

                                                                              1. 2

                                                                                What is intelligence though? Could it be the case that it’s nothing more than trillions of dumb function estimators?

                                                                                1. 1

                                                                                  Due to function composition, the current AI wave is proving that assertion false. Even driving cars is proving to be a little bit more than an over complicated mathematical function.

                                                                        1. 1

                                                                          Is there any feature that doesn’t exist out-of-the-box on Linux?

                                                                          1. 4

                                                                            GPU drivers

                                                                            1. 1

                                                                              Most likely, I’ll end up buying a Lenovo A485 to replace my MBP 2012. To my knowledge, the AMD and Intel GPU drivers work out of the box these days so it’s only NVIDIA, right?!

                                                                            2. 2

                                                                              macOS support.

                                                                              1. 1

                                                                                Nothing like that exists out of the box. Linux is but a kernel.

                                                                                1. 1

                                                                                  In @soc’s defense, he wrote “[…] on Linux”.

                                                                                2. 1

                                                                                  You don’t have to use xorg/wayland.

                                                                                1. 1

                                                                                  Using precompiled headers will shave a bit of the compilation time, but the compiler will still have to do the template instantiations every time. Has the author tried explicitly instantiating the templates in a different translation unit?