Join devRant
Do all the things like
++ or -- rants, post your own rants, comment on others' rants and build your customized dev avatar
Sign Up
Pipeless API
From the creators of devRant, Pipeless lets you power real-time personalized recommendations and activity feeds using a simple API
Learn More
Search - "look up the actual docs"
-
I had to open the desktop app to write this because I could never write a rant this long on the app.
This will be a well-informed rebuttal to the "arrays start at 1 in Lua" complaint. If you have ever said or thought that, I guarantee you will learn a lot from this rant and probably enjoy it quite a bit as well.
Just a tiny bit of background information on me: I have a very intimate understanding of Lua and its c API. I have used this language for years and love it dearly.
[START RANT]
"arrays start at 1 in Lua" is factually incorrect because Lua does not have arrays. From their documentation, section 11.1 ("Arrays"), "We implement arrays in Lua simply by indexing tables with integers."
From chapter 2 of the Lua docs, we know there are only 8 types of data in Lua: nil, boolean, number, string, userdata, function, thread, and table
The only unfamiliar thing here might be userdata. "A userdatum offers a raw memory area with no predefined operations in Lua" (section 26.1). Essentially, it's for the API to interact with Lua scripts. The point is, this isn't a fancy term for array.
The misinformation comes from the table type. Let's first explore, at a low level, what an array is. An array, in programming, is a collection of data items all in a line in memory (The OS may not actually put them in a line, but they act as if they are). In most syntaxes, you access an array element similar to:
array[index]
Let's look at c, so we have some solid reference. "array" would be the name of the array, but what it really does is keep track of the starting location in memory of the array. Memory in computers acts like a number. In a very basic sense, the first sector of your RAM is memory location (referred to as an address) 0. "array" would be, for example, address 543745. This is where your data starts. Arrays can only be made up of one type, this is so that each element in that array is EXACTLY the same size. So, this is how indexing an array works. If you know where your array starts, and you know how large each element is, you can find the 6th element by starting at the start of they array and adding 6 times the size of the data in that array.
Tables are incredibly different. The elements of a table are NOT in a line in memory; they're all over the place depending on when you created them (and a lot of other things). Therefore, an array-style index is useless, because you cannot apply the above formula. In the case of a table, you need to perform a lookup: search through all of the elements in the table to find the right one. In Lua, you can do:
a = {1, 5, 9};
a["hello_world"] = "whatever";
a is a table with the length of 4 (the 4th element is "hello_world" with value "whatever"), but a[4] is nil because even though there are 4 items in the table, it looks for something "named" 4, not the 4th element of the table.
This is the difference between indexing and lookups. But you may say,
"Algo! If I do this:
a = {"first", "second", "third"};
print(a[1]);
...then "first" appears in my console!"
Yes, that's correct, in terms of computer science. Lua, because it is a nice language, makes keys in tables optional by automatically giving them an integer value key. This starts at 1. Why? Lets look at that formula for arrays again:
Given array "arr", size of data type "sz", and index "i", find the desired element ("el"):
el = arr + (sz * i)
This NEEDS to start at 0 and not 1 because otherwise, "sz" would always be added to the start address of the array and the first element would ALWAYS be skipped. But in tables, this is not the case, because tables do not have a defined data type size, and this formula is never used. This is why actual arrays are incredibly performant no matter the size, and the larger a table gets, the slower it is.
That felt good to get off my chest. Yes, Lua could start the auto-key at 0, but that might confuse people into thinking tables are arrays... well, I guess there's no avoiding that either way.13 -
When looking something up, I generally try to avoid StackOverflow answers and find actual documentation, since SO answers are usually outdated.2
-
Central team: No, your team must be doing something wrong. Our pipeline is super-configurable and works for any situation! You just have to read the docs!
Me: Where are the docs?
Central team: Uhh, well, umm... we'll hook you up with a CI/CD coach!
Me: Okay, cool. In the mean time, can you point me at the repo where all the base scripts are?
Central team: Sure, it's here.
Me, some weeks later: Yeah, uhh, the coach can't seem to figure out how to make our Prod deployment work either.
Central team: That's impossible! It's so easy and completely configurable!
Me: Well, okay... but, here's the thing: your pipeline IS pretty "configurable", in the sense that you look for A LOT of variables...
Central team: See! We told you!
Me: ...none of which are actually documented, so they're just about useless to me...
Central team: But, but the coach...
Me: ...couldn't make heads or taisl of it either despite him literally being ON YOUR TEAM...
Central team: Then your project must just be architected wrong!
Me: Well, we're not perfect, so could be...
Central team: Right!
Me: ...but I think it's far more likely that the scripts... you know, the ACTUAL Python scripts the pipeline executes... while it took me DAYS to get through all your levels of abstraction and indirection and, well, BULLSHIT... it turns out they are incredibly NOT flexible. They do one thing, all the time, basically disregarding any flexibility in the pipeline. So, yeah, I'm thinking this is probably one of this "it's you, not me" deals.
Central team: Waaaaahhhhhhhh!!!!!!2 -
Canoncal.. buddy.. pal..
We need to talk about the content on the server image's login screen.
Now, I get that lots of developers will use the server image out of a desire to keep their environments minimal.. but at the same time, is the same server image that will be deployed on thousands of VMs all over the world really the place to be talking about "great IDEs available on Ubuntu" complete with smiley faces?
I'm dead serious I log in and there are fifty seven lines of crap on the screen. I don't need links to your docs or support pages, I definitely don't need cutesy links to "hey look at this cool stuff you can do on Ubuntu!", and I absolutely don't need advertisements for your paid services.
This is some of the tackiest stuff I've seen outside of Gitlab shilling for GKE in the paid enterprise version.
Stuff like this turns actual users off. Sysadmins, the ones who are going to be seeing this stuff since it's visible on SSH shells only do not care about your cutesy IDE advertising.
Grow up.4 -
include ::rant
rant::newentry {'new-job-rant' :
ensure => latest,
location => goverment-employment-office-HQ,
job => DevOps,
content => {'
So, i've been at my new job for some time now, almost two weeks (hurray!) but boy oh boy, what a job it is!
I'm working at a goverment office charged with helping the unemployed to get a job or a new education course. I'm hored as re-enforcements for their DevOps team. I get my pay, easy transportation home<->office, coffe is adequate in quality and quantity, so no complaints there...
But the actual job is a FUCKING MENTAL CLUSTERFUCKS OF WHAT THE ACTUAL FUCK MULTIPLIED BY TEN TO THE POWER OF GOOGOL!
A few items that make my blood boil to new temperature records defying medical science:
* devs refuse to use linting, say the builder will catch it when there is an error, never look at the builder error logs
* (puppet) modules have NO TESTS
* (puppet) modules get included in several git repo's as submodules, in turn they are part of a git repo, in turn they are replicated to several puppet masters, and they differentiate the environment by bash scripts... R10K or code manager? never heard of it.
* Me cleaning up code, commit, gets accepted, some douchebag checks out code, reverts it back to the point where linting tools generate 50+ lines of warnings, complains to ME his code doesnt work! (Seriously, bitch? Serously?) , explain to that person what linting does, that persons hears the bells ring on the other end of the galaxy, refuses to use it.
* Deployment day arrives (today) -> tasks are set up on an excel sheet (on google docs) , totally out of sync with what really must be done -> something breaks, spend 30 minutes finding out who is to blame, the whole deploy train stops, find out it's a syntax error, ... waiting for person to change that since that person can only access it...
...
the list goes on and on and on. And did you expect to ahve any docs or guidelines? NO , as if docs are something for the luxurious and leisurely people having "time" to write it...
I can use another coffee... hopefully i wake up from this nightmare at my 15th cup...
},
require => [Class['::coffee'], Class['::auxiliary_brain'], Class['::brain_unfuck_tools'],],
}1