Es ist offiziell: Diagnose Depression

Dabei hat alles so gut angefangen. Nach 6 Jahren Arbeitsunfähigkeit durch extreme Schlafrythmusstörungen bekam ich ziemlich schnell nach Ablauf meiner EU-Rente eine Stelle, die ziemlich genau auf meine Vorstellungen passte. Ich betreue IT-Kunden, muß auch mal rausfahren und bin der Helfer in der Not, der das Problem auch wirklich löst und nicht nur oberflächlich behandelt. Ich bekam einen Firmenwagen, was wirklich ein großer Glückstreffer war, denn ein Auto war und ist finanziell nicht möglich und mit den ÖPNV benötige ich im besten Fall 45 Minuten, im schlechtesten Fall 1,5 Stunden zur Arbeit – einfache Strecke. Bis hierhin hätte nicht besser laufen können.

Mein Einstieg in der Firma war zwar etwas holprig, aber trotzdem nicht enorm steinig. Doch dann kristallisierte sich etwas heraus, was ich am Anfang gar nicht bemerkt hatte. Los ging es mit nervösen Gefühlen im Bein, die ich aber nicht als hinderlich Empfand. Muskelzuckungen und nervöse Gefühle hatte ich ja schon desöfteren, und im Normalfall waren die nach einem Tag wieder vorbei, sodaß ich mir keine großen Gedanken darüber machte. Dann stellte ich fest, daß ich nicht in der Lage war, bestimmte Entscheidungen selbst zu treffen. Das betraf fast ausschließlich nicht-fachliche Themen, insbesondere Themen zur Geschäftsorganisation. Beispiel: “Darf ich für den Kunden Ware kaufen und über die Firma abrechnen, oder muß er es erst über die Firma bestellen?”. Man kann natürlich argumentieren: “Ja, es ist gut, dies nicht selbst zu entscheiden, sondern immer den Chef fragen”. Aber in dieser Firma läuft das anders: Treffe eine (begründete) Entscheidung, egal, ob sie richtig oder falsch ist. Wenn sie falsch ist, wird es besprochen.

Dies widerspricht allem, was ich jemals in Firmen gelernt habe. Um es noch spitzer zu formulieren: In meinen bisherigen Arbeitsverhältnissen wurde mir eingetrichtert: “Du hast keine Entscheidungskompetenz, dies wird von den Vorgesetzten übernommen.” und “Wir sagen dir, was du wann wie zu machen hast”. Und das ist jetzt anders. Völlig anders.

Auf der einen Seite ist das toll – denn ich kann selbst entscheiden. Auf der anderen Seite habe ich Angst. Brutale Angst. Angst, Fehler zu machen und dafür um Köpfe kürzer gemacht zu werden. So, wie es in allen Firmen vorher passiert ist. Ich bin nicht in der Lage, mich durchzusetzen. So geschehen im Vorfeld der ICMP7, zu der ich über das Wochenende fahren wollte. Der Plan war gut: Freitag um 14 Uhr mit den gesammelten Überstunden Feierabend machen, sodaß ich noch vor dem Berufsverkehr in Münchsteinach bin. Doch die Realität sah anders aus.

Es kam natürlich etwas dazwischen – nämlich meine Angst. Ich konnte nicht äußern, daß ich jetzt Feierabend habe. Ich hatte Angst, daß die Kollegen mich mobben, so wie es früher schon passiert ist, weil ich angeblich “Aus der Reihe getanzt bin”. Die latente Angst, daß ich für alle da sein muß, der Retter in der Not. Wenn ich nicht rette, werde ich bestraft.

Aber das ist noch nicht alles. In den Wochen vor der ICMP bemerkte ich, daß ich mich nur schlecht konzentrieren konnte und mein Gemütszustand eher neutral bis niedergeschlagen war. Jede kleine Ablenkung brachte mich völlig aus dem Konzept und es dauerte eine Weile, bis ich wieder bei meiner eigentlichen Tätigkeit war. Und dann kam die ICMP.

Das Wochenende auf der ICMP7 war ganz nett und dort lernte ich eine Person kennen, die mir den Schubser in die richtige Richtung gab: Es könnten Depressionen sein. Das war mir aber zu diesem Zeitpunkt noch nicht klar, denn ich fühlte mich nicht depressiv. Am darauffolgenden Montag verlief der Tag eigentlich ganz normal, bis ich Abends das Auto ausräumen wollte. Ich fühlte mich plötzlich völlig überfordert von der Menge der Dinge, die noch in die Waschmaschine und in diverse Lagerorte verstaut werden wollten. Ich zitterte und war nicht in der Lage, einen klaren Gedanken zu fassen. Am Folgetag meldete ich mich krank.

Mein Plüschologe (Verniedlichungsform von Psychologe) war im Urlaub, also mußte ich mit meinem Hausarzt vorlieb nehmen. Er verschrieb mir beruhigende Medikamente, die aber keinerlei Wirkung zeigten. Ich verbrachte den Großteil meiner Zeit im Bett und mußte mich wirklich anstrengen, genügend zu essen und zu trinken. Ich ging zu diesem Zeitpunkt noch nicht davon aus, daß diese Geschichte eine längere sein würde. Typischer Fall von “denkste”. Nach 2 Wochen war mein Plüschologe wieder da und ich schilderte ihm meine Symptome, die ich in diesen 2 Wochen gesammelt hatte. Es war mir nämlich nicht möglich, zu erklären, welche Symptome ich am Vortag erlebt hatte. Und seine Reaktion war schnell und gezielt: Depression.

Ich erhalte jetzt seit etwa 2 Wochen Elontril, welches die Nervosität und Unruhe recht schnell lindern und nach einiger Zeit Antidepressiv wirken soll. Ich muß der Realität leider jetzt ins Auge sehen: Ich verspüre bisher noch keine Wirkung. Selbst die Erhöhung von 150mg auf 300mg brachte keine Besserung. Und jetzt realisiere ich: Der Weg wird steinig. Und meine Hoffnung auf schnelle Genesung und Wideraufnahme meiner beruflichen Tätigkeit schwindet dahin. Dies könnte auch durchaus den Verlust meines Arbeitsplatzes mit sich bringen. Und das macht mir zusätzlich Angst.

Aber ich habe auch Hoffnung. Es gab einige Tage in den letzten Wochen, an denen ich mich immerhin um Basics wie Zimmer aufräumen oder Wäsche machen kümmern konnte. Ich konnte auch an der MRMCD teilnehmen (wenngleich auch dort Stimmungsschwankungen auftraten). Sollte ich meinen Arbeitsplatz verlieren, sollte das Krankengeld greifen. Und trotzdem bin ich nervös und habe unruhige Beine. Die Angst überwiegt. Aber ich habe Hoffnung. Vielleicht.

How fear killed my abilities

Bullying started when I was 8 years old. Maybe 7 or maybe 9, I can’t clearly remember. I was bullied because I was different. Back in those days, I thought it was because I was looking ugly and smelled funny. I was beaten around and provoked, and my classmates were pretty smart in pointing me out as the culprit. I was the evil one and they were the good ones. I was the one who had to go to the psychiatrist, not them. I was the one with the problem, not them. And I didn’t wanted to be the one who had a problem. I wanted to be on the good side.

At home, the situation was the same: I was always the one who was at fault, not my mother and not my father. I always did things wrong, even if I didn’t.

Bullying continued up to my junior high exam, where I finally got rid of most people knowing me. And at the very same time, it was revealed to me that my father wasn’t my real father but instead my step-father, and that I’ve been adopted by him. My step-father moved out and suddenly a completely new life began: I got an apprenticeship at SAP, a good self-esteem and excellent marks in job school. After my apprenticeship, I moved to Frankfurt to start at a new company as a systems administrator, because I wanted to live on my own and concentrate on my career as a DJ and musician. Shortly after that, things started to collapse again: I was assigned a shitty software engineering project, even tough as I was employed as a systems administrator, and my health went down quite much. After one and a half years, I was laid off because the company did crash. I was able to find another job quickly, this time as a software developer. This wasn’t what I wanted to do, but I couldn’t accept the fact that I was out of work, so I did a job I didn’t like.

In that software developer position, I worked my arse off. I was often working 10 to 14 hours a day, mainly because I was in fear that I could laid off again. I never had the balls to say: My 8 hour contract is over, I don’t care if the contract says “overtime has to be done without compensation”, I’m going home now, if you don’t like that, find another person. After 2,5 years, I was suffering from a burn out syndrome and changed my job again.

I had a pretty severe sleep disorder and didn’t last for long in my new job, which was a developer job again. But I didn’t realize it, I thought I was pretty good at software development (and I still am), but this wasn’t what I wanted to do. I did it because I had the fear of being homeless and without money. I started being self-employed. And there it was again, the fear of failing and thus being without money.

A long period of sleep disorder, doctor appointments and even invalidity pension followed, before I finally started working 3 months ago. I have to admit that this isn’t a 100% match to my dream position, but it’s a pretty okay company which matches about 70% of where I want to work (100% would be administrating huge server systems and data centers, especially the networking side). And now, being 33 years old, I finally realized by what my life was driven so far: Fear.

I feared that other people bully me, do not respect me, don’t ask me for help, don’t believe in my judgement, think my work is not good, that I might fail and that I end up without having enough money to life.

And this fear killed my abilities. Not my technical or social skills, but my personal skills. I couldn’t stand up and say: No. I won’t do that. I won’t do it that way. Just doing things without a safety net.

And that’s exactly what I need to do. I need to take risks. I need to say no. I need to behave like I believe it’s right, and not what others expect.

And you should do that, too

OXID Rants

Today I had a major outage in an OXID-based shop system. The reason is unknown; it did resolve “itself” as quickly as it appeared, leaving behind an almost 3 hour downtime of the system. I assume that it’s a combination of their odd caching, and during debugging what went wrong, I took some notes which I eventually wrote down in this blog entry.

OXID, why do you disable modules without any visual indication on the modules list?

OXID shows that modules are enabled, but some aren’t. Nothing in the error logs. No information on the GUI. After an hour of digging into the code, I found out that there’s a configuration entry in the OXCONFIG table (of course, crypted see below) which holds a serialized PHP array of disabled modules (“adisabledmodules”). I do not know at this point where this array is filled, but if it is, modules are silently ignored – and the worst thing: They are shown as if they are enabled.

OXID, why don’t you give any hints why a module can’t be enabled?

If OXID fails to enable a module, it does so silently. At least, this time you actually see that the module is disabled again, but you get no clue why.

OXID, why you store your config encrypted in the database?

OXID uses DECODE() and ENCODE() with a public known key to store data in the OXCONFIG table. This is next to useless and only makes maintenance harder. The key is actually the same for each installation. Of course, one could change the key, but this isn’t documented. Additionally, some contents of the OXCONFIG table are stored as temporary, unencrypted data in the tmp folder anyways.

OXID, why do you use a custom class extension system?

OXID uses a custom class extension system. Probably to emulate some kind of multiple inheritance. In theory, this doesn’t sound too bad, but in practice, this gives headaches, because it is implemented poorly.

Class names are mangled to lower case in some places, but not in others, causing all sorts of problems, combined with too much or simply wrong caching mechanisms. One needs to add their class extensions into a file called “metadata.php”, which looks like this:

Don’t ever change the case of _any_ class name. Here’s where the inconsistency begins: The actual PHP class name is “Thankyou”. Most modules so far use “thankyou” as class identifier for the “extend” portion of the array. If you’d use “Thankyou” as identifier, you’d mess up the whole system, resulting in “method not found” errors. And if you did that once, it gets cached in the system, and you have no chance to revert this unless you manually delete the information from the OXCONFIG table.

Conclusion

When I first started out with OXID, it didn’t seem too bad as a shop system: They got unit tests and a wide range of modules. Some of them are available as purchase-only variants, which is okay.

However, the quality of the whole OXID infrastructure is a big problem. It uses smarty templates all over the place, even in their admin backend. Modules assume that they are the only one who extend a template, which is often not the case (example: List headers). There’s no documentation on where you should extend functionality. There’s no overall picture of how the business logic works. You can even purchase two modules, which change the business logic.

The lack of technical documentation is a big no-go. Did you knew that database properties are mapped to an object’s tablename__fieldname property? If you want to retrieve an order’s order date, you need to use:

This is neither documented within the oxBase class nor on their OXIDForge Website. If you decide to step into OXID development, be aware that you’ll be on your own – forums aren’t too much help, and expect to read lots of (odd), undocumented code.

We need more troubleshooters for 31c3 (and other big chaos events as well)

This is a small personal review of the 30c3. I realized that the congress (and other big chaos events as well) need more troubleshooters – that is, angels that take responsibility for minor problems and willing to solve them.

Update: jz pointed out that your troubleshooter for all concerns is heaven (DECT 1023), even for minor tasks. So this blog post is mostly obsolete, but kept as-is for reference. However, you (as an angel) still may want to take responsibility to call heaven when you spot a problem which you can’t solve.

While I was not able to attend the congress as I had planned to due to a cold, I did 4 hours of NOC Helpdesk as well as other minor tasks. During that, here is a small list of items which occurred:

  • (unconfirmed) It appeared that some switches (if not all) had ports 1-4 reserved for NAT64, which was not labeled on the switches themselves.
  • The NOC Helpdesk did not have enough seating for the 4 angels assigned to the NOC helpdesk shifts
  • The NOC Helpdesk didn’t have pens, paper and a list of contacts to call (like the NOC itself). This was partially solved
  • Each Colo Server should have a set of contact information (name, DECT/GSM number, departure date, IP address). People put the labels onto by themselves with missing information, until we realized that a printed form would be a better idea (that also decreased setup time for each Colo server)
  • People were going up to the Colo by themselves, without being aware of that they need to report to the NOC helpdesk prior putting their servers up (solved by putting up some signs which said something like “YOU SHOULDN’T BE HERE, REPORT TO THE NOC HELPDESK”)
  • At least one person reported that the WIFI access data should be put up as signs all over the congress (aka you can use any Username/Password combination and which WiFi does what), especially as the wiki was down (was not solved AFAIR, but couldn’t solve it myself due to the cold)
  • A local wiki mirror should have been put up, as it was down several times

All those items listed required that some angel stepped up and took care of it (=responsibility).

This might also go wrong in some cases; in my case, I opened the door for the NOC to the Colo with some lockpicking tricks (the person with the key to the colo was asleep) and I was “caught” by a security angel. I tried to explain the situation, however, even saying that this was for the NOC and he should call the NOC to resolve the issue was ignored. Yes, I probably shouldn’t have opened the door and instead calling somebody, but that wasn’t obvious to me in that situation. So yes, taking responsibility for things sometimes goes horribly wrong and you might end up with wrong decisions.

But again, we need more angels who not only do what they’re told to do, but who do take responsibility and willing to resolve problems (or do improvements) as they appear. After the congress experience (and, of course, the OHM2013 experience where I acted as emergency toilet cleaner/soap/toilet paper refiller), I really feel that there’s a big need for angel problem solvers – maybe not only within their shifts, but in general. This will make the congress more enjoyable for everyone.

Probably there should be a team of “troubleshooters”, which takes care of any “interdisciplinary” issues occurring. That team should also be walking around and ask angels doing shifts what could be improved – because often, angels can’t leave their posts to solve those issues.

30c3 Quick VPN setup

The CongressChecklist mentions that a VPN tunnel is a good idea; in fact it is. Here’s a basic OpenVPN recipe. You need the following tools:

  • A server with enough bandwidth to handle the incoming and outgoing bandwidth (I’ve got a root server with 1Gbit/s connectivity at Hetzer, that should do)
  • OpenVPN

The recipe is fairly simple; I use a preshared secret and NAT so that I don’t need a separate IP.

Note: This setup is only suitable for a single device; it doesn’t do DHCP or other fancy stuff.

Step 1: Generate the shared secret

This generates a key to be used as shared secret. You need the same key on both your server and your client(s). Personally, I’ve placed my key in /etc/openvpn/secrets, but you may use any other path as well (AFAIK).

Step 2: Server Configuration

Additionally, we need a NAT rule which applies to the tunnel network (technically, the netmask is too big; but hey, you can fix that later). eth1 is my output interface.

Step 3: Client Config

Step 4: Testing

Start both tunnels. Check the output of both logs; you should see something like this:

Test that you can ping the server’s internal IP from your client:

Verify that you can ping the interwebz:

Verify that you actually route via the tunnel:

Possible solutions for non-working setups (I’ve not tested them and I am not 100% sure that you need those; they’re just ideas)

  • Check that /proc/sys/net/ipv4/ip_forward on your server is set to 1. On the client, this shouldn’t be necessary.
  • Check that /proc/sys/net/ipv4/conf/all/rp_filter is set to 0 on your server.

Step 5: IPv6 Tunneling

You can tunnel IPv6 over OpenVPN as well, but I have neither setup nor tested this. Technically, you could simply use two static IPv6 addresses and route them via the tunnel; however, this requires additional works with routing tables. You could even setup NAT, but that’s not a good idea either.

A better idea might be to use a tunnel broker or miredo, which should simply use the IPv4 tunnel. If you have comments about how to easily setup IPv6 over the tunnel, feel free to comment!

Updates:

  • The MTU was still too big, 1380 didn’t work (yet?) on the congress network. Using 1300 for now
  • I couldn’t get DNS push to work, probably because clients don’t use DHCP for now – I simply created a script which pushes my own nameserver into /etc/resolv.conf

IP Power Strip “Reverse Engineering”

Wöhlke Websteckdose
Image © Wöhlke EDV-Beratung

I recently came across an IP controllable power strip from Wöhlke, which looked quite neat, however, it was way too expensive. They want 199€ for 3 controllable sockets. Reichelt has an IP controllable power strip for only 70€, and there you have 4 sockets including nice LEDs. The one from Reichelt also looks more like a custom designed product, while the Wöhlke one looked more like a product “mashup” (which isn’t a bad idea at all). They even sell a separate board, so my interest was increasing.

I’ve been looking for a nice power strip which I could re-cable for quite some time, but most power strips are designed down to a price, so they do whatever they can to keep it cheap. That’s also the reason why you’ll find so many power strips in a 45° angle – they’re much cheaper to produce.

A cracked open cheap power strip

I’ve cracked a cheap power strip open (literally – most cheap power strips don’t have screws, because they’re bolted down or only clipped together). You can clearly see how the (presumably) copper strips are arranged. If you’d have 90° outlets, you’d have to pay lots more for the copper strips, because they have to be routed in some sort so that they don’t short out.

I realized that the power strip Wöhlke used must be much simpler to modify, so I did a quite long search for power strips and I finally came across a manufacturer where the power strip looks pretty much identical to what Wöhlke uses: the Bachmann Craftsman Power Strip.

 

hwl_awd_cmyk_igel

The Bachmann Craftsman Power Strip
Image © Bachmann

I decided I’d give it a shot, mainly because of curiousity, and ordered the strip. It isn’t a cheap power strip; it costs 19,98€ on Amazon, whereas most cheap 6 port power strips come in the 3-6€ range. When the strip arrived, I realized that I was absolutely right: You can easily open the strip using 4 screws (2 on each side) and an additional one for the cover. They also use some kind of copper strips, which happen to be about 6mm – great for 6,3mm cable lugs. Now it’s easy to understand how Wöhlke (probably) did it – cut the copper bars, and put cable lugs onto there which are fed into their custom board. The case isn’t aluminium, but plastic, but that’s completely okay for the price IMHO.

 

That’s a real nice base for own projects, and you can even get 9 or 12 port ones, and the 12 port is only 36€ - quite a nice price! Of course, you’d have to rip out 2 or 3 plugs to make space for electronics and take care on how you cover the holes, but the problematic part is solved: Getting a base for any power control projects.

More Pics below!

IMG_2540

IMG_2539 IMG_2538 IMG_2535 IMG_2534IMG_2533

SolarWind currently out of order

A few weeks ago, SolarWind became pretty unstable. This mainly has 2 reasons:

  • The router draws too much power (I planned to upgrade to Carambola2, but haven’t gotten the time yet), thus it becomes unreachable in the night. This was expected.
  • It doesn’t connect to my home WiFi network anymore, which I’m unable to debug due to lack of the serial interface – I’m using the serial to communicate with the power measurement board

This means that there’s no data. I hope that I can free some money to buy a larger panel and finish the Carambola2 upgrade. In the meantime no data is available – sorry!

SolarWind OHM2013 slides

Here are the slides for my talk at OHM2013: Solar Powered Autonomous Routers @ OHM2013

SolarWind updates: MPPT, Carambola2

During the past month, I mainly concentrated on combining my CurrentMonitor with a DIY MPPT charge controller. Work is done at the CurrentMonitor repository.

My design goals for the MPPT charge controller are:

  • 10A (sufficient to cover 250W panels)
  • MPPT charge controller acts as an I²C slave
    • It can be configured via I²C
    • Values like power consumption or power harvested can be queried via I²C as well
    • The MPPT doesn’t have a user interface or LCD by default
  • Uses APR/ATC/ATO blade fuses instead of solar fuses due to the reduced cost (and regular glass fuse holders only are widely available up to 6.3A)
  • +12V Output can be disconnected via software
  • Additional +3.3V 800mA output which also can be disconnected via software

Below is a picture of the prototype, which is likely to heavily change.

IMG_20130716_002117 IMG_20130716_002108

DIY Directional WiFi Antenna + Tests

IMG_20130528_020617IMG_20130528_195107Yesterday I stumbled over the IKEA Baren Toilet Brush - yes, I do keep an eye on toilet brush holders since nazco and myself are planning a directional WiFi link. The box said 10cm diameter, which is a bit too much according to this heise.de article, however, once I arrived at RaumZeitLabor I was surprised that it is “only” 92mm in diameter – the optimal size.

The setup consisted of a TL-WR741ND on our balcony as well as an external Logilink WiFi adaptor which I used to measure stuff along my 2 hour trip.

IMG_20130528_160930

Test Point 1

IMG_20130528_195120


The TL-WR741ND sat on our balcony, approx 8m above ground level. It was equipped with the stock stub antenna. All tests were done using an external USB WiFi stick (Logilink, unknown model, rt73usb driver). For all test locations, I did the test with the stock stub antenna and my directional antenna.

I’ve used iperf to measure the throughput (iperf server on the TL-WR741ND, and iperf client on my notebook). I could have done send/receive stats, but at first I thought that it wouldn’t work so well if I had only one directional antenna – I was wrong! Performance was much better than expected, even at over half a kilometer I had nearly the same performance using only one directional antenna as I had when I was at home).

IMG_20130528_164251

Test Point 3

Big Win: With only one directional antenna, I was able to achieve 18.3 Mbit/s over half a kilometer with a non-optimal line of sight, which is only 4 Mbit/s less than placing both antennas next to each other.

You can find my measurements in the following file: Messwerte.ods (20kb or so)

Additionally, I have visualized the test points on Google Maps.

Note that performance is sometimes less because of trees in the line of sight, and the antenna isn’t constructed in an optimal way. Additionally, my hand is a bit shaky, so there’s room for some additional percent of performance.

IMG_20130528_164718

Test Point 4

IMG_20130528_174234

Test Point 6