Last week, I mentioned that holidays dry up quickly, this time of year, so what I scrounged up—other than this being the blog’s five hundredth post—was the anniversary of the formalization of the Albanian alphabet by the Congress of Manastir.

The Congress of Manastir

Coming from a software background as I do, I like to imagine the Congress as a consortium of business interests arguing that the language should use special letters that only their pens can write properly, or adding “private use” sections of the alphabet for organizations to create proprietary letters.

And speaking of programming, here are the week’s projects.


Haskell continues to be frustrating. Or rather, the language seems fine. The community seems like it would just as soon never interact with other people. To my prior complaints about scattered/incomplete documentation and non-working example/tutorial code, I add snotty documentation saying things along the lines of “you want to solve the error you’re getting in a straightforward manner? Why would you even want to use Haskell, then?” As far as I’m concerned, this attitude is inexcusable, unless the goal is to keep the ecosystem from being successful.

Similarly, two weeks working with three libraries produced precisely no buildable results, unless you need to print command-line arguments.

Since I don’t have much patience for communities that are more interested in preaching their philosophy than helping people actually get things done, I’m scrapping the Haskell code. It was a nice idea, and it looks like a nice language, but this experience makes me think that the ecosystem isn’t mature enough to bother with.

Therefore, I’m scrapping the Haskell code for now. I’ll try to return to the ecosystem in a few years, but instead, I’ll delete the code, and Ask INTERN has been rewritten in Elixir. I’ve done some minor work in Elixir, over the years, so it’s not entirely new to me—the reason that I chose Haskell—but I’ve also spent too much time on what would have maybe been thirty lines of code in a language like C.

For an example of what I mean, here’s what my Elixir version of the code looks like.

query = Enum.join(args, " ")
opts = [active: false]
{:ok, socket} = :gen_tcp.connect('localhost', 48813, opts)
:ok = :gen_tcp.send(socket, query)
case :gen_tcp.recv(socket, 0, 10000) do
  {:ok, response} -> IO.puts response
  {:error, reason} -> IO.puts "#{reason}"
:ok = :gen_tcp.close(socket)

One line to turn the arguments into a string, two to send the request, four to get the response, and one to clean up. The Haskell version was shaping up to be at least twice as long, with type errors even passing values from one API call to the next.

It’s pretty anti-climactic, after so much research in one language, to switch languages and have a working solution in nine lines of code. But it’s done—though I should handle exceptions—and that’s satisfying.

Common Calendar 🔗

Of interest to probably nobody, the Common Calendar is now up to modern standards. The build problem was that, when creating the application, I didn’t pick a version of the getopts library (“crate”), and that’s apparently no longer legitimate. While I was already tinkering with the repository, I fixed the code’s formatting and applied the advice of not-the-Microsoft-paperclip Clippy.

Next 🔗

With Ask INTERN finally working, I’ll probably return to INTERN to add some small features, and possibly Doritís Onomáton to figure out what happened with the local storage.

Credits: The header image is Komisioni i Alfabetit Monastir 1908 by an unknown photographer, long in the public domain.