jyrgenn: Blurred head shot from 2007 (Default)
[Incidentally I found the text of a number of old articles about bars and restaurants and the like again. I wrote them between end of 2006 and early 2009, and although I knew I had saved the texts, I believed them lost until I stumbled upon them again today. I will post a number of them here; alas, all are in German.]

Ende 2006 bis Anfang 2009 tummelte ich mich mit anderen auf der Lokalbewertungsplattform "Qype" (mitterweile von Yelp geschluckt). Freunde zogen mich da hinein, und es machte mir viel Spaß, kleine Artikel zu schreiben, mich mit anderen Teilnehmern zu treffen, und darüber noch mehr Artikel zu schreiben.

Leider veränderte es sich dort so, dass der Spaß nachließ, und ich verließ die Plattform. Die Texte fand ich nicht mehr wieder, obwohl ich wusste, dass ich sie mir gesichert hatte, bevor ich sie auf der Plattform löschte. Heute bin ich vollkommen zufällig darüber gestolpert, und ich werde in der nächsten Zeit einen Teil davon oder auch alle hier posten.

Diese Artikel sind historisch. Vieles davon ist nicht mehr aktuell; manches Lokal gibt es heute nicht mehr. Auch würde ich vermutlich manches heute anders sehen oder anders beschreiben. Als Reminiszenz möchte ich diese Artikel trotzdem unverändert lassen bis auf Fehler in Rechtschreibung und Grammatik; wo es mir nötig scheint, werde ich einen Kommentar anhängen.

Also nun, eine Reise in die nähere Vergangenheit!
jyrgenn: Blurred head shot from 2007 (Default)
Just for fun I timed a program that I have developed in my spare time, the Lisp interpreter lingo, written in Go, on a number of computers. This measures basically single-thread performance, presumably with some emphasis on memory access, as the interpreter does a lot of pointer chasing. Mainly I wanted to compare my newly upgraded home server mellum with others.

The first four of the computers listed in the table are my own, the first three at home, the fourth an external rented server. All others are my employer's and are operated by our group.


mellum35057151.00E3-1220 v343.1FreeBSD 10.3
naibel4971927.05T40E APU21FreeBSD 10.3
wrixum16591912.11Core 2 Duo22.4OS X 10.11.4
holt18490071.90Opteron 138542.7Debian Jessie
Brunei13756742.55E5-2620 v3122.4Debian Jessie
Island15480872.26X5650122.67Debian Jessie
Bermuda21399851.64i5-240043.1Debian Jessie
qcm0516227772.16E5-2690 v2203Debian Jessie
qcm0613554492.59E5-2690 v3242.6Debian Jessie
qcm0713915232.52E5-2690 v3242.6Debian Jessie
qcw5041664560.84i5-459043.3Debian Jessie
dgm0714736662.38X5650122.7Debian Wheezy


The listed number of cores is the total in the machine, without hyperthreading.

The program I ran is the interpreter lingo, commit 5aa9fa8cd136efd05e0adcbb9474f0aa6fe1fe64, built with the current Go 1.6.2 – to be precise, a run of make benchmark10 in the lingo directory, which factorises the number 100000000001 with the (rather naïvely implemented) Lisp program factor.lisp.

The number at "evals/s" states how many Lisp expressions have been evaluated per second. I have used the best number of a few runs each (at least two). Apart from qcm05 and qcm07 the machines were very lightly loaded, such that each had a "free" CPU.

I am a bit surprised that, apart from the workstation qcw50, my computer with a relatively cheap and nearly three-year-old CPU comes out ahead of nearly everything I could get my hands on, and not only the old ones (Island, our workgroup server, and Bermuda, my workstation), but also the newer ones. Now that computer has only one CPU and only four cores in total; especially the qcm0[5-7], meant for serious number crunching, have much more. Still amazing.

