around in 10 years
See Hinsen's https://rescience.github.io/ten-years/
around in 10 years
See Hinsen's https://rescience.github.io/ten-years/
no matter how ill-adapted it is to our needs
I dunno. I think the common argument that the Web was not intended to be an application delivery platform is both (a) ignorant of basic facts in subtle ways that are materially relevant to the particular use case described here and (b) poorly applied to this use case, given those particulars.
I don't like most traditional Web apps or what passes for best practices in the contemporary culture. I don't write them, and I'm not defending them.
But we're talking about scientific literature here. I'll dispute the general argument as it applies to the specific use case under discussion by pointing out that a document-centric platform is in fact exactly the correct tool for the job in this case. The only thing that could be better is if you were able to write your paper more or less as you ordinarily do for journal publication and then feed the journal article into a machine able to comprehend the methods at a deep level and then simulate what it describes. We don't have that, though. But we can to author documents that are a little more explicit instead. This is not a terrible consolation prize. So we really should start seizing the benefits of the current circumstances, lest the Web platform actually turn into something unsuited for this. (Which, perversely, is most likely to happen as a result of pursuing the vision of making it more suited for traditional software development.)
Again—by all means, don't compile to asm.js (or WASM, or from TypeScript, etc.). Put it to use on its strengths and in the spirit of its original vision.
perhaps we will end up compiling our software to asm.js and run in the browser
Better yet, not compiling to asm.js at all. Just WYGIWYG (What You've Got Is What You Give [Me, Too]).
Note however that it’s not “any of today’s virtual machine managers”
I agree. And this very reason (along with the complexity, mentioned in the following paragraph) is what should disqualify VirtualBox.
The virtual machine manager you should use is the one you assumed would be available when you published this post (and that you were correct about, and that I am using right now to read it): the Web browser.
For the 2013 Web platform, you may hope that its sheer popularity will motivate someone to keep it alive, but I wouldn’t bet on it either. The Web platform is too complex and too ill-defined to be kept alive reliably when no one uses it in daily life any more.
There's some sleight of hand here, which treats "when no one uses it in daily life anymore" as a given. That (folks continuing to use it) is the stability of the Web platform.
Besides, even if we suppose that people have stopped using it (dubious), the entirety of what constitutes "the 2013 Web platform" is not necessary—only the parts that are actually used for computation and I/O. That's much smaller.
if you want to use an archived copy of a 2013 Web site, you need the 2013 Web platform
Fortunately, the 2013 platform is a subset of the later one.
we can’t know what trivial change to the environment might stop the experiment working, or (worse) make it appear to work but actually have a major change in it
"can't is too strong a word here"
The more I think about it, the less I think there is a meaningful definition of the one true run time. I have put significant effort into making sure that runtimes are consistent but, however we do this, it makes our experiments less realistic. With rare exceptions (perhaps some safety critical systems) our algorithms will not be used in highly controlled situations, moderated to reduce variability between runs or to maximise speed of this particular process. Algorithms will be run as part of a larger system, in a computer sometimes with many other processes and sometimes with few and, because of the way that computing has developed, sometimes in raw silicon and sometimes in virtual machines. So the more I think about it, the more I think that what matters is the distribution of run times. For this, your experiment on your hardware is important, but so are future recomputations on a wide variety of VMs running on a variety of different hardware.
The truth of this has consequences not just for the metaissue of recomputation, but the entire raison d'etre of doing performance studies to begin with.
If I can’t run your experiment at all, then I can’t reproduce your times.
"The greatest performance improvement of all is when a system goes from not-working to working"
We are not asking people to send us VMs, but to send us what they think we need to get the experiment to run. This is usually a few megabytes of code and maybe executables. Assuming we can run it in a standard environment, we can make our own VM without one ever being sent to us.
X for thee, not for me
Code you make available today can be built with only minor pain by many people on current computers
Before running it you need two free tools, Vagrant and Virtual Box.
This kills the crab.
There has been significant pressure for scientists to make their code open, but this is not enough. Even if I hired the only postdoc who can get the code to work, she might have forgotten the exact details of how an experiment was run. Or she might not know about a critical dependency on an obsolete version of a library.
Other examples of tech stacks that are very stable are C, C++, and Fortran.
Category error; C, C++, and Fortran are programming languages, not tech stacks.
sometimes, the system thecustomer wants and the system that should be built are quitedifferent.
Error establishing a database connection
Perverse!
the reason a lot of studies are made of these price and volume variables is that now, in the age of computers, there are almost endless data available about them. It isn’t necessarily because such studies have any utility; it’s simply that the data are there and academicians have worked hard to learn the mathematical skills needed to manipulate them. Once these skills are acquired, it seems sinful not to use them, even if the usage has no utility or negative utility.
Applicable as criticism for: - marketing analytics for "data-driven" campaigns - the sort of resume-driven development that is fashionable on Github - naive code reuse, generally
there is an intended reading order
In a world where all scientifically relevant information is stored in stable and well-defined open file formats, software tools can evolve much more freely without disturbing ongoing work or harming reproducibility.
Good formulation! All scientifically relevant information—this demands that the programs themselves be "stored in stable and well-defined open file formats". This is precisely what is missing (both the mindset and the practice).
I suspect, though, that the author themself has missed this and is thinking of the "software environments" (that he later refers to in this conclusion) as being outside this purview. But it need not (and should not) be.
David Cournape made the interesting observation that no technology less than 20 years old is better than Python in terms of stability.
Not true. The standardized Web platform is not just more stable than Python, it's probably one of the most stable platforms in existence. It just moves (read: improves) slowly.*
Most people don't recognize this, because they pack the stable, standardized parts all in the same mental bag as the shiny, non-standardized parts (like Flash, for an example of decades past, or experimental vendor-specific stuff for a more evergreen problem), then end up getting bit in a similar way and blaming the environment rather than communal tendencies towards recklessness.
It also turns out that the Web's original academic underpinnings are deeply aligned with the goals of researchers looking for a way to work together—even if the final puzzle piece (ECMA-262) didn't come into existence until later in the decade when the Web first appeared. It's still old enough that it passes the litmus test proposed here.
* for good reason; after all, look at the evidence
Every beginner-level tutorial for scientists should state during the first five minutes that you cannot expect stability and that you should either use Python only for throw-away code or else
My conclusion: the scientific computing community—and many Python programmers, generally—have done themselves a disservice by standardizing on Python. The problems that have been shown to arise here and in similar cases comes down to an impedance mismatch between what these programmers want Python to be and what Python actually is.
Another insight comes from observing the way in which folks from the affected group have tended to approach the problem—wading in with a sort of undisciplined, YOLO mindset and then thrashing when they've gotten in over the heads because it turns out that a lack of discipline permeates the actions of everyone else, too—which includes, crucially, those they look for to be disciplined so that there's something that can be relied upon.
Food for thought: although I'm not a Java programmer it's not hard to see that had they standardized instead on the JVM (doesn't necessarily have to be Java—could be a Python lookalike), then this would have almost certainly served them better here on the matter of stability and had the nice benefit of sidestepping the performance issues that Python is known for.
The technical solutions proposed all depend on yet more infrastructure whose longevity is uncertain.
The "every problem in computing can be solved with another layer of hacks" school of thought.
Finally, in anticipation of an argument that I expect to see, let me stress that this is not a technical issue. Computing technology moves at a fast pace, but that doesn’t mean that lack of stability is a fatality. My last Fortran code, published in 1994, still works without changing a single line. Banks have been running Cobol code unchanged for decades. Today’s Java implementations will run the very first Java code from 1995 without changes, and even much faster thanks to JIT technology. This last example also shows that stability is not in contradiction with progress. You can have both if that’s a design goal. It’s all a matter of policy, not technology.
What is not OK is what I perceive as the dominant attitude today: sell SciPy as a great easy-to-use tool for all scientists, and then, when people get bitten by breaking changes, tell them that it’s their fault for not having a solid maintenance plan for their code.
coding-intensive research
This is still not the best way to put it. Decisions come at the expense of writing code. This maintenance work is something else.
the poor reproducibility of Python-based computer-aided research
What I find surprising in the frequent heated debates is that the nature of the type system is rarely even discussed. People talk about static vs. dynamic types as if there were only one static and one dynamic type system.
Good point.
We can go further. Suppose I have a project written in TypeScript, and your affinity for TypeScript is well-known. Only—surprise!—I'm actually using TypeScript 1.x from n years ago. Are you still happy?
The closest technology I am aware of in this space is F# type providers
every computation on a modern computing system is actually a staged computation, with reproducibility of the last stage (the one we most care about) requires the reproducibility of all prior stages
This is not strictly true, but it's not the worst thing in the world to pretend that it is.
explicit documentation of both the execution environment used to run the software and all requirements and dependencies of systems, software, and libraries should be clearly noted in the code and/or readme file (Benureau and Rougier 2018). While time passing can make software obsolete, it also fades the memories of researchers. For that reason alone, it is important to annotate source code to explain the intended operations, which supports reproducibility for the original research team while also supporting future reusers (Benureau and Rougier 2018)
Most developers know and love github pages
An ActivePaper is, by defini-tion, a package combining the code, data, and documentationthat describe together a computational scientific study.
today’s notebook implementations require note-book authors to take various precautions to ensure repro-ducibility, which are exactly the same as required for makingscripts reproducible: a detailed documentation of the soft-ware environment that was used, listing all dependencieswith detailed version information
A recent study [25]of more than a million notebooks in public GitHub reposito-ries found many indicators of poor quality, some of whichsupport earlier criticisms of notebooks encouraging bad soft-ware engineering habits
C, Fortran, BLAS, and Unix
over the seven years of the project, I ended upspending a lot of time catching up with dependencies. Newreleases of NumPy and matplotlib made my code collapse,and the increasing complexity of Python installations addedanother dose of instability. When I got a new computer in2013 and installed the then-current versions of everything,some of my scripts no longer worked and, worse, oneof them produced different results. Since then, softwarecollapse has become an increasingly serious issue for mywork. NumPy 1.9 caused the collapse of my MolecularModelling Toolkit, and it seems hardly worth doing muchabout it because the upcoming end of support for Python 2in 2020 will be the final death blow.
perhaps the mostfrequent motivation for adding dependencies in layer-3 soft-ware is the desire to write less code oneself
Accept that your construction is short-lived. In caseof collapse, start from scratch
This seems to be the position adopted by many developers. More than is reasonable. #3 and #4 probably account for most developers.
a blog post
This one, it looks like: https://blog.khinsen.net/posts/2017/01/13/sustainable-software-and-reproducible-research-dealing-with-software-collapse/
There is a good chance that you have never heard ofsoftware collapse before, for the simple reason that it’s aterm I have made up myself two years ago in a blog post.
What I call software collapse is what is more commonly referred to as software rot: the fact that software stops working eventually if is not actively maintained. The rot/maintenance metaphor is not appropriate in my opinion because it blames the phenomenon on the wrong part. Software does not disintegrate with time. It stops working because the foundations on which it was built start to move.
Cited by https://link.springer.com/content/pdf/10.1007/s00287-018-01134-1.pdf
“on a decadal time scale, wecannot rely on software to run repeatably.
See also: Fielding
even if the code has been made available, it cannotbe easily run because of changes in the underlyinglibraries, operating systems, and other dependen-cies
Finally, software is hard to work with. Forgetmaking research reproducible, it is hard enough touse it 6 months later.
The “work around” was to detect users in an IAB and display a message on first navigation attempt to prompt them to click the “open in browser” button early.
That's a pretty deficient workaround, given the obvious downsides. A more robust workaround would be to make the cart stateless, as far as the server is concerned, for non-logged-in users; don't depend on cookies. A page request instead amounts to a request for the form that has this and this and this pre-selected ("in the cart"). Like with paper.
Roughly stated, my overarching career mission is to design, build, and deploy software platforms that put end users in control of their computing and data, in part by making it easy and natural for programmers to create software that honors user desire.
The idea here is to emulate the hardware platform WordPerfect ran on
That seems like unnecessarily tight coupling. Surely there's a better level of abstraction that's higher than "emulate the hardware platform".
We also see the usual conceit of totalizing systems like Microsoft Word: plain ASCII text files are accepted, as input files, but only “for compatibility reasons”. Ugh.
Huh?
in Oberon (as in Python, but very much not as in C or Pascal) a character is a string of length 1
nope
software collapse
Is this not just a new name for what was already described in the 1960s as the "software crisis"?
I can't possibly keep updating software to deal with new JavaScript versions
There's a fundamental misunderstanding (alternatively, misdirection) about what the source of breakage is. JS is not an SDK, and neither is the Web platform. Whatever worked in the old "JavaScript version" will work in the new one.
A complete description on implementing eventhe simple IMGUI would take too much space. Iinvite you instead to watch Casey’s video lecturemirrored on my web site, and look at the samplecode I’ve posted. I’d like to thank Casey Muratori, JonathanBlow, and Atman Binstock for feedback on thisarticle, some of which you can read on Casey’sweb site forum.
a “global variable” which identifies whichwidget is active
Instead, we simplydescribe them from scratch every frame, whichdoesn’t actually result in more code. It’s more likewe run the “create” code every frame.
Now imagine, as a performance optimization, a lib where you can write in IMGUI style, so you write the same amount of code, but behind the scenes, the lib is managing things, so it's actually free to do all the retained mode heavy lifting.
We just invented declarative programming.
This is less efficient than the previousapproach, but it’s less likely to have bugs.If we have CPU speed to spare, we can get rid ofall the bugs.
Interesting remarks, given the Muratori school on profligate misuse of computing resources by modern developers.
Game Developer. September 2005.
This describes one of the most pleasing hacks I've ever come across. I just now tracked it down and added it to my bookmarks. (Not sure why it wasn't already there.)
You could also conceive of going one step further. When your app (doesn't actually have to be a game, though admittedly it's much easier for you if it is) is compiled with tweak.h, it gives it the power to paint the source file on the screen—so you don't actually have to switch over to your text editor to save it, etc. Suppose you want to provide custom inputs like Bret Victor-style sliders for numeric values. You could edit it in your text editor, or you could derp around with it in-app. Tweaking the value in-app should of course both update it wrt the app runtime but also still write the file to disk, too, so if live reloading is turned on in your text editor, whatever changes you make inside the live process image gets synced out.
Hey, traveller. You're looking for https://web.archive.org/web/20070824202955/http://www.mollyrocket.com:80/forums/viewtopic.php?t=159&sid=cb913629aa8310947c0476848a8824dd
I like to organize all the state in a program so that it's reachable from some root pointer. This makes it easy for the reader to understand all the resources allocated by the program by just following the tree of types. It also makes it easy to find any piece of state from within a debugger, or to write little debugging helpers that eg check global invariants or print queue lengths.
I've gotten to where "if I can't make sense of it and be productive in it with just vim, grep, and find, your code is too complex".
But even allowing for grep is too lax, in my view. It's too high a cost. If I've got some file open and am looking at some Identifier X, I should be able to both deterministically and easily figure out exactly which file X lives in.
Violating this is what sucks about C's text-pasting anti-module system, and it's annoying that Go's "package" system ends up causing similar problems. I shouldn't have to have a whole-project view. I should be able to just follow my nose.
Maybe that’s why Wordpress has always struggled so much with building any kind of network effect
I think it is the beneficiary of a network effect—it's just driven by a professional class, and not end users.
Also: ho-hoism; see McCarthy to Russell on eval
and free of globals
Ah! This remark highlights a fundamental difference in understanding between two camps, which I have been (painfully) aware of, but the source of this confusion has eluded me until only just right now. (Really, this is a source of frustration going back years.)
In one camp, the advice "don't use global variables" is a way of attacking a bunch of things endemic to their use, most notably unnecessary coupling to spooky state. In another camp "no global variables" is understood to mean literally that and taken no further—so you can have as much spookiness as you like, and so long as the value is not directly accessible (visible) from, say, another given piece of code appearing at the top-level ("global") context, as with the way i is bound to the activation record in this example but is not accessible outside the scope of getGetNext, then you're good.
That is, there are two aspects to variables: visibility and extent, and the first interpretation seeks to avoid the negative effects on both dimensions, while the second is satisfied by narrowly prohibiting direct visibility across boundaries.
I find the latter interpretation bizarre and completely at odds with the spirit of the exhortation for avoiding globals in the first place.
(What's worse is the the second interpretation usually goes hand in hand with the practice of making extensive use of closures, which because they are propped up as being closely associated with functions, then leads people to regretfully refer to this style as functional programming. This is a grave error—and, to repeat, totally at odds with the spirit of the thing.)
I don't like bloat and the JavaScript fuelled Win98-isation of the web. Therefore I tend to write very spartan webpages. This one for example is generated from a lightweight markup format that I created, and uses only the P and A elements.
This is silly set of statements to make in series.
Just make the published form of this document the canonical representation—treat it as suitable for reading and editing alike (since it is).
Typography in HTML is awful
A similar mistake is being made here as the one that precedes the reminder that there is no such thing as a fast programming language—only a given implementation can be called fast.
I avoided using languages that I don't know how to bootstrap like node.js
There's a weird (read: "weirdly obvious") category error here. NodeJS is not a language. (This wouldn't be so notable if the comment didn't go on to say "The key point is writing to an interface and not an implementation.")
The puzzle piece that fits the shape of the hole here is "JS". JS is the language, NodeJS is one of its implementations—and chubot knew both of these things already, so it's odd that it was expressed this way. Plus, there's a lot more diversity of JS implementations than exist for e.g. Python...
IMO avoiding things like CommonMark and Python will just make your site worse right now
I don't see how avoiding Python "will just make your site worse"—whether right now, or ever. Is there supposed to be something inevitable about Python?
Its account of how Heft made his flag closely resembled the standard story, but instead of any assertion that it became the basis for the official design, it merely said that it was “considered Lancaster’s first.”
I'm having trouble parsing this.
I basically think of it as an "executable README". A README or blog post often contains shell commands. So I just copy those into a script.
Suppose that instead of shell commands, the snippets were JS, and the README, rather than being named README.markdown or README.txt, were actually named e.g. README.txt.htm. it wouldn't be basically like an executable README—it would actually be executable. You could double click it to open, and then read through it and use it to actually do the stuff that the README is documenting (like build the project in question).
See https://discuss.write.as/t/only-30-users-listed-in-users/6317 ("My site has 37 users now, but only 30 users are displayed[...]"; later: "Well. the 2nd page displayed when users got 60").
ES Modules was ratified by TC39 in 2019
Huh? Modules are ES6 aka ES2015.
they're called objects, and everybody has them
Even most ostensible FP practitioners who swear they don't.
Static variables are bad for re-entrancy. Code that accesses such state is not re-entrant. It is all too easy to produce such code. Case in point: javac. Originally conceived as a batch compiler, javac had to undergo extensive reconstructive surgery to make it suitable for use in IDEs. A major problem was that one could not create multiple instances of the compiler to be used by different parts of an IDE, because javac had significant static state.
Walter Bright described similar issues with the Digital Mars compiler in a recent NWCPP talk "Adding Modules to C in 10 Lines of Code", albeit Walter's compiler sounds like it was far easier to fix.
It's funny that this happens with compilers. Wirth's Oberon compiler (module ORP) also depends on static state. But compilers seem natural to me to be something that you want to allow multiple instances of—it's not even among the list of things I'd expect people to make excuses for (cf https://kentonshouse.com/singletons).
RSS may not have been "designed to work with comments in mind", but Atom supports them: https://www.xml.com/pub/a/2004/06/16/dive.html
There are no static variables and no initialization
This is an excellent property. It's not a weakness.
Since the original Pascal was implemented with a one-pass compiler, the language believes strongly in declaration before use. In particular, procedures and functions must be declared (body and all) before they are used. The result is that a typical Pascal program reads from the bottom up - all the procedures and functions are displayed before any of the code that calls them, at all levels. This is essentially opposite to the order in which the functions are designed and used.
Worth noting that almost every C program is impaired by a similar limitation in the C language (despite the disclaimer that follows this passage about the use of the preproccessor), and many programmers' thought processes suffer because of it—no consideration for the presentability of code (even when not in languages that are affected by this limitation!)
JavaScript Tips
This is a 404.
see {{bug(442099, “bug”, 19)}}
That's bug 442099, comment 19, i.e. trying to substantiate the opinionated claim that "an operator at the front" is better for human factors.
In JavaScript, == is preferred to ===.
And second it was not immediately visible in a program text, where an imported identifier was declared.
The problem of multiple import forms plagues ECMAScript today. Additionally the lack of "immediate" visibility of "where an imported identifier was declared" continues to plague Golang, to an extent even worse than described here for Modula-2 (because at least when you're iteratively jumping through the file with naive text search, you'll eventually reach the Modula-2 import statement, even though it involves wrapping around after reaching the bottom). It's explicit at some point. With Golang, on the other hand, having not been sufficiently wounded by the problems of C, the team designed it such that it has magical name resolution, making it tedious to carry out (as a human) the process that the compiler uses.
identifiers may now appear that are neither locally declared, nor qualified by a module name, nor visible in an import list; an entirely undesirable situation in a structured language
As an aside, we note that in object-oriented languages the concept of data type is merged with the module concept and is called a class.
I've been perusing codetriage.com/ this morning and most projects are essentially for the benefit of other developers.
This is the dirty secret of the neo-OSS era—that it's mostly devops shovelware (to a degree that makes it look like Sturgeon was being conservative)
The effort got him accolades and commit access to the Rails repo.
But having commit access and the having ability to fiddle with bugs are two orthogonal sets of privileges...
The creator of CodeTriage, Richard Schneeman, was surprised to learn one day that the Ruby on Rails core team (of about 7 or so people) were responsible for handling ALL the issues opened on the Rails GitHub repo. At the time, there were about 700 or so issues. These maintainers are hugely valuable to the project due to their depth of knowledge, however keeping up with issues was taking a huge amount of time. Would you rather these highly specialized maintainers spend their time developing new features and actually fix bugs, or would you want them to spend their days responding to hundreds of issues? Asking for simple questions like "what version of Rails are you using?", and "can you provide an example app?", and "is this fixed on master?”. While asking these questions might only take 5 or 10 minutes of time, the sheer volume of issues per maintainer was unreasonable. This was highlighted by the herculean efforts of another developer Steve Klabnik, who went through every single issue and responded to all of them in a marathon session spanning multiple days. The effort got him accolades and commit access to the Rails repo. While he deserves the praise, the efforts were ultimately unsustainable.
Surprise: going all in on GitHub—including abandoning traditional practices governing bugtrackers in favor of GitHub's anemic project management tools—has a negative impact.
Wikipedia would not be as successful as it is now had I named WikiWikiWeb "electronic-encyclopedia"
"Why have a locked wiki when you can instead just post static Web pages?"
What even is a locked wiki insofar as the ways it differs from traditional (pre-wiki) content publishing pipelines? Where's the wiki part of it?
Wirth pithily makes some of the same points in his HOPL III paper on the history of Modula-2 and Oberon
Related: much of functional programming is not even functional. Closures end up doing a lot of heavy lifting, despite being at odds with what FP claims to be.
I feel those implications are very intellectually liberating and are far more cognitively organic than the print paradigm which currently shapes our intellectual mindset
There's a lot to be gained by reflecting on pre-Web paradigms and hewing to similar approaches—electing to be bound by the constraints. Print is a discipline, and the practices surrounding the print-based publishing industry comprises a form of technology itself.
Related: lineality is a virtue.
Other versions which are available are:
Another PDF from CERN, but this one what looks like a PDF of the original as a first-class digital document, i.e., not a scan of a paper copy: https://cds.cern.ch/record/369245/files/dd-89-001.pdf
This looks like a PDF created from the RTF version described at https://www.w3.org/History/1989/proposal.html
TI’s effective monopoly power hurts these kids as much as it has chilled the development of better graphing calculators with superior feature sets from other manufacturers.
I'm not sure the argument of chilling effect holds up in light of the high price. A high-priced incumbent should be easier to dislodge than one priced reasonably.
if you’re a beginner you can use Replit which allows you to program through your browser without installing anything on your machine
publishers and advertisers deserve full control of their audio experiences
gross
We never got there. We never distributed the source code to a working web browser, more importantly, to the web browser that people were actually using. We didn't release the source code to the most-previous-release of Netscape Navigator: instead, we released what we had at the time, which had a number of incomplete features, and lots and lots of bugs.
People only really contribute when they get something out of it. When someone is first beginning to contribute, they especially need to see some kind of payback, some kind of positive reinforcement, right away. For example, if someone were running a web browser, then stopped, added a simple new command to the source, recompiled, and had that same web browser plus their addition, they would be motivated to do this again, and possibly to tackle even larger projects.
readable
Readable how? I think the better approach over what we do now, where we run source code through what are essentially compilers for making websites and then treat the output similar to object files—i.e. opaque blobs that are unsuitable for anything other than either (a) executing/experiencing, or (b) publishing to others—would be to pursue non-destructive compilation. So after the Markdown is compiled (if there is any compilation step at all), you don't have to keep the original sources around. The tooling should be sufficiently advanced to work with the publishable form as input, too, and not demand only Markdown. In instances where the Markdown files are kept around because the spartan experience of opening a plain text file where the content is almost entirely unadorned by formatting concerns is the preferred way to get things done, the tooling should be able to derive the original Markdown (or a good enough rendition) from the output itself. HTML is rich enough to be able to encode the necessary structure for this on the first Markdown-to-HTML pass. Systems that implement this kind of thing could be said to support a sort of "reversible Markdown", making the publishable form a suitable source of truth—a treatment that is right now reserved only for the originals that are collected and kept off-site.
Make the writing and editing experience more like Word or Google Docs and less like LaTeX.
A CMS for hosting, editing and maintaining markdown files AND a hosting service for publishing these as blogs.
Another solution, in two steps:
See also: A New Publishing Discipline.
triplicate
Mentioned above; also:
Slab
I think Mozilla would be a great steward for a project like this.
From a former Mozillian's perspective, Mozilla would be a terrible steward for this. They would be a terrible steward now, and they'd have been a terrible steward in 2018.
Here’s what I’d like to see:
Sounds like write.as.
getting set up requires a github account and “pushing” commits every time I write a post
But starting, hosting and maintaining your own blog is still too hard.
Finally, there is the nuclear option: the move the authors label the “hollow man”. With this, one does not even try to refute the substance of an argument; instead, one claims that whatever one’s opponent has to say in favour of proposition P is in reality a smokescreen for their real (and terrible) reasons for holding P. One can label one’s opponent a “racist”, a “bigot” or a “fascist”, and suggest that an audience is safest by ignoring the arguments altogether, for fear of being duped into bigotry itself.
Did this require a new term ("hollow man")? Isn't "ad hominem" sufficient?
Since they are already using the Node toolchain for the front-end, developers from this track only needed to stretch a bit more to become “full-stack” engineers.
Think about the irony of this.
The current trend of using arrow functions everywhere is absolutely killing me
in my mind, this had led to a generation of engineers that write poor JavaScript because now they are reliant purely on the tooling to provide productivity instead of using the tooling to improve productivity and using plain old good practices for organizing code, naming things well, encapsulating logic, and so on.
See also: "Avoid using language extensions and libraries that do not play well[...] without an IDE"
Unlike .NET, JavaScript does not have a rich set of base class libraries. It has been dependent on the community to fill that gap by writing open source projects and publishing shared packages to NPM.
What always gets me when people bring this up is that none of those repeating it ever seem to have thought of shamelessly copying the superior libraries they have in mind, rather than buying in to the purportedly lower quality system.
I also don't think you know what you're talking about when you talk about code readability. By and large, the vast majority of opinions on code readability, when you break them down, are based on a personal stance about preferences in writing
In order to keep your service online, you are required to keep a positive account credit balance. If your account balance drops low, our system will automatically send multiple warning emails. If despite that, you still fail to recharge your account, the system will automatically suspend your account and all your pull zones. Any data in your storage zones will also be deleted after a few days without a backup. Therefore, always make sure to keep your account in good standing.
Should be able to separate storage balance and credits for servicing traffic.
It's also hard to share this workflow with someone non-technical. I have to setup and maintain the correct environment on their machine
Not saying I agree or disagree with this, but the existence of a class system in tech jobs is the OP’s central point.
I'm continually surprised when someone posts and HN fails to understand even very basic points in a piece of writing, even when they're very clearly made like they were here. PragmaticPulp's top comment (and the fact that is the top comment) is completely mystifying, for example.
Yes, it’s making it easier than ever to write code collaboratively in the browser with zero configuration and setup. That’s amazing! I’m a HUGE believer in this mission.
Until those things go away.
A case study: DuckDuckHack used Codio, which "worked" until DDG decided to call it a wrap on accepting outside contributions. DDG stopped paying for Codio, and because of that, there was no longer an easy way to replicate the development environment—the DuckDuckHack repos remained available (still do), but you can't pop over into Codio and play around with it. Furthermore, because Codio had been functioning as a sort of crutch to paper over the shortcomings in the onboarding/startup process for DuckDuckHack, there was never any pressure to make sure that contributors could easily get up and running without access to a Codio-based development environment.
It's interesting that, no matter how many times cloud-based Web IDEs have been attempted and failed to displace traditional, local development, people keep getting suckered into it, despite the history of observable downsides.
What's also interesting is the conflation of two things:
software that works by treating the Web browser as a ubiquitous, reliable interpreter (in a way that neither /usr/local/bin/node nor /usr/bin/python3 are reliably ubiquitous)—NB: and running locally, just like Node or Python (or go build or make run or...)—and
the idea that development toolchains aiming for "zero configuration and setup" should defer to and depend upon the continued operation of third-party servers
That is, even though the Web browser is an attractive target for its consistency (in behavior and availability), most Web IDE advocates aren't actually leveraging its benefits—they still end up targeting (e.g.) /usr/local/bin/node and /usr/local/python3—except the executables in question are expected to run on some server(s) instead of the contributor's own machine. These browser-based IDEs aren't so browser-based after all, since they're just shelling out to some non-browser process (over RPC over HTTP). The "World Wide Wruntime" is relegated to merely interpreting the code for a thin client that handles its half of the transactions to/from said remote processes, which end up handling the bulk of the computing (even if that computing isn't heavyweight and/or the client code on its own is full of bloat, owing to the modern trends in Web design).
It's sort of crazy how common it is to encounter this "mental slippery slope": "We can lean on the Web browser, since it's available everywhere!" → "That involves offloading it to the cloud (because that's how you 'do' stuff for the browser, right?)".
So: want to see an actual boom in collaborative development spurred by zero-configuration dev environments? The prescription is straightforward: make all these tools truly run in the browser. The experience we should all be shooting for resemble something like this: Step 1: clone the repo Step 2: double click README.html Step 3: you're off to the races—because project upstream has given you all the tools you need to nurture your desire to contribute
You can also watch this space for more examples of the need for an alternative take on working to actually manage to achieve the promise of increased collaboration through friction-free (or at least friction-reduced) development: * https://hypothes.is/search?q=%22the+repo+is+the+IDE%22 * https://hypothes.is/search?q=%22builds+and+burdens%22
Old clients, bosses, colleagues?
This presupposes something; is this step #1 or not? (In other words, "Where did those people come from?")
I see lots of handwaving on this part—which is silly, because for the people who are the main audience for pieces like this, this is the part that's most interesting. It's easy to see their frustration.
The thing I really admired about Chris Lattner in an interview I listened to during lockdown was the fact that (one of?) the first things he mentioned about success was the role that luck played in his life. There's a tacit admission there that, although he's Chris Lattner and a really smart guy and clearly deserving of his success because of the facts from our now-foregone past that serve as proof, if you reset and tried to "replay' it all, then things might not actually work out like they did the first time. It's a tacit admission that replicability is not guaranteed.
This polemic identifies CS as the culprit. That seems empirically wrong. As stated, it's "not a prerequisite for most programming" even in theory, and in practice, there are mountains of GitHub programmers, at least, who don't have CS backgrounds. Non-CS folks probably account for most of the "frontend"/"full stack" development today. This has exacerbated the Tower of Babel, not improved it.
HCI is CS—and that's what we should focus on. There's a fair bit of emphasis on engineering due, too. To be able to look at a problem and ask, "What should it take?" and ocnversely, "What isn't required here (contra cultural imperatives)?"
Open source development has succeeded mostly at solving the problems of expert programmers.
It is long past time to return to designing tools not just for rock stars at Google but the vast majority of programmers and laypeople with simple small-scale problems.
Unlike every other technology, software doesn’t wear out.
these things could have or would have doomed the earlier phases
This is what people refer to when they say something was "ahead of its time".
can be used in a TACE compatible way
Wait, what? At this point, I'm not sure these are accurately being scored against the given rubric.
to write HTML you need to think about CSS
it is TACE compatible
Huh? Again—is it? I don't think I've seen anyone put Bootstrap to serious use and not use the preprocessed version.
these concerns also exist when using vanilla JS
These concerns also exist if you're using frameworks.
I also see people regard libraries like DOMPurify as magic. There is no magic. Even using these libraries, you have to know what you're doing; you have to make sure DOMPurify is configured correctly in order to carry out your intent. You can be just as vulnerable if you're not paying attention with a library as you are when using one.
it falls within TACE
Does it? Most jQuery is served minified. Even if not, the "full fat" version is not especially readable.
There are bad reasons to despise jQuery (e.g. because it's old). But there are good reasons, too (because it's bloated and just not very good).
actual programming language
modern web development has become selfish
focusing on the developers and making sure the developers can quickly output projects at the expense of the end users
Feels like Tales From The Loop-y era Simon Stålenhag. Previously.
@6:15
An engraving (as shown here) was published in at least one place with the caption "The Battle of Omdurman: The Defence of the Khalifa's Black Flag".
The watercolor(?) of this appeared in the 1898 September 24 print of The Graphic, on page 406. It is captioned "The Battle of Omdurman: The Fight for the Khalifa's Standard". It is signed "C. Hentschel", but attributed "Drawn by J. Gulich, R.I."
@8:02
This is "Return of the Grand Cordon of the Legion of Honour to the New Khedive of Egypt" by Henri Meyer, 1892. https://www.art.com/products/p55962177457-sa-i9361182/henri-meyer-return-of-the-grand-cordon-of-the-legion-of-honour-to-the-new-khedive-of-egypt-1892.htm
I actually do it all the time myself - in my own private git source tree. I send git patches to Junio by email, and I don't publish my own git tree any more
Git as He Is Poke(d)
the straw man fallacy
I've come around to preferring the term "strawchild".
* Is this aspect of "strawchild" an instance of failure to elevate the other (i.e. steelman/starman them)? Yes.
const div3 = n % 3 === 0; const div5 = n % 5 === 0;
I'm approaching the open source portion of this project strictly as "open source" not "open contribution" similar to the SQLite approach
as a reader, I want documents, as a writer, I want blocks
Good use case for an LP doc.
instead of inlining the images, the image URL’s (and captions) are read from a .yaml file. The URL of the yaml file is passed as an argument when loading the page. The .yaml file as well as the images should be publicly served.
The language is academic, which has contributed to the confusion around the topic, but it is clear enough that most developers should be able to understand it.
This I disagree with. Even Fielding's "... must be hypertext driven" rant (which is great and in my bookmarks) is sabotaged by the curse of knowledge. If you know what REST is—and how most "REST" isn't REST (including the things that try to stand out as doing REST right and still just doing it wrong, but with nuance) then "REST APIs must[...]" makes sense. If you don't already get it, though, then it's nigh impenetrable—funnily enough, you need an a priori understanding of REST to be able to understand these attempts to explain REST and what Fielding is trying to communicate about REST not requiring *a priori" knowledge!
Let's call this style of API pseduoREST or JSON-RPC.
What the re-education around REST needs is a catchy label for what people call REST that works well as a light pejorative. Two-Bit History gave it a shot, coining the ad hoc acronym "FIOH", but it doesn't have the desired properties.
OpenBooks is a hub for Neocities community projects.
Why the name, though?
The trouble with redefining "REST" to mean "not REST" is that the first step in learning known techniques to solve a problem is learning the terminology that people use to explain the techniques. If you think you know the terminology, but you have the wrong definition in your mind, you will not be able to understand the explanations, and you will not be able to figure out why you can't understand them, until you finally figure out that the definition you learned was wrong.
@54:25:
There's this debate about whether those games are truly interactive, because there's no way to actually transcend the intent of the designer (other than with, like, glitches or that sort of thing)
They're talking about video games—"authored experience[s]"—but it's relevant of other types of games (boardgames, like chess), too.
cf Carse:
Finite players play within boundaries; infinite players play with boundaries
something something declarative effects
@2:10
They didn't publish the code. They published the algorithm. And they prided themselves on—the computer scientists at the time—of describing the algorithm, not GitHubbing the code. These days we don't—we GitHub the code. You want the algorithm? Here's the code.
This is not always reliable. There are some non-highly-mathematical things that you'd prefer to have the algorithm explained rather than slog through the code, which is probably adulterated with hacks for e.g. platform gotchas, etc.
There is a better way, though, which is to publish a high-level description of the workings as runnable code that you can simulate in a Web browser. Too many people have misconceptions about the stability of the Web browser as a platform for simulations, however. We need to work on this.
So that’s when I came across Hypothesis. At the time, I was like, “Hey, this is cool,” but I also resonated with the company — like the web ethos being open-source. Being embedded into this distributed web of conversation was super cool to me, but at the time that wasn’t important for the Sidekick product. And then, when we pivoted Sidekick into a chatbot for youth apprenticeships, we didn’t need anything like annotation anymore, but also what happened is I basically reorg’d myself out of a job. So I was kind of looking around, but just casually looking because I didn’t have any end date, and then a recruiter reached out, and I was like, “I know these people,” and I really liked the company.
This reads like a (fairly raw) transcript of a spoken-word interview. Hard to read.
to
too many "to"s; make this "for"
Gates befriended Ballmer at Harvard
I'm surprised that this is the exemplar, and not the Allen–Gates relationship.
I dislike the metaphor of luck. None of this is luck.
No luck involved
It's likely you're constantly solving problems and learning interesting things at your job. This is a great opportunity
None of these things are totally in your control, which can at times feel frustrating.
It uses the jsdoc syntax, and strives to document all the tools and members available to front-end developers. To generate documentation, you'll also need the jsdoc utility available via npm. See the disclaimer above about the node package manager, of course. # npm install jsdoc -g
This approaches it backwards. Consider a TypeScript-free codebase where the type annotations live in the documentation—which isn't generated. Your "compiler" then is really just a program verifier. Given the JS program text and the availability of docs, it takes the fusion as input and runs the verifier on that. No source-to-source compilation or mangling. The code that runs is the code you write—not some intermediate file output by tsc.
Another key idea here is to separate meaning from tactics. E.g. the meaning of sorting is much simpler and more compact than the dozens of most useful sorting algorithms, each one of which uses different strategies and tactics to achieve the same goal. If the “meanings” of a program could be given in a way that the system could run them as programs, then a very large part of the difficulties of program design would be solved in a very compact fashion. The resulting “meaning code” would constitute a debuggable, runnable specification that allows practical testing. If we can then annotate the meanings with optimizations and keep them separate, then we have also created a much more controllable practical system.
This opens the possibility of doing a design much better than Squeak's, both fundamentally and at the user-level, to create a model of an entire personal computer system that is extremely compact (under 20,000 lines of code)
See: Oberon
This is critical since many optimizations are accomplished by violating (hopefully safely) module boundaries; it is disastrous to incorporate optimizations into the main body of code. The separation allows the optimizations to be checked against the meanings.
See also the discussion (in the comments) about optimization-after-the-fact in http://akkartik.name/post/mu-2019-2
the Squeak system, which was derived from PARC Smalltalk, includes its own operating system, GUI, development tools, graphics, sound, Internet sockets, and many applications including Etoys and Croquet, yet is only about 230,000 lines of code. The executables are about 2.8MB and only half of this code is generally used.
We know it will happen, barring some radical change in human psychology, because that is what we're living with now. Everyone is walking around with a smartphone in their pocket that not even the president of the United States could have gotten his hands on in, you know, the year 2000. It's pure science fiction. And yet now it's just a basic necessity of life [...] we reset to the new level, and again, we keep comparing ourselves to others
There's a submarine counterargument to the overall point here (and the last half of the sentence quoted here), and it lies in the words "necessity" and "new level". (I realize that when it was spoken, "necessity" was chosen for effect and meant as a slight exaggeration, but it's not as exaggerated as it would need to be in order to erase the force behind of the counterargument.)
In other discussions like these, you can often find people bringing up the argument that Keynes's remark about 15-hour work weeks wasn't wrong, provided that you're willing to accept the standards of living that existed at the time when Keynes was saying it. But that's not exactly true, because it doesn't really ever come down to a true choice of deciding whether you'd like to opt in or not.
You could take the argument about smartphones and make the same one by swapping out automobiles instead. The problem is that even if you did desire to opt out of the higher standards, the difficulty lies in the fact that the society that exists around you will re-orient itself such that access to a car is a baked-in requirement—because it's taken as a given in others' own lives, it gets absorbed into their baseline of what affordances they expect to be available to people who are not them ("new level"). This continual creation of new requirements ("necessities") is the other culprit in the pair that never gets talked about in these conversations. Everyone focuses on the personal happiness and satisfaction component wrt comparison to others.
It makes it really hard often to reason about the impact of this kind of work, because there are no easy metrics. One of the takeaways that I take from it is that making tools easy to use, fast to use, and pleasant to use is really powerful. It’s really powerful in ways that are hard to predict until you’ve done it, and so you should just take it as axiomatic that it’s worth a little bit more time than your organization otherwise would spend investing in tool quality, because people will change how they relate to those tools.They’ll find new ways to use it. They’ll use them more often. It often leads to this productivity flywheel in somewhat non-obvious ways.
Surprise! The point of technology is that it's supposed to make things easier. Why not make sure it's easy to make things easy while you're at it?
When you’re building developer tools, if the officially supported developer environment doesn’t work for people in some way, they build their own approach.
it shows that any time that you make something easier or harder to do, either because it’s faster or slower, or just because you’ve reduced the number of steps, or you’ve made the steps more annoying, or you’ve added cognitive overhead, then people react by changing how they use your tool.
a lot of the time i get a lot of questions these days
@3:07:14:
Blow: A lot of time I get a lot of questions these days by people who are asking, "How do you do a lot of work?", or, "How do you get started?" and all that. And very often these questions are themselves a procrastination, right? It's like, "Obviously, I'm in the state where I can't do a lot of work right now. So I need somebody to give me the answer before I can." And actually the secret is you sit down and decide to do it. That's all it is, right?
Jaimungal: Seinfeld is like that. That's his famous advice to comics, to comedians.
Blow: Mmm. Yeah. I mean—
Jaimungal: Comedians always want to know what's the secret. He says, "Just work. Stop talking about it."
Blow: Yeah. [...] Because that's an exc— it's like, "Oh, someday— I have permission to not actually do this work until someday somebody bestows upon me the magical[...] baton[...]"
i mean i have a whole speech about that
@03:06:54:
Blow: I mean I have a whole speech about that that I can link you to as well.
Should that be necessary? "Links" (URLs) are just a mechanical way to follow a citation to the source. So to "link you" to it is as easy as giving it a name and then saying that name. In this case, the names are URLs. Naming things is said to be hard, but it's (probably) not as hard as advertised. It turns out that the hard part is getting people to actually do it.
maybe people today are more complacent about emergencies because they think someone will come along and save the day.
The actual phrasing here (@39:03):
maybe people today are more complacent about emergencies because at some implicit level they see there's more division of labor and they think someone will come along and save the day
(No idea what's up with the transcript here. It omits some crucial wording/context.)
@18:08:
The interesting thing is when you read, say, extremely foreign fiction—so fiction that's very alien to you in terms of mental models—the author may assume you understand the mental models, but you may not. So for example Japanese comic books—the couple of times I've tried to read them, they just feel so bizarre to me—the sort of conventions for indicating, you know, emotions and actions and so forth. They're just so unintuitive to me that the world[...] that should be in the background and implicit and I should just be able to reference it like an operating system, it sort of becomes a little too visible for me to read the fiction seamlessly.
This is The Knowledge Project Ep. #7 — Venkatesh Rao: The Three Types of Decision Makers
imagine you were measuring
@47:58 audible gasps at the mention of standards
@37:52:
Again, when I was traveling around in 2004 giving talks, the predominant attitude I had was a misconception about Darwinian processes that—most people I talked to thought that we must be at the best place that we could be because look at how many millions of people are participating in this thing. And if you know about Darwinian processes, they aren't optimizers at all. They're "satisficers"—a term made up by one of the most famous professors ever to be at Carnegie—and satisficing is not the same as designing something great.
@18:09:
So the real question is not whether we can improve on this but "what is the actual level of improvement?", which is tantamount to asking, "how complex is the actual problems we're trying to solve compared to the complexity we're creating by just bumbling around?"
I guess my hesitation in answering your question is that I hate essentialism. It’s the same way that I hate it when people say women are better leaders because we are more empathetic. The problem with essentialism is, the moment you pay yourself a compliment based on gender, caste, religion, color of your skin — whatever — country of your origin — if you’re going to accept one generalization is true, then you’re going to have to suck up the generalizations and the caricatures that aren’t so flattering.
One thing that I didn't hear considered is to kill modelessness by allowing selection anytime. If you want to select something, then just draw the shape that you want using whatever tool you already have, and then invoke some action that transforms it after the fact.
This falls in line with the principle of preferring to make it easy to undo something rather than making it difficult to do in the first place.
The relevant analogy is that if you were in your office in dialogue with someone and you had a printout of your WIP, then in order to communicate your intent, the most likely course of action would be to mark up the work in its current state using whatever tool is handy, explaining what it is you want to happen, passing it to your partner in dialogue, and then trust that they'll return to the source and get to it wrt to carrying out your desire.
The thing that bugs me when I listen to the Muse podcast—it's something that's present here along with the episode with gklitt—is that there's this overarching suggestion that the solution to this is elusive or that there are platform constraints (especially re the Web) that keep any of these things from being made. But lots of what gets talked about here is possible today, it's just that no one's doing it, because the software development practices that have captured the attention of e.g. GitHub and Programmer Twitter value things that go against the grain of these desires. This is especially obvious in the parts that mention dealing with files. You could write your Web app to do that. So go do it! Even where problems exist, like with mobile OSes (esp. iOS), there're things like remoteStorage. Think remoteStorage sucks? Fine! Go embrace and extend it and make it work. It's not actually a technical problem at this point.
@18:52:
I wanna also dig a little more into the kind of... dynamism, ease-of-making-changes thing, because I think there's actually two ways to look at the ease of making changes when you solve a problem with software. One way is to make software sufficiency sophisticated so that you can swap any arbitrary part out and you can keep making changes. The other is to make the software so simple that it's easy to rewrite and you can just rewrite it when the constraints change.
@14:18:
So, for example, if you want to make a very basic static site: well, okay, now you need the static site generator, and now you need a library system, you need a package manager, you need a way to install the package manager, you need a way to check for security vulnerabilities in all the packages, you need a web server, you need a place to run the app. It's a whole thing, right?
It made sense when JS was doing small simple things in HTML - it doesn’t make much sense anymore
No, it still makes sense.
Insisting that everyone use === everywhere, on the other hands, makes as much sense as disallowing method declarations that accept a parameter that implements an interface (in favor of formal parameters that insist on a certain class or a derivative), or injecting a bunch of instanceof checks for no good reason...
I have rarely encountered a good reason to use == in JS. Most of the time, or you are relying on it, you are probably doing something wrong.
Easier to just add a new operator that does things the right way and keep the original == operator as is. That way people can transition on their own time
Stupid myth.
But I later realized writing is many things, one of which is the finished article you’re reading now. Mainly though, it’s a tool for thinking things through.
I've mentioned this elsewhere, but I'm skeptical of this popularly recurring take that says writing is thinking, or that thinking without writing really isn't thinking. If writing helps you think, it's better for you to know that than the alternative. But thinking is thinking, and writing is writing.
I worry with all the insistence around this view of writing as a precondition to real thinking that people who are thinking at or near capacity without writing will believe they're somehow missing something and waste a lot of cycles in frustration as they attempt to write and find that it doesn't do anything for them thoughtwise that they weren't already getting before.
Think about the sad essay we all used to write for your (insert language here) class: back then you didn’t have permission to generate original ideas.
I'm not sure that's the correct diagnosis.
Alternative take: you were not, at that point in your life, equipped to understand that you could be generating new ideas and that you should walk away from that writing course with an appreciation for writing as a vehicle for what you'd like to accomplish with a given subject/format. It's fine that you didn't—many people don't—and your instructors, institution, parents, community, etc. probably could have done a better job at communicating this to you, but it was there, and it was the point all along.
The type for an item is given as the value of an itemtype attribute on the same element as the itemscope attribute.
The presence of an itemtype attribute should imply the existence of an item, and thus make the presence of itemscope optional—itemscope should be required only when there is no explicit itemtype declared.
It's important to note that there is no relationship between the microdata and the content of the document where the microdata is marked up.
Wait, really? That's unfortunate. It seems plainly useful to be able in e.g. the datetime example to correlate the text content of the element with the datetime property with the datetime value.
There is no inherent virtue in insisting that paths continue to use backslash even though we're well past the days of CP/M and DOS. There are good reasons not to use it, however.
I do recognize that it provides a source of the type of obscurantism that Windows users take delight in. At this point, though, backslash-as-path-separator is a liability, and application authors should work to eradicate it from every UI surface that users come in contact with. Microsoft themselves should scrub their own apps so that e.g. even Windows Explorer favors the common solidus in any displayed path name.
Consider this to be a straw proposal for an "are we slash yet?" movement.
Respect your seniors. Love your juniors.
Suppose these were inverted.
Deny oneself in order to follow Christ.
What does this mean?
// NB: Since line terminators can be the multibyte CRLF sequence, care // must be taken to ensure we work for calls where `tokenPosition` is some // start minus 1, where that "start" is some line start itself.
I think this satisfies the threshold of "minimum viable publication". So write this up and reference it here.
Full impl.:
getLineStart(tokenPosition, anteTerminators = null) {
if (tokenPosition > this._edge && tokenPosition != this.length) {
throw new Error("random access too far out"); // XXX
}
// NB: Since line terminators can be the multibyte CRLF sequence, care
// must be taken to ensure we work for calls where `tokenPosition` is some
// start minus 1, where that "start" is some line start itself.
for (let i = this._lineTerminators.length - 1; i >= 0; --i) {
let current = this._lineTerminators[i];
if (tokenPosition >= current.position + current.content.length) {
if (anteTerminators) {
anteTerminators.push(...this._lineTerminators.slice(0, i));
}
return current.position + current.content.length;
}
}
return 0;
}
(Inlined for posterity, since this comes from an uncommitted working directory.)
To make a page on MySpace, all it took was text in a textbox.The text could be words or code.Anyone could read the words and see the code.
See also: wikis[1] vs anti-wikis
Free as in ...? Points out that freedoms afforded by foss software to the average computer user are effectively the same as proprietary software, because it's too difficult to even find the source and build it, let alone make any changes. Advocates the foss developers should not think only about the things that users are not legally prevented from doing, but about what things they are realistically empowered and supported in doing.
Previously: Open Source Is Not Enough and Free software is not enough: on practical user freedom.
See also: "Even GNU's philosophy has a few puzzle pieces missing from the box."