Molok is the name used in the Bible for a Canaanite deity that the Israelites were forbidden to "suffer their seed to pass through the fire to". Details are scarce, but this is usually taken to refer to human sacrifice. It later became syncretized with reports of child sacrifice at Carthage, where the popular imagery associated with Molok (the idol with outstretched hands, the drums) is taken from.
Carthage and Canaan did share many cultural traits, and the Carthaginians also called themselves Canaanites. It's quite plausible that the Carthaginians would indeed worship Moloch and make sacrifices to that god, and that the mentions of child sacrifice in classical sources about Carthage are based on such.
I think it's still inaccurate to refer to Moloch as Carthaginian rather than Canaanite. The latter is obviously correct, though a bit vague. The former is contested and not as clear.
> Another pathology is that there are companies who ship LibreOffice, often claiming support, but then file all their tickets up-stream and hope they are fixed for free.
Lmao... but thinking again, given the average user's bug-filing abilities, a professional bug-filer might actually be useful.
I follow Joe Duffy in recognising that we should make a distinction between "errors" and "bugs" [0]. IOException is an error; out of bounds access, division by zero, assertion failures, and things like ClassCastException and NullPointerException in Java, are bugs.
For errors, you should do error handling, which means you want the compiler to make sure you don't miss them.
For bugs, you want to let the program bomb out, either aborting entirely or stopping at some high-level boundary from which it's possible to sanely continue. In Java, unchecked exceptions are a mostly adequate mechanism for that. Rust's catch_unwind is better, because it makes stronger guarantees [1]. Erlang's approach of terminating the thread and throwing away its heap is also very good, if you can apply that.
But once you've accepted unchecked exceptions (and paid the cost of the having them), it just doesn't make sense to only use them only for bugs. For example, it is better to
try:
x = json['foo']['bar'][i]
catch OOB:
handle error
than to
if not (json is a dict and
'foo' in json and
json['foo'] is a dict and
...):
handle error
x = json['foo']['bar'][i]
even though in the former, unchecked exceptions are used for non-bugs.
The idea is that for bugs you don't even need a try-catch (or maybe one around your entire program). And pattern matching and functions like `map` make the second case much nicer.
> That hermeneutic - texts are collections of independent logical propositions - was essentially unknown in the ancient world
On the contrary, the atomization and recombination of the text into new meanings is highly characteristic of Midrash. Of course, this isn't the same as the "prooftext" hermeneutic I think you're criticizing.
Even Jesus himself often referred to specific verses in the Old Testament: "Jesus said to him, “Again it is written, ‘You shall not put the Lord your God to the test.’” (Matthew 4:7; cf. Luke 4:12)" "“You have heard that it was said, ‘An eye for an eye and a tooth for a tooth.’” (Matthew 5:38)" So the Scripture must have been "Balkanized" before Christianity existed. Which is not so strange given that it served both as religion and as a code of law.
> You have heard that it was said, ‘An eye for an eye and a tooth for a tooth.’”
That's a great example, because that verse is saying only punish an eye for an eye, and not a life for an eye. It's a verse requiring proportional punishment. (On top of that it means the value of an eye, not an actual eye.)
So quoting it that way actually does remove necessary understanding, which is making the OP's point.
Not sure I understand what you mean? Jesus was known as a rabbi and well-versed in the Scriptures. I don't think he was misconstruing the text he was citing. Here he is contrasting his view of justice ("turn the other cheek") to the legal norms of the time under which feuds and exacting revenge were commonplace.
My main point is that Jesus was probably not the first one to use this form of argumentation. He likely imitated other rabbis who had taught him to speak in this way.
The meaning for the "eye for an eye" verse is well known, it's talking about proportionality in justice.
It's a pretty strange choice to use when talking about "turn the other cheek".
> to the legal norms of the time under which feuds and exacting revenge were commonplace.
But that's exactly what "eye for an eye" attempts to stop. It's instructing people to seek appropriate justice, and not just attack people who hurt them.
Using that verse, rather hurts his message amongst those who understand the verse.
But it's a great way to show verses used out of context!
> was probably not the first one to use this form of argumentation. He likely imitated other rabbis who had taught him to speak in this way.
But they only spoke this way to other Rabbi's, never to people who did not already understand the meaning of the verse.
> The meaning for the "eye for an eye" verse is well known, it's talking about proportionality in justice.
> It's a pretty strange choice to use when talking about "turn the other cheek".
The phrase "an eye for an eye" puts an upper bound on retributive justice. That is, if you have been fouled, this is the maximum amount of punishment that you are allowed to inflict upon the perpetrator. Don't do as Lamech and kill the one who wounds you because that is not proportional.
Consider the context of Jesus speech. He was speaking to peasants in the Galilee for whom eternal feuds must have been commonplace. They must have been aware of the harmful effects of seeking revenge to everyone involved but unable to put an end to it. That is why one of his examples is a slap. There is and was no legal recourse for slap except for slapping back. Jesus asks his followers to "let it go."
Dear lovely @ars, thankyou for your comment. I agree it is strange. Context:
You have heard that it was said, ‘Eye for eye, and tooth for tooth.’ But I tell you, do not resist an evil person. If anyone slaps you on the right cheek, turn to them the other cheek also. And if anyone wants to sue you and take your shirt, hand over your coat as well. If anyone forces you to go one mile, go with them two miles. Give to the one who asks you, and do not turn away from the one who wants to borrow from you.
You have heard that it was said, ‘Love your neighbor and hate your enemy.’ But I tell you, love your enemies and pray for those who persecute you, that you may be children of your Father in heaven.
--
So I think Jesus is agreeing with your comments. Interestingly verse quotations are prefaced with something like "It is written". Yet here 'hate your enemy' is not a biblical verse, and it is prefaced with "You have heard that it was said" -- Jesus was speaking to a crowd here, and contrasting what they had heard, with what his message
One of the implications is he is saying proportionality of justice is a start, but is not nearly enough. For instance, he ends:
If you love those who love you, what reward will you get? Are not even the tax collectors doing that? And if you greet only your own people, what are you doing more than others? Do not even pagans do that? Be perfect, therefore, as your heavenly Father is perfect
--
> But they only spoke this way to other Rabbis
He extremely strongly disagreed with the Rabbis. See Matthew 5 for context
I think more so what Jesus is calling Christians to do is to be forgiving of others in the way God is forgiving to man. Which can often be more difficult of a thing to do than to always seek proportional judgement. I do not think in other words his reading of that verse is all that different from yours.
Somewhat related to this conversation but this reading is clear in my view if you continue to read what Jesus says in this passage :)
> And Cain rose up against his brother Abel. [...] With what did he kill him? R. Simeon said: He killed him with a staff: And a young man for my bruising (Gen 4:23) implies a weapon which inflicts a bruise. The Rabbis said: He killed him with a stone: For I have slain a man for wounding me (ibid) indicates a weapon which inflicts wounds. R. 'Azariah and R. Jonathan in R. Isaac's name said: Cain had closely observed where his father slew the bullock [which he sacrificed, as it is written], And it shall please the Lord better than a bullock (Ps 69:31), and there he killed him: by the throat and its organs.
From a Christian perspective, a more interesting example might be the Gospel's atomization/recontextualizations of text as Messianic prophecy ("out of Egypt I have called my son", "behold, a virgin shall be with child").
I love Emacs, and it continues to be my editor of choice, but it doesn't seem the design is amenable to adding good threading primitives. NeoVIM seems like a success story in this regard, though VIMScript is a much less pleasant extension language than Elisp, which is not perfect, but is at least a real programming language.
There may be a way forward for Emacs, building a sandbox that looks like a full Emacs instance to existing Elisp, and slowly factoring out the whole-editor blocking issues; but that might be almost as complicated as starting fresh, with fewer benefits.
My first test of any text editor is to open something like 4-gigabytes log file with one gigabyte line. If editor works fast, it's good. So far very few editors pass this test, so most are not suitable for general use, only for some niche use like editing tiny text files.
I finally stopped on Windows EditPad, but it's shareware and its UI is somewhat weird, so I won't recommend it for everyone, but as a general text editor, it works for me.
Ugly maybe, but they're do kinda combine the advantages of both. They have the portability and reproducibility advantages of static linking, while still letting you take them apart and change the dependencies like with dynamic linking if you really want to.
One without packages shipped as prebuilt binaries: Gentoo [1] would be a good example. You compile every binary yourself (sometime you can use prebuilt binaries for the biggest software, if you are so inclined and the distro allows it).
> Dynamically linking against something in the long tail is pretty pointless though.
I disagree. Dynamic linking, in the context of an OS which offers a curated list of packages in the form of an official package repository, means that a specialized third party is able to maintain a subcomponent of your system.
This means you and me and countless others are able to reap the benefit of bugfixes and security fixes provided by a third-party without being actively engaged in the process.
In the context of an OS where the DLL hell problem hasn't been addressed and all software packages are forced to ship all their libraries that are shared with no one at all, indeed its pretty pointless.
> Dynamic linking, in the context of an OS which offers a curated list of packages in the form of an official package repository, means that a specialized third party is able to maintain a subcomponent of your system.
You nailed it, in my opinion. The biggest reason I favor dynamic linking is not because of any inherent advantage that I'm determined to believe in (in the face of purported evidence to the contrary, like this article), but because I fear the ecosystem changes that a major shift towards static linking would allow.
If everything is a static blob, you have an environment that is much more friendly to every dev shipping their app as a binary download on their website, like Windows "freeware". Or worse still, they only support AppImage or some other "modern" method of distribution. This cuts maintainers out of the loop. I want to continue using a distribution with maintainers. I think they solve some important problems: when a maintainer is the gatekeeper, it means that a dev has to convince a third party that their app is (a) worth including, (b) not malware, (c) open source - at least heavily preferred since the dev will be building it themselves. And plus having a maintainer means someone besides the original dev is responsible for making sure you get security updates.
Now of course you can distribute statically built apps that way, but there's a reason it's less common. There are so many Go apps out there where the only supported method to build them is using the Go toolchain and pulling in 150 Github repos.
> If everything is a static blob, you have an environment that is much more friendly to every dev shipping their app as a binary download on their website, like Windows "freeware". Or worse still, they only support AppImage or some other "modern" method of distribution. This cuts maintainers out of the loop. I want to continue using a distribution with maintainers.
So because that's what you want, let's make what other people want harder.
Personally, I can't stand the repo/maintainer model. I want to cut maintainers out of the loop! I like having a direct relationship with the developer of the software I use. If they update their software with a feature or bug fix I need, I want the update right now, not when some unpaid third party gets around to integrating it with the f'ing distro. When I report bugs to the developer, I don't want to have to involve the third party.
> So because that's what you want, let's make what other people want harder.
No? I haven't said it should be harder to statically link software. I just said I want to discourage it. I want to advocate that my Linux community resist these kind of ecosystem changes that would, in my opinion, harm the free software community.
> Shit like this is why I stick to Windows.
Seems like telling on yourself. Compare the results: the software available on Linux distributions vs. the Windows freeware market.
> I like having a direct relationship with the developer of the software I use.
And what if that developer isn't trustworthy in some way? (See the Arch Linux dev's post that I linked.)
> If they update their software with a feature or bug fix I need, I want the update right now
Just one example, but I've sometimes gotten updates for Firefox on Arch Linux before the official binaries got released. The maintainers seem to be on top of their game. And never mind the fact that if you're counting on automatic updates, you're assuming that they roll out to everyone simultaneously (often not true) and that automatic updating is always desirable anyway. (Plus a lot of Windows software doesn't update itself at all, so...)
> Seems like telling on yourself. Compare the results: the software available on Linux distributions vs. the Windows freeware market.
Obvious choice? WINE wasn't invented because Linux had a great software library.
> And what if that developer isn't trustworthy in some way?
Then you probably shouldn't use their software at all. But that isn't necessarily realistic, which is why I also advocate for sandboxed applications by default, something mobile got right.
> Just one example, but I've sometimes gotten updates for Firefox on Arch Linux before the official binaries got released.
Sure, maybe that happens sometimes for big and popular projects, but there are a lot of more niche projects where what is in the repo is years out of date. Hell, I have to get qbittorrent-nox from a PPA to be up to date and that isn't even very niche.
It can also cut the other way though. Bugs can be introduced, compatibility can be broken, users can not find the library in their package manager, or they may find too new of a version. The danger of this is smaller for popular libraries, but goes up as you move to the long tail.
But this also highlights the benefit of community packaging. Debian packagers often backport security fixes into older versions of libraries that are no longer maintained upstream. That's a big part of their job--not just to bang out a build and walk away, but to keep an eye on things. This is why it's important to only use distro-packaged libraries as much as you can, even when statically linking.
Getting off the treadmill of integrating interface-breaking upstream changes is one of the biggest practical reasons people prefer static linking and directly adding upstream source repositories into their build. It's at least as important, IME, as being able to use newer versions of libraries unavailable in an LTS distro. It can work well for large organizations, such as Google with their monolithic build, because they can and often do substitute the army of open source packers with their own army of people to curate and backport upstream changes. For everybody else it's quite risky, and if containerization provides any measure we're definitely worse off given the staleness problems with even the most popular containers.[1]
[1] I wouldn't be surprised if an open source project emerged to provide regularly rebuilt and possibly patched upstream containers, recapitulating the organizational evolution of the traditional FOSS distribution ecosystem.
Bugs & compatibility issues are still a problem with the statically-linked version, unless you want to stay on the version of the library with the security vulnerability, you have to upgrade. That means, for either static or dynamic, dealing with bugs and compatibility issues — which I'd argue is another form of bug; if you're practicing semantic versioning (which you should be, as it prevents exactly this issue), this indicates either someone accidentally broke compatibility (a bug in the library), or someone was relying on something outside the established API (a bug in the consumer). For major versions (i.e., where compatibility is intentionally broken), good package managers are able to manage side-by-side installation of well-behaved packaged. (E.g., Portage's "slots" concept.) I'd also mention Nix's design here; my understanding is that it allows you to upgrade the dependency for just some consumers, so you really can then choose between insecure & bugs.