But I am even more surprised that my oldish MacBook Pro wrixum (13", mid-2010) keeps itself up so bravely. It has not only a CPU design from nearly eight years ago, but was also the slowest of the product line when I bought it.

Update: an additional result from rbarclay (see comments)

Update: More results are welcome! If you want to build from source, look into the comments for detailed instructions. If you want to use a pre-built binary for FreeBSD, Linux, or OS X on the amd64 architecture, download the appropriate one of the following files, unpack it, change into the lingo directory, and run <code>make benchmark10</code>. See the output for the "evals/s" value.

additional results
rbarclay28504421.23FX-835084Debian Jessie
Update: An article Modern Microprocessors – A 90 Minute Guide! by Jason Robert Carey Patterson is interesting in this context.

Pay Raise

Jun. 28th, 2015 07:38 pm
jyrgenn: Blurred head shot from 2007 (Default)
A few data points about pay raises.

WeTeachFaculty, where I work now, is public service, implies collective labour agreements, implies small increments. Not coupled at all to performance reviews, which The Director didn't do until very recently anyway, but suddenly started, to everyone's surprise. (This may well be related to that recent employee survey that very visibly showed a high, and I mean high, degree of discontent of the employees with The Director. Maybe he did get some flak for that from The Chancellor after all.)

My other places of work were diverse.

VeryNiceCompany[1] did yearly performance review cum next year planning / objective agreement, where they also declared your incremental pay raise. This would have been the place to claim spectacular successes or developments and so a higher pay raise, only I didn't have those.

[1] my first one, mid-sized[2], and, in hindsight, a really great work environment

[2] grew from ~90 to > 250 before being hit by the burst of the Internet bubble and was shortly after bought out by WeMakeChips

The small startup WeLoveMulticast where I was for 16 months in between was founded by a former colleague from VNC, so he copied many of their processes, including reviews and pay raises. He had worse ideas than this.

WeMakeChips had roughly the same, only in a more refined and regulated way. When it came to the obligatory objective agreement, my boss said, well, what shall I say, keep on doing what you're doing? Yes, I said, that sounds quite right. So it is that then, he said. (He was a good one.) Incremental pay raise, only at one point I had a really good rating, but a definitely sub-average pay raise. I had some suspicion why that was, but my boss had said nothing of it. I found that kind of dishonest and it was the final straw to leave.

MobileInternetEnablers did nothing, IIRC, in the 2.5 years I was there — no performance reviews, no pay raise. Maybe the way was to go to the boss and say "I want!", only I didn't.

WeHostMillions did yearly performance review cum some planning, objective agreements were quite like at WMC. No pay raise, though, despite very good ratings — to get one, I'd probably have had to claim one, which I didn't. That wasn't only due to cowardice, but I also didn't want the pay to be a bigger reason to stay there than it already was. After 4 years, when WHM had been bought by FormerStateMonopolyTelco, suddenly a 10 % pay raise. What a conincidence. And then, after a year, I left for public service and 20 % less.
jyrgenn: Blurred head shot from 2007 (Default)
The IPv6 tunnel via HE worked fine, but I was not really pleased with the roundtrip times to their access point. So, when I got a new server hosted by my former employer last year, one that comes with a /56 IPv6 space, this gave me another tunneling opportunity.

In between I had trashed the Mikrotik router described in an earlier article after it had bricked itself when I tried to reset the configuration just like it was documented. Last straw and all that. The new one is an EdgeRouter PoE from Ubuiqiti, with which I am mostly happy. It has its weak points, too, but it is openly based on Debian and Vyatta, meaning you don't even have to break out of the configuration CLI to access any Unix commands. (The web GUI is nice and shiny, but very limited in its capabilities.) The CLI is modeled after JunOS, which made me feel at home fast.

Vyatta offers OpenVPN out of the box, so it was easy to set up a tunnel configuration to an OpenVPN instance on my server. This way I have a /60 tunneled to my home, which should be plenty. And other than with HE, the roundtrip times are in the single digits of milliseconds.
jyrgenn: Blurred head shot from 2007 (Default)
Today I thought of that version cum configuration control system ("ShapeTools") with Makefile-like input files I had the pleasure to work on 20+ years ago.

One user, a co-student of mine, came whining (again!) about some alleged bug in the "shape" program that had allegedly deleted his (alleged) source files. No way, we said.

No, it didn't. It only tended to skip the very last character of the Shapefile. Which didn't do any harm (ever), because that (always) was a newline character, right?
        rm -f core *.o $(PROGRAM) #*# *~

(For totally unrelated reasons, I implemented a new Shapefile parser not long after that bug report. And I still never end a "clean" rule in a Makefile with "*~".)
jyrgenn: Blurred head shot from 2007 (Default)
Some time ago I found this book mentioned at some other place and immediately resolved to read it, which I finally did.

Fox is a cultural anthropologist by trade, and as such, embarks on the IIRC self-appointed endeavour to investigate the English. While this is a serious study, she presents it with lots of humour, making this book both interesting and funny.

At the end she arrives at the result that at the core of Englishness sits what she calls the "social dis-ease", a non-relaxedness, an awkwardness of the English in dealing with each other (except with close friends and family). This social dis-ease results not only in hypocrisy, class snobbery, and eeyorishness, but also in humour, modesty, and fair play.

But not only the result is interesting, but also all the details she gets into. Her own embarrassment when she experiments with queue-jumping, all those consequences of the money-talk taboo, a broad perspective on rites of passage — there is a lot in here, and all really fascinating to see so thoroughly scrutinized.

Everywhere in that book I recognized things that also applied to me, or rather to the northern German society I grew up in, and things that did not. It would be most interesting to read the same book about my own tribe; alas, of course it is impossible to find the same kind of anthropologist from northern Germany doing the same thing.

So this must stand alone, but as such, it is an extremely interesting book, and great fun to read.
jyrgenn: Blurred head shot from 2007 (Default)
In the last days I have put a new server for infrastructure services into operation at home.

It does not run as router or firewall, but has an SSHd for remote logins, DHCP and RADIUS server, DNS resolver, and cron jobs to do all those little things that must be done when my outer IP(v4) address changes, like updating dynamic DNS and reconfiguring the IPv6 tunnel with HE. For a few hours now, fail2ban has also been successfully blocking those pesky brute-force ssh attacks from China and the like.

The hardware is a small and — moderately — low power model from PC Engines, but still with a dual-core 1 GHz AMD CPU (amd64) and 4 GB of RAM, so it is quite capable. I have put in an SLC SSD (relatively expensive, but AIUI not as easily worn out by writing), also with 4 GB, which is enough for normal operation.


Despite being low power (≤ 12 W), that little thing runs quite hot. Internally, CPU and south bridge are thermally connected to the case via an aluminium heat spreader:


Still, the case gets so hot that I felt another cooling element is in order, as it is already quite warm on the upper boards of the store-room shelf (the left one in the picture):

from left to right: the new small server with heat sink attached, the router, the switch connecing router and DSL modem

With that, it runs up to 72 °C on the CPU when it is around 30 °C outside. As the CPU is rated for up to 90 °C, that seems to be okay.

The server is connected to my "core" network, to the WLAN segment, and to the DMZ, where incoming SSH connections are terminated.

As it runs security-critical services, I decided to give OpenBSD a try, for the first time. Not a bad idea — while not as much pre-packaged software is available as for, say, FreeBSD or Debian, most things I want are there, and then I should still be able to install most things from source. Or write them myself, dammit!

OpenBSD feels more like a "traditional" BSD than FreeBSD — the installation is rather like that of other systems 20 years ago; the whole setup feels simpler, more straightforward, with fewer automatic tentacles; updates are done by getting the source for the whole system and recompiling. Without being able to give really informed comments yet, I can say it feels good, solid, familiar, definitely likeable.

BTW, the 4 GB SSD proved to be too small for rebuilding the system, so I had to put /usr/src/ and /usr/obj/ on the file server, NFS-mounted over mere Fast Ethernet. I was afraid that this would slow down the system building by much, but building the userland was done after 5h20m, with 63% CPU utilization. Pleasant surprise!

Update: I have to admit that after some time I fell back to FreeBSD for this machine. While that decreases the OS diversity, it is much easier to update two FreeBSD boxen than one FreeBSD and one OpenBSD box. Also, the tunnel isn't to HE any more, but to my own external server, which is much closer, roundtrip-wise, and handled directly by the router (the middle device in the picture) using OpenVPN.
jyrgenn: Blurred head shot from 2007 (Default)
As I have mentioned, I have been using a Mikrotik RB750GL router running their RouterOS. This thing is small and cheap, and I was quite fond of it. At some other place, I wrote:
I have [a RB750GL] now as my home router, and I like it. Not that it doesn't have its quirks, of course — some things don't work like documented, and some might, only I find the documentation quite confusing. Firewall settings seem to presume intimate knowledge of iptables (which I have always hated and never got comfortable with). And a few other things, like it mysteriously only accepting only DSA public keys for ssh, not RSA.

Two weeks ago this saga continued, and the dissonance between documented and actual behaviour of this cute little piece of hardware produced semi-catastrophic failure.

To do some larger firewall changes, which is really tedious through the web interface, I downloaded the configuration from the router and wanted to be able to upload and activate it again.

The configuration can be exported to a file using an "/export" command and imported from a file through an "/import" command, says the documentation. The export worked fine, only the import complained about syntax errors in the file. Oh dear.

Now the lines in the exported configuration are just like lines you could type on the command line, so why not just try that? Because it complains about things like "I have a DHCP pool with that name already" — well, yes. Granted.

So you'd want to reset the configuration first before executing it again? Hey, it turns out this there is a command for that! It is "/system reset-configuration", and it has a parameter that makes it execute a configuration export file after reset, exactly what I wanted.

Only it didn't work. The reset may have worked, but obviously the configuration file is not loaded — the router is effectively dead. Maybe the factory default configuration file has been loaded. My trust in the Mikrotik router is gone, though, and I don't bother to check.

Luckily I had not sold the Juniper SRX100, as intended, so I brought it up again — not without changes, though, but at least it worked before the neighbors, who share the Internet access, came home again.


The Juniper is only a temporary solution, as I have learned that, while more convenient than IOS, JunOS config is similarly difficult if you don't deal with these things on a daily basis, and without a support contract you don't get software updates, which I see as a major problem nowadays.

I am resolved now to get a Soekris thingy once I got the money from the tax return and try OpenBSD. I know that is good hardware, I can put arbitrary other services on it as long as there is RAM, and no problem with software updates.

Update: I didn't get a Soekris, but a much cheaper APU1C4 instead (see later article), but don't use it as a router. The router I use now is a Ubiquiti EdgerouterPOE, and while it does have some quirks, it seems to be the right one for me.


May. 27th, 2014 09:28 am
jyrgenn: Blurred head shot from 2007 (Default)
It has been said you cannot "try" to get a girlfriend.

Oh yes, you can try. I know I did; post-21 (after it had gone well when I was younger) there were stretches of years where I felt so godawful lonely and really tried, tried to demonstrate interest (which was genuinely there) towards any vaguely compatible-seeming, possibly interesting, and remotely attractive female, tried to make them interested in me, offered and gave help in small things and in bigger, cultivated friendships that I hoped to be able to turn into romantic-erotic relationships eventually, yada, yada, yada, all that.

To no avail. I am sure I am not, and was not, that much of a loser to be totally ineligible (hey, I really did that personal hygiene thing!), but probably I just didn't do the right things because I didn't know what the right things were or was too shy to do them (like, me, chatting up an unacquainted woman? you're kidding), or perhaps did the right things all wrong, and then, after a while of frustration and continued loneliness, there was, very likely, that stench of despair.

In the end, despite all the trying on my side, and despite all hopeful desperate fruitless desires crushes infatuations, all those vaguely compatible-seeming, possibly interesting, and remotely attractive — or even really compatible-seeming, totally interesting, and immensely attractive — women more or less ignored me or fell for someone else or gave me no encouragement at all to step out of the friend zone or even showed very clearly how decidedly they were not interested, further increasing the stench of despair on my side.

Anyway, this trying didn't help, not once. Not once did it lead to anything. I just felt lonely and broken and hurt, and did I mention lonely? In any of these stretches I gave up after a while, felt numb, passive, no longer hopeful enough to even try or even to be interested to try, too numb to even be desperate. Healed a bit.

And then, suddenly, that relationship thing came up from behind and bit me in the ass. Met someone new, or someone I already knew suddenly and explicitly showed interest, or I suddenly developed interest in someone I knew and it was reciprocated just so, *WHAM!*, mutual attraction, falling in love, bliss. Unexpected, out of the blue, effortless.

TL;DR: you can try. But in my experience, trying does not help. Trying leads to frustration and despair. Only not trying helps. At which point I am nearly at "there is no trying"...

[Just to be clear, what I describe here is a thing of the past. I have been happily married for a while now.]
jyrgenn: Blurred head shot from 2007 (Default)
I am interested in programming languages in general. In particular, I was always intrigued by how another programming language can offer me new possibilities to express my programs and allow me to grow as a programmer.

I learned my first one in school. The computers there — a room full of PET 2001s, when they were new — had only BASIC, which frustrated me soon. At the university, I started out with a course in Pascal and did quite some programming on the side in it. Pascal filled many of the gaps that I had found annoying with BASIC too soon.

For fun I learned the basics of FORTRAN, but never had any real use for it. Modula-II came along, even for largish programming assignments, but didn't really catch my interest. I found Ada more interesting, but had little opportunity to use it outside of the process control course. I looked a bit into Forth, but again had no real application to get some practice.

It was when I got to C that I was finally hooked. That was, finally, "the real thing", in a way, and a language that served me well, not only in the technical sense — for most of my professional life, it was one of the main things that kept me well-fed.

There were other interesting languages I learned at the university, Tcl, for instance, not the greatest language, but a very easily embeddable interpreter. For a while, I put one into every major program I wrote. I learned a little of Prolog, but not enough, which I regret.

But I was fascinated by functional languages and got a bit more productive in that field — Lisp, Hope, ML mainly. Lisp was the only one that I built an implementation for myself — or, rather, more than one. First for an assignment, together with a co-student, in Modula-II. We did not like some of the requirements in that course, and not so much the implementation language, so afterwards, we did a similar one in C. Years later, I made a Lisp interpreter in Java, and still later another one in C. All these are not really complete — in particular the garbage collector of the latter is a bit too eager and collects away things it shouldn't —, but both do implement a small but "real" Lisp, one that can use recursion and higher-order functions and has the basic builtins available. In between I have written one in Go, which is the most complete of all of them, although still in the My Favourite Toy Language category rather than a useful programming environment.

As mentioned, C was instrumental to most of the professional jobs I had, and the one I currently have. But others came into view, mainly Perl. Perl has even become the default language for me when I want to try something or have to implement just a bit of functionality. This is not because I value Perl so highly for its technical merits, but it is available everywhere, everybody knows it, so many things are admittedly much easier to do in Perl than in C, and consequently Perl has become a kind of habit. I am not the biggest fan of Perl, though; I find it inelegant and clumsy in places, and seductively encouraging questionable programming habits in others. Still, often it gets things done with relatively little effort.

There are others that I found interesting on the way, but have not found enough time (and practical use) to really learn them — Lua, SNOBOL, and APL (or J, rather) come to mind. I will have to work with JavaScript soonish, but I am strongly meh about it.

Then I saw more and more of Go. An article about it by Rob Pike finally made me dig into it, something I had been wanting to do for a while. Now that seems to be a fine language, with great ideas built into it, while still catering to the habits of programmers who grew up with C and its descendants. Go has the potential to give me back some of the fun I head with C 20 years ago, by combining ease and pragmatism (like in Perl) with a, finally, elegant language (although not as elegant as Lisp or the more modern functional languages). I'll see; for now I haven't done more than a few sample programs and the abovementioned Lisp interpreter in Go.

Then there is Haskell. I became curious about Haskell already in the early 90s, when I had contact with other functional languages as a student (see above). Someone passed me an article about Haskell in, I think, the ACM SIGPLAN Notices. Haskell was still new then, but in between it has matured for a few decades and is still there, which I assume is a good sign. As I always liked functional programming, this may be something to go with.

Now the biggest obstacle in adopting a new programming language for myself is not the difficulty of learning it and getting up to speed for real tasks, but other people. While my workplace has, to my regrets, a culture of people mostly doing their development projects alone, it is still considered important that someone else will be able to fix things when the original author is on vacation, or to do further development after the original author has left. I agree with that, of course. But that makes it difficult to adopt a new programming language when the others are just not interested in doing the same. And alas, it appears they are not.

Besides shell scripts, we work with C and — mostly — Perl, but I would love to do things in Go or Haskell. And I would like to do that at work, to make my work easier and more interesting. But as there is no one to take over a project done in one of these languages, I cannot do that. (There is one who would be interested enough in Go, I guess, but he is a student and will leave us in a year or two.) That is quite frustrating. Perhaps I should try to initiate a kind of consensus which language we should adopt next — but I am afraid there is too little interest to leave the beaten tracks of C and Perl. After all, they have already adopted Perl as a new laguage not even twenty years ago, so why do something like that again so soon?
jyrgenn: Blurred head shot from 2007 (Default)
In summer I gave up the additional "luxury" Internet access (with native IPv6 and fixed IPv4 address) to cut costs, leaving me without IPv6 at home. Now, a few weeks ago, one of our local IPv6 evangelists triggered me to try the free tunnel offering from Hurricane Electric (HE), and so I did. This weekend I put together the remaining pieces, so now I have everything in place again, including tunnel updates when my home IP address changes, and reverse DNS delegation.

Getting the tunnel to work was not that easy. On the HE tunnel broker website the information on how to update the tunnel information (i.e. the web API) is not exactly pushed into your face; googling helps. The first script I found for the Mikrotik router, though, seems to use an outdated version of the API, and then you don't want the router to do that anyway – while it has an HTTP client that you can use in scripts, it does not do https (WTF?!), so it sends your password in clear text. And don't get me started on the scripting language.

Anyway, for (IPv4) dynamic DNS updates I have a script on my home server watch the external IP address anyway, so this could as well trigger a script to update the tunnel when the address changed. This is so much easier in a shell script than with a router script...

In case anyone else needs something like it, this is the script:
# update HE ipv6 tunnel with Mikrotik router

USER=he_user # HE account username
PASS=hepassword # HE account password
HOST=12345678 # HE tunnel ID
TNIF=sit1 # Mikrotik router's tunnel interface name
ROUTER=mt_router # router hostname
ADMIN=admin # router admin account
SSHKEY=$HOME/.ssh/id_dsa_$ROUTER # ssh identity key file

curl -s -k "$URL" | while read mode addr; do
case "$mode" in
good) $SSH "/interface 6to4 set [find name=sit1] local-address=$addr"
logger "$0: new address $addr";;
nochg) logger "$0: address unchanged $addr";;
*) logger "$0: unknown response $mode $addr";;
Of course, be sure to understand what this does before you use it. Needs curl, and the approriate ssh key file in place. The ssh key must be good for admin access at the router.
jyrgenn: Blurred head shot from 2007 (Default)
"Deep" was never the word I had reserved for Jackie Chan's movies. But I always liked them. This one was the first I saw, and the one that impressed me most. Not only because of the artistry, the bold choreography, and the daringness of the stunts, but for the intensity of feelings. In no other of his films that I have seen, Jackie Chan has been so earnest, and has admitted so strong feelings. Of course he is funny as well – when he poses and squeezes his pimples on the other side of the one-way mirror, that is hilarious! But his feud with the motorcycle gang is strong and honest, and moving. Later that Hovercraft – hilarious again.

