1. 30

    This is a constant language problem on HN and I see it here sometimes too… define the word “developer”. Alternatively define the word “professional”.

    Is it possible to use FreeBSD for a developer machine? Yes, if your definition lines up with the software available for FreeBSD. Otherwise no. You need to define developer first.

    Same argument as “is the 2019 MacBook Pro (or Mac Pro) a real professional machine?” Yes, if you are a professional and your needs line up with the capabilities of that machine. Otherwise no.

    But those terms are so broad that there cannot be one single answer. Yet that doesn’t stop people from arguing about it.

    1. 6

      Precisely this. There are many different ways to be a “developer” and some of them are easy on FreeBSD and some are impossible. Personally, as I spend most of my time in Emacs or Jupyter notebooks, it would work great for me. When I was doing CUDA development, or writing complicated media transformation pipeline using QuickTime, it was a no-go.

      1. 3

        Headlines are going to be like this. If you want specific definitions of every word in a headline, maybe we should increase the Lobste.rs headline character limit. If the author doesn’t address the headline in the article, I could understand your complaint, but in this case it’s well addressed.

        1. 4

          The article goes into detail about which development activities work well and which do not. This comment seems like needless nitpicking to me.

          I’m pretty disappointed this comment has more upvotes than the thoughtful, interesting, and informative article. What the heck is going on with Lobste.rs?

          1. 1

            Yes. I guess people online just want to argue about something, and the ambiguous definition of “developer” makes it “fun”.

            In all seriousness, the only thing I found that is completely impossible is CUDA on FreeBSD, but I guess this is not part of OP’s “developer” from what he said in replying another comment here. Does it prevent me from using FreeBSD? No. I just sshfs v100: /n/v100 and ssh v100 make run.

          1. 5

            Bitmap fonts have a cool retro look, but I don’t get why you’d want one for productivity. Typographic legibility has been studied for a century at least, and there’s a reason so much work went into vector fonts and antialiasing in the 80s and 90s. (John Warnock did early work on antialiasing at PARC before founding Adobe.) Bitmaps have shit legibility. If you want tiny text, get a high-DPI display and a good programmer’s font like Fira Code.

            Signed, crabby old fart who remembers staring at 5x7 bitmap text on his childhood Apple ][ and would have sold his soul to Satan for a Retina display

            1. 2

              Even on a retina MacBook pro, I’m still using the bitmaps in pragmata pro. Vector fonts just can’t beat the crispness.

              1. 2

                Bitmap fonts have a cool retro look, but I don’t get why you’d want one for productivity. … Bitmaps have shit legibility.

                Whether a font looks legible is highly subjective. Hell, almost everything about fonts is subjective.

                Signed, crabby old fart who remembers staring at 5x7 bitmap text on his childhood Apple ][ and would have sold his soul to Satan for a Retina display

                See this image

                Which looks better? the first font is cozette, the next is Fira Code, the last is ttyp0 (bitmapped). All of them are legible (IMHO), but the bitmapped fonts are a little crisper.

                1. 4

                  Those all look blurry to me because they’re white-on-black. I find text on black backgrounds harder to read, and more so if the whole screen is black — I think because the irises open wider to let in more light, which reduces sharpness, specially when you have astigmatism as I do. (My eyes aren’t especially bad or anything. Honestly I don’t know how anyone can prefer “Dark mode”.)

                  The bitmaps will be sharp due to pixel alignment of orthogonal lines, but they also contain a lot of visual noise from the aliasing of the non-orthogonal strokes. And on a 300+DPI display I don’t think the alignment matters that much.

                  Legibility isn’t especially subjective. Many empirical studies have been done, with many people as test subjects, where reading speed and comprehension were measured with different typographic choices.

                  1. 1

                    I for one am thankful that Go Mono exists. At least one company/foundry agrees that serifs aid legibility.

                    1. 2

                      I’ve used Luxi Mono for quite a while because I crave serif monospace fonts (and don’t like Courier!).

              1. 37
                  The venerable master Qc Na was walking with his student, Anton.  Hoping to
                prompt the master into a discussion, Anton said "Master, I have heard that
                objects are a very good thing - is this true?"  Qc Na looked pityingly at
                his student and replied, "Foolish pupil - objects are merely a poor man's
                closures."
                
                  Chastised, Anton took his leave from his master and returned to his cell,
                intent on studying closures.  He carefully read the entire "Lambda: The
                Ultimate..." series of papers and its cousins, and implemented a small
                Scheme interpreter with a closure-based object system.  He learned much, and
                looked forward to informing his master of his progress.
                
                  On his next walk with Qc Na, Anton attempted to impress his master by
                saying "Master, I have diligently studied the matter, and now understand
                that objects are truly a poor man's closures."  Qc Na responded by hitting
                Anton with his stick, saying "When will you learn? Closures are a poor man's
                object."  At that moment, Anton became enlightened.
                
                --- Anton van Straaten
                
                1. 5

                  Lo, I came here to post that very koan, and saw upon my arrival that it had already been done.

                  1. 14

                    And now you are enlightened.

                  2. 2

                    This is especially true if you know how objects in Smalltalk / Self work.

                  1. 7

                    This is so pointless. Here is wc in awk with 52 characters without a single branch. Took about 10 seconds to write.

                    {b+=length($0)+1;w+=NF;++l}END{print l,w,b,FILENAME}
                    
                    1. 1

                      Here’s one in Perl (it doesn’t print the filename, though):

                      $l++;$w+=@F;$b+=length}{print "$l $w $b\n"
                      

                      Explanation:

                      • @F in scalar context is the number of fields (NF)
                      • length without arguments is the length of current line
                      • }{ is the END

                      Example:

                      echo "hello world" | perl -ane '$l++;$w+=@F;$b+=length}{print "$l $w $b\n"'
                      
                    1. 5

                      Time to upgrade this benchmark of scheme implementations?

                      1. 2

                        Thanks for this. Even since I saw this [1] I have been looking into Lisp. I started looking and realize its a pretty big community with many dialects and implementations

                        1. https://fodor.org/blog/webassembly-hello-world
                        1. 8

                          -Wpedantic: webassembly isn’t a lisp, it just uses s-expressions for describing its text format.

                          1. 1

                            To quote you 7 months ago: “unreadable langauges with too many parenthesis”, let me know how your search goes.

                            1. 1

                              Honestly I stand by that. Every example of Lisp I have ever seen, looks like this:

                              (sunday 10
                                 (monday 11
                                    (tuesday 12)))
                              

                              Where the linked syntax looks like this:

                              (sunday
                                 10 (monday
                                    11 (tuesday 12)
                                 )
                              )
                              

                              Style matters. Its a small difference, but to me its markedly more readable.

                          2. 1

                            By the look of the raw numbers, guile has to be much more than an average of 2x speed up to be any where near chez.

                            1. 2

                              “Compared to 2.2, microbenchmark performance is around twice as good on the whole, though some individual benchmarks are up to 32 times as fast.”

                              So depending on how “around” rounds off, it may be. :-)

                            2. 1

                              I was surprised to see that gambit overtook Chez. I honestly have no idea who uses it.

                              1. 1

                                That’s a combined statistics of gambit and gerbil. I use gerbil for small stuffs.

                            1. 1

                              Nice and practical approach. Though you probably want more than the device serial for this to be secure (depending on your threat assessment).

                              Compare with Apple Watch -> Mac proximity unlock:

                              When enabling an Apple Watch to unlock a Mac, a secure link using Auto Unlock Identities is established. The Mac creates a random one-time-use unlock secret and transmits it to the Apple Watch over the link. The secret is stored on Apple Watch and can only be accessed when Apple Watch is unlocked. The unlock token is not the user’s password.

                              During an unlock operation, the Mac uses BLE to create a connection to the Apple Watch. A secure link is then established between the two devices using the shared keys used when it was first enabled. The Mac and Apple Watch then use peer-to-peer Wi-Fi and a secure key derived from the secure link to determine the distance between the two devices. If the devices are within range, the secure link is then used to transfer the preshared secret to unlock the Mac. After successful unlock, the Mac replaces the current unlock secret with a new one-time use unlock secret and transmits the new unlock secret to the Apple Watch over the link.*

                              https://support.apple.com/guide/security/apple-watch-usage-sec947c4b977/web

                              1. 1

                                Good idea, to copy one time keys to the USB pendrive for example :)

                                1. 3

                                  You are missing the point that “The secret is stored on Apple Watch and can only be accessed when Apple Watch is unlocked.”

                                  1. 1

                                    Indeed, an I bet that the secret can only be decrypted using the secure element, which can only be used by unlocking the watch.

                                    1. 1

                                      No matter how good the encryption is, there is always this case where encryption quality does not matter at all :)

                                      https://www.xkcd.com/538/

                                      1. 1

                                        Sure. If I am target of the NSA or whatever, encryption does not matter. That does not mean that one should not use a cryptographically secure setup as a default. There are many other attack vectors that this protects very well against, including laptop theft, or being arrested by police that does not use wrenches to get a password (which is the most likely way to get arrested in my country).

                                        Edit: not that I currently use this method for unlocking my Mac. I like Touch ID much more, but it was great before I had a Touch ID-capable Mac.

                              1. 1

                                You just proved that median does not equal to mean, and you stated that you would bet on median instead of mean.

                                In other words, in parallel universes, there are larger number of you losing money than the number of you earning money. Although if you pool all of your money from all the universes, and redistribute it evenly among all of you, you gain.

                                I would definitely bet, and I will bet on a fixed dollar amount each time.

                                By the way, you also proved that E[X] ≠ exp(E[log(x)])

                                1. 9

                                  By the time I was ready to ditch the host operating system and install Plan 9 on bare hardware, my desire for the modern web experience had ebbed to an all time low.

                                  As much as I love Plan 9, not having a modern web browser is a non-starter. Too much of the world depends on that: I need to be able to read the news, video conference, consult reference materials, do my banking, order pizza, and so on…

                                  1. 14

                                    Ultimately, the magic of Plan 9 is you can write a file server for the seamless/grubhub API, and then all you need to do is mount your pizza place of choice, and kick off the delivery with

                                    echo cheese > /n/pizza

                                    1. 8

                                      Except someone needs to do the work, which is mostly a waste of time, not to mention api’s for services like that are far from stable.

                                      1. 6

                                        Mostly a waste of time?

                                        Once it’s done, it’s usually done for years. And APIs are getting better, not worse, generally.

                                        cat /n/pizza/toppings; echo 'pepperoni' >> /n/pizza/order; echo 'done' >> /n/pizza/order

                                        Actually sounds like a super simple way to order pizza. From here a pretty simple UI could be made.

                                        My issue with plan 9/9front is as sl says: it just isn’t for me at this time, and maybe never. But the ideas it has, can and have been, used in other places.

                                        When it comes to powerful text editing, the tools I use work across practically any OS I touch. And to me its those tools that are powerful as long as they remain small (so that they can maintainable, and portable).

                                        1. 3

                                          My point is the comment is making it seem unrealistically easy in terms of effort for reward to use ‘magic’ to implement a 9p filesystem for ordering pizza.

                                          1. 2

                                            I was joking :). Writing a 9p server isn’t exactly easy, but, to extend indirection’s comment, it would be kind of nice to grep and echo for pizza

                                            1. 3

                                              Writing a 9p server is an hour or so of work, at least with lib9p. Maybe less. Getting it to order pizza is harder.

                                          2. 2

                                            Yeah, that sounds like a super simple way to order pizza because its skipping most of the things involved in ordering pizza, like choosing the pizza place and giving them your address and payment info.

                                            1. 2

                                              All that stuff could be done once.

                                              echo '1 north pole' > /n/pizza/address; cat /n/pizza/places; echo 'pizzapizza' >> /n/pizza/place; echo 'mypaymentinfosoateuhstaoheus' > /n/pizza/payment or whatever.

                                              Not saying the same can’t be done with other systems.

                                            2. 0

                                              username checks out

                                        2. 5

                                          i lean hard on my smartphone for some of this. so far, for the same reasons as you, i’ve been unable to avoid either one or the other (using a modern web browser on my pc or carrying a smartphone). what i can do is limit the number of vectors exposing me to harm, as often and as thoroughly as possible. it’s fair to say that if the modern web is a hard requirement then living in plan 9 may not be for you. realize, though, that in spite of the many enticements being offered, it is still perfectly possible to get a lot of computing done without directly transmitting data to surveillance companies.*

                                          (* sins of the telecom carriers sadly acknowledged.)

                                          1. 3

                                            You could do it the other way around and run Plan 9 in a browser, according to this little project:

                                            https://github.com/sirnewton01/9webdraw

                                            1. 2

                                              There’s vmx or vnc for when you really need it.

                                              1. 1

                                                As it mentions, you can install another OS in a vm and run a browser there.

                                                1. 1

                                                  I know, I just hate switching work environments back and forth…

                                                  1. 2

                                                    A modern browser is itself a VM.

                                                    1. 10

                                                      The browser is the new Emacs

                                                      1. 14

                                                        No, the browser is successful.

                                                        1. 8

                                                          M-x oh-snap

                                                          1. 3

                                                            I actually try this, you know…

                                              1. 19

                                                I set out to write a comprehensive answer to this, but I suspect it comes off as more polemical and less informative than I’d prefer:

                                                http://helpful.cat-v.org/Blog/2019/12/03/0/

                                                1. 5

                                                  Thanks for the write up. There is one thing missing and perhaps everybody using a computer would be interested in. How do you do backup?

                                                  1. 4

                                                    Thank you. I’m starting a series on individual howto topics. This would make a good one. Hint: http://man.9front.org/8/mkfs

                                                    1. 2

                                                      Excellent! Looking forward to this.

                                                  2. 2

                                                    Thank you for this (as well as your previous comments). Very informative.

                                                    1. 1

                                                      Thanks a lot, that was great. I’ve been following your sites for a while and I’ve always wondered what your day-to-day computing experience looked like

                                                    1. 15

                                                      TL;DR: 9front plays well with other systems with very few setup.

                                                      If you do not want to install 9front on your main disk and boot it by default, you may make use of a virtual machine, either local or hosted on a VPS or some computer at home.

                                                      Then you can connect to it through http://drawterm.9front.org/, which does provide a “plan 9 window” (think of SSH + X11 forwarding + SFTP onto a much simpler protocol).

                                                      It is surprising how well this works in practice since drawterm got resizing support : all the windows inside it will be resized equally well due to how plan9 handles resizes.

                                                      You can start a window in system (rio) in it, or directly one application (acme, sam, other…).

                                                      You can also copy paste from/to it, and have your local filesystem mounted inside 9front for sharing files between the local and remote.

                                                      After a while, you can integrate more of 9front onto your environment (replace a DNS (ndb+cs) / mail (imap,smtp,spamfilter) / VPN (tinc) server with it. It works well.

                                                      Given all of these are filesystems available as 9p streams, you can mount them onto other non-9front systems. Here comes all the fun: use 9p servers so that systems provide services to others. You can mount natively 9p on linux and through FUSE https://github.com/mischief/9pfs

                                                      Then the frontier between 9front systems and other systems tends to blur, and you achieved distribution of your computing through multiple systems. I haven’t been that far due to lack of time (and other project ongoing).

                                                      In this vision, you can use 9front for getting some work done, and make use of other systems for what else good they have and 9front lacks, and the other way around.

                                                      I did not test the other way around: running Linux or alike in 9front. as it has an hypervisor: http://man.9front.org/1/vmx

                                                      1. 4

                                                        If you use macOS and have a retina display, you can use my fork of drawterm, https://bitbucket.org/j-xy/drawterm/, which has the same metal backend as the one in plan9port devdraw.

                                                        By the way, with the new mailing list host, you can see all the “glory/gory” details about the community at https://9fans.topicbox.com/groups/9fans

                                                        1. 2

                                                          Nice, have you thought about getting your patches into the drawterm that 9front ships?

                                                          1. 3

                                                            Sure. I talked to folks on irc, but it didn’t get anywhere, apart from one commit, https://code.9front.org/hg/drawterm/rev/ff43e9bf3cea

                                                            1. 2

                                                              post to the 9front mailing list or e-mail cinap directly.

                                                        2. 3

                                                          You got me to upload the ISO to a VPS on Vultr, and I can connect to its console and get a window manager! Thank you.

                                                          I don’t have a 3-button mouse, though. IIRC that’s pretty essential? Is there some way to emulate middle-click, particularly over the internet?

                                                          I see a terminal window open. How can I open a second?

                                                          I haven’t yet tried drawterm, but I look forward to trying it out next.

                                                          1. 2

                                                            Thank you for your input. This gradual approach does indeed sound sensible.

                                                          1. 1

                                                            For a dictionary of 235886 words, the four-word “correcthorsebatterystaple” requires (235886^4)/(2^70) ~ 2.6 million US dollars. So what? Just make it six words.

                                                            By the way, where does this 1197962070743187 number come from?

                                                            1. 1

                                                              For a dictionary of 235886 words

                                                              Indeed, this also goes to point 1, that the entropy is hard to figure out. The XKCD comic indicated that it was using a 2048 (2^11) word dictionary, which apparently is about the size of the dictionary some cryptocurrency wallets use.

                                                              where does this 1197962070743187 number come from?

                                                              From this article: 2^75/(365*24*60*60)

                                                            1. 3

                                                              This process can be expressed as a couple of binary operations, by first mapping the input as whitespace (0) and non-whitespace (1). Shifting that binary value by one digit and inverting it produces a mask that can be used to find word boundaries, which computers are great at counting.

                                                              Wait so, since you’re already tokenizing and parsing input why is it more costly to increment a counter?

                                                              1. 2

                                                                In simd.h

                                                                static inline int count_words(simd_vector vec, wcount_state *state)
                                                                {
                                                                	simd_imask ws = simd_imask_from_mask(simd_cmpws_i8_mask(vec)),
                                                                	           first_chars = ~ws & ((ws << 1) + *state);
                                                                	*state = ws >> (sizeof(simd_vector) - 1);
                                                                	return simd_imask_popcnt(first_chars);
                                                                }
                                                                

                                                                You can find what simd_imask_popcnt actually is in that file. POPCNT, especially the simd versions, are much faster than looping and incrementing a counter.

                                                                1. 1

                                                                  In fact GCC an LLVM even try to find code implementations of POPCNT to swap it for for one instruction.

                                                              1. 15

                                                                I’ve recently started using Makefiles for a lot more stuff; I use them in my notes directories to turn text files into PDFs, as well as whenever I’m programming. The only time I haven’t yet managed to get a decent workflow with make is when working with raw TeX (I try and avoid it where possible) - the workflow is so clunky (repeating commands and so on) that when I tried it still broke on me.

                                                                Thanks for this!

                                                                1. 18
                                                                  main.pdf:
                                                                  	latexmk -pdf $(basename $@)
                                                                  
                                                                  1. 3

                                                                    I didn’t know about latexmk, thanks!

                                                                  2. 3

                                                                    My current interesting (to me) Makefile use is, when I update underlying data tables, to automatically update all the dependent summaries and extracts for a public health research project at work.

                                                                    1. 3

                                                                      For commands that don’t have an output or need to be repeated multiple times, I found it useful to touch sentinel files, or use other artifacts outputted by the command that have a different semantic meaning, as checkpoints.

                                                                      1. 1

                                                                        Oops. How do I “folding” it into that?

                                                                        1. 1

                                                                          It has to be done by a mod. Paging @pushcx or @alynpost.

                                                                      1. 1

                                                                        Waiting for it to be ported to other systems.

                                                                        1. 1

                                                                          No colours!

                                                                          I wish the diff view in tog would have them.

                                                                        1. 2

                                                                          Ask: Is avoiding trying an array language like APL, because of the obtuse syntax and weird keyboard-usage requirements, a bad thing?

                                                                          1. 9

                                                                            It changes you.

                                                                            The fringes of software can be so strange and so incredible it is difficult, after living there so long, to use the term “best practices” with a straight face. It might also be nice to still believe there’s any difference at all between python and php; it was certainly easier to talk to other programmers back then. There’s other things, like my spacebar used to get more action.

                                                                            And yet, I still maintain array programming is in the top-five things that have made me the better programmer today.

                                                                            1. 4

                                                                              It depends on whether you think learning something very different (that will change the way you think about programming) is worth the investment. The good thing is that you can approximate the experience by watching this video. It walks through an implementation of Conway’s Game of Life in APL and shows how simple it is when you have APL’s powerful operators. Genuinely mind-blowing, and it leads you consider what might be possible if those operators were available in mainstream programming languages.

                                                                              1. 1

                                                                                A different question would be: Is avoiding trying an east Asian language like Chinese or Japanese, because of the obtuse grammar and weird keyboard-usage requirements, a bad thing?

                                                                              1. 25

                                                                                Go: the basic idea behind defer is excellent.

                                                                                Rust: memory-safety without GC is an amazingly wonderful goal.

                                                                                Java: pioneered one of the (now) most prevalent strategies for write-once/run-everywhere (bytecode VM).

                                                                                C#: fixed a lot of boiler-plate and ergonomic problems from Java.

                                                                                Ruby: prizing developer ergonomics is lovely.

                                                                                Javascript: making programming accessible to everyone (essentially every computer ships with a fully-functional IDE) is awesome.

                                                                                C++: offering blessed, zero-cost abstractions is a lovely gift.

                                                                                Python: the idea of only having one way to accomplish a task is the dynamically-typed version of my C++ comment above.

                                                                                PHP: what would we even do without wikipedia?

                                                                                Excel: phenomenally-intuitive in a way that no other modern GUI programming has managed to rival

                                                                                1. 10

                                                                                  Java: pioneered one of the (now) most prevalent strategies for write-once/run-everywhere (bytecode VM).

                                                                                  I enjoyed your list. Except this was popularized by UCSD Pascal which you might find interesting. I think Wirth said this design got Pascal ported to over 70+ architectures in 2 years with diversity ranging from 8-bit personals to odd-sized mainframes. System/38, later AS/400, also had platform-neutral code it compiled to to make it future-proof. See this for it among others.

                                                                                  1. 2

                                                                                    Python: the idea of only having one way to accomplish a task is the dynamically-typed version of my C++ comment above.

                                                                                    I truly enjoyed this idea of Python 20 years ago.

                                                                                  1. 1

                                                                                    I really wish there would be a generic scheme R7RS implementation, instead of depending on Racket.

                                                                                    1. 1

                                                                                      but why not depend on racket? after all, the primary reason racket broke away from its scheme roots was they felt they could design a better language as an evolution of scheme.

                                                                                      1. 2

                                                                                        The latest release is discouraging to me: “the use of single-flonums appears to be rare”.

                                                                                      2. 1

                                                                                        Have you looked at Chibi? It’s pretty good, and has a decent amount of useful libraries bundled.

                                                                                        1. 1

                                                                                          Well there’s Chez Scheme, which the latest version of racket is built on. I believe there’s an R7RS implementation floating around for it.

                                                                                          1. 1

                                                                                            I guess the question is really about how much of the code depends on some Racket specific features.

                                                                                            1. 4

                                                                                              Author here. Rash does rely on several Racket-specific features. I don’t recall any standard Scheme way to launch subprocesses (though I’ll be happy to be proven wrong). Supposing there is one you could make a library to do the subprocess pipeline at the core of Rash. This allows things like (run-subprocess-pipeline '(ls -l) '(grep foo)). But the pipeline operator macro stuff and the line macro stuff all use Racket macro magic.

                                                                                              • Most notably it needs syntax-local-value for macros to communicate (see “Macros that Work Together”.
                                                                                              • Rash relies heavily on syntax-parse, which is perhaps not strictly necessary but it would be a frustrating pain to implement directly with syntax-case.
                                                                                              • Also Rash uses things like syntax parameters, and some pipeline operators use local-expand.
                                                                                              • One fork of the repo (not yet in master) includes binding constructs you can use in the middle of a pipeline which require new macro facilities (I’m waiting for the APIs around it to stabilize before I put it in master).
                                                                                              • And of course Rash uses Racket’s #lang facility.

                                                                                              Standard scheme is great, but a Rash-like language in standard Scheme would be a lot more work and would lack a lot of Rash’s features. Racket’s macro system (IE the hygiene algorithm, the module system, syntax-local-value, syntax-parse, #lang, local-expand, etc, etc) really makes more ambitious DSLs possible, realistic, and interoperable.

                                                                                              1. 1

                                                                                                I’m not sure how widely it’s implemented but there is SRFI-170 which aims to provide POSIX compatibility, which includes process spawning, but it doesn’t seem to specify the behavior of pipes, and comments on the difficulty of file descriptors vs ports. That’s likely the non-portable angle here.

                                                                                                However, a truly motivated individual could use cond-expand, from R7RS, to craft an implementation of pipes/ports for each supported implementation. But … based on the little I’ve followed about Rash, it’s easy to underestimate the amount of work to get this right, I think.

                                                                                        1. 3

                                                                                          Mercurial is the only thing I use that depends on Python 2. I guess git would be the only way to go then.

                                                                                          1. 3

                                                                                            Python 3 support is in Beta, though.

                                                                                            https://www.mercurial-scm.org/wiki/Python3

                                                                                          1. 2

                                                                                            Replacing integers with strings? Is this really any better?

                                                                                            In a language with a better type system, each tensor index should really be a different type. Lots of errors would be eliminated by type analysis alone.