New Machine Learning Gems for Ruby
ankane.org
ankane.org
I don't hate python but it's existence is the main brake slowing ruby down.
I enjoy programming in Ruby. As the years roll by and I get more grey hairs the enjoyment I get from other languages descends to just toiling away and wasting one's life.
Thank fuck for Ruby
In general, this whole thread completely misses the point Python makes. Do not invite “clever” language (ab)use. Do the straightforward thing.
Only by its BDFL. Most languages consider lambdas to be first class so why not let the user decide?
Part of what has also kept Ruby lagging is also cultural. It’s not a language that was ever adopted by engineers but rather artists, and it took a while for these artist types to realize performance actually matters.
Python, on the other hand, always had an avid base of CS oriented folk that helped drive the language forward technically. Ruby instead only had Rails, which was a productivity marvel rather than a technical one.
… are none of the engineers that work at GitHub (Microsoft) CS oriented folks?
> Ruby instead only had Rails, which was a productivity marvel rather than a technical one.
… are productivity marvels and technical marvels mutually exclusive?
And sure, some of the engineers at Github/Shopify/etc are super qualified but from my personal experience in the Ruby ecosystem (5+ years and counting) there are WAY more autodidact freelancers who can throw up new websites in minutes but still struggle with computing the algorithmic complexity of linked lists than there are CS graduates who have a solid grounding in data structures and algorithms. In such an environment, it is not surprising that many of the available libraries are very business-oriented but not very optimized.
Ruby and it’s ecosystem make things look easy. So easy that anybody can create software.
The elitists fail to see that creating such an ecosystem is where true skills and thinking required. Funny part is most of them ARE sheep, and make so many basic and architectural mistakes. They simply like to feel superior to others.
It is true IME that usability and compatibility, not performance, are Matz’s first concern.
After all, people did flock to Python for integration with scientific, math and machine learning libraries, not to Ruby.
There are some musings, for example, here: https://twitter.com/zverok/status/1365014133180141578?s=20
Flipside, I love Python and hate Ruby. It's easy to use Python idiomatically, and this design deters bad behavior from "clever geniuses". Ruby code I've had to maintain is full of mixins, dynamic dispatch, and magical behavior from a distance. This is why I love Rust so much despite the fact that it feels like Ruby at a superficial level - it doesn't want you to be clever.
But I feel the same way you do about PHP.
> "it's existence is the main brake slowing [...] down."
Maybe Ruby could focus on winning over the PHP community instead of trying for the data science community.
I had to do some hacking on discourse (the OSS forum package), and the amount of magic and difficult-to-follow logic is super high.
Basically, ruby is the new perl, as far as I can tell.
What's new in ruby? it's there since 1995, and the connection to perl was an explicit influence in its design.
Can't tell you the amount of times I've been able to just put pseudocode down in Ruby and have it work somehow, the language is beautiful
I'll address the points you made since I love talking about Ruby lol, hope you don't mind!
I'm not sure what you mean with the 3.times {} point. I personally prefer the 3.times do ... end syntax, because it's basically English, it makes it very easy to comprehend what's happening as a beginner. You're doing a thing 3 times, it might as well be pseudocode. IMO it's much more elegant than the whole for (i = 0; i < 3; i++) syntax that's more common in other languages.
The optional return thing I'd agree with, it can lead to some confusing situations. Even after years of Rubying, I sometimes get caught by an unexpected return, especially if I'm working in other langs for a bit. Though if you just disable Rubocop's warnings, you can put a return in no problems! I even encourage beginners to explicitly put in returns, so that the methods they write do what they intend them to do. Didn't intend to return that specific thing there? Now it's clear!
What specifically about strings and symbols? The only caveat that I can think of is that symbols are immutable whereas strings are not , but I don't know how often beginners come across situations where they're confronted with symbols outside of a Hash anyway.
The hash conventions are simply a matter of legacy code. I forget when the rocket (=>) syntax was 'replaced', for lack of a better word, but that's just because before a certain version of ruby you couldn't do the foo: :bar syntax. For legacy purposes, the rocket one remains, but in my experience most people writing modern ruby stick with the foo: :bar convention.
I'd also agree with the optional parenthesis bit, though again for beginners I just tell them to always put parens since it makes it easier to reason about methods.
Pandas and numpy skirt this with custom numeric types. I've seen some efforts to build pandas clones in Ruby, but none have come close to the performance needed to handle a few gigs of data.
I am doing Ops (aka DevOps, aka system administration) and I was using bash and Python. I never clicked with Ruby. I was suffering. Constant thought "why is it so shitty?"
Outdated bash doesn't meet any modern expectation from a programming language.
Python, as other general purpose languages, was not created for Ops specifically. Running external process is a pain, data manipulation is with list comprehensions instead of more straightforward map() and filter() (or do non-idiomatic Python), quite a few other features missing which I would expect when writing small scripts.
I think Ops people deserve better. Result - my own programming language - https://github.com/ngs-lang/ngs . Is it "better" language? Probably not. I do think it sucks less than others for Ops though.
I absolutely adore Ruby as a scripting language. It's so easy and elegant to shell out to bash and do something with the output. When brevity or familiarity with bash is desired, variables like $? are there also (although there are generally less esoteric ways to do things). Running a simple shell command in Ruby is as easy as using backticks and having the output from the command returned to you as a String (and I always add a .chomp to strip the trailing \n)[1] Example: datestr = `date '+%Y-%m-%d-%H-%M-%S'`.chomp
Worth noting too is that Ruby also has a fantastic one-liner command line syntax like perl and awk for example. Check out https://robm.me.uk/2013/11/ruby-enp/ and https://benoithamelin.tumblr.com/ruby1line/
Also the community is amazing. There are gems for almost everything, and really neat/fun projects like Ruby Warrior: https://github.com/ryanb/ruby-warrior
I'll stop now, but suffice it to say Ruby is one of the best tool sin my belt, and I haven't even mentioned the number of times I've thrown down a simple single-file HTTP service based on Sinatra in record time ;-)
Agree with the estimation :)
> but for others seriously give Ruby a look
Of course. Python is not out of the question either. I think it's mostly about alignment of how you think and what is possible to express in the language in a straightforward manner.
> It's so easy and elegant to shell out
That's the area where I think NGS has better facility than pretty much anything else I've seen out there. In NGS, it's the "domain". From the top of my head:
* Short syntax for run-the-command-and-parse-output (currently auto detects JSON but customizable) - like backticks in bash but double-backtick on each side.
* backticks syntax like in bash (but don't strip the last newline)
* Argv facility for constructing command line arguments (if the command is complex)
* Automatic handling of exit codes. Errors throw exceptions and no, not any non-zero is an error.
* ok: option to specify non-error exit codes for particular run of a program
* log: option to log the command being run
More at https://github.com/ngs-lang/ngs/wiki/Use-Cases#use-case-ops-...> Worth noting too is that Ruby also has a fantastic one-liner command line syntax like perl and awk for example.
NGS is somewhat there and somewhat getting there
Has any additional development happened since then? I was interested to see this, but less so if it hasn't got any traction over the past year and a half
He's done a lot of the hard-work for creating the tooling in the first place - the community can step in from here.