I hadn't seen this one for ages, but I still liked it very much again.
jyrgenn: Blurred head shot from 2007 (Default)
(from a thread elsewhere)

Originally, Bach's works (and in particular the Brandenburg Concertos) were my choice of music to tune out surrounding audible distractions. I first used it when I was working on my diploma thesis in a really lively work group office in the university.

Recently, I have heard much more music at work. I found that I grew a bit tired of wearing headphones, but with the office door open (as I prefer it), there are often distractions from the hall and the other offices that I'd like to tune out. The other desk in my office is vacant, so there is little danger of annoying someone else. I bought speakers.[1]

With speakers, the music not as directly in my head as with headphones, I can hear a much broader spectrum of music than before, music that would have been distracting itself or even annoying when heard through headphones. With that restriction removed, I am now going through more or less the whole (digitized part of) my music collection, and there were some discoveries.

For instance, I have learned that some of the digital music I grabbed at the old work is not my thing. I do not actually like Can or Amon Düül, and I can do without Canned Heat's recordings except for a few songs. Most of Lou Reed's works do nothing for me. I dispensed with Grateful Dead at all. I could go on.

But there are also re-discoveries of things I really like. Some of Michael Jackson; The Selecter; Miles Davis. I love Jacques Loussier and his Bach and Verdi renditions. Even Bob Marley — I was never a real fan of his music, but could now well hear it again. Linton Kwesi Johnson, even much more so.

