> "because 1% of Excel users need pivot tables or something"
It's crazy to me how often Open Source pushers have the vibe "I don't use computers, I don't know what anyone does with computers, but I'm still dismissive and superior". I almost made this comment earlier today in reply to [1] which was another "You have problems with Linux? I daily-drive Linux for years and I've never had any problems" comment and the issues were common/well-known things - fractional scaling in Gnome, HDMI, screen sharing in Slack, crashes in Google Meet, crashes in Chrome, KDE unstable, missing desktop software they use, audio too buggy, constant crashes in another program after days of work.
Nothing anyone would be surprised at, except a Linux user who - apparently - never does anything with their computer and is baffled that other people do. I decided my comment was too trolling and didn't finish it, but here you are bringing that vibe again: you don't know what Excel does or why people use it, but you're confident that you know better; prompting me to actually call it out.
The first thing I looked for when I installed LibreOffice most recently, I found a thread[2] asking: "In excel you can create a table simply by using insert->table. Is there a way to create tables in calc, as well?" and the first visible reply is them explaining that they don't want to create a table in Write, they want Excel's "insert table" feature in Calc. Why would they have to explain that again already, their question was two short lines. Presumably the people replying don't know that feature exists. There are some people being helpful and suggesting ways to get similar effects, but of course there's "Why do you want to insert a table into a Calc spreadsheet? It doesn’t seem like a feature that I’d use much" ("I don't know what the feature does but I know I don't want it"), a couple people commenting explanations of what Excel's tables are and why they are useful including a link to a video demonstration ... followed by someone saying "It already works, they are called database ranges" - no, that's different. Someone who doesn't know what they are, didn't read the explanations or watch the video and still thinks they know better. Crazy.
One of the earlier repliers comes back with "LibreOffice has a database component which is by far more powerful than any fake tables on a calculator’s grid." doubling down on "I don't understand it, didn't read the explanations, don't respect you enough to consider that you know anything about what you want or do on a computer, I still know better" and with namecalling it 'fake'. Crazy.
Note, to avoid the obvious tangent, that I'm not demanding people implement features for me in free software. As the thread ends by kerosene5 "Instead of spending so much time poo pooing the feature request, you could explore it. It really is a good feature. I just downloaded and opened my bank transactions and the very FIRST thing I did was look how to convert it to a table. . . . back to Excel."
It's not "1% of Excel users need pivot tables or something" it was the very FIRST thing they wanted, and multiple people in that thread want, and the second thing I wanted. No this is not the only feature Excel has that LibreOffice hasn't; if you want to know why people aren't using Open Source software? Try actually looking and listening instead of whatever that is you are doing.
My god the amount of projection in your comment. It seems you've mistaken me for everyone who ever commented in favor of migrating off of Excel.
I"m aware that there are things I'm unaware of. Perhaps I don't know how to use Excel, I'm "no true Excel user" if you will, and therefore my opinion is invalid. Like you I'm baffled not by the technical side of things but by our reaction to it. People say "it powers 10% of the world's economy" but not "and it's a problem".
It's a problem. My point is not that LO is better, it's that we should work to remove our dependency on closed-source software for universal office work. Governments should be doing that. But no, let's just say "the other one sucks" and continue to act like depending on a single for-profit company for all our economies is a good thing.
Not sure how my other comment relates to this. Is it arrogant to have preferences?
Source: Steve Yegge’s “Amazon understand platforms and Google doesn’t” rant - copy found at https://gist.github.com/chitchcock/1281611 among others, since it was originally posted on Google+ and link-rotted.
Oh that's clever! Garmin's watches[1] estimate stress levels by variability of pulse rate, and they estimate breathing rate by looking for sinus arrhythmia (the benign change in heart rate speeding up when breathing in and slowing down when breathing out) which is cool. I wonder if any pick up ectopic beats with the normal continuous pulse sensor and not the 1-lead EKG thing?
Do you know Bill Gates claimed to program Fortran? [1]
Did you know Joel Spolsky who co-founded StackOverflow and used to project manage Excel at Microsoft described Bill Gates[2] as "amazingly technical. He understood Variants, and COM objects, and IDispatch and why Automation is different than vtables and why this might lead to dual interfaces. He worried about date functions. He didn’t meddle in software if he trusted the people who were working on it, but you couldn’t bullshit him for a minute because he was a programmer. A real, actual, programmer." ?
Did you know Raymond Chen of The Old New Thing blog recounted the story[3] "During the development of Windows 3.0, it was customary to have regular meetings with Bill Gates to brief him on the status of the project. At one of the reviews, the topic was performance, and Bill complained, “You guys are spending all this time with your segment tuning tinkering. I could teach a twelve-year-old to segment-tune. I want to see some real optimization, not this segment tuning nonsense. I wrote FAT on an airplane, for heaven’s sake.” (I can’t believe I had to write this: This is a dramatization, not a courtroom transcript.) This “I wrote FAT on an airplane” line was apparently one Bill used when he wanted to complain that what other people was doing wasn’t Real Programming. But this time, the development manager decided she’d had enough. “Fine, Bill. We’ll set you up with a machine fully enlisted in the Windows source code, and you can help us out with some of your programming magic, why don’t you.”"
which, while dramatization, puts Bill Gates in a light where he could code and multiple people knew it and believed it. Compare with another Joel Spolsky comment "the same time that Bill Gates was hauling programmers into meetings begging them to create a single rich text edit control that could be reused in all their products. Put Jim Manzi (the suit who let the MBAs take over Lotus) in that meeting and he would be staring blankly. “What’s a rich text edit control?” It never would have occurred to him to take technological leadership because he didn’t grok the technology"
Age 13 he wrote code / debugged for 'Computer Center Corp.' sneaking out to do it[4]
This is multiple people making multiple different but connected claims about someone who founded one of the world's biggest software companies - he claims that he codes, other people claim that he codes, other people call him amazingly technical, other people find it plausible that he was criticising code performance in technical ways and gate(s)keeping 'real programming' as something he did and others weren't doing. You "like the truth" what evidence do you have other than you saying "period"?
Most of your 'insert values' code is wrangling the data from what the interpreter lets you type into the form you need it; ⍪← do the appending which is what you want, ↓⍉↑()()() are input parsing and transform which you don't care about but have to do to get around APL limitations and the interpreter's input parsing limitations. 9/11ths of the symbols in that line are APL boilerplate. 81% noise.
Deletion with k v⌿⍨←⊂k≠str⍳⊂'buggy' too; enclosing 'buggy' for index to search for it as a single element in a nested array, keeping in mind that (⍴'a')≠(⍴'aa') in case you had a single character key. Making a Boolean array which is nothing to do with your problem domain - it's what you have to do to deal with APL not offering you the thing you want.
Saying "we can create a hash map of vector values" is misleading because there isn't any hashing going on. Your code doesn't check for duplicate keys. You can't choose the hash, can't tune the hash for speed vs. random distribution. The keys are appended in order which makes searching slower than a sorted array (and you can't sort array k without messing up its links to array v, same with using nub ∪ on it to make it a set) and at scale the array search becomes slow - even with Dyalog APL's bit-packing and SIMD accelerated searches behind the scenes - so there is a magic interpreter command (I-Beam 1500)[1] which marks an array for internal hashing for faster lookups. But remember the leaky internal abstractions because ⍪← isn't really appending; APL's model is nearly immutable, the array is streamed through and updated into a new array, so the hash has to work with that and you need to understand it and keep it in mind for the times it won't work and some code will invalidate the hash and end up slower.
----
Good ideas of language and tooling design such as "pit of success", "there's only one way to do it", "the first way that comes to mind should be the right way to do it", "different work should look different" are all missing from APL; code that looks workable often has some small internal detail why it isn't; there's no obvious way to do common things. Compare it with Python or C# or similar languages which have syntax for kv={'a':1, 'b':2} and it "just works", if you miss parens or miss a colon it looks clearly wrong, throws editor squigglie underlines, and gives compile time errors. There's many fewer trivial typos which look plausible and run error-free but screw things up. Make a mistake and get an error, and the error won't be LENGTH ERROR or DOMAIN ERROR it will be something mostly helpful. The map behaves how one would expect - deleting doesn't stream the entire dictionary through memory and make a new copy; there's no need to manually link indices between different arrays; failed key lookup gives null or helpful error, the key can be any reasonable data type in the language, etc.
APL implementations are reliant on magic interpreter functions for IO (⎕NGET, ⎕CSV, ⎕JSON and friends). Error handling is bad, logging is bad, debugging is bad, because an entire expression is executed as one thing - and with hooks and forks, one thing which can't easily be split into smaller pieces. e.g. if ↓⍉↑ is a valid transform that returns some data but it's not the transform you want, how do you find out why not? How do you find out what it is doing instead of what you thought it was doing? How do you tell that k v⌿⍨←⊂... needed that enclose on the boolean matrix? Trying without the enclose gets LENGTH ERROR, then what? The language and tooling give you minimal to zero help with any of this, you're left with experimentation - and that sucks because you can't actually type in the 2D arrays you want to work with and the code doesn't work for some mismatch of shape/nesting/enclosing/primitives that you don't understand, so experiments to understand what's happening don't work for the exact same reasons that you can't do the experiments for reasons you don't understand.
One needs a precise feel for all the different array shapes, why ⊂3 doesn't seem to do anything, why ⊆ and ⊂ are different, what things are a 1D array and what are a 2D array with one row or a boxed 1D array or a nested 1D array as a scalar inside a 2D array, or which things are working by scalar extension[3] before one can do much of anything including experimenting and learning how to do much of anything.
Where is the 'immediately accessible' pattern "if a key is in the dictionary, update it, if it's not there, add it"? In Python it's if/else and "key in map". In C# it's if/else and "map.Contains(key)". In your APL design we start with the deletion code and enclose the key, search for it in str to get an index-of and hope it only comes up once, then immediately we find branching is difficult. Do we use ⍣ with a boolean arg to choose whether it runs or not? Do we always append but do a boolean compress on the data to append something-or-nothing? Do we use dfns and guards? Do we switch to a trad-fn and use :if/:else? Do we make an array of functions and index which one to execute, or an array of names and index which one to eval ⍎? There's no immediate answer so instead of skipping over this trivial non-issue in any other language and on with the problem, we descend into "how to reimplement basic thing in APL" for branching.
> "What I find really nice about this approach is that each expression is no longer a black box, making it really natural to customize expressions for specific needs."
It's an argument Aaron Hsu has made, but it's like using Up-Goer 5 or speaking Toki Pona where you can't say "fire engine" but can say "car of man with job to stop fire".[4]
Man, you bring up so many good, juicy points. I wish we could sit down and chat about them!
First off, just to be clear, I totally understand the friction points you bring up. APL's learning curve is crazy steep, and learning materials beyond the beginner level are nigh on nonexistent. It sucks, I agree.
That said, if you're able to push through the abyss, I can assure you that most of that friction drops away. It's clear that you're still thinking in terms of individual primitive operations, but with familiarity thing like k v⌿⍨← will just read as atomic operations in the same way that you read "laser" not "l-a-s-e-r".
More than that, though, the if/else struggle you mention really brings back memories. In practice it's really not an issue. We just ⍪←∪ to insert potentially new keys, str←str[x←⍋str] ⋄ k v⊇←⊂x if a sort is needed, etc. But we only do those when the operations on the data demand it. Otherwise there's no point in encoding irrelevant extra structure in the data.
It took me a good couple years of regular APL hacking for things to click, but I'm not really sure how to get across the feeling, so you'll just have to believe me or not, I guess.
You’re so close! This is like watching right wing people smugly saying “the phrase women’s rights is such a funny one to me - if we assume women are humans and deserve rights then what next, black rights?” As if they’ve hit a winning argument that of course black people aren’t human and don’t deserve rights so of course women's rights are a nonsense as well.
You've started with the assumption that landlording is a good Capitalist respectable thing and nobody could question it, so mocking the thing a landlord does can't possibly have any legs to stand on. But yes! A landlord seeking rent for doing nothing is a parasite! Yes! It’s rent seeking! The people who really try to defend it as difficult and performing a useful service are bad people who benefit from the status quo and lack the imagination and wider experience to see that things like council housing exists and works and benefits people other than the wealthy landowners. If there are two houses and two families could own them and live in them, turning it into one family owning both plots/houses and the the other family paying rent forever is worse. Turning it into one landlord owning both plots/houses and charging both families to live there forever so they don't have to work for a living is worse again. Turning it into a landlord class who both try to squeeze as much rent as possible while lobbying the authorities to block new-house building and reduce tenant's rights is worse again.