752 karma · joined October 26, 2021
Personal site: arthurbricq.com
If you only remove the bishops from the starting position, then the rules of chess still allow bishops to come in later in the game (through a promotion).
I am assuming they did not have enough memory to hold the rules of bishops, and therefore decided to completely remove them from the set of possible pieces. They allow rooks and knights promotion because these pieces are in the set of initial pieces: their rules are already implemented.
> Lasso is [...] licensed under the GNU General Public License
But in some places (for instance where I live, Lausanne Switzerland) it's becoming easier to escape this car culture. I don't have kids, but some colleagues do. One of them does not own a car and her 2 children (6 and 9 years old) do everything by bike : going to school, to the activities (they climb!), etc. They surely look much more agile and risky than other colleague's children. It's quite crazy to see these two kids on their bikes, and how much liberating it is for them to move by theirselves. Unlike most kids who just commute in their parents's car.
Of course, I am aware this works only because there's a really good bike infrastructure. And people drive pretty well too, I guess.
To illustrate what I mean by "expressing systems of equations in a declarative way", here is a toy-example of how to estimate the position of the a sensor with respect to a robot's center if you have access to a dataset containing robot positions and the sensor positions. The 'naive' approach (it very often works) is to solve an over-constrained system with a gradient-descent. To perform a gradient descent, you need a residual function and its jacobian. Here's how you would do to compute it with Sympy. (Note: you'd just have to define the `transform` and `invert` functions...)
# Pose of a sensor in robot frame (to be estimated)
xa, ya = symbols("xa, ya")
a = Matrix([xa, ya, ta])
# Position of the robot at time t
rx, ry, rt = symbols("rx, ry, rt")
rk = Matrix([rx, ry, rt])
# Measure of the sensor at time t
gx, gy = symbols("gx, gy")
gk = Matrix([gx, gy, 0])
# Estimated x (from the measures)
estimated_a = transform(invert(rk), gk)
# compute the norm of the gk, squared
n2_mat = norm2(estimated_a - a)
n2 = sympy.collect(sympy.expand(n2_mat[0, 0]), a).simplify()
# Compute the jacobian
J = n2_mat.jacobian([xa, ya, ta])
# Print what is necessary for Guass-Markov regression
print("\n\nres =", n2)
print("\nJacobian = ", J)At my robotics company (where I lost so many hours compiling overly-templated code in C++), I was able to convince my boss to start a new small product in Rust (was an internal simulation tool) and it convinced him to let me work on another new product a few month later, also in Rust, on a much bigger scale. He had only ever worked in C++ before, and I guess he doesn't mind to loose hours compiling and fixing memory leaks. But regardless, it worked and now I can work (a bit) in Rust.
I don't like much the phrasing "I give up". How about "I had fun, learned while enjoying it, and now move on to my next unfinished project". Great article though !
[0]: https://www.research-collection.ethz.ch/bitstream/handle/20....
You seem to know a lot about this time. Would you have a reference on this report ? I am quite curious now !
- No generic types. That's really limiting. You want to implement Linear Algebra for vectors ? You need a class for each possible types.
- No proper error handling : no such thing as `TRY` or `CATCH`. Instead, you need to pass a `BOOLEAN` mutable flag in functions that may crash. That's just sad.
- No distinction between a class, an abstract class and interfaces / pure abstract classes. If you want to write an abstract class, you just `HALT` in the base methods (like you would do in Python I guess). But there is no language semantic to define that this class is abstract. So the compiler can't help you out much with them.
- No enumerations. They are just very powerful.
(- Faulty garbage collector, even though that is not a a feature of the language but rather of the implementation that I am using.)
I am quite sure that Oberon was written with a real focus on designing a language for which it is easy to write a compiler / garbage collector. It really made sense back then. And they succeeded in doing so. However, for broad distribution of executable, it probably wasn't the best guess. These glimpses of the past are so interesting though, discovery of the most optimal tech stack was a long and dense path of exploration !
At my company we have this language that is not mainstream (Oberon) and therefore there was no code-coverage reporting at all. I found this paper and realized it was super easy to write a minimal code-coverage analysis from our AST parser and code formatter (internal tools). Somehow it had never occured to me that it was this simple.
The transition from "no code coverage at all" to "seing which module is covered and which is not" was really insightful !
I'm not sure how much work is it for you guys to add a language, maybe it's easier for you to add languages than for other mainstream platforms thanks to the use of AI ? If it the case, it would be really nice to have one serbo-croatian language, such as croatian or bosnian.
I struggled to find ressources for these languages. Since a few months I have been trying to learn Bosnian (going on a long trek in the balkanies this summer) and I was just not able to find any "modern" service (Duolingo, Babel, etc ...) which supports these languages. I guess it makes sense since almost no-one wakes up and decide to learn Montenegrin, but maybe you can find a niche market.
Anyway, cool product ! I hope you guys make it.
I see that GitHub now tries to become at the same time a social media for hacker-friendly people and some sort of super-CI server with automation. For sure these are good features. However I also see why people are sad that the old (and defining) functionalities stopped working without JS.(look at commit, browse the sources, read and submit issues / PR and code review). It saddens me a bit to often see working websites getting more and more complex, adding more and more features, probably to remain "fancy" and competitive.
Quite well written, in my opinion.
I guess that sometimes the risk to make a language migration (and to introduce some bugs) is higher than the performance benefits.