I have been digging through rather forgotten music of the 70s, 80s, and 90s in recent weeks and am looking forward to check out a great lot of Bach's that I acquired in bulk some time and have not yet even heard, much of it organ works and cantatas.

Great lengths to go to, only to shut out the distracting discussions from neighbour offices!

[1] M-Audio Studiophile AV 40

M-Audio Studiophile AV 40 frontM-Audio Studiophile AV 40 back
(press photos from the M-Audio website)

These speakers are sold as near-field monitors, but it is said they are crap as studio monitors. They do make excellent PC speakers, though. M-Audio makes cheap plasticky Chinese music gear, but apparently, as I had heard before, of the good cheap plasticky Chinese kind. And indeed they are cheap, a bit under € 120 for the pair. I like them a lot.
jyrgenn: Blurred head shot from 2007 (Default)
Last weekend I visited my father in the hospital, where he recovers after another, and more serious than ever before, cardiovascular surgery. It has definitely begun that I cannot take his existence for granted any more. He was in a brilliant mood and good form – talking, laughing, walking us to the cafeteria, discussing things. Had I not known of the surgery, I might not have suspected it. But that was the first day he was so well, my mother said.

This is from my parents' golden wedding anniversary last fall, where I had the honor that they chose one of my pictures as the "official" one.

jyrgenn: Blurred head shot from 2007 (Default)
Recently I complained about the "Go" programming language's time.Format(), which is there because someone found strftime() unappealing.

I find time.Format() unappealing, so I started to write a strftime(). It does all the conversion specifiers, but does not support any modifiers. These should be gracefully ignored, though. Locales are also not supported.

If anyone wants to use it as a starting point to add modifiers and locale support, or just use it as it is, you are welcome. License is BSD-like.

I'd also appreciate any advice how to make it better, more Go-like, more idiomatic.

jyrgenn: Blurred head shot from 2007 (Default)
In the last few days I have been familiarizing myself with the Go programming language and found that in general a very pleasant experience. Up to now, a few areas were a bit unfamiliar, but doable, others outright delightful.

Yesterday, I wanted to do something that involved writing a smallish program. Instead of going for the usual Perl, I wanted to try it in Go. The functionality involved writing a timestamp to a file, so I looked for the strftime() equivalent and found this:

Seriously, Go, time.Format()?

While strftime() may be "a bad interface" in someone's eyes (not in mine -- I always found it perfectly adequate), I can see time.Format() only as a persiflage of how bad an interface can be if carried to the extreme.

Especially this gets me, about strftime(): "no one remembers all the letters, so the only way to use it is with documentation in hand." And with time.Format(), am I supposed to remember -- instead of the partly arbitrary format letters of strftime() -- the parts of the example timestamp, which are all totally arbitrary? I mean, what were they drinking?
jyrgenn: Blurred head shot from 2007 (Default)
(From the discussion on an article on Google Plus)

There are always different opinions about a programming language. IMO it is a matter not just of personal taste, but also of the personal balance of priorities you have. For instance, if you particularly want terseness, freedom of expression, and lots of pragmatic shortcuts, Perl is just the thing. If you need real type safety and a firm grip on the module interfaces for a large team, Java or Ada may be the right thing. (I happen to like both, BTW.)

For me, Go may have just the right balance of type safety, pragmatic shortcuts (partly implicit strong typing! automatic memory management!), good performance, and powerful language features (closures! channels! interfaces! goroutines! multiple values!).

I lean to the stricter side of programming, such that I see it as a weakness of, say, Python or Ruby that variables do not have to be declared explicitly. Doing it with a simple ":=" like in Go, on the other hand, is so elegant I could squeak!

In a similar vein I am not a friend of the implicit string<->number equivalence that has become so popular since Perl (I guess) opened that particular box. I am very happy that Go does not follow that practice, but can, apparently, provide well-controlled implicit conversions where they are useful.

C has served me well for nearly a quarter of a century, in more than just the technical sense, and I still like it. But many things are so tedious to do in C. Implementing complex data structures, handling memory management, and constantly aiming carefully for the space between the toes takes, after an initial rush in the first years, much of the fun from programming and is quite tiring in the end.

Go may be just the thing to avoid many of C's tediousnesses, while keeping most of C's expressive power plus quite some of its own, and give me back the fun I have been missing.


Update: In the meantime I have learned that Go does no implicit conversion between strings and integers, but instead uses a common interface for print formatting, which is even better.

Update of the update: Later I learned that there is not (and cannot be) one common interface for print formatting implemented by all types and objects, but the formatter code looks at the value via reflection to decide how it should be formatted. There is built-in knowledge for simple types, an interface that can be used for those struct types that implement it, and generic code to explore other struct types via reflection.
jyrgenn: Blurred head shot from 2007 (Default)
Yesterday my wife had the girls over for their monthly game of cards, meaning no dinner at home, so I stopped on my way home to grab something to bite. I was aiming at a small chinese diner I had visited earlier and found okay.

When I crossed the street to get there, I suddenly noticed a chinese sign in a small side street. Closer inspection actually revealed a chinese restaurant I had never been in. There was a partial menu hanging outside, which looked very interesting, especially because the names of the items were give not only in German, but first in Chinese.

The restaurant was bigger than I'd have expected for the area. Not only were there about 10 tables for four, but they weren't in the least crowded. The style was unpretentious, bright, friendly.

So was, in a way, the waitress who brought me the menu. They had the usual one in a plastic binder, just like everywhere, and there was mostly the usual stuff in it. But there was also an additional menu on single sheet of paper, similar to the one on the picture above, and here were the interesting things.

