Thursday, 5/23/2019
- ID
- de61fdff-0fa7-4a06-8f5c-c67a3abecbe1
#+BEGIN: clocktable :scope file :maxlevel 2
#+CAPTION: Clock summary at
| Headline | Time | |
|----------------------+---------+-------|
| *Total time* | *15:16* | |
|----------------------+---------+-------|
| Wednesday, 5/22/2019 | 15:16 | |
| \_ Tasks [16/17] | | 15:16 |
#+END:
Tasks [14/14]
DONE Clean dishes
CLOSED:
:LOGBOOK:
CLOCK: -- => 0:40
:END:
DONE Set tasks for the day
CLOSED:
:LOGBOOK:
CLOCK: -- => 0:31
:END:
DONE Write in daily journal
CLOSED: SCHEDULED:
:LOGBOOK:
CLOCK: -- => 0:04
CLOCK: -- => 0:14
:END:
DONE Move sheep fence to stable
- FENCED
- STABLE FRONT
CLOSED: SCHEDULED:
:LOGBOOK:
CLOCK: -- => 1:09
:END:
DONE Hang up laundry
CLOSED:
:LOGBOOK:
CLOCK: -- => 0:36
:END:
DONE Read up on exploring GDB for debugging python
CLOSED:
:LOGBOOK:
CLOCK: -- => 0:22
:END:
https://stripe.com/en-ca/blog/exploring-python-using-gdb
[[https://stripe.com/en-ca/blog/exploring-python-using-gdb][Exploring Python Using GDB]]
Article
People tend to have a narrow view of the problems they can solve using [[http://sources.redhat.com/gdb/][GDB]]. Many
think that GDB is just for debugging [[http://en.wikipedia.org/wiki/Segmentation_fault][segfaults]] or that it's only useful with C
or C++ programs. In reality, GDB is an impressively general and powerful tool.
When you know how to use it, you can debug just about anything, including
Python, Ruby, and other dynamic languages. It's not just for inspection
either---GDB can also be used to modify a program's behavior while it's running.
When we ran our [[/en-ca/blog/capture-the-flag][Capture The Flag]] contest, a lot of people asked us about
introductions to that kind of low-level work. GDB can be a great way to get
started. In order to demonstrate some of GDB's flexibility, and show some of the
steps involved in practical GDB work, we've put together a brief example of
debugging Python with GDB.
Imagine you're building a web app in Django. The standard cycle for building one
of these apps is to edit some code, hit an error, fix it, restart the server,
and refresh in the browser. It's a little tedious. Wouldn't it be cool if you
could hit the error, fix the code while the request is still pending, and then
have the request complete successfully?
As it happens, the [[http://www.youtube.com/watch?v=M54qmZZKKPA][Seaside]] framework supports exactly this. Using one of
Stripe's [[https://github.com/stripe/monospace-django][example projects]], let's take a look at how we could pull it off in
Python using GDB:
GDB Demo Screencast
Pretty cool, right? Though a little contrived, this example demonstrates many
helpful techniques for making effective real-world use of GDB. I'll walk through
what we did in a little more detail, and explain some of the GDB tricks as we
go.
For the sake of brevity, I'll show the commands I type, but elide some of the
output they generate. I'm working on Ubuntu 12.04 with GDB 7.4. The manipulation
should still work on other platforms, but you probably won't get automatic
pretty-printing of Python types. You can generate them by hand by running =p
PyString_AsString(PyObject_Repr(obj))= in GDB.
Getting Set Up
First, let's start the monospace-django server with =--noreload= so that Django's autoreloading doesn't get in the way of our GDB-based reloading. We'll also use the =python2.7-dbg= interpreter, which will ensure that less of the program's state is optimized away.
#+BEGIN_EXAMPLE
$ git clone http://github.com/stripe/monospace-django
$ cd monospace-django/
$ virtualenv --no-site-packages env
$ cp /usr/bin/python2.7-dbg env/bin/python
$ source env/bin/activate
(env)$ pip install -r requirements.txt
(env)$ python monospace/manage.py syncdb
(env)$ python monospace/manage.py runserver --noreload
$ sudo gdb -p $(pgrep -f monospace/manage.py)
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
[...]
Attaching to process 946
Reading symbols from /home/evan/monospace-django/env/bin/python...done.
(gdb) symbol-file /usr/bin/python2.7-dbg
Load new symbol table from "/usr/bin/python2.7-dbg"? (y or n) y
Reading symbols from /usr/bin/python2.7-dbg...done.
#+END_EXAMPLE
As of version 7.0 of GDB, it's possible to [[http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html][automatically script GDB's behavior]], and even register your own code to pretty-print C types. Python comes with its own hooks which can pretty-print Python types (such as =PyObject *=) and understand the Python stack. These hooks are loaded automatically if you have the =python2.7-dbg= package installed on Ubuntu.
Whatever you're debugging, you should look to see if there are relevant GDB scripts available---useful helpers have been created for many dynamic languages.
Catching the Error
The Python interpreter creates a =PyFrameObject= every time it starts executing a Python stack frame. From that frame object, we can get the name of the function being executed. It's stored as a Python object, so we can convert it to a C string using =PyString_AsString=, and then stop the interpreter only if it begins executing a function called =handle_uncaught_exception=.
The obvious way to catch this would be by creating a GDB breakpoint. A lot of frames are allocated in the process of executing Python code, though. Rather than tediously continue through hundreds of false positives, we can set a /conditional breakpoint/ that'll break on only the frame we care about:
#+BEGIN_EXAMPLE
(gdb) b PyEval_EvalFrameEx if strcmp(PyString_AsString(f->f_code->co_name), "handle_uncaught_exception") == 0
Breakpoint 1 at 0x519d64: file ../Python/ceval.c, line 688.
(gdb) c
Continuing.
#+END_EXAMPLE
Breakpoint conditions can be pretty complex, but it's worth noting that conditional breakpoints that fire often (like =PyEval_EvalFrameEx=) can slow the program down significantly.
Generating the Initial Return Value
Okay, let's see if we can actually fix things during the next request. We resubmit the form. Once again, GDB halts when the app starts generating the internal server error response. While we investigate more, let's disable the breakpoint in order to keep things fast.
What we really want to do here is to let the app finish generating its original return value (the error response) and then to replace that with our own (the correct response). We find the stack frame where =get_response= is being evaluated. Once we've jumped to that frame with the [[http://sourceware.org/gdb/current/onlinedocs/gdb/Selection.html#index-up-451][=up=]] or [[http://sourceware.org/gdb/current/onlinedocs/gdb/Frames.html#index-frame_0040r_007b_002c-command_007d-430][=frame=]] command, we can use the [[http://sourceware.org/gdb/current/onlinedocs/gdb/Continuing-and-Stepping.html#index-finish-314][=finish=]] command to wait until the currently selected stack frame finishes executing and returns.
#+BEGIN_EXAMPLE
Breakpoint 1, PyEval_EvalFrameEx (f=
Frame 0x3534110, for file [...]/django/core/handlers/base.py, line 186, in handle_uncaught_exception [...], throwflag=0) at ../Python/ceval.c:688
688 ../Python/ceval.c: No such file or directory.
(gdb) disable 1
(gdb) frame 3
#3 0x0000000000521276 in PyEval_EvalFrameEx (f=
Frame 0x31ac000, for file [...]/django/core/handlers/base.py, line 169, in get_response [...], throwflag=0) at ../Python/ceval.c:2666
2666 in ../Python/ceval.c
(gdb) finish
Run till exit from #3 0x0000000000521276 in PyEval_EvalFrameEx (f=
Frame 0x31ac000, for file [...]/django/core/handlers/base.py, line 169, in get_response [...], throwflag=0) at ../Python/ceval.c:2666
0x0000000000526871 in fast_function (func=,
pp_stack=0x7fffb296e4b0, n=2, na=2, nk=0) at ../Python/ceval.c:4107
4107 in ../Python/ceval.c
Value returned is $1 =
#+END_EXAMPLE
Patching the Code
Now that we've gotten the interpreter into the state we want, we can use [[http://docs.python.org/c-api/index.html][Python's internals]] to modify the running state of the application. GDB allows you to make fairly complicated dynamic function invocations, and we'll use lots of that here.
We use the C equivalent of the Python [[http://docs.python.org/library/functions.html#reload][=reload=]] function to reimport the code. We have to also reload the =monospace.urls= module so that it picks up the new code in =monospace.views=.
One handy trick, which we use to invoke git in the video and curl here, is that you can run shell commands from within GDB.
#+BEGIN_EXAMPLE
(gdb) shell curl -s -L https://gist.github.com/raw/2897961/ | patch -p1
patching file monospace/views.py
(gdb) p PyImport_ReloadModule(PyImport_AddModule("monospace.views"))
$2 =
(gdb) p PyImport_ReloadModule(PyImport_AddModule("monospace.urls"))
$3 =
#+END_EXAMPLE
We've now patched and reloaded the code. Next, let's generate a new response by finding =self= and =request= from the local variables in this stack frame, and fetch and call its =get_response= method.
#+BEGIN_EXAMPLE
(gdb) p $self = PyDict_GetItemString(f->f_locals, "self")
$4 =
(gdb) set $request = PyDict_GetItemString(f->f_locals, "request")
(gdb) set $get_response = PyObject_GetAttrString($self, "get_response")
(gdb) set $args = Py_BuildValue("(O)", $request)
(gdb) p PyObject_Call($get_response, $args, 0)
$5 =
#+END_EXAMPLE
In the above snippet, we use GDB's =set= command to assign values to variables.
Alright, we now have a new response. Remember that we stopped the program right where the original =get_response= method returned. The C return value for the Python interpreter is the same as the Python return value. And so, to replace that return value on x86, we just have to store the new return value in a register--- =$rax= on 64-bit x86--- and then allow the execution to continue.
GDB allows you to refer to refer to the values returned by every command you evaluate by number. In this case, we want =$5=:
#+BEGIN_EXAMPLE
(gdb) set $rax = $5
(gdb) c
Continuing.
#+END_EXAMPLE
And, like magic, our web request finishes successfully.
GDB is a powerful precision tool. Even if you spend most of your time writing code in a much higher-level language, it can be extremely useful to have it available when you need to investigate subtle bugs or complex issues in running applications.
DONE Prep for Thorn interview
CLOSED: SCHEDULED:
:LOGBOOK:
CLOCK: -- => 0:08
:END:
DONE Interview with Mike and Kyle at Thorn
CLOSED: SCHEDULED:
- LINK
- https://thorn.zoom.us/j/144008924
:LOGBOOK:
CLOCK: -- => 2:14
:END:
+ Design simple website scrapper
+ URL for thread on message board
+ JSON array of message objects
DONE Write down intro notes for Almost Sunrise
CLOSED: SCHEDULED:
DONE Reading from Granta
CLOSED: SCHEDULED:
:LOGBOOK:
CLOCK: -- => 0:16
:END:
[[https://granta.com/to-zinder/][To Zinder | Sven Lindqvist | Granta Magazine]]
Article
Translated from the Swedish by [[https://granta.com/contributor/joan-tate/][Joan Tate]]
A Note from the Publisher:
/Sven Lindqvist was similar to the young Swedish climate activist Greta Thunberg
in that he was not interested in hope or false optimism. He wanted the truth.
His own rock solid belief in fundamental equality meant that he was never swayed
by tropes of colonial inequality or historicist apologies. And this belief of
his was not, one sensed, ideological -- it was a much deeper conviction than
that. Equality for Sven was simply true, a fact of life. I was so proud to
publish him. He was an extraordinary writer -- like Sebald and Coetzee, his work
combines depth with a quality of evenness and dry beauty. In some ways he was
essentially a travel writer -- he looked at the world and found it wanting. And
who could not agree with him? /
[[https://www.waterstones.com/book/exterminate-all-the-brutes/sven-lindqvist/9781847081988][[[https://granta.com/wp-content/uploads/2019/05/Brutes-Cover.jpg]]]]
\\
/The following is the final chapter of/ [[https://www.waterstones.com/book/exterminate-all-the-brutes/sven-lindqvist/9781847081988][Exterminate All the Brutes]] /by Sven
Lindqvist. Over twenty years ago, Sven Lindqvist, one of the great pioneers of a
new kind of experiential history writing, set out across Central Africa.
Obsessed with a single line from Conrad's The Heart of Darkness -- Kurtz's
injunction to ‘Exterminate All the Brutes' -- he braided an account of his
experiences with a profound historical investigation, revealing to the reader
with immediacy and cauterizing force precisely what Europe's imperial powers had
exacted on Africa's people over the course of the preceding two centuries./
[[https://www.waterstones.com/book/exterminate-all-the-brutes/sven-lindqvist/9781847081988][Exterminate All the Brutes]] / is available now from Granta Books./
The Nazi slaughter of the Jews, like every other event, however unique it may
be, has to be seen in its historical context.
Arno J. Mayer, in his controversial book /Why Did the Heavens Not Darken? The
“Final Solution” in History/ (1988), goes right back to the horrors of the
Thirty Years' War, the storming of Magdeburg on May 10, 1631, when thirty
thousand men, women, and children were murdered, and even further back to the
mass murder by the Crusaders of eleven hundred innocent inhabitants of Mainz in
1096, to find equivalents to the mass murders of Jews during World War II.
On the other hand, there is no mention of the European slave trade, which
forcibly moved fifteen million Negroes between continents and killed perhaps
just as many. Nor are the nineteenthcentury European colonial wars or punitive
expeditions mentioned. If Mayer had as much as glanced in that direction, he
would have found so many examples of brutal extermination based on clearly
racial convictions, that the Thirty Years' War and the Crusades would seem to
lie unnecessarily far back.
On my journey through the Sahara alone, I have been in two Mainzes. One is
called Zaatcha, where the entire population was wiped out by the French in 1849.
The other is Laghouat, where on December 3, 1852, after the storming, the
remaining third of the population, mainly women and children, was massacred. In
one single well, 256 corpses were found.
That was how one mixed with the inferior races. It was not considered good form
to talk about it, nor was it anything that needed concealing. It was established
practice. Only occasionally was there any debate -- for instance, over the
events taking place while Joseph Conrad was writing Heart of Darkness and the
Central African Expedition was on its way toward Zinder.
*
The bus to Zinder leaves at 7:30. At dawn I find a man with a wheelbarrow to
help me wheel away my word processor and suitcase. It is a windy and cold
morning, some fires flickering over by the stalls across the street, a few lamps
glowing faintly, overcome by the morning light.
After half an hour, the driver arrives and starts washing the windows of the big
white Renault truck that has been converted into a bus. On the sides it says in
giant red letters: societe nationale de transport nigerenne.
Vendors of loose cigarettes and sticky lollipops start assembling. A shivering
man is carrying round red nuts, already shelled and indecently naked on his
tray. A bright yellow baby's cap frames his anthracite black face.
Toward half-past eight, the blind women come, all of them at once, all singing,
all begging, all led by children, some of the women with newborn babies on their
backs.
At nine, the passengers are called out according to the passenger list and each
given a small piece of paper, which afrer another roll call is exchanged for the
ticket already booked and paid for the day before yesterday.
A man stands on a barrel and flings the luggage up to the driver, who stows it
on to the roof of the bus. After that the station supervisor gets into the bus
and, standing inside where he is very difficult to hear, starts the third and
determining roll call. It is not easy to predict how a name like mine will
sound. I miss the name and thus lose my booked seat in the front of the bus.
Only the seats at the back are left.
I can still change my mind. I can still jump off. Here at the far back I will
never cope with the jolts. And once out in the desert there is no return. One
has to go on, for eight hours, whatever happens. It is now, at this moment, and
only now, I still have a chance to get off.
Always the same alloy of panic and joy at the moment of departure. It is like
losing your foothold in a great love affair. What will happen now? I have no
idea. All I know is that I have just thrown myself out into it.
*
At the head of the 1898 Central African Expedition was Captain Voulet and
Lieutenant Chanoine.
Paul Voulet, the thirty-two-year-oldson of a doctor, had, according to his
officer colleagues, ‘a true love of blood and cruelty coupled with a sometimes
foolish sensitivity.' He was, it was said afterward, a weak character dominated
by two evil people, his black mistress and Chanoine.
Charles Chanoine, the son of a general, was described as impulsive, ruthless,
and cruel -- ‘cruel out of cold-bloodedness as well as for pleasure.' Two years
previously, in 1896, the two friends had conquered Ouagadougou in what is now
Burkina Faso, and had shown themselves to be skilled at burning down villages
and murdering natives. Faced with this new expedition, Voulet boasted to the
governor of Sudan of how he would crush resistance by letting the villages burn.
So despite, or perhaps thanks to, his reputation, Voulet was appointed head of
an expedition that was to explore the area between the Niger and Lake Chad and
place it, as was said, ‘under French protection.'
Otherwise his orders were vague in the extreme. ‘I don't pretend to be able to
give you any instructions on which route to choose or how you are to behave
toward the native chieftains and peoples,' wrote the minister for the colonies
modestly.
Voulet was given a free hand to use the methods for which he had made himself
notorious.
*
It is 270 miles from Agadez to Zinder -- 270 miles of washboard, sanded over by
high wandering dunes that lift the bus and throw it down with fierce, stunning
jolts.
The driver maintains a good speed in order to get there before sunset. It is
like sitting on a leaping compressed air drill. The fat in my blood ought to be
churned to butter by the vibration.
At the same time you have to be constantly prepared to rise in the saddle and
receive the great jolts with your thigh and arm muscles instead of your spine.
But I miss every fourth or every tenth one, not noticing in time that the driver
has taken his foot off the accelerator, and I am suddenly hurled with full force
down toward the center of the earth. All my vertebrae come tumbling down and the
disks in my spine have to take the whole jolt.
For the first hours the wind is very strong. The dust turns day into white
night, and the sand sweeps over steppe and savanna. The white steppe grass
drowns, the bushes ride in despair on the waves of sand. The occasional tree is
glimpsed in the blurred murkiness of the sand, and misty human figures struggle
on, whipped by the sand in the air.
The sand seems to be the attacker when the desert comes, but it is the dryness
that kills. Dead plants can no longer bind and stop the sand. We drive for hours
through sparse forest where only every hundredth tree is alive. White tree
trunks lie like distorted skeletons on the ground.
After five desert hours we are suddenly in among fields. The cultivation
boundary has moved forward until it coincides with the boundary of the desert.
The vulnerable living space the nomads once found between desert and field no
longer exists.
*
Here on the edge of the desert, in 1898, marched the Central African Expedition.
It consisted of nine French officers, seventy regular Senegal soldiers, and
thirty interpreters and ‘agents.' In addition, they had recruited four hundred
‘auxilliaries,' Africans who went with the French and took part in the fighting
for a chance to plunder. In Tombouctou, ninety Senegalese joined them, placed at
the expedition's disposal by Lieutenant-Colonel Klobb.
Voulet took with him great quantities of arms and ammunition, but had not taken
any means of paying the bearers. His men simply seized eight hundred black men
and forced them to be bearers. The latter were dressed for the hot climate
prevailing where they were captured and suffered severely from the night cold in
the desert. A dysentery epidemic broke out, and148 bearers died during the first
two months of the expedition. Chanoine set an example by having anyone who tried
to escape shot.
They requisitioned food from the villages, naturally without payment. What with
baggage and mistresses, the expedition had grown to sixteen hundred people and
eight hundred animals. It moved on like a swarm oflocusts through areas normally
living on the edge of starvation. Neither of the two commanders had any
experience of desert areas. The expedition cruised between the water holes,
dominated by the necessity of supplying men and animals with forty tons of water
a day.
*
Meanwhile Joseph Conrad was sitting at his Chippendale desk at Pent Farm in
Kent, penciling out his story about Kurtz, the story of outrages committed in
the name of Civilization and Progress. He could not have been influenced by
contemporary events in French Sudan, as he knew nothing about them.
Not until January 29, when Conrad had almost finished his story, was one of the
French officers, Lieutenant Peteau, sent back owing to ‘lack of discipline and
enthusiasm.' Not until February 5 did Peteau write a fifteen-page letter to his
wife-to-be in Paris to tell her of some of the atrocities he had been involved
in.
The forcibly recruited bearers were maltreated and refused medical attention
during the dysentery epidemic, Peteau writes. Those who were unable to continue
were beheaded. Twelve bearers were shot for trying to escape, the rest bound
together with neck chains, in groups of five.
To recruit new bearers, the French sent out patrols, which sur rounded the
villages at dawn and shot anyone trying to escape. As evidence that they had
carried out their orders, the soldiers took the heads back with them. Voulet had
the heads impaled on stakes and placed out to frighten the population into
submission.
In Sansan-Hausa, a village already under French ‘protection,' Voulet had given
orders that thirty women and children were to be killed -- with bayonets, to
save ammunition. According to the chieftain, Kourtey, there were even more
victims. ‘I had done nothing to them,' he said. ‘I gave them everything they
asked for. They ordered me to hand over six horses and thirty head of cattle
within three days. I did so. And yet they killed everyone they could get hold
of. A hundred and one men, women, and children were massacred.'
*
Peteau's fiancée sent his letter to her deputy in parliament, and in the middle
of April, the government intervened. The governor of Sudan gave orders to
Lieutenant-Colonel Klobb in Tombuoctou to find Voulet and remove from him his
command of the expedition.
Just as in Conrad's novel Marlow set off into the interior to find Kurtz, Klobb
took up the hunt for Voulet. His tracks were easy to follow; they consisted of
ruins and corpses, which increased in number appallingly the closer Klobb came.
Klobb found guides who had displeased Voulet and had been strung up alive, low
enough for hyenas to eat their feet, while the rest of the bodies were left to
the vultures. Outside the burned-out village ofTibiri, 120 miles west of Zinder,
Klobb found the bodies of thirteen women hanging in the trees. Outside
Koran-Kaljo, nearer to Zinder, hung two corpses of children.
On July 10, 1899, Klobb arrived at the little village of Damangara to be told
that Voulet was only a few hours' march away.
*
In the middle of the night, my father telephones. Surprised and confused, I rush
across the hotel yard in the dark to take the call in Reception. When I lift the
receiver I can hear nothing but a hollow crackling.
Nor could I expect anything else, I realize when I wake up. After all, Father is
dead.
The heat enfolds me in its moist embrace. The heat in the Sahara stings like a
whiplash, but only where the searchlight of the sun fell; in the shade it was
cool, at night cold. Here in Zinder the summer temperature seldom goes below
105°F.
Your veins swell and snake along under your skin, pumping, throbbing, ready to
burst. Hands and feet swell, the soles of your feet sting, fingers resemble
small clubs, your skin is not large enough. Your face swells up, becomes porous
and opens. Sweat spurts out through the pores, suddenly, just as when a heavy
raindrop strikes your skin.
I can feel a burning heat on the inside of my lower arm and notice it is
brushing my stomach. I have burned myself on my own body.
All flesh thickens, overflows, starts running. A movement and your body is
soaked all over. Keep still and nonetheless you are soaked.
I drink so much, the salt balance in my body is disturbed. Then I eat salt,
become thirsty, and have to drink even more. My belly swells, my body slops
about, nothing helps.
Next morning I am sitting as usual in the library of the French Institute
reading Klobb's journal. But my mind stiffens like coagulated blood in my head,
and the afternoons start earlier and earlier, sinking deeper and deeper into a
hot torpor.
In the evening as I sit waiting for the news on the hotel owner's radio, I hear
a sea moving in the rise and fall of the interference. Above me, filled with a
wonderful cool, roll the huge roaring breakers of space.
*
The meeting between Klobb and Voulet was even more dramatic than the meeting
between Marlow and Kurtz in Conrad's novel, by then already finished and
published in /Blackwood's/ magazine. Marlow did not after all have to make Kurtz
come back with him. Kurtz was seriously ill and went with him after some
persuasion. Voulet did not.
Klobb sent a sergeant and two soldiers with a letter that briefly and curtly
told Voulet he had been removed from his command and was to return home
immediately. Voulet replied that he had six hundred rifles against Klobb's fifty
and would open fire if Klobb approached.
On July 13, Voulet had a hundred and fifty women and children executed as
punishment for the death of two of his soldiers during an attack on a nearby
village. On the same day, he once again wrote to Klobb and warned him not to
come any nearer.
Klobb was convinced that neither Senegalese soldiers nor French officers would
bring themselves to shoot at a superior officer. He counted on the ninety
soldiers he had lent the expedition preferring to obey him rather than Voulet.
What he did not know was that Voulet and Chanoine had kept his letter secret
from the other whites and had sent them all out on various assignments in the
vicinity, keeping with them only the black troops personally loyal to them.
On July 14, Bastille Day, Klobb's and Voulet's troops stood facing each other.
Klobb gave his men strict orders not to open fire under any circumstances. Then
he started slowly walking toward Voulet, who had his soldiers fire two salvos
into the air. When Klobb was within earshot, he stopped and started speaking
directly to the soldiers.
Voulet was furious and, threatening them with a pistol, forced his men to fire
at Klobb. Klobb was wounded and fell -- still calling on his men not to answer
fire. The next salvo killed him.
*
Naturally, Voulet had not read Conrad's recently published story about Kurtz,
the white man who, with terror and magic, had made himself king over a black
realm in the heart of the continent.
But when the white officers returned that evening, Voulet told them what had
happened and suggested a solution of exactly that kind: they would continue to
Lake Chad and there set up their own kingdom, ‘a strong and impenetrable empire,
surrounded by a waterless desert.'
‘I am no longer a Frenchman. I am a black chief,' said Voulet.
The following day, the black sergeants decided to mutiny. Voulet was warned by
an interpreter, who was immediately shot for not warning him earlier. Voulet
mounted his horse and, with Chanoine, addressed the soldiers, firing at them at
the same time. The soldiers answered fire and killed Chanoine. When Voulet tried
to approach the camp the following morning, he was also shot.
The French officers held a council of war and decided to continue the
expedition. They marched toward Zinder and captured the town.
*
The hotel owner sits allday in the yard talking to his parrot, his voice
caressing and loving, quite different from the brusque commanding tone he
otherwise uses in his contact with the outside world.
Sometimes he brings his two dogs here and exercises them in the yard. An adopted
son takes up a middle position, a handsome black boy, son of his dead
housekeeper.
I am the only guest.
I am engrossed in the history of Zinder. It turns out that a much larger French
expedition, which had just crossed the Sahara in the summer of 1899, was on its
way to Zinder. So it was quite superfluous for other Frenchmen to capture the
town.
But the remains of the Central African Expedition got there first. These were
the troops to gain everlasting glory by occupying Zinder, the expedition's
officers hoping their crimes would be forgotten.
They were right.
When the murder of Klobb became known in Paris, an official inquiry was set up
on August 23. After having accumulated three huge cardboard boxes of statements
and documents, they found only one conceivable explanation: the climate. Voulet
must have gone mad in the African heat.
The crimes of the others were excused and forgotten, and France kept her
captured possessions.
The French left wing took over in government in1899 and had little interest in
digging any further into the affair. The right wing had even less. The ugly
truth stayed in the inquiry's cardboard boxes.
*
Eventually the facts trickled out. Of course, educated Frenchmen knew roughly,
or even quite precisely, by what means their colonies were captured and
administered.
Just as educated Frenchmen in the 1950s and 1960s knew what their troops were up
to in Vietnam and Algeria.
Just as educated Russians in the 1980s knew what their troops did in
Afghanistan, and educated South Africans and Americans during the same period
knew what their ‘auxilliaries' were doing in Mozambique and Central America
respectively.
Just as educated Europeans today know how children die when the whip of debt
whistles over poor countries.
It is not knowledge that is lacking. The educated general public has always
largely known what outrages have been committed and are being committed in the
name of Progress, Civilization, Socialism, Democracy, and the Market.
*
At all times it has also been profitable to deny or suppress such knowledge.
Even today there are readers of Conrad's story who maintain it lacks universal
application.
It has been said that the circumstances in the Congo of the Belgian monarch were
unique. The novel cannot be seen as an accusation against the whole of the
civilized world, as the oppressive Belgian regime in the Congo was a
one-of-a-kind phenomenon already condemned by most reasonable people.
But during just those months when Conrad was writing the book, similar or even
worse events were occurring by another river, the Niger, on the way to another
chamber of the same dark heart.
No, the Belgians were not unique, nor were the Swedish officers in their
service. Conrad would have been able to set his story using any of the peoples
of European culture. In practice, the whole of Europe acted according to the
maxim ‘Exterminate all the brutes.'
Officially, it was, of course, denied. But man to man, everyone knew. That is
why Marlow can tell his story as he does in Conrad's novel. He has no need to
count up the crimes Kurtz committed. He has no need to describe them. He has no
need to produce evidence. For no one doubted it.
Marlow-Conrad was able to assume quite calmly that both the listening gentlemen
on the yacht, the /Nellie/, and the readers of /Blackwood's/ silently knew quite
enough to understand the story and in their own imaginations develop details the
novel only implied. This knowledge is a fundamental prerequisite of the book.
This knowledge could be expressed in general and scholarly language. Imperialism
is a biologically necessary process that, according to the laws of nature, leads
to the inevitable destruction of the lower races. Things of that kind could be
said. But the way it actually happened, what it really did to the exterminators
and the exterminated, that was at most only implied.
And when what had been done in the heart of darkness was repeated in the heart
of Europe, no one recognized it. No one wished to admit what everyone knew.
*
Everywhere in the world where knowledge is being suppressed, knowledge that, if
it were made known, would shatter our image of the world and force us to
question ourselves -- everywhere there, Heart of Darkness is being enacted.
*
You already know that. So do I. It is not knowledge we lack. What is missing is
the courage to understand what we know and draw conclusions.
/The above is an excerpt from Sven Lindqvist's/ [[https://www.waterstones.com/book/exterminate-all-the-brutes/sven-lindqvist/9781847081988][Exterminate All the Brutes]] /,
translated from the Swedish by Joan Tate and available now from Granta Books./
DONE Move chicken tractor
CLOSED: SCHEDULED:
:LOGBOOK:
CLOCK: -- => 0:43
:END:
DONE Pull out taps
CLOSED:
DONE Almost Sunrise film
CLOSED:
:LOGBOOK:
CLOCK: -- => 4:38
:END:
DONE Watch NBA playoffs
CLOSED:
:LOGBOOK:
CLOCK: -- => 2:20
:END:
Journal
Nabby is freaking out on my shoulder right now ... Sometimes I don't know what's
wrong with a baby. I always think of profoundish things while I'm doing
something else. Usually working outside or running. Then I sit down here in
front of the computer and I say the day is nice or some shit.
My hands hurt today. After clearing a bunch of alders with the kuhuri knife
yesterday I'm exhausted. I woke up stiff, like I'd done a long run or something.
It was worth it though. The birches down at Brad's property line look great. I
need to fix my chainsaw and get some mix and bar oil and then I can really do a job.
I have an interview with Thorn today, and I'm strangely not nervous. I would
have thought I would be, given how my other interviews went, but not today. It
might help that I also have the stress of MCing the Almost Sunrise showing today.