Reinout van Rees’ weblog

3Di symposium (NL), tweede ochtendsessies

2015-04-16

Tags: nelenschuurmans

Note beforehand in English: this’ll be one of the rare Dutch entries :-)

Zie ook de samenvattingen van de eerste ochtendsessies.

It is the image that counts - Elmar Eisemann

Elmar is professor computer graphics aan de TU Delft. Door goede, niet van echt te onderscheiden, 3D visualisaties kan je mensen vaak veel beter zaken duidelijk maken dan door een grafiekje of een 2D plaatje.

De uitdaging bij 3Di is dat het zo veel data is. Voor de 3Di visualisatie gebruiken ze de AHN2 met kleurinformatie. Dat is 8 terabyte. Als je het op CDs zou zetten zou je een stapel van 20 meter hoog krijgen! Dus als je alles op het kleinste detailniveau wilt tonen lukt dat niet met normale computers.

De oplossing hiervoor is om de detailleringsgraad aan te passen. Iets dat ver af ligt hoeft minder gedetailleerd te zijn. Ook kan je simplificeren en combineren.

Naast de visualisatie zelf moet er ook aan de data zelf gewerkt worden. De beschikbare data heeft normaliter gaten omdat de meeste kleurinfo van boven opgenomen wordt, dus zijkanten van gebouwen zijn een probleem. Dit kunnen ze verhelpen door allerlei berekeningen op de data los te laten.

Ze kijken ook naar integratie van real-time informatie in de 3D visualisatie, zoals regenval en twitter berichten over wateroverlast. Door dit soort informatie in 3D te tonen kan je beter en makkelijker samenwerken als, bijvoorbeeld, hulpdiensten.

Ze doen hiervoor ook onderzoek naar het gezamelijk beslissingnemen. Zaken zoals schetsen in google maps met een mogelijke oplossing (“als we in dit gebied nou xyz doen...”) wat dan tegelijkertijd gedeeld wordt met de andere deelnemers. In 3D. Wat ook handig is om op meerdere beeldschermen en apparaten naar hetzelfde plaatje te kijken, bestuurd door 1 van de apparaten.

Veel onderzoek doen ze ook naar de eigenlijke 3d visualisatie. Bij de eerste 3d bioscoopfilms kreeg je koppijn omdat je hersens kijken naar het scherm en objecten zien die ervoor zitten. Dat klopt niet met elkaar en daarvan krijg je koppijn. De tweede generatie 3D films bleef qua 3D dicht bij het scherm, in de “comfort zone”, maar daar was het effect dus heel beperkt.

Bij de TU Delft houden ze rekening met allerlei manieren waarop je hersenen met je ogen omgaan. Optische illusies, maar dan gebruikt om iets meer 3D te maken zonder aparte apparatuur. Of om luchtfoto’s duidelijker en herkenbaarder te maken door hogere gebouwen wat extra schuin te zetten.

“Augmented reality”: dit kan zo simpel zijn als het tonen van labels (plaatsen, straatnamen) in een 3D visualisatie. Maar het helpt wel veel en geeft veel duidelijkheid.

Waar ook nog veel meer mee kan: de community inschakelen. Hulp bij verzamelen van gedetailleerde gebouwmodellen, bijvoorbeeld.

In al dit onderzoek zit ook veel potentie voor 3Di! Een deel wordt al gebruikt en daarnaast zijn er veel prototypes en leuke testen.

Onderschat trouwens niet hoe snel het allemaal kan gaan! 30 jaar geleden was een computerspelletje een monochroom 2D plaatje van 100x100 pixels. Nu heb je vrijwel fotorealistische real-time 3D spelletjes!

Aan de wind rekenen - Guus Stelling

Guus (professor TU Delft; Stelling Hydraulics) is de grondlegger van 3Di.

Hij breekt als eerste een lans voor het snel gebruiken van innovaties zoals 3Di. Toen de stoommachine nauwelijks was uitgevonden keken er al heel snel mensen naar die uitvinding om te kijken of het Haarlemmermeer ermee drooggemaakt kon worden. Dus... als je een positie hebt om het te doen: zorg dat 3Di gebruikt gaat worden!

Op aarde hebben we 1.360.000.000 kubieke kilometer water! Ruim 90% daarvan zit in de oceanen.

Prachtverhaal, maar grotendeels niet samen te vatten. Als het goed is komt er een video van. Dat wordt bij deze alvast een aanrader!

Enfin, ze zijn nu bezig om de wind in de 3Di modellen mee te nemen. Dan komen er allerlei complicaties langszetten. Hoe dunner het waterlaagje, hoe groter het effect van de wind wordt. En hoe lastiger de berekeningen worden.

Hij laat een paar voorbeelden zien, onder andere de reden voor maalstromen bij de kust. Leuk!

Als laatste liet hij een simulatie los op... de doortocht van de zee van Mozes. Een echte locatie was niet makkelijk te vinden en dus gebruikte hij het als voorbeeld voor het belang van details. Hij zette wind op een bak met water met een dijkje in het midden, in twee varianten, eentje met een rechte wand en eentje met een schuin talud. Het verschil in eindresultaat was opvallend en toonde daarmee aan dat de gedetailleerdheid van het onderliggende model van groot belang is.

Slotopmerking: “3Di is een imperfect model. Maar ik ken geen model dat perfecter is!” Modelleren is toch een beetje als een artiest: met een enkele verfstreek moet je soms de essentie vastleggen.

3Di in Afrika - Stefan Nijwening

Stefan (Rebel groep) werkt aan projecten in Afrika om samen met grote bedrijven, zoals brouwerijen en industrie, die water nodig hebben, te kijken naar waterproblematiek.

Hij haalt een project terug van 8 jaar geleden in Ho Chi Mihn City. Het maken van een overstromingsmodel duurde daar te lang om echt in de praktijk te gebruiken. Wat had hij graag 3Di toen al gehad, dat had veel opgeleverd.

Langzamerhand beginnen ook bedrijven en economen naar water te kijken en het als een groot toekomstrisico te zien. Economen en bedrijven kijken toch anders er naar dan overheden. Ze kijken wat er met hun geld gebeurd. Met hun investeringen. Of er extra geld uit investeringen gehaald kan worden (waterveiligheid door een dam en dan ook nog eens stroom opwekken, bijvoorbeeld). En dan economisch afwegen van allerlei varianten.

3Di, met een touch table bijvoorbeeld, maakt water allemaal veel inzichtelijker, ook voor economen die geen vakinhoudelijke kennis ervan hebben. Je kan het zien. En je kan maatregelen simuleren en het effect ervan gelijk zien.

Een uitdaging is om de verschillende stakeholders bij elkaar te krijgen. Het hebben van een 3Di touch table kan dan helpen. Zelf hebben ze ook een dashboard gemaakt waarmee tekstueel allerlei scenario’s met elkaar vergeleken kunnen worden.

Er zit geld in water risico’s! Je kan namelijk veel geld besparen door er goed mee om te gaan.

Hoe exporteer je water - Tineke Huizinga

Tineke, voormalig staatssecretaris, is nu voorzitter van de delta alliance international governing board.

De Delta Alliance is een kennis-netwerkorganisatie. 16 landen zijn aangesloten die allemaal specifieke delta’s vertegenwoordigen. Het is een Nederlands initiatief. Het doel is om de resilliance, de veerkrachtigheid, van de delta’s te vergroten. Dit doen ze door kennisdeling, informatie verzamelen en het ontwikkelen van het kennisnetwerk door verbeteren van het onderlinge contact van de deelnemende kennisinstituten.

Soms kan het vrij eenvoudig zijn. Zo hebben ze toolboxen met instructies voor het maken van bepaalde kaarten, bijvoorbeeld.

Er zit ook een Nederlands karakter in door de nadruk op aanpasbaarheid. Net zoals het deltaprogramma op een tijdsschaal van 50 of 100 jaar kijkt en accepteert dat niet alles 100% duidelijk is. En dat het beleid en de maatregelen dus aangepast moeten (kunnen) worden. En dat het dus verder kijkt dan een 4 jaar, bijvoorbeeld, van een bepaalde regering. Zo’n lange termijn aanpak is in veel gebieden onbekend.

We hebben het als Nederland opgezet uit de overtuiging dat we de wereld echt iets te bieden hebben met onze waterkennis. We lopen voor op de rest van de wereld! Wel is het doel van de delta alliance om de wereldwijde waterkennis bij elkaar te brengen, te delen. Het is zeker niet de bedoeling alleen te “zenden”.

Als delta alliance zouden ze 3Di erg graag op willen nemen in hun toolboxen.

3Di symposium (NL), eerste ochtendsessies

2015-04-16

Tags: nelenschuurmans

(Note beforehand in English: this’ll be one of the rare Dutch entries :-) )

Het 3Di symposium werd, net als vorig jaar, in het prachtige spoorwegmuseum in Utrecht gehouden.

3Di is nu een onafhankelijke stichting. Waarom? Om het te borgen; de verschillende ontwikkelingen worden er in ondergebracht. 3Di is een samenwerking tussen partijen met verschillende achtergronden. Deltares is meer een “braaf” onderzoeksinstituut en mede-ontwikkelaar Nelen&Schuurmans is meer een “dynamische en minder brave” commerciele marktpartij. En dan zijn er de TU Delft en de launching customers. De keus voor een brave stichting was de beste mogelijkheid

Ervaring van het afgelopen jaar - Michiel van Haaersma Buma en Luc Kohsiek

Vorig jaar waren ze blij dat het allemaal werkte. In een jaar tijd is er veel gebeurd. Luc (dijkgraaf HHNK) noemt vier opvallende punten

  • De stichting is opgericht. Best een grote stap!
  • De medewerkers moeten ermee leren werken en ermee kunnen werken.
  • 3Di werkt erg gedetailleerd, dus opeens kom je er achter dat de interne informatie niet op orde is: veel missende duikers en kleine sluisjes, bijvoorbeeld.
  • De innovatie is niet gestopt. De riolering die nu aan 3Di toe gevoegd wordt is geweldig.

Michiel (dijkgraaf Delfland) voegt toe dat ze 3Di vrij uitgebreid in de hele organisatie heeft uitgerold. Daarmee kom je wel achter wat ruwe randjes, maar dat is te verwachten als je rechtstreeks uit het labaratorium naar de praktijk gaat. Ze hebben de lat hoog gelegd. Ook politiek wordt er flink op gelet.

Luc laat een 3Di demo zien van Texel. Een dijkbreuk die Den Burgh bedreigt. Een oude stroomgeul wordt gebruikt om het water zoveel mogelijk af te leiden richting een polder. Als simulatie wordt daarvoor een dijk doorgestoken. Aan het eind worden er berekende plaatjes getoond met daarop hoe lang het duurt voordat het water op een plek is. En ook tot wanneer de wegen nog bruikbaar zijn voor evacuaties. Dit biedt inzicht!

Michiel zegt dat Delfland, dat vroeger een open gebied was, eigenlijk een grote stad is geworden. Hij toont een plaatje waar ook de kassen als bebouwing is meegenomen en dan is het inderdaad voor het grootste deel bebouwd. In het 3Di model hebben ze inmiddels zowel de riolering als het oppervlaktewater gemodelleerd, ze zijn nu bezig het aan elkaar te knopen.

Voor onderling overleg met andere instanties gaan ze richting wat ze een “digitale watertafel” noemen. Gezamelijk als het ware “rond de informatie gaat zitten” en overleggen. Hiervoor kunnen ze 3Di gaan gebruiken. Je hebt dan alle informatie bij elkaar en omdat het visueel is wordt alles veel duidelijker voor alle partijen. Je kan dan letterlijk rond de informatie gaan zitten! Je krijgt meer inzicht en je kan goed laten zien wat het effect is van mogelijke maatregelen (of het nalaten van die maatregelen).

De dagvoorzitter vroeg wat nou het nut van 3Di was. Mooie plaatjes, maar is het niet allemaal al bekend? Twee antwoorden:

  • Je kan veel sneller rekenen als er een calamiteit is. Vroeger moest je een paar weken op je berekening wachten, nu kan je gelijk kijken.
  • Het is veel gedetailleerder dan wat er tot nu toe beschikbaar is. In grove zin weet je wel welke polder onder gaat lopen, natuurlijk. Maar dan neem je ook grove maatregelen. Nu is het allemaal veel nauwkeuriger en gedetailleerder en kan je ook betere en subtielere maatregelen nemen.

Wat kan de specialist zonder hightech instrument - Joost Buntsma

Joost (directeur STOWA) komt met een persoonlijk verhaal. 28 juli 2014 zat hij onder een blauwe hemel en in een lekker zonnetje op een camping in een afgelegen hoek van Wales. Ondanks de slechte mobiele dekking kwam er opeens een SMS met “Pap, man, bellen! Nu!”. Oei, wat is er aan de hand?

Met moeite konden ze verbinding krijgen en wat foto’s binnenhalen van nat parket en een borrelend toilet en een ondergelopen garage. Een enorme regenbui zorgde dat de riolering in het laaggelegen gedeelte overstroomde en de straten blank stonden in Heemskerk, zijn woonplaats. Elders was er ook wat aan de hand. Kockengen liep onder, in Alphen a/d Rijn liep een boezem over en in Amsterdam was er ook overlast.

Hij liet een sheet zien met als titel “van primair naar secundair en tertiair”. Hij komt oorspronkelijk van rijkswaterstaat en daar waren ze vooral bezig met de grote overstromingsrisico’s van het falen van een hoofddijk. Daar waren wel overstromingsberekeningen voor, maar vrij grofmazig.

De waterschappen, waar hij via STOWA nu voor werkt, gaat het om de secundaire keringen en dan moet het fijnmaziger zijn dan voor rijkswaterstaat. De tertiaire overlast gaat over overstromende riolen enzo, en daarvoor moet je als waterschap nog veel gedetailleerder werken. Dit kan nauwelijks zonder 3Di.

De stijl van nu gaat ook veel meer van gezag (de overheid of het waterschap vertelt wat er gaat gebeuren) naar participatie (we kijken samen wat er aan de hand is en wat we eraan kunnen doen). 3Di is daar goed voor. Ook ga je dan van een tekstueel rapport naar een visueel instrument.

3Di helpt ook om met modellen een stap verder te gaan: van de beleidsfase richting het veel dynamischer beheer en ook voor bij calamiteiten.

Veilige innovaties - Erik Kraaij

Erik (plv programmadirecteur HWBP, hoogwaterbeschermingsprogramma) heeft het over “vat op veiligheid: wat kan en wil HWBP met 3Di”. Het HWBP is het jaarlijkse programma van dijkversterkingen van de waterschappen en rijkswaterstaat. 748km dijk voldoet op het moment niet aan de wettelijke norm. En ook nog eens 275 kunstwerken. De komende decennia zijn er zo’n 186 projecten. Het is het grootste waterprogramma. Het is erg ruimtelijk georienteerd en het moet ook passen in bijvoorbeeld het deltaprogramma.

Het is een groot project waar veel geld in om gaat, maar er moet ook heel veel gebeuren. En er is een kritische omgeving met veel wensen. Per project moet er dus breed gekeken worden: veel zaken meenemen en veel wensen verzamelen en voldoende overleggen.

Een extra doel is dat innovaties worden gestimuleerd en toegepast. En samenwerking moet intensief zijn: RWS heeft bijvoorbeeld veel kennis van nieuwe contractvormen en waterschappen hebben juist weer de gebiedskennis.

Op dit moment, in de opstartfase van dit project, wordt een kwart van het budget besteed aan innovatie. Dat vinden ze belangrijk.

En wat is dan de rol en meerwaarde van 3Di voor HWBP?

  • In projecten kan 3Di goed laten zien (=inzichtelijk maken) waar een dijk niet goed genoeg is en wat het effect is. Dit zorgt voor meer draagvlak.
  • Je kan kijken naar alternatieve oplossingen. Meekoppelen andere belangen. Afwegingen maken.
  • Het is erg handig voor communicatie, voorlichting en bij inspraak.

De vraag die er dan ligt is of je per project naar 3Di kijkt of dat je het samen als programma oppakt. De projecten zijn van de waterschappen, dus daar ligt de sleutel. Zelf vindt hij dat dit soort zaken beter gezamelijk opgepakt kunnen worden.

3Di: waar ligt die dijk? Wat is er aan de hand? Wat gaat er gebeuren? En... wat betekent dit voor mij, mijn huis en mijn veiligheid?

Cutting down a tree

2015-04-13

Tags: personal

Yesterday I finally cut down a chestnut (NL: kastanje) in our back yard. The poor thing was already dead, so I wanted it out of the way. It took me 8 hours with a reasonably big hand saw:

http://reinout.vanrees.org/images/2015/boom_omzagen.gif

I’m still feeling sore all-over, but getting the exercise was nice :-)

Halfway through I discovered a dove’s nest somewhere high up in a crack in the tree. There were gashes and weak bits and cracks all over the place. The tree was composed of various limbs all twisting around each other a bit. So the good parts held the bad parts up, basically.

Anyway, I only discovered the nest after two hours and I hadn’t seen a bird yet, so the egg was cold. After an hour, two doves started flying over the tree, one of them looking a bit disapprovingly in my direction. Ah well.... I spotted one of them with some fresh twigs, so they’ll have another go.

Dying NTP deamons on vsphere vmware machines

2015-02-26

Tags: django

We (Nelen & Schuurmans) have quite some servers. Most of them are vmware virtual machines in a vshpere cluster.

Once in a while, one or more of the machines got reported by our monitoring tool (zabbix) as having a time drift problem. Weird, as we have NTP running everywhere. And weird if you look at django logfiles and see a negative jump in time all of a sudden.

We run ntpd everywhere to keep the time in sync with two windows domain servers. Every time a server drifted, the ntpd daemon turned out to have died. Without leaving any trace in any logfile.

ntpd kills itself when the time drift is more than 20 minutes or so, assuming that it hurts more than it helps. There’s a switch to prevent this self-killing behaviour, but ntpd killed itself anyway.

In the end, an external sysadmin found the problem:

  • One of the physical vsphere host machines (big server, lots of blades) was mis-configured: the ntp daemon on the host machine itself was configured, but it was not configured to automatically start when you start up the server...
  • This host machine started to drift its time, naturally.
  • Several actions vsphere does on a VM result in a very very short period where the VM is frozen. Actions like “full backup”, “snapshot” and “automatically moving from one host machine to another for performance reasons”. Very short, but vmware does adjust the time inside the VM. It keeps track of how long the quick action took and adjusts the VM’s time accordingly.
  • It adjusts the time relative to the host machine’s time. So if an action took 1 second, the second is added to the host machine’s time and the result is set as the VM time. All is still well if the VM stays on the same host.
  • If the action includes moving the VM to a different host... And that host is the one with the drifted time.... If the host machine’s time has drifted by an hour, the VM that gets moved to that host suddenly gets its internal time moved by an hour...

So it was a combination of host machines with a drifted time and the fact that vmware adjusts the VM’s time after certain actions.

Writing it down as it might help someone googling for this problem :-)

Don’t import (too much) in your django settings

2015-02-11

Tags: django

One of our production Django sites broke this afternoon with a database error “relation xyz doesn’t exist”. So: a missing table.

Why 1

I helped debugging it and eventually found the cause by doing a select * from south_migrationhistory. This lists the south migrations and lo and behold, a migration had just been applied 25 minutes earlier. The migration name suggested a rename of tables, which of course matches the “missing table” error.

Why 2

Cause found. But you have to ask yourself “why” again. So: “why was this migration applied?”.

Well, someone was working on a bit of database cleanup and refactoring. Naming consistency, proper use of permissions, that sort of thing. Of course, locally in a branch. And on a development database. Now why did the local command result in a migration on the production database?

Why 3

So, effectively, “why don’t the development settings work as intended”? We normally use settings.py as the production settings and a developmentsettings.py that is used in development. It imports from settings.py and sets the debug mode and development database and so.

This project is a bit different in that there’s only a settings.py. It does however try to import localsettings.py. This is generated for you when you set up your project environment with ansible. A bit less clear (in my opinion) than a real .py file in your github repository, but it works. We saw the generated localsettings file with development database and DEBUG = True. This wasn’t the cause. What then?

Normally, calling django’s diffsettings command (see the django documentation) shows you any settings errors by printing all the settings in your config that are different from Django’s defaults. In this case, nothing was wrong. The DATABASES setting was the right one with the local development database. Huh?

The developer mentioned one other thing he changed recently: importing some django signal registration module in the ``settings.py``. Ah! Django’s signals often work on the database. Yes, the signals in this module did database work, too.

So the settings.py effectively looked like this:

DATABASES = { .... 'server': 'productiondatabase' ....}
import my_project.signal_stuff_that_works_on_the_database
try:
    from .localsettings import *
    # This normally sets DATABASES = { .... 'server': 'developmentdatabase' ....}
except ImportError:
    pass

The import of the signal registration module apparently triggered something in Django’s database layer so that the database connection was already active. The subsequent change of the DATABASES config to the local development database didn’t have any effect anymore.

diffsettings just shows you what the settings are and doesn’t catch the fact that the DATABASES isn’t really used in the form that comes out of diffsettings.

Why 4

Why the import, then?

Well, it has to be executed when django starts up. The settings file looked like a good spot. It isn’t, though.

The traditional location to place imports like this is the urls.py or models.py file. That’s why the admin.autodiscover() line is often in your urls.py, for instance.

So... put imports like this in models.py or urls.py instead of in your settings file.

Why 5

Digging even deeper... isn’t this sort of weird and ugly? Why isn’t there a more obvious place for initialization code like this? Now you have to have the arcane knowledge to somehow know where you can import and where not, right?

The answer: there is a good spot, in django 1.7. The AppConfig.ready() method! Quote from the documentation: Subclasses can override this method to perform initialization tasks such as registering signals. Bingo!

Forward movement

2015-01-16

Tags: personal

Over the years, one phrase started to help me a lot: “forward movement”. It is a question I can ask at the end of a day: “did I have move forward today”?. The subject of the question is often a project or a goal. The question itself is quite liberating.

Liberating? Yes. You cannot do your life’s work in one day. You cannot finish a model railway in one day. You cannot paint an entire house in one day. But you can move forward on one or more of them! “Did I put in time and effort to move one of my higher-priority items forward?” Or even “did I do a load of small things that in themselves aren’t terribly important but that kept nagging at me”?

I have three main areas/goals I want to put some real effort into this year. A year is a long time. You can do a lot in a year, provided you don’t try to do it all in the last few days of the year!

One of the three goals is the deliberately vague-sounding “lose mass”. My body mass should go down. But also the amount of paper/books/saved items/junk in the house should go down. And the backlog of I-should-read-it-one-day magazines. And... And... And... Lots of things can be placed under this banner.

Now... I can aim for perfection in one of the areas. Or I can aim at progress. Forward movement. “Practice progress over perfection” is a quote I recently saw. Nice.

Some progress I made:

  • I went to my thursday evening swordfighting lessons again for the first time in three months. Sore muscles all over, so that ought to help a tiny bit in getting my body mass down. Someone stabbing you with a knife or aiming a sword at your stomach tends to make you pretty active :-) I’m always drenched with sweat afterwards.

  • Yesterday I emptied out my overflowing email inboxes.

  • This morning I emptied my backpack (which I use for my laptop) of three months of accumulated papers and assorted bits and pieces. This gave me a surprisingly good feeling. Opening the bag and looking at the tidy interior instead of at a pile of cumpled papers...

    The mess apparently had “mass” as it put a weight on my shoulders (figuratively) just by me looking at it every morning and afternoon.

  • I cleaned out my desk. And found a couple of scribled down TODO items that I’ve now placed in my GTD system. Again: a bit of weight left my shoulders this way. Unconsciously you know there might be unfinished business lurking in the pile of papers on your desk.

I’m still amazed at the joy I now have in opening my backpack :-) Forward movement is great.

Updated instructions to fix macbook pro with black screen

2015-01-14

Tags: python, apple

Last week I wrote about my macbook pro and its screen that suddenly stayed black after waking it from sleep. Including instructions on how to fix it. I now have improved instructions...

The piece of crap did it again. (This time there was no external monitor in play, btw)

Symptoms: you open up your late 2014 macbook pro 15” and expect it to wake from sleep in 0.5 seconds. Instead the screen stays black.

  • Press shift-option-control-power and release them all at the same time. This resets the “system management controller”, amongst others it makes sure the “power” button actually reacts.
  • Now look at the back of your mac’s screen. Make sure the light of the apple logo is off. If necessary, keep the power button pressed for 5 seconds to force a shutdown. (The power button should work again after step 1).
  • Keep your fingers ready for pressing command-option-p-r at the same time. You need both hands for this weird combination. Press the power button and then hold these four keys. Your mac will now actually boot, give you the startup sound and lo and behold, you’ve got your screen back.

I do hope apple will fix this Real Soon. I suspect a software bug. I hope it isn’t a hardware one. It was a hardware bug (wrong solder being used for the video card connection) that brought down my previous macbook after four years... Apples are great machines for programming (python) and I’m in love with the retina display, but...

Actually doing work - proof by blogging

2015-01-14

Tags: nelenschuurmans, python

I’m a programmer. Which means it is not always clear when I’m working. What I mean is that, if I’m sitting behind my screen, I might be reading an article about postgres performance improvements, but I might also be reading the news. And clicking on my ipad might mean I’m keeping my python knowledge up to date by reading weblogs, but I might also be reading some comics. Typing furiously on my keyboard might indicate great productivity, but it also might indicate a long personal email.

The other way around, sitting nicely in the living room at home, clicking away on the laptop, might mean I’m relaxing by writing an update on my model railway work on a forum, but it might also mean I’m finishing off a work project in my own time.

“Doing research” is a potential problem for me. I’ve spend a ton of time reading about Ansible and on how to use it. But it was only when I actually started doing something with it that I started to wrap my head around it. So... just reading and thinking is dangerous to my productivity.

I want to be productive.

One of the simplest tricks I can use is to blog about it. Thinking about something for two days is fine, but I should at least get a blog entry out of it. Writing forces me to think things through. It focuses my thinking.

If I don’t blog for a full week, I’m probably not hard at work programming: otherwise I’d have encountered some dreadful mistake I made or some horrible bug, all of which are blog-worthy. Or I’ve started thinking too much about something without taking a higher-level view after a few days (again, resulting in a blog entry).

So... I’ll prove I’m working by blogging about it :-)

New emacs setup

2015-01-14

Tags: python

I edit all my code with emacs. Since 1996 or so. And all blog entries. And all...

So my emacs settings are “quite important” to me. When I installed the new laptop I’m typing this on, my settings stopped working: I just deleted my ~/.emacs.d/ directory because I wanted to upgrade my setup.

Since a couple of years I used the emacs starter kit version 2. The link goes to my slightly modified copy of the original version 2 starter kit.

The setup change I wanted to make was to update to the version 3 of the emacs starter kit. That link goes to the real starter kit, which in version 3 is... just a text document!

Which is a good thing. You don’t need to clone a git repo just to get a bunch of settings. You use emacs’ package tool to download the better-defaults package, which contains most/all of the settings changes that made the original emacs starter git such a joy to use.

And on top of that, it suggests a couple of handy packages to use also. I’m using all of the suggested ones (apart from ‘scpaste’, which I don’t use).

And it provides a template for an almost-empty init.el main config file. I’ve copy/pasted a couple of lines from the version 2 starter kit at the end:

;; Standard emacs starter kit (version 3) startup code.
(require 'package)
(add-to-list 'package-archives
             '("marmalade" . "http://marmalade-repo.org/packages/") t)
(package-initialize)

;; List of packages that I use.
(defvar my-packages '(better-defaults paredit idle-highlight-mode ido-ubiquitous
                                      find-file-in-project magit smex)
  "A list of packages to ensure are installed at launch.")

;; Commands suggested by the Emacs starter kit to keep its packages up
;; to date.
(when (not package-archive-contents)
  (package-refresh-contents))
(dolist (p my-packages)
  (when (not (package-installed-p p))
    (package-install p)))

;; Load system specific init (read: "run only on osx").
;; Also load my username's config (read: my customizations are in 'reinout.el')
(setq dotfiles-dir (file-name-directory
                    (or (buffer-file-name) load-file-name)))
(setq system-specific-config (concat dotfiles-dir system-name ".el")
      user-specific-config (concat dotfiles-dir user-login-name ".el"))
(if (file-exists-p system-specific-config) (load system-specific-config))
(if (file-exists-p user-specific-config) (load user-specific-config))

Those last few of lines make sure that on my laptop, it finds the hostname-named nens-lt-148.local.el which starts emacs as a server. And it loads my username-named reinout.el with my personal customizations.

Anyway... Now my emacs config is just a few config files in my git-stored dotfiles directory (see for instance this article where I mention Dotfiles). Instead of a separate git clone. Nice and tidy!

VariableDoesNotExist: Failed lookup for key [text] in ‘None’

2015-01-14

Tags: django

VariableDoesNotExist: Failed lookup for key [text] in 'None', that was the error that I got out of an internal django app that I wrote. The app is the most error-free one that I ever build, so I was quite surprised.

I was even more surprised when I started debugging it. The error was in the search functionality. Searching for “lizard” would give an “error 500” page. Searching for “lizar” gave 0 results (which is fine), for “lizardd”, too. “lidard” also gave 0 results. Only a search for “lizard” crashed the site.

Huh? Weird. I got the question whether I put a hidden message into this app (as “lizard” is one of our main products) :-)

Locally it all worked fine, of course. Only on the server did I see the error.

Here’s the relevant part of the traceback:

Stacktrace (most recent call last):
File "django/core/handlers/base.py", line 112, in get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "haystack/views.py", line 50, in __call__
  return self.create_response()
File "haystack/views.py", line 144, in create_response
  return render_to_response(self.template, context, context_instance=self.context_class(self.request))
File "django/shortcuts/__init__.py", line 29, in render_to_response
  return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "django/template/loader.py", line 169, in render_to_string
  return t.render(context_instance)
File "django/template/base.py", line 140, in render
  return self._render(context)
...
File "django/template/base.py", line 840, in render
  bit = self.render_node(node, context)
File "django/template/debug.py", line 78, in render_node
  return node.render(context)
File "django/template/defaulttags.py", line 196, in render
  nodelist.append(node.render(context))
File "haystack/templatetags/highlight.py", line 30, in render
  text_block = self.text_block.resolve(context)
File "django/template/base.py", line 735, in resolve
  value = self._resolve_lookup(context)
File "django/template/base.py", line 781, in _resolve_lookup
  (bit, current))  # missing attribute

Eventually I found it. Via this django-haystack post. Haystack, which I use for searching, by default doesn’t deal with deleted objects. And, of course, yesterday I removed an object via the admin interface. A project with “lizard” in the title. Normally nothing is removed in this app, so the problem didn’t surface earlier.

Haystack’s results include the deleted now-non-existing object, which crashes the template. Which is a little bit weird, as normally django’s template layer is quite forgiving about None. It might be the {% highlight %} templatetag that I’m using.

Anyway, the solution is to run the update_index command with the --remove option. Or run rebuild_index. The second replaces the index, but is quicker. The first takes more resources, but leaves the index in place. Take whatever fits your usecase best.

 
vanrees.org logo

About me

My name is Reinout van Rees and I work a lot with Python (programming language) and Django (website framework). I live in The Netherlands and I'm happily married to Annie van Rees-Kooiman.

Weblog feeds

Most of my website content is in my weblog. You can keep up to date by subscribing to the automatic feeds (for instance with Google reader):