On this menu were rice soups, a number of dim sums, and a few other smallish things, like pig's tongue on cucumber salad, and "phoenix claws" -- chicken feet. Now chicken feet is, here around, considered one of the ultimately strange items of chinese cuisine, and more or less unmarketable to the public. Unless, of course, someone is especially curious about it.

Most chinese restaurants in Germany have adapted at least a part of their dishes very much to european taste, even the better ones. Some are said to have two menus, one they hand out to everyone, and the other one that you get if you ask for it in Chinese. So the idea is, if a restaurant openly shows the menu that offers chicken feet, they mean serious business, without fear of driving away the general public, and the guest can, perhaps, expect more authenticity than usual.

Of course I was especially curious about chicken feet, so I ordered them, as well as the pig's tongue, deep-fried bread, and a Tsingtao beer. It took some persuasion on my part to convince the waitress that, yes, I really wanted the chicken feet. The beer was as always, the bread was nice, the pig's tongue a bit strange, but still palatable.

The chicken feet -- well. They were not crispy, as I had heard it once, but rather soft and a bit slimy, with some condiment. I did not really know how to eat them, at least it didn't really work with chopsticks. Spoon and fork, which were on the table, too, wouldn't have helped either. Probably it is better to take them in your hands and directly try to suck what little there is of skin and meat off the bones. But somehow I am not the biggest fan of taking my food in my hands if there isn't something like bread about it to keep your fingers dry and clean, even with things where it is generally accepted, like spare ribs. So it was... difficult.

Ah, bones, speaking of bones -- there were lots of them. Lots and lots. I would have thought chicken have as many bones in their feet as we have in our hands, but somehow that did not seem to be the case. I haven't really counted -- certainly it felt like there were two or three times as many.

The taste was "special". I guess it was some seasoning together with the soft and slimy texture that made me not really relish the chicken feet. In the end, the difficulties of eating them together with that taste let me give up early, leaving more than half uneaten on the table. The cook, who had in between replaced the waitress in taking care of the guests, smiled a bit at that and said these were rather for real chinese, not so much for europeans. I could not but agree with him. He assured me that the dim sums would be more to my taste.

Still, that little restaurant is very interesting. There are unusual things to be had, and I am sure most of them are not as strange as the chicken feet. Even dim sums are rare around here, and the smallish number of them on the menu makes me hope they make them themselves. I will definitely go back there and make my way through their offerings, which were not only interesting, but also quite cheap. Add the friendly atmosphere and the apparently good quality of the food.

Robert-Lück-Straße 1
12169 Berlin
jyrgenn: Blurred head shot from 2007 (Default)
When I was in London Easter 2009, I saw an ad for this book in the Underground and took a picture to remember it, because I liked the title. A few weeks ago I noticed the picture again and, as it was just the time for some mindless entertainment, bought the book on the Orinoco Market (or the like) for € 0.01 (yes, really!) plus € 3 for shipping. That should be worth it, I thought. And it was! This is a nice, light comedy, reminding me a bit of Bridget Jones, but maybe even funnier. The (SPOILER!) happy ending with the twist is not a real surprise any more when it finally happens, but (oh the irony!) that was to be expected.
jyrgenn: Blurred head shot from 2007 (Default)
This is not the first of Crichton's books I have picked up for a second time. I really liked it on first reading for its fast-paced story-telling and, other than, for instance, the Da Vinci Code, for the story itself. That is what Crichton does (or rather did) so well: write gripping and highly entertaining stories that are not stupid. They may not be the most distinguished and sophisticated art, but page-turners that I don't feel bad about afterwards.

Anyone who, like myself, is not into quantum physics will not really notice the boundary between fact and fiction when that drivel about quantum effects and time travel comes up. This makes the willing suspension of disbelief easy, and it doesn't get into the way of the story. Well, at least for me it works, as the story is good in distracting the reader from the technical things. Have you ever faced a really dangerous and angry knight in a joust who will probably try to kill you as soon as he sees a chance? I thought you haven't.


jyrgenn: Blurred head shot from 2007 (Default)

March 2017

567 891011


RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags