I recently had a look inside the archive of this blog and was quite surprised to find out I have been maintaining it for 10 years now. That’s quite a long time for human standards.
On this occasion I started to reminisce about the past ten years and the ups and downs I had in this period of time. There are very mixed feelings when looking into the past and even more when trying to tell the future.
I feel like I have lost my purpose of being somewhere along the way, but the one I had was not doing me good either. It gave me a direction whereas now I feel aimless, but it wore me down to the bone and made me neglect myself. Nowadays I still have the tendency to disregard my own needs – old habits die hard – but i’m no longer peer-pressured into thinking that it’s alright and that I need to wear me down even more to succeed. On the contrary even, my friends point out my flawed thinking and convince me to take care of myself.
Speaking of friends, I feel thankful for the people in my life. Those I keep contact with from long before and those who came along during the journey. The diversity of life reflected in them and all the different experiences I have had with them tought me a lot. Often I feel guilty of being a burden to them…
Change is probably the one lasting constant of life. I hope to change for the better in the future and never lose my passions.
Ten years ago I wouldn’t have dared to make up characters and stories to share them publicly. Nowadays I’m publishing my own webcomic, where the first chapter has just been completed and the second one is about to get ready for release. And I have ideas and plans for more chapters to come.
Excuse me my rambling in this blog post. It’s just something that occupied my mind lately.
Keep calm and wash hands.
]]>I thought I’d give you a little update about the things I’ve been up to in the past month or so since I posted my last blog post.
I actually managed to use some time periods I usually would spend online or working on my projects at least mentally to wind down a little. For that purpose I looked at some mangas and settled for “Spy x Family” and boy am I sold on this series. I’m still in the first half of the second issue and I’m enjoying it more than I had anticipated. I really do recommend this manga series.
My little hiatus from drawing did not last long, because I could not handle my imagination present me with beautiful ideas for either redraws of old art or even new art ideas. Unfortunately for my ongoing comic project the ideas I had go into completely different directions. On the other hand I might have drawn my best drawings so far.
To distract me a little from my urge to draw I started working on my vulkan renderer in Haskell again, which made some good progress thanks to my renewed passion for it. I optimized some data handling between CPU and GPU and also am able to load and display textures, but UV maps don’t work yet and I need to figure out why. But here’s a little video of it’s current capabilities:
I hope soon to be able to actually use this renderer and continue with my game projects, where I might have gained a new idea…
This is what I’ve been up to so far. I hope to make blog posts a more regular thing again in the future. See you soon.
Keep calm and wash hands.
]]>It’s surely been a while again since I posted something on my blog. I owe you an apology for that. I have had blog posts I want to write on my mind for some time now, but I never actually got to execute any of those ideas due to me being too busy.
I am very busy. To name just a few of the things I do: I have work, I have my ongoing comic, I have ideas for further comics, I draw other stuff, I dabble in Haskell game development, I do photography and so on and so forth. I don’t do these things all at once, but still it’s a lot.
Lately I’ve had problems drawing new pages for my ongoing comic. Not because I didn’t enjoy thinking about it any more or I was fed up with the story or the characters. At first I thought it was because it was always the same project and I needed to spice my drawing time up a little with other drawings than the comic. But the problem is deeper.
I have been struggling with mental health problems for more than half of my life now and all these projects on top of my regular dayjob are taking their toll, which I’m slowly beginning to feel.
Over the course of the past years I somehow managed to un-learn a very important activity: I forgot how to relax. I can’t remember when I last sat down with a good book or comic and read it for the sake of just reading it. The same goes for watching a movie or an episode of a series. I used to be playing video games.
I didn’t fully realize I had a problem until very recently, when a friend called me for emotional support. They told me they are about to burn out. During our conversation they told me some of the early warning signs they had experienced and I was immediately reminded of myself and the situation I am in at the moment.
This warrants some changes I need to make to take proper care of myself. I want to re-learn how to relax and spend time “doing nothing” without havig a bad conscience. Since the amount of time in a day or a week is limited, this means I need to cut back on other activities in my free time, which has been mostly taken over by drawing and related activities. This does not mean I’m droppping drawing and my comic projects altogether, but there is a hiatus coming soon.
On a technical side note: You might have noticed the new design of my blog. I overhauled it because I have grown increasingly discontent with the old design. I hope you like it. Let me know what you think.
]]>Merry Holidays! I sincerely hope you have some relaxed days at the end of this year and get to spend also some time with people close to you.
I’ve been quite busy in the past months getting up to speed with my job, my personal projects and everyday life.
As you might have seen, I have been constantly updating my comic since may and have already begun working on the second chapter, from which I sometimes post glimpses on my Mastodon account. I am making good progress, but the update speed will remain the same for the foreseeable future, as the time I can work on the comic is limited and I don’t want to run through my backbuffer of pages too fast. Making this comic is definitely one of the most challenging projects I have ever begun, but I’m having loads of fun doing it and I’m constantly learning new stuff and improve my technique. It’s also very interesting and satisfying to see the evolution and refinement of my art style in the course of this project.
Drawing in general has become a very dear hobby of mine in the past three years where I particularly like, how it engages a more creative and emotional side of me. I kind of wish I hadn’t been ashamed of being creative in the first place.
Because of my comic and partially also my work my pursuits in gamedev have slowed down significantly. My games have not had any significant updates for quite some time now, as I am in the process of learning to use the vulkan graphics API with the goal of rewriting the graphics pipelines of my games to use this new standard instead of OpenGL, which is on its way to deprecation. So far my progress has been good while working through the vkguide vulkan tutorial to build a simple renderer. Like most gamedev tutorials handling raw graphics code it is written in C++, so I’m making the effort of translating it into Haskell. You can see my progress as I complete the chapters in my code repository. Here’s also a small visual representation of my current state:
So this is what I have been up to in the past months. Lots of different stuff.
Keep calm and wash hands.
]]>I thought it’s time for a little update and changes that happened and will happen.
First off some technical changes that happened in the background of all my pages: Roughly a year ago I decided to install and configure matomo to get some metrics about my readership. I tried to use it for a year and tried to understand the graphs and numbers it threw at me, Also the maintainance effort rose, as the software seems to be rather unstable. I always managed to recover it, but a rather nasty outage convinced me, that the software might be both a bad fit for me and a disservice on you.
I underwent what now I see as a failed experiment with a little bit of a bad conscience, as I usually am very against the tracking of people, not only on the internet, but in general and only managed to justify that to me as I would host the service myself and not share the data anywhere. So I did basically a 180 degree turn, purged matomo from my server and now I resort to analyzing the log files of my web server using the application goaccess. Additionally I configured the web server to not store the IP addresses and the user agent strings for any request. As a bonus the reports generated by goaccess appear more meaningful to me than the matomo reports ever looked.
Secondly, my treatment in hospital came to an end about a month ago and I am slowly returning to my old job since then. As you can see I still maintain my upload schedule for my comic, but unfortunately producing new pages has been slowed down a bit. This will not affect the upload schedule for the time being, as my buffer of finished pages is still large enough. I hope to return to my old pace of producing new pages soon. I just need to sort some stuff out and get accustomed to working a dayjob again.
So far for this very overdue update from me. I also plan on posting more frequently again here and already have two ideas for blog posts forming in my head, which I hope will be very helpful each in their own way.
See you around.
Keep calm and wash hands.
]]>Long time no see. About half a year, to be precise. A lot has happened in that time.
Good news first: My comic is out there. I released it two weeks ago, but did not find the time to make a proper announcement here, but those of you ho follow me on Twitter and/or Mastodon May have read the news as it was fresh(er). Overall reception seemed good so far, but feel free to tell me your opinions on it. I would be very interested in constructive feedback of any kind.
If you are interested, You can read the comic on its own website. I will progressively upload a new page every month as I work on the next parts of the comic.
Why so slow updates?
This is a fair question, which brings me to the bad news: I am currently in hospital (again) and getting better again. During the holidays my mental helath took a sharp downturn and I finally managed to start treatment in march. I kept on drawing, but with a slower pace. So to avoid further malicious stress from my comic i chose to make the update schedule very slow.
WIth all that said, I wish you all a nice summertime, enjoy the warm days and stay tuned for more comic pages.
See you soon (hopefully).
Keep calm and wash hands.
]]>Once again I have to apologise for not having updated my blog in such a long time. But here I am and I’m trying my best to summarise what has happened so far.
Long story short: I was busy. Very busy.
I expected drawing a comic alongside my dayjob would be dificult and time consuming, especially if I wanted to finish it in the foreseeable future. I shelved my other projects, especially the gamedev ones, so I would have the focus needed for this. I’m not entirely happy with this arrangement, since I also enjoy doing gamedev, but I can’t draw a comic and shave a yak at the same time.
So I set out to draw the first comic out of the upcoming series and started out with the storyboards and used those later to create page layouts. I did several iterations on the layouts until I was satisfied. Before that I did not know for sure, how many pages the comic would even have. After that I started with the actual drawing. I did that for a month without a schedule, because I did not know how fast or slow I would progress.
To my surprise I made progress quite quickly and was able to put out around a page a week. A great help in this regard also was the decision to keep the comic mostly in grayscale. With this data I could make a rough estimate and set myself a reasonable schedule. I expect to be finished with the first comic around the end of February next year.
Since I would like my comic to be actually read by people, I also dod some research on how to promote it, once it’s out. There were several options, but in the end I am going to apply at the webcomic collective SpiderForest and already joined their Discord community to get to know each other.
So much for what hapened in the past two months or so. Now you ,ay have a sneak peek at the comic itself:
With all that I wish you also merry christmas and a good start into the new year.
Keep calm and wash hands.
]]>Some time hase passed since my last update and there has been some great progress. First off: The story outline for my comic or rather series of short comics is finished!
While being occupied with other things like work, event planning and my ever returning mental health issues I was unable to work on the story of my comic very much. What I was able to do, was to draw some reference for one of my main characters, which led to me drawing a lot (about 20) different facial expressions of this character for practicing conveying emotions better, which had been a problem before.
After that I explored a little bit the options of how to color my comic and came to the conclusion, that most of the comic will be black & white, since this mode of (not) coloring leads to faster production of pages. Shadows will be handled as simple cel-shading using semitones as well as hints of color values. Special pages or panels will be in full colour though.
The nicest breakthrough with my comic happened just this weekend, where I was able to sit down with my older brother and discuss the story a bit. I already had a good beginning and a fairly decent ending, but my middle part was still an unsolidified mess of ideas for possible events.
The process was quite simple in retrospective: I began telling my brother the story as far as I had it from the beginning and whenever I reached a point of unsolidified ideas or outright plot holes he would ask critical questions and we would discuss possible solutions to the problem at hand. A great help in this whole process was, that my brother at this point was not very well acquainted with the story, so he head an unbiased and uninformed view on the whole construct.
The resulting story outline is shorter than I had expected, but it is in a way the “minimum viable product” to tell the story. Now that the story is more or less defined and in place I can begin drawing storyboards and layouts for the individual pages. As always: nothing is set in stone. I might deviate from the story outline spontaneously during the drawing step, but at least I have a plan with a finite scope.
So much for this update. I hope to keep you updated here and on my art portfolio without spoiling too much of the story.
Keep calm and wash hands.
]]>It’s been a long time since I posted anything here, which by no means is the end of this blog or my art journey. Instead I am preparing my next steps while going through some changes in my life.
I reached a turning point in life with the end of my apprenticeship as IT specialist for applications development and got transitioned into a job almost instantly. To get settled in with the job, company, commute and everything else that comes with it I gave myself four weeks, which are now coming to an end.
The other point is my preparation for something bigger. For the past year I have been developing story and characters for a series of comics if gradually increasing intensity. This takes up quite a bit of my free time I would usually spend drawing or pursuing my other hobbies where I instead write my script or devour tutorial after tutorial on how to publish webcomics. And lastly I’m drawing drawing reference material for said comics, which I don’t really want to publish right now, as it might contain spoilers.
Also my game development projects came to a halt in that time. In that little time I spent with it I started remodeling the physics “engine” I wrote to a be based on forces applied to objects and calculated to accelerations, velocities and movement instead of the other way round. I’m also using some good literature on that topic: “Physics for game developers” by Brian Bywalec and David Bourg, which I found to be a good introductory book into the topic which transitions into more advanced topics rather nicely.
So in conclusion: yes, I am still out here, drawing and plotting. Expect to get nice things to look at. I sincerely hope it will be rather sooner than later.
]]>As my apprenticeship slowly winds down and comes to an end, I have found the time again to work on “Pituicat”. This time I tackled the problem of interacting with movable objects. This was all possible due to the friendly Haskell GameDev community on Discord, which gave me valuable hints here and there, when I needed them.
This meant another rework on the collision handling side of the code, so I had to break the collectible powerups, but I hope to get them back shortly.
Also I changed the way player movement is handled. I used to apply the move velocity as a physical velocity before doing collision checks, which tended to backfire and cause random breakage and unforeseen behaviour, especially when applying velocity updates after collision. Then just shortly I got the valuable hint, that player movement should not be really applied as a physical force but rather “hacked in”. This I managed to do, which now saves me a lot of headache when updating the player’s velocity.
I rendered a short Video of some interaction between the player and placed objects on the map. Vertical interactions work well, as you can see, but horizontal still need work, which is why I chose to ommit them here.
I am quite happy to make progress on this project, no matter how small that progress seems to be.
As always, you can look into the code and game design documents in the project’s gitea repository.
I wish you all a pleasant sommer. Don’t melt.
Keep calm and wash hands.
]]>Long time no see. I am currently quite busy finishing my apprenticeship so my free time suffers a bit, but my goal is now in reach. Only my oral exam is left to pass and then I will be done.
So today I want to write about some hardware issues I had with my drawing tablets and which I solved thanks to this blog post by David Revoy.
I have been drawing digitally a lot in my free time and thus own at least one drawing tablet. I stuck with the brand “XP-Pen” as they seem to have a fairly good quality for a reasonable price. Also they seem to support linux (at least in their own strange way). They do ship a driver for their tablets, which is proprietary and needs to run in the background all the time and seems not to be able to remember its settings (at least not on my NixOS).
So up until recently I was bound to work with what worked out of the box with Deco Pro M, which was most of the functionality it provided, even the pen tilt was recognized out of the box. The only things I was missing was making a right-click with my pen, assigning the hotkeys on my tablet and mapping the tablet to a specific Display on a multi monitor setup.
This is where David’s blog post enters the stage, where he provides a detailed
guide on how to set up a XP-Pen Artist 24 drawing monitor in linux without
using the proprietary driver. I was able to extrapolate from that and adjust my
/etc/nixos/configuration.nix
to configure my tablet according to my needs.
What I want to try with this blog post is to provide a more general guide on how to configure most, if not any, XP-Pen drawing tablets or monitors on NixOS.
First of all, You need to find out the identifier for your tablet. with the
tablet plugged into the USB port, run lsusb
(which is part of the usbutils
package). You should get some lines of output with an entry similar to this one:
Bus 001 Device 005: ID 28bd:0904 XP-Pen 11 inch PenTablet
The 28bd:0904
is the ID we are looking for. Note that the part after the
colon varies from device to device, so don’t just copy&paste.
Now we enter the realm of the configuration. First of all, we need to enable the digimend driver with the following settings:
true; services.xserver.digimend.enable =
Now we move on to having the wacom driver actually manage the XP-Pen devices.
For this we have to add rules to the Xorg.conf
, which is conveniently handled
like this:
[
services.xserver.inputClassSections = ''
Identifier "XP-Pen 11 inch PenTablet"
MatchUSBID "28bd:0904"
MatchIsTablet "on"
MatchDevicePath "/dev/input/event*"
Driver "wacom"
''
''
Identifier "XP-Pen 11 inch PenTablet"
MatchUSBID "28bd:0904"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
''
];
These two sections match to my tablet, so alter all occurences of the lines
Identifier
and MatchUSBID
to match your device, otherwise it will not work.
With this you tell your system to let the wacom driver handle all tablet input
it can handle, everything else will be interpreted as a keyboard by libinput
,
which includes all the hotkeys on your tablet, if you have any.
Now comes the fun part mapping the upper stylus button to be a right-click. For
this we need to analyse the input of the stylus using evtest
(which is
contained within the package of the same name). With root permissions we run
evtest
and see output containing lines similar to this:
...
/dev/input/event21: 11 inch PenTablet Mouse
/dev/input/event22: 11 inch PenTablet Keyboard
/dev/input/event23: 11 inch PenTablet
...
Select the device event number [0-23]:
Select the device without Mouse
or Keyboard
, so 23
in this example.
You will get an overview of all input events supported by this device and when
you bring your stylus near the pad it should pick up all movements and button
presses you make and print them onto the console. To abort this testing, press
Ctrl
+ C
on your keyboard.
Depending on your device, the output of the stylus test will produce a lot of output, because all position and tilt changes will be recorded onto the console. what we are looking for though is the input of the upper stylus button, so press it a few times trying to hold the pen as steady as possible and abort shortly after your button presses.
Now you need to look for specific lines in the console output, which will look somewhat like this:
Event: time 1624813216.995575, type 4 (EV_MSC), code 4 (MSC_SCAN), value d0045
The most important keyword here is the code 4 (MSC_SCAN)
, so search for that,
and note the value behind it. In this case it is d0045
. This value, by the
way, seems to be the standard value for the right-click with XP-Pen tablets,
as it is the same with all three tablets or monitors I have set up with this
method so far.
After we extracted the right-click value of the stylus, let’s return to our configuration file and add the following option:
''
services.udev.extraHwdb = evdev:input:b0003v28BDp0904e0100-e0*
KEYBOARD_KEY_d0045=0x14c
'';
This rule will do the actual remapping of the button press on the stylus to right-click. Note, that the USB-ID of your device is present in here too, so change this line so it matches your device:
evdev:input:b0003v<vendor-id>p<product-id>e0100-e0*
The line below contains the value of the upper stylus button (d0045
) and maps
it to the right-click value (0x14c
).
Congratulations. You just configured right-click on your stylus.
To map your hotkeys on your tablet, you need to run evtest
again, but this
time you want to test the device with the keyboard description. Press your
hotkeys and note the values behind the code 4 (MSC_SCAN)
lines.
Then remap the values to your desired keys. Note that not all hotkeys support multikey bindings, but only those emitting multiple different keypress codes.
I hope this tutorial is helpful for you in any way. If you feel that I missed something or need some clarification, just get in touch and I will expand this article as needed.
Keep calm and wash hands.
I completely forgot to write about this part. The most generic way to do this
is to find out the ID of your stylus via xinput
, and then the number of the
graphics output you want to map it to using xrandr --listactivemonitors
.
You are interested in the number prefacing the monitor/connection descriptor.
After accomplishing this, you enter the following command:
xinput map-to-output <Stylus-ID> HEAD-<Output-No>
In the article I stated to enable the wacom driver, which actually is not absolutely needed, but I forgot to mention the digimend driver, Which is activated by this setting:
true; services.xserver.digimend.enable =
The according section in the article has also been corrected.
]]>after the last update I wanted to try implementing something I was a bit anxious about: Powerups. They were quite a wildcard until then, sonce i didn’t know how to implement neither the interaction with them nor how effects would be communicated or even passed on to the player.
Turns out my worries have been ungrounded. Implementing everything was quite a breeze. Picking them up uses the collision detection system already present, I only needed to alter the collision reaction. Powerups are their own type using an enum to define the stored effect. very straightforward. Upon collision with the player the effect is passed unto the player with a given amount of time how long the effect lasts. Finally even the powerups present on the map have a time to live and despawn when their time runs out.
I also started to make some minor tweaks, like the player character looking in the direction they move. but see for yourself:
The first smaller pituicat is a powerup granting more speed for 5 seconds. The other one is just a test with collision objects which are not part of the map definition. I am quite pleased with these results, but I see, that I now need to work more on visuals to make things on screen more understandable.
At this point I want to stress, how powerful ffmpeg is. The above video was generated from an OpenGL API trace. If I had known this before, it would have saved me tons of worries trying setting up a finicky recording system, which was the cause for the lack of a nice showcase video in the last update.
All the progress on the code is, as always, for you to see in the gitea repository
With all that said, I wish you all happy hacking!
Keep calm and wash hands.
]]>To be honest: I lost track of how often I tinkered on my collision detection and collision response algorithms, but I have rewritten them from scratch at least four times. At least so my counter on the branch names says…
But after all this wailing and gnashing of teeth and lots of hair pulled, I may finally have a universally working solution for the game.
What helped me to find this solution? One part distance and one part perseverance. I actually did not have the time and mental capacity to pursue this project a lot since the last update. My apprenticeship is coming to an end and I’m busy coding my final project and writing its documentation.
There’s been going on a lot with my life: I applied for jobs (and found myself a really neat one), had some hospital visits (nothing too serious, so no need to worry) and also pursuing art. So I distanced myself a little from my game.
But every now and then I would still look at it, and at least try to fix the issue regarding my collision detection. So tonight, after a longer stretch of not working on the game, I looked at it again and finally found the flaw in my algorithm. Fixing it and cleaning the whole mess around it was then only a question of time.
So now I wish you all a good morning and happy hacking, I need to return to my more mundane projects now.
As always: Feel free to look at what I’ve done so far.
Keep calm and wash hands.
]]>development on my game has been a little slow lately due to health issues, but I still managed to get something new working. This time I focused a little bit on user input, to make this game actually somewhat interactive.
In the process of implementing rudimentary user controls using already prepared plumbing from my engine I found some errors in the detection and handling of collisions, so I had to rework that completely.
Physics implementations are hard, as far as my limited experience goes, but I hope I did it at least halfway right this time. But see for yourselves:
There is still a long way to go to the game I have in mind, but it feels good make even those small steps in the right direction.
If you are curious about how the physics are actually implemented, go check out the code from the repository. I hope everything is quite understandable there.
See you next time.
Keep calm and wash hands.
]]>It’s been only a little while since I last worked on my latest game. I took the time between Christmas and New Year to dive again into the depths of code.
Following the rough roadmap I have in my head I am trying to get the game to become finally interactive, but being a platformer, this has some prerequisites on basic physics and collision detection and collision handling. So I prepared again a lot of reusable plumbing, implemented all the necessary functions and tied it all together nicely to play along with the already existing parts of the game. Here is a small video of the result:
Again, it does not look like much, but I am very happy about this result. Although I will surely have to tweak the collision reaction more, but it is a good start, so I believe.
Next up will be handling of input events including, but not lmited to, keyboard key presses to control the player. After that I will hopefully be ready to fill the game with actual content.
As always, you may check out the code of the game and its progress in its repository. I try to leave as many helpful comments and documentation as possible while programming, but if anything is unclear, you need further explanation or just want to talk about the game or any other interesting topic, do not hesitate to contact me via email or any other means listed on my contact page.
So much for this update. I hope I will be able to continue to work on this game shortly.
Until then, keep calm and wash hands.
]]>Between some christmas preparations and work I was able to squeeze in also some development time on my game again with some visible results.
Most of the time I was preparing plumbing again for static objects (called “Props”) and interactable entities (called “Actors”) to be displayed on top of their according layer of residence.
After having the plumbing ready I created an entity for the player to be displayed and this was the result:
The player does not move yet and does not interact with anything, so the graphics just sit there, but I am still quite happy for it to work.
Next up I will probably start implementing keyboard interaction, so the player can actually move.
Until next time.
Keep calm and wash hands.
]]>Another weekend passed and another step has been taken. Last time I was struggling my way through OpenGL and got a single quad displayed on screen, which I had hardcoded there. The next step I decided to take was reading level maps and generate quads where tiles would be and texture them properly.
I had already put some thought into how to store level information.
May train of thought here is, that tiles are static and arranged in layers above each other. To represent that I use a simple bitmap picture per layer. every single pixel in this bitmap represents a tile. The red channel contains the information of the tile type (at the moment there are only solid tiles, platform tiles and decoration tiles). The green and blue channel mark the offset on the tilemap. To make the information visible to the naked eye, the information is stored inverted, so that filled areas appear white and empty areas black.
I will have to figure out dynamic objects like collectibles or enemies later.
So after defining types for the tiles, the tilemap and the level map I also defined a rather generic typeclass for anything drawable to spew out vertices with texture coordinate information. Putting my game on the screen now looks like this:
Making progress is fun and I enjoy making it in my own bespoken way, though havig to think in different coordinate systems at the same time (OpenGL coordinates vs. Image coordinates mostly) can cause quite a headache and some rather fun bugs.
As always, feel free to check out the code on my gitea.
See you next time!
]]>With things getting more calm I found some time and motivation to code again, so I grabbed my current project “Pituicat” and started out implementing my own abstractions around OpenGL to get stuff on screen. Today I finally made it:
I know. It doesn’t look very overwhelming, but it’s a start. The code I wrote to make this possible should enable me to draw massive amounts of 2D tiles more efficiently than the library NanoVG does.
This breakthrough is very welcome, since I started considering moving the game to an engine I do not build myself, namely Godot, which is a powerful free software game engine. I already started to make some stubs in it, but I seemingly enjoy shaving yaks far too much…
After this milestone is taken, I can start taking care of the actual in-game graphics and display them accordingly. Although I’m not absolutely new to game development, I never actually handled OpenGL myself, so this is a huge, sometimes fun and sometimes frustrating, learning experience.
At this point I want to thank the Haskell game development community and the Haskell community in general for being the excellent, friendly and helpful communities they are.
Also special thanks go to The Cherno, who has made an excellent Video tutorial series on OpenGL available on his YouTube channel. Although the tutorial is held in C++ I could carry most of the concepts over to Haskell and apply them to my needs.
As always, if you want to see my progress with the code, head over to project repository on my gitea.
So much for this update, I hope to see you soon.
Keep calm and wash hands.
]]>As promised I will be writing a bit about my new game project called “Pituicat”.
The idea for this game is rather old and even predates “Tracer” by quite some time, I even found some code and some assets I drew for the game, but it was only a stub with broken physics.
The core idea for story and gameplay did not change over time. “Pituicat” will be a 2D platformer with puzzle elements where the player controls a cat turned to a slimey blob.
In this game I wanted apply my findings from the book “Level Up!” by Scott Rogers. and the tutorial series on OpenGL by The Cherno.
So before I started any coding whatsoever I created some game design documents to create an overview of the game, the world it is set in and the gameplay mechanics present in the game. I also created an overview over all the levels that the player will play to beat the game.
At the time of writing the documents are suficiently complete that i can already do some coding and figure things out implementations-wise, since I never worked with persistent maps before (“Tracer” generated its maps randomly).
If you wnat to check out the code for “Pituicat” and its progress, go over to my gitea. Development will most likely be quite slow, because I am busy at my apprenticeship and have only limited spare time.
]]>I have a lot pf projects and some of them are very dear to me. One of these is my attempt at a game called “tracer”. This does not mean I am giving up on that. Instead of “killing” this one of my darlings, I would like ot freeze it. This menas I put it away for later.
“But why?” you may ask.
Well, simply because the idea has become too complex and difficult to achieve with my toolset and knowledge. Additionally, I did not make much of a plan beforehand what to incorporate in the game and how it should all work.
To cover the technical aspects I followed a superb tutorial series on OpenGL. I can hightly recommend it, if you want to learn how modern OpenGL is actually used. The tutorial series itself is taught in C++, but I was able to translate it into Haskell, which you can see on my gitea.
Secondly I learned a lot about the game design process from the book “Level Up!” by Scott Rogers. I was recommended this book by one of my co-apprentices who used to study computer science with emphasis on multimedia applications.
The findings from these will go into a new project, which will get its own blogpost shortly.
]]>Finally I reached the time of year, where I have a long vacation during my apprenticeship, so I can relax a bit. In theory.
Reality looks a bit different, though. With me moving out of my old place because of reconstruction works, some paperwork that’s been piling up alongside personal projects which beg for my attention I am quite busy. But it is still relaxing, since I have no schedule apart from the schedule I make up myself.
One project that receives quite a lot of attention lately is a short comic I am drawing. After reading some books on comic drawing and structuring I am trying to apply some of the findings.
For example I never really did storyboarding or panel layout before. Everything was more or less on a whim and from the top of my head. That’s not bad per se, but can make things difficult when not being able to work on a comic page continuously.
Another thing that’s really helpful for my motivation is that with a proper plan and structure of my comic I get quite a good sense of progression while drawing. The number of pages turns finite and you can focus on drawing and not worry about the story for the next panel or page.
When th comic is finished, I will release it on my art portfolio in its entirety.
Unfortunately my endeavours in prosa writing came to a full halt, but maybe I an fix my problems with writing in a similar way like I did with my comic drawing, but I will have to make some research there.
]]>I recently had a look at my blog’s archive page and realised two things:
Seven years is quite a long time in which I personally had a lot of ups and downs, some of them I even made public here. You have accompanied me through my hard times and enjoyed the good times. Thanks for all the support.
I also had a look on the other pages of my blog and found some quite outdated info, especially the page about this blog. I will have to revise it thoroughly. I will maybe even restructure the whole blog.
Let’s just see what I come up with.
Seeya!
]]>Some folks who are following me on mastodon surely have noticed my increased output in drawn art. I even created a portfolio page for that.
As you might remember, I also had some endeavours in creating written art and even published some short stories here on my blog. I want to revive that, without subjecting myself to too much pressure, so there will be, like with my drawings, no schedule.
I will start doing some writing exercises soon, create fragments or even short stories based on own ideas, random ideas or even writing prompts off the internet.
Genre-wise I will probably do a lot of fantasy, but I also learned about the budding genre of Solarpunk and I would like to explore that. This will be a bit challenging, because Solarpunkt tends to be rather optimistic, what I usually tend not to be. But this challenge excites me.
Anyway. So much for the update. Expect a new category to pop up on the portfolio page soon, so check there regularly or get the feed from there.
Keep calm and wash hands.
]]>I apologize for being so silent the past months. Lockdown does strange things to me, but it’s under control at the moment. I just needed readjustment of medication.
Since I am human and can’t lie apathetically in a corner all day (which I also had my good share of) I decided to build a website for my visual pieces of art, a portfolio, so to speak. You can reach it at https://art.nek0.eu.
The website is built with Hakyll, of course, and I took the opportunity to learn some of the more advanced features and even some supplementary libraries. I was once again very pleasantly surprised how powerful this software is.
Some of the pictures there are related to my ongoing webcomic Alitheia Road, which I had currently to put on hold to alleviate pressure from my mind. But It will continue, I promise. I am gathering ideas and fleshing out storylines for future pages whenever it feels ok to do so.
So much for an update from me.
Stay calm and wash hands.
]]>In light of the recent events I would like to make a status update.
I’m overall ok and am on self-imposed lockdown since March 14th and urged the hackerspace I usually hang out at to do the same.
School has been canceled for now and my apprenticeship practice is transitioning to home office, but I have no information yet, how exactly this is supposed to work and fear I might have trouble participating, because I have no Windows licence. All my computers run Linux-based operating systems (NixOS specifically).
In the meantime I was able to tackle one bigger project of mine: I am running my own XMPP-Server based on ejabberd now. Now you can reach me through my new nek0@jabber.nek0.eu address.
I hope people around here learn their lessons from this event. A pandemic can happen anytime, so the healthcare system needs its resources to be able to tackle it. Universal healthcare is a neccessity which mustn’t be run for profit.
Stay safe.
]]>As I posted earlier I had switched back to Debian. This did not last long. After visiting NixCon and learning about all the cool new stuff coming to NixOS (and after breaking my Debian system) I decided to give NixOS another shot and installed it all. I even got my graphics setup to work properly thanks to the Optimus Prime setup options.
Now I am learning how to handle haskell.nix, an alternative builder for Haskell projects I learned about at NixCon. It works quite well, despite still being marked as experimental. What I still struggle with, is the setup of packages depending on other packages available only locally. Until I can resolve this issue, some of my Haskell development is halted. If someone has some resource at hand on how to achieve this other than the official docs, I would be very grateful for a nudge in the right direction.
Some other thing, which happened longer ago, but I failed to announce properly: Eidolon, my image gallery is down and I am planning to change the scope and rewrite the project. I took the gallery offline after new legislation passed the european parliament known as “Article 13”, which would have forced me to either implement content filtering for copyright infringements at upload or buy this service externally. The first seems impossible with my resorces and the latter I am not willing to do. So the gallery will change to a single-user gallery software.
And this concludes today’s update. I will be present at 36C3, so if you want to get in touch, you may find me there. I will be most likely hanging around the ChaosZone assembly or you can call me on DECT 6350.
]]>Unfortunately this does not apply to game development in Haskell. At least for me. After years of trying the closest I ever got to a game was Tracer, which I still wish to complete, but I doubt I will ever be successful. This is due to the fact that in the current state it performs badly because of poor technical choices on my side, which I am trying to rectify. To make better informed decisions I set the game aside and started experimenting with some new and some different concepts. This includes concepts like Functional Reactive Programming (FRP) as a new paradigm, but also better tooling, like proper shader programming.
Finding resources on FRP was quite easy. I was given a good itroductory book and found a capable Haskell library implementing this concept in reactive-banana.
Finding resources for shader programming in Haskell was not as successful. There are some interesting attempts at abstracting the GLSL shader language into Haskell, so one can profit from static type checking by the compiler, but these haven’t been updated for at least two years and don’t work anymore. All in all the whole GPU programming part of game development in Haskell looks very bleak. To get things done one has to resort to interfacing C libraries oneself, which is an error prone and tedious task.
For now I am really frustrated by this lack of an ecosystem and by the fact, that after three years of trying I only have rotting bits and pieces of software.
]]>Das Motto dieses Jahr war “Patch gehabt” und es haben sich eine Menge interessanter Talks im Programm angesammelt, welche im Nachgang alle auf media.ccc.de schauen möchte. Leider konnte ich die nicht live sehen, da ich ja den Infotresen bedient habe. Aber wozu hat man Freunde, die einem eine kurze Zusammenfassung liefern und das VOC, das alles aufzeichnet und abspeichert.
Was ich allerdings aus erster Hand mitbekommen habe, waren ein grober Überblick über die Besucherzahlen und die Stimmung auf dem Gelände. Das Erstere war etwas ernüchternd und konnte durch die Zahlen aus dem Netzwerkmonitoring unterfüttert werden: Es waren nie wirklich mehr als 200 Menschen gleichzeitig auf dem Gelände. Das ist verglichen mit den Vorjahren weniger, aber unterstützt meinen zweiten Punkt, nämlich die Stimmung. Diese war nämlich sehr familiär und entspannt. Ich persönlich habe die Datenspuren von der Seite aus sehr genossen und war nicht von Menschenmassen erschlagen, wie ich es auf dem Congress, oder ähnlichen Großveranstaltungen, für gewöhnlich bin.
Es gab auch ein paar Mankos an den Datenspuren, welche ich hier nicht alle aufführen möchte, da ich diese erst in die Nachbereitung der Datenspuren einfließen lassen möchte. Erwähnen will ich trotzden den eklatanten Engelmangel. Wir brauchen für zukünftige Datenspuren dringend mehr Helfer, welche keine Scheu haben auch mal das Mikro in die Hand zu nehmen und einen Speaker an- und abzukündigen. Wer sich das nicht zutraut, kann auch gerne als Videoengel den Schnitt der verschiedenen Kameraeinstellungen vornehmen. Chaos-Veranstaltungen unabhängig ihrer Größe, wie die Datenspuren oder der Congress, leben davon, dass die Zuschauer auch mithelfen.
Trotz allen Widrigkeiten waren es aber tolle Datenspuren mit vielen coolen Inhalten und Ich hoffe einen Großteil der langjährigen Besucher auch nächstes Jahr zu sehen.
]]>“But why?” you may ask.
Well, the answer is quite simple. I need a stable operating system on my workstation, which has to have properly working 3D-hardware acceleration. In the weeks before my switch back, This was no longer the case and nobody could help me.
But this all does not mean I abandoned NixOS as a whole or think less of the project. I still believe it is a very cool concept for an operating system and package management and will gladly revisit it, when things are more stable and mature, but for now I only maintain a small virtual machine with a NixOS installation to run my NixOps deployments.
During my endeavours of switching back I unfortunately lost some data (e.g. pgp keys), so I updated data where needed. This prompted me to think of a proper paper backup solution for sensitive data. Maybe I’ll come up with some acceptable workflow.
Also setting up my laptop anew prompted me to plan new blogposts, especially about full-disk-encryption and my NixOps setup. These will follow in the future.
So long and thanks for all the fish.
]]>Since the middle of June things gradually change for me. I am in psychiatry again, but the outlook is pretty good. I’m getting new medication, which replaces the cocktail I formerly got. This means less side effects and this new meds seem to be really working. I feel more energetic than I felt for a long time, probably years.
I am looking forward to leaving the clinic, yet I still feel anxious about how life will go on. I deeply hope the positive effects prevail and I can continue my apprenticeship as energetically as I feel at the moment.
Other positive effects of my stay here is, that I finally found the time to learn to draw with classical media and I stuck with aquarel colors, because they work well in my mind. But their outcome is sometimes a bit unpreditable, especially when applying “wet” techniques. I’ll probably have some off my pictures I made in clinic scanned and will post them on my deviantart account. I should generally post more stuff there. As well as here.
With all that being said, I hope you all are well, too.
]]>As some of you might know, I struggle with depression. The last few months have been very hard for me, as my illness gets more active and unpredictable due to stress. And I feel more and more like I’m losing ground. Things I enjoyed doing in the past don’t appeal to me anymore. I have trouble maintaining my sleep schedule. Everyday tasks are harder and harder to make and my thoughts venture more and more into darker places. These all and more are warning signs for a very serious depressive episode.
It feels like nothing really changes. Every time I’m in clinical treatment, most recently in november, new problems become visible, but none of my complications ever get resolved. I’m on medication, which messes with my brain and has tons of side effects and yet it only keeps me barely functioning.
I feel like a burden. Both socially on my friends and family but also on society as a whole. I don’t dare to speak to my friends too much anymore, to not drag them down. Everyone has enough of his own problems. And somehow everyone gets his or her things done, except for me. I am useless.
]]>With this change you can now build my latest game attempt “tracer” without having to handle a sandbox or similar.
]]>As I am busy with my apprenticeship, which started four weeks ago, I don’t get to code so much lately. I am all the more pleased about the outcome of my latest coding sprint: An Agent System.
In detail this means, that all the NPCs in my game have stats like hunger, thirst or attention and thus have needs, which have to be fulfilled. And this they do themselves, given there is a possibility to do so in the current map. There are toilets, watercoolers and other things present in the game assets, but the maps are generated randomly, so if they can’t find a way to fulfill their need, they go to the elevator.
This also means, that the NPCs don’t walk around randomly, or at least by default, but walk to targets according to the needs they have.
I also am starting to prepare my talk I’m giving at Datenspuren. I’m always thankful for input about what you would like to know. You can leave it here in the comments or use other means of communication.
See you soon!
]]>I also now have loading screens, which were a little trickier than I thought in the beginning. My problems boiled down to the fact, that if I have another thread, which wants to do some actions with OpenGL, it needs to have its own context and context sharing has to be enabled.
My biggest breakthrough I achieved just today: Interactable objects. Until now you could move around the map and test out collision between the player and his surroundings, but not more. Now you can move up to any copier and activate it with a right click when you stand right in front of it and look in the right direction. For now this just changes the animation, that is played, but it’s a start. Here is a small screencap I made of the whole process:
The copier itself is also an interesting. because it is animated, it does not reside in the Matrix where all the walls, tables and boxes are. It resides like allother animated things (e.g.: the player and the NPCs) inside the Entity Component System, but it still has collision boundaries, which are respected by the player and the NPCs. That took me some time to figure out, how to do this.
I am also preparing a possibility to have the game’s solution generated procedurally. Graph theory for the win!
I already have submitted my talk to the “Datenspuren” event and hope it will get accepted.
See you (hopefully) soon.
]]>The floors still exist, but are not as colourful as they used to be. The floor is now uniformly white, because I have no proper texture for the floor, but I added some furniture. For now it’s just tables and some cardboard boxes, but there will be more. There is also sanity checking when placing furniture. Everything that needs to be accessed is reachable.
I reworked the collision system, which used to be tile based. This was good for the beginning and easy to implement, but I soon realized, that I needed something more complex. So instead of checking if a tile can be walked upon, there are now boundaries within a tile, based upon the object existing on that tile, where the player can’t walk. This took me a whole lot of time getting it to work properly. I had several instances, where the player could glitch through walls under certain circumstances.
My biggest breakthrough though I finished just today. I have laid the foundation for NPCs. For now they don’t have any real appearance, they are just displayed as red dots (the player is also just a cyan coloured dot). For now they just walk around randomly between tables, where they stay some random time. Again I fell, that the Entity Component System is a very powerful tool here. I suspect that my former game projects failed partly because of the lack of this tool.
This is how it looks now:
Unfortunately you don’t get to see the dots moving on a still image, but you can get an impression.
seeya!
]]>Two days ago I just installed NixOS on my laptop out of the blue. Now I’m trying to get my programming projects to build and work again. On may way to accomplish this, I learned a lot about the system and its configuration.
Overall I must say, that I am quite pleased with the outcome. It is a fairly usable system, which holds some cool advantages for me as a Haskell developer over my old Debian system setup. Te biggest one is, That I can scrap all cabal sandboxes from all my projects and hand the management of the right dependency versions over to Nix.
What I want to share is a small snippet of a nix expression, that lets you
include local dependencies to your Haskell project’s nix shell (like you would
do with cabal sandbox add-source
.
First you need to create a nix shell configuration. There is a handy tool called
cabal2nix
which you can install simply by invoking
nix-env -iA nixos.cabal2nix
. This is the main work horse for converting any
Haskell package to nix and it does its job very well.
To build your Nix shell configuration you call cabal2nix --shell . > shell.nix
from your project directory. This generates the file shell.nix
for you. Check
it for any errors. If you want to use a local package, you can add its
definition to the shell.nix
file. To get the definition of that package, you
can again use cabal2nix
. Simply invoke cabal2nix file://<path to Package>
and
copy the resulting block into the let
block of your existing shell.nix
like this:
<packageName> = with haskellPackages; callPackage (
<packageDefinition>
) {};
Where <packageName>
is the variable name for the package inside this Nix
expression. <packagDefinition>
is the package definition of the local package
we just obtained from cabal2nix
. Then delete the original package name form
the arguments of the f
function in the let block of the Nix expression.
Finally align everything to look nicely, and save the file. To see an example of
that, you can look at the
Nix expression of my latest game project.
To test your setup, just invoke nix-shell shell.nix
and watch the system build
a temporary environment for your project and give you a shell to it, if
everything went well. Now all dependencies of your project, including your local
ones are installed in this environment, so you only need to invoke
cabal build
.
I hope You find this snippet of my Nix experience helpful, it sure took me some time to find out.
]]>After tinkering a lot on my game engine i thought it would be nice to have some “real result”, to be able to present the product of my endeavours. I plan to make a talk at our local hacker symposium “Datenspuren” and maybe even at 35C3. As a showcase I want to present a game that is more than just a simple clone of an existing game. I already have that. No. I want an original game.
What I came up with is a game, where you play as an intruder infiltrating a company with your main task being getting a copy of their database. But you have to path your way through their multi-floor building seeking clues and data traces how to access the next floor and ultimately the server room.
For this I am starting a devlog, to show my progress as I keep on developing the game.
So far I have my engine affection as my foundation, for drawing I use NanoVG-bindings and as something new to me, I am using an entity-component-system called ecstasy. For now I have spent the last month or so figuring out, how to procedurally generate sane floors for the building and how to use the entity-component-system. So far, the whole thing looks like this:
Pretty neat, isn’t it?
That’s all for now. See you soon!
PS:
I totally forgot to tell you, where you can find the code for my game. It is hosted on my Github profile. Have fun reading it.
]]>The whole problem boils down to an incompatibility between unprivileged LXC Containers and systemd. Thanks a lot for breaking our stuff.
But now everything is fine, my site is runnning again and so is eidolon.
]]>During that time I was also programming a lot, especially on my game engine and example games, or technical demos, for said engine. I do game development in Haskell. For fun.
Why game development? Why in Haskell? These are questions I regularly hear from people, when they get to know me and what I do. Somehow There seems to be a notion, that game development is not real development and that Haskell is either an unfit or even impossible choice for that. Both notions are not true. Game development is a very complex matter (You’re doing real time Simulations of a world) and Haskell is very fit for the Job. I could be seeing results faster in different languages, but that’s not the languages fault. I have to write a lot of the tooling myself, which slows me down. But it’s a great learning experience.
But why do I do that? Well, I like creating and developing worlds. You can see that in my writing section. But writing sometimes is limited when it comes to interaction with the world. In games the player usually can explore the world to a deeper level. The immersion is different.
That’s what I always liked about the games I played. They let me escape to a different world and go on my own adventures. In RPGs I could take on the role of a brave adventurer, in RTS games I could lead a faction to victory on the battlefield. Those are the game genres I mostly played.
Nowadays I play less and less, but I do more game development. At the current stage my knowledge and tooling do not suffice for the kind of game I have in my mind for quite some time, so I try to take smaller steps. But ultimately I bring my escapism of past days to a new level. Now I don’t escape into virtual worlds created by others, but I am in the process of creating them myself. Sometimes it’s a frustrating experience, but sometimes it’s awesome.
For those of you interested in my games, I can show you at this point only haskelloids. Not the most original name, but It’s the first real game that runs on my own engine, which you can find in its own Github repo, together with some small example programs.
]]>Ich weiß, ich habe mir fest vorgenommen mindestens einmal im Monat etwas sinnvolles hier zu schreiben, aber es fällt mir zunehmend schwer. Ich weiß nicht so recht, worüber oder was ich schreiben soll. Gleichzeitig will ich mich nicht zu sehr unter Druck setzen, da dann erst recht nichts bei rauskommt. Und so sitze ich da im Zwiespalt zwischen schreiben wollen und nicht können.
Entschuldigend könnte man sagen, dass ich in den letzten zwei Monaten mit Reha ziemlich viel um die Ohren hatte und das darunter meine Freizeitprojekte etwas leiden. Aber da ich schon länger nichts mehr kreativ geschrieben habe, vermute ich etwas anderes dahinter.
Ich bin ratlos, was ich machen soll und weiß nicht einmal, an wen ich mich in solchen Situationen wenden kann. Es fühlt sich falsch an jetzt einfach alles hinzuschmeißen, weil ich nicht weiterkomme. Dazu habe ich mich viel zu lange schon mit dem Thema beschäftigt und auch langfristige Projekte angefangen.
Ich könnte wirklich etwas Rat gebrauchen.
]]>First of all I had a relapse. One of the ugly kind, but I somehow managed to get out of it, thanks to the people around me. But from what these people tell me I seem to get better at handling these situations, which is kind of nice. I took a small vacation staying with some friends in the countryside for a week. There I took a step forward in a project of mine. Some of you might know, that I want to build my own tent for various purposes. One is, to finally have a tent (yay!), the second is to have a tent to take with me on hacker camps and the third and most difficult task is to have a tent fit for LARPing. I have a plan, so I could buy some pure cotton canvas very cheaply directly from a weaving mill. Now I have to come up with a way to build the struts, before I can get to sewing. But don’t get the impression I was in any way productive during the vacation. I was mostly lazily lying around.
After that vacation and spending some time at home again more or less successfully managing to keep up my daily schedule I got a call from my vocational rehab I applied for. They wanted to take me in prematurely, because someone else somehow didn’t show up. Because I had nothing better to do I agreed to take the opening one month before my scheduled start. So now I’m in my third week of attending this rehab. I was pretty overwhelmed in the beginning because of all the testing they ran on me, like another IQ-Test and some testing of my motor skills. Now I’m getting accustomed to the new schedule and to being pretty exhausted at the end of the day from doing menial tasks aimed for testing my capacities in certain fields. For now I have been doing tasks in administration and economy, which is not really the most interesting field and definitely not the field I want to work in the future, but the more interesting fields like design or electronics and computer science will follow. I am looking forward to these. But because of this I had to tone down on my other activities like coding or writing. I am simply too exhausted when I come home. But I managed to get my piano up and running again, which I haven’t touched for at least a year, so I can relax with playing a little music.
Progress feels good.
]]>Zehn
Ich haste durch die Bahnhofshalle und verzweifelt halte ich Ausschau nach einem
freien Fahrkartenautomaten. Hinter mir zerre ich meine beiden schweren Koffer
her, in einem meine Kleidung und Reiseutensilien, in dem anderen das Paket.
Vor allen anderen Automaten stehen Menschen, zumeist Touristen, in langen
Schlangen an. Viel Zeit bleibt mir nicht mehr. Ich hätte gerne mehr Vorbereitung
gehabt, aber der Anruf meiner Mutter kam überraschend. Ich verlasse die
Bahnhofshalle und begebe mich in die
verschlungenen Gänge des Bahnhofs. Erst als ich an den Schränken der
Gepäckaufbewahrung vorüber gehe, sehe ich in einer dunklen Ecke einen einsamen
Fahrkartenautomaten stehen. Die Ecke ist dunkel, die Leuchtstoffröhre, die für
Licht sorgen sollte, flackert nur in unregelmäßigen Abständen mal auf und der
Automat ist mit diversen Lackstiften und Permanentmarkern verunstaltet worden,
sodass ich mich eigentlich nicht traue ihn zu bedienen, aber eine kurze
Erinnerung an die übervolle Bahnhofshalle lässt mein Zögern dahinschmelzen.
Derjenige, der den Fahrkartenautomaten verunstaltet hatte, muss wohl ein
ziemlicher Kartenspiel-Narr gewesen sein, denn überall auf dem Automaten sind
Spielkarten aufgemalt, doch alle sind sie von der Farbe Pik.
Ich bin gerade dabei an dem verkrusteten Automaten meine Fahrkarte zu Ziehen, da
krächzt eine weibliche Stimme aus dem schief hängenden Lautsprecher.
“Der IC nach Berlin fährt heute außerplanmäßig von Gleis Neun.”
Flehentlich schaue ich auf das glimmende Licht des Ausgabeschachtes am
Automaten, dass er doch endlich meine Fahrkarte ausspucken möge. Ich muss zum
Gleis 9, am anderen Ende des Bahnhofs, und habe nur noch wenig Zeit. Innerlich
verfluche ich mich selbst, dass ich mich in die Machenschaften meiner Mutter
habe mit hineinziehen lassen. Ich weiß noch nicht mal, was ich in meinem Koffer
habe, aber ich weiß, dass es die Polizei auch nicht wissen sollte.
Endlich flattert die Fahrkarte auf den Boden des Ausgabeschachtes. Ohne zu
zögern greife ich danach und verlasse die unheimliche Ecke des Bahnhofs, noch
bevor mir der Automat eine gute Reise wünschen kann. Ich haste durch den langen
Gang unterhalb der Gleise und durch die Bahnhofshalle, bis ich mein Gleis
erreiche. Ohne zu zögern springe ich in den Zug und kurz nachdem sich die Türen
hinter mir schließen, geht ein Ruck durch den Wagen und langsam setzt er sich in
Bewegung. Langsam manövriere ich mich im Zug vorwärts um an einen Sitzplatz zu
kommen, aber sobald ich in das Innere des Wagens trete, zerfallen meine
Hoffnungen. Alle Sitzplätze sind besetzt und im Gang stehen schon Leute, die,
wie ich, keinen Sitzplatz gefunden haben. Umständlich drehe ich mich mit meinem
schweren Gepäck um, wobei ich meinen Koffer einem besonders breitbeinig
dasitzenden jungen Mann unabsichtlich ins Knie ramme. Dieser entrüstet sich
“Mensch, geben sie mal Acht!”.
Ich entschuldige mich hastig und verlasse so schnell es geht den Ort des Geschehens. Ich irre weiter durch den Zug bis ich erst nach einiger Zeit einen freien Sitzplatz finde, der auch nicht reserviert ist. Bevor ich mich erschöpft auf den Sitzplatz fallen lasse, verstaue ich meine Sieben Sachen in der Gepäckablage. Der Wagen ist etwas leerer als die anderen, dafür aber lauter. Familien fahren mit ihren Kindern wohl in den Urlaub und es wird gelacht, gespielt und im Gang hin und her gerannt. Dabei bleibt ein kleines Mädchen unvermittelt an meinem Platz stehen und kräht mir mit lauter Stimme “Sieben!” entgegen, bevor sie weiter ihren Spielkameraden lachend hinterherläuft.
Ich versuche es mir so gut es geht auf meinem Sitzplatz gemütlich zu machen. Ich ziehe die Jacke aus und rolle sie zu einem behelfsmäßigen Kopfkissen zusammen. Viel anderes als schlafen bleibt mir nicht übrig, denn mich erwarten sechs Stunden Fahrt und in meiner Eile habe ich vergessen mir eine passende Beschäftigung, wie ein Buch, einzupacken. Ich lehne an der Wand des Wagens und lausche dem monotonen Rattern des Zuges und betrachtete abwesend die Schrauben, die den Klapptisch am Sitz vor mir halten. Es sind sechs.
Während ich dasitze und meine Augenlider immer schwerer werden höre ich ein Flattern wie vom Schlagen vieler Flügel. Draußen vor dem Fenster wird es schlagartig dunkel, der Lärm im Zugwagen verstummt und auch der Zug scheint auf wundersame Art angehalten zu haben. Ich stehe auf, und schaue mich im Wagen um. Er ist Leer. Wo eben noch spielende Kinder waren, ist nun niemand. Ich gehe fünf Sitzreihen vor und versuche irgendjemanden zu finden, doch es ist niemand da. Der Wagen bleibt leer, geradezu klinisch rein. Plötzlich öffnen sich die Türen und fünf Raben fliegen laut krächzend herein und kreisen über meinem Kopf. Doch ihr krächzen ist sonderbar. Jedes einzelne klingt wie ein verzerrtes “Fünf!”
Ich versuche wegzurennen, doch meine Füße stecken fest. Ich bin mittlerweile bis zu meinen Knöcheln im Boden eingesunken und sinke rasch weiter ein. Schon stecke ich bis zu den Knien im Boden, da schaue ich auf zu den Raben, welche weiter hämisch krächzen. Sie kreisen zu viert über meinem Kopf, während der Fünfte in der Mitte des Kreises flattert und sich mit dem Schnabel vier Federn ausreißt und zu Boden fallen lässt. Doch noch bevor Sie den Boden erreichen verwandeln sie sich Spielkarten. Vier Pik-Asse liegen vor mir auf dem Boden, in welchen ich weiter einsinke. Ich bäume mich weiter auf, doch ich versinke weiter im Boden, Ich bin schon bis zur Brust eingesunken und habe Schwierigkeiten beim Atmen.
Ein Finger bohrt sich dreimal unsanft in meine Schulter. Ich schrecke hoch. Ich war eingeschlafen und hatte alles nur geträumt. “Zum dritten Mal: Die Fahrkarte bitte” sagt der Schaffner ungeduldig, welcher mit gezückter Stempelzange neben meinem Sitzplatz steht. Ich nestele in meinem Jackett nach der Fahrkarte und reiche sie ihm. Misstrauisch kontrolliert er sie und obwohl ich mir sicher bin, dass alles mit ihr in Ordnung ist, verspüre ich Erleichterung, als der Schaffner sie schließlich abstempelt.
Die restlichen zwei Stunden der Fahrt vergehen ereignislos, doch wage ich es nicht wieder einzuschlafen aus Angst vor weiteren Albträumen. Ich komme am Berliner Hauptbahnhof auf dem zweiten Gleis an. Ich steige aus mit meinem schweren Gepäck und gehe zum Ausgang. Während ich gehe, fühle ich mein Handy vibrieren. Ich halte an und schaue aufs Display. Zwei verpasste Anrufe. Beide von meiner Mutter. Mich überkommt Übelkeit, während ich ihre Nummer wähle. Mit zuckersüßer Stimme begrüßt sie mich am Telefon, doch ohne lange Umschweife kommt sie auf ihr eigentliches Begehr. “Hast du die beiden Pakete, um die ich dich gebeten habe?” fragt sie weiter mit zuckersüßer Stimme. Mutters Pakete. Dinge die sie bei mir deponiert, damit sie das Amt nicht mitbekommt. “Ich habe nur eines mit. Ich wusste nicht, dass ich beide mitbringen sollte.” Sage ich wahrheitsgemäß während ich den Bahnhof verlasse.
“Nie kannst du ein einziges Mal eine Sache richtig machen!” schreit mich meine Mutter aufgebracht vom anderen Ende der Telefonleitung an, während ich die Straße überquere, “Ich bitte dich nur im eine Sache und du musst es ja vergessen. Du hast deinen Kopf nur, damit es dir nicht in den Hals hineinregnet!” führt sie weiter aus. Es folgen weitere wüste Beschimpfungen, doch ich höre gar nicht mehr hin. Ein Kratzen innerhalb meines linken Ärmels lenkt mich plötzlich ab. Aus dem Augenwinkel sehe ich, wie eine einzelne Spielkarte aus meinem Ärmel fällt, zu Boden flattert und mit der Rückseite nach oben liegen bleibt. Abwesend bücke ich mich, hebe die Karte auf und drehe sie um. Ein einzelnes Symbol prangt mir entgegen. Es ist ein Pik-Ass. Ich nehme nur noch ein lautes Hupen wahr und ein Paar heller Scheinwerfer, die auf mich zurasen.
Null
First off: If you need to use OTF fonts in LaTeX documents, you can simply
switch to XeLaTeX or LuaLaTeX, like I did in the first place. Both of these
environments support the package fontspec
, which makes using fonts installed
in your system extremely easy. So if you can, switch the environment.
If you can’t switch the environment, don’t want to, feel a little adventurous or even want to feel some of the innards of LaTeX you can choose the path I am about to show.
Before you can start, you need to install the LCDF typetools, which is
a set of tools for manipulating the font definitions of LaTeX. Most GNU/Linux
distributions have them in their repositories, Mac users can install them
through homebrew and even Windows binaries are available on the website.
Additionally make sure, that you use updmap
in system mode and have root
privileges.
To create the font mappings from the OTF, you simply run
sudo otftotfm -a <fontfile> --vendor <vendor> --typeface <typeface> -e texnansx
Where you replace the items in the angle brackets. This not only produces the
mappings, but also places them in the right directory. (If otftotfm
complains
because of updmap
, run the updmap
commands in the error messages as
updmap-sys
.)
Before you can actually use the Font, you have to write your own font
definition. A small template for this follows, which should be saved as
T1<typeface>.df
\ProvidesFile{T1<fontname>.fd}
[YYYY/mm/dd foobar]\DeclareFontFamily{T1}{<fontname>}{}
\DeclareFontShape{T1}{<fontname>}{m}{n} {<-> <fontface> } {}
\endinput
Here you can define <fontname>
as you wish, the other elements in angle
brackets correspond to the box above.
To actually use it, you can call
\renewcommand*{\familydefault}{<fontname>}
from your document to change the font in the whole document, assuming the
T1<fontname>.fd
is in your project folder, or call
\fontfamily{<fontname>}\fontseries{m}\fontshape{n}
Lorem ipsum {\selectfont dolor sit} amet
to change the font only for “dolor sit” in this example.
There are tons of other options how to handle fonts in LaTeX, but this is the most convenient one I found.
]]>In my free time I am still pursuing my projects and starting new ones. For example: My Game Engine makes progress so far, that I am now implementing physics. It’s still in testing and doesn’t work always right, but the tests look promising.
My book also does some progress. I actually managed to make it some kind of habit to work on it at least on sundays. I usually meet with my older brother and we discuss things related to writing, while we both work on our books. It’s cool to exchange Ideas this way and ask for an opinion, when one of us is stuck.
That’s about it. see you soon.
]]>I have been an intern at a local tech company for the past few weeks, where I mostly write documentation, but also help with other stuff. I work only 20 hours a week, so I don’t overexert myself too much. I’m still not at all well. I really enjoy my job there, it’s definitely better than sitting at home and slowly sink back into depression again.
But still there is some frustration in it. I still remember how I was before and now some of these qualities have not come back (yet). My concentration got better, thanks to the job and the programming I still do. I may have arrived at the beginning of the “valley of despair” with Haskell. My projects don’t progress with the speed i would like them to progress and the complexity is sometimes a little overwhelming. I have the impression that I pretty much suck at this language, yet still I don’t want to give it up.
Writer’s block is also still there, but sometimes I get a little hint of an idea I immediately put down. I’m trying to get a regular schedule for writing or at least writing exercises. I am also looking for writing group in my area, but there seems seems to be nothing around my area.
That’s about it. A short update about my life.
]]>Because I have been doing it a lot recently in this project, I would like to make public the method of profiling I use.
first of all, you will need the profiling libraries for Haskell, which in Debian
you can find in the ghc-prof
package.
Next you need to enable profiling in your build environment. You can do this either globally or per-package. If you want to enable it globally, you just need to add
profiling: True
to your ~/.cabal/config
file.
If you want to enable it per-package, you need to add the same line to a
cabal.config
in your projects root directory (The same directory your
*.cabal
file is located.
When enabling profiling, it might happen, that you need to reinstall a whole lot of packages. Sandboxing your project might be a good idea.
Recompiling your projects with profiling options should be easy. Just invoke
cabal build
.
After your build succeeded, you can start profiling your executables by
path/to/executable +RTS -hc
Your executable will run as expected, you can try it out and everything. When
your application terminates, it produces an file ending with .hp
, containing
your profiling information. Its content is rather cryptic, but that doesn’t
matter. There are tools even for that. You can try running
hp2ps -c executable.hp
where executable
is the name of your executable. This produces a .ps
file,
a simple postscript file, that you can open with your PDF-viewer. You will see
a graph showing memory allocation per function, which might lead you to memory
leaks or similar problems.
If you want to profile your executable by datatype memory allocation, just run
the profiling command (the one with the +RTS
) and write -hy
instead of -hc
.
I hope this helps you out hunting your bugs, it sure helped me a lot.
]]>“Come, we have to go on”
said Ari as he reached out to his younger brother Kfir.
Kfir stood up after he had stumbled in the searing hot sand of the
desert.
“It’s been days. Do you think they still pursue us?”
asked Kfir.
“I don’t know, but I don’t want to find out either.”
his brother responded with a strange look on his face.
They were fleeing from the red tower – the place where they had been
held since their village had been attacked by men with strange dark skin
colour and only barely speaking their tongue. Since then they had never
seen anyone from their village again. They had been kept in hot dungeons
stinking of filth and decay with just barely enough to eat and drink.
Every day, people had been taken away from the dungeon, never to return.
Ari had tricked the guards into opening the door so they could escape
their uncertain fate into the desert.
“Ari, I’m thirsty”
“Please don’t complain. I’m thirsty, too. You know just as well as I,
that one apple is all that we have left.”
After that Kfir fell silent. He was too tired to argue and about to lose
all hope. For days, he and his brother had been following the stars at
night. Stars which, some of them, they have never seen before.
Kfir stumped weakly after his brother through the sand when he suddenly
bumped into him.
“Do you hear that?”
Ari asked.
There was a hissing sound in the distance. They looked up into the blue,
cloudless sky to see where it came from. They saw something falling
down. With a loud thud, it dropped into a dune in the distance.
Curiosity befell Kfir. He began to run to the place where the object was
glimmering in the sand. Ari shouted something, but Kfir didn’t listen.
He ran and ran until he reached the small crater in the sand. There it
was. A large, white egg with a visible crack in its shell. Ari arrived
just as Kfir was about to slide down the slope of the crater towards the
egg.
“Wait. We don’t know what it is.”
he said, but that didn’t stop Kfir.
Kfir slid down to the egg and examined it. It was colder than the
surrounding sand with a very smooth surface, which glistened with all
colors of the rainbow. Carefully he knocked on the shell. Suddenly,
there came a loud wailing noise from the egg and Kfir backed off in
surprise. Ari came sliding down the slope.
“What was that?”
he asked with an alarmed voice.
“I think there is something inside the egg.”
Kfir responded and gave the shell another knock. Another heartbreaking
sound came from it. He dug his fingernails into the crack in the shell
and tried to pry it open but to no avail.
“What are you doing? We don’t know what’s inside. What if it’s
hostile?”
Ari interjected.
“You mean more hostile than this desert?”
asked Kfir with bitterness in his voice. He heard his brother breathing
in as if to prepare for a response, but he remained silent in the end.
Instead, Ari kneeled down to the egg and helped Kfir try to open the
egg, but even with their strengths combined, they did not succeed in
prying the egg open. During their attempts the creature inside the egg
kept on wailing, but each time it seemed increasingly faint.
Ari stood up while Kfir was still trying to open the egg.
“We need a tool to open this.”
he said and tapped gently on his brother’s back.
“Look, there are some cliffs over there. If we carry the egg over there,
we can open it with a rock.”
he continued.
Together they picked up the egg. It was still surprisingly chilly and a
lot heavier than it looked. With every shock while carrying the egg the
creature in it let out a small howl and each of these howls stirred a
feeling of compassion in Kfir. He was fighting back his tears by the
time they arrived at the cliffs of red rock. Gently, they lowered the
egg into the sand, grabbed some sharp rocks and hacked at the shell on
the spots already weakened with cracks.
“Hold on just a little longer, we’re nearly finished”
Kfir whispered silently with a soothing voice, unsure whether he tried
to calm himself or the creature inside the egg. They continued until
finally the eggshell broke in half and out of it emerged, with a joyful
purr, a colourful turtle. Its skin was of a dark grey colour, but the
scales on its shell shone in bright colours, each of them in a different
colour. Both brothers sighed with relief, when they heard the turtle’s
soft purr. Kfir slowly approached the turtle and carefully caressed its
head. The turtle responded by closing its eyes and purring again.
“See? It’s not hostile at all”
triumphed Kfir with a laugh.
The turtle backed off slightly and, with a soft hum, lifted itself in
the air and floated slowly in Ari’s direction. It startled to nibble on
the pouch he carried on his belt. Both brothers gasped audibly. They had
never seen anything like this.
“Hey! Back off!”
shouted Ari after he recovered from his shock, He shoved the turtle
gently from his pouch. The turtle backed off slowly with a growl. Kfir’s
stomach rumbled.
“I’m hungry, too”
“This is all we have left, Kfir. We can’t just waste it.”
“I didn’t say to give the turtle the whole apple. We could at least
share it.”
argued Kfir.
Ari sighed and shook his head.
“Let’s at least go into the shade”
he said and went closer to the cliffs. Kfir followed with the turtle.
Once they arrived in the shadows of the ragged cliffs Ari took the
shriveled apple out and broke it into pieces. He gave two to his brother
and resorted to eating the smallest one himself. Kfir delightedly chewed
his part of the apple while feeding the other part to the turtle, which
rested purring on his lap.
After finishing their meagre meal they remained in the shadow of the
cliffs for the remainder of the day. Kfir spent most of the time
sleeping and the turtle did not leave his side. Ari also found the time
to catch some sleep.
As soon as the setting sun touched the horizon a deep rumble shook the
cliffs. The stones began to move and the sand began to shift. Great
black claws emerged from the sand and tried to grab the brothers. They
managed to evade each of the attacks, but could not escape because of
the shaking ground. Ari grabbed Kfir by the waist and tried jumping off
the cliffs. He succeeded to jump down to where the sand had shifted
away, just to see that under the claws waited a giant orifice full of
sharp teeth. Two yellow protruding eyes leered maliciously at the
brothers. The sand was still shifting and dragging them towards their
certain doom, when with a howling sound the turtle came floating down.
The brothers grabbed the turtle by its shell and the turtle started
lifting them out of the danger. Just as they were about to get away,
another claw emerged from the sand and grabbed Ari by the leg.
“You go on without me! It can’t lift us both!”
Ari shouted over the roaring of the shifting sand and rumbling rocks. He
let go of the turtles shell. Kfir reached out. He wanted his brother to
live. He missed Ari’s hand by just a small distance.
With tears in his eyes Kfir looked back and watched as his brother was
dragged towards the maw. He struggled against the grip of the mighty
black claw holding his leg, but he was mercilessly dragged inside the
orifice of the giant crab and crushed by its mighty mandibles. Without
Ari’s weight the turtle increased rapidly in speed and left the place of
horror with Kfir on its back.
They flew night and day until Kfir almost couldn’t hold on the turtle’s
shell any longer when a giant tree appeared on the horizon, its branches
reaching far into the clouds. As they approached he could see houses
built into the boughs and towers and gates on the outermost branches.
Giant birds transporting people and goods on large saddles filled the
air around the tree coming to the gates and leaving in the distance.
Kfir directed the turtle gently towards the nearest gate, where they
landed safely. His legs were weak so he stumbled more than he walked
towards the gate followed by the turtle which floated in midair.
Just before before Kfir could cross the gate and enter the city, he
heard a sharp call.
“Halt! Who are you and what is your desire in Oulian?”
Guards emerged from both sides of the gate. He was too tired and worn
out to respond and broke down on the spot.
“bring water and bring him to the palace!”
were the last words he heard, before his mind turned blank.
Kfir woke up in a warm and comfortable bed. He sat up and looked around.
The room he was in was gorgeous. Beautiful paintings covered the walls
and the furniture was of unparalleled craftsmanship. He had been washed
and wore clean clothes with a flowery scent. Beside his bed on a small
table rested a carafe full of water. He immediately grabbed it and
emptied it in no time. He had been thirsty beyond measure. As he stood
up he heard a familiar purring sound. The turtle lay on a cushion beside
his bed and lifted itself in the air as soon as it saw him. Softly the
turtle nudged Kfir and he began caressing its head when suddenly the
door opened and a young woman entered the room.
“Thanks to the tree, you are awake.”
She exclaimed with joy.
“Where am I?”
Kfir asked. It was not his first time waking up in an unknown room, but
this time it at least seemed a lot nicer than in the red tower.
“You are in Oulian Palace, residence of King Bialden. His highness wants
to see you and your turtle. My name, by the way, is Issajana.”
she answered, opened the door again and beckoned him out of the room.
Kfir followed her through the corridors of the palace. They were of
breathtaking beauty. He stopped at a large window for a while and looked
outside. The palace was at the center of the treetop. Outside was a
great bustle with birds flying to and fro carrying all kinds of things
and people. The roads on the large branches of the tree ware also very
lively with merchant stands and people.
He followed Issajana deeper into the palace, until they finally entered
a large hall. It was decorated with the finest paintings of the whole
palace and on the floor were excellent rugs. On a platform in the middle
of the room stood a single throne. Soft flute music was playing in the
background. They entered the hall until they stood before the throne.
The king sitting on the throne was a frail old man, looking sickly with
his pale skin.
“This is the mysterious foreigner, I presume”
said the king with a soft voice.
“What is your name, boy?”
He asked scrutinizing Kfir.
“My name is Kfir, your highness.”
“Do you know what kind of animal you have as company?”
The king inquired further.
“It’s a floating turtle. I don’t know what it’s called.”
Kfir answered. He was surprised about the king’s interest in the
animal.
“This animal is called a ‘Cloud Glider’ and is believed to be extinct.
It is said its tears can heal any wound and illness.”
The king explained with a sigh.
“You see, I am very ill and my healers are unable to help me. It is a
strange whim of fate for you and your companion to arrive at the gates
of my city. Would you allow your companion to heal me and receive my
eternal gratitude?”
Kfir looked at the turtle and the turtle looked back. It seemed that it
had understood the whole conversation and nodded slightly.
“I will allow it, but I have a condition. I want to erect a tombstone
for my brother, who sacrificed his life to save ours.”
The king didn’t need long to consider this offer.
“I agree. You will be given a spot on the palace grounds and the
services of my master mason for your tombstone. Your brother’s bravery
has to be remembered.”
As the king finished, the turtle purred softly and floated towards him.
A single teardrop rolled down the turtle’s cheek and fell onto the
king’s open hand, where it landed as a clear little gem.
“I thank you so much. I will have everything arranged for you. Be my
guest in the meantime.”
said the king, still looking at the little gem in his hand.
In the next days Kfir spent time with the king’s mason, who made a great
tombstone of marvellous artisanship for Ari. With finally a place to
mourn for his brother, Kfir arranged a symbolic funeral for him.
The king grew fond of Kfir in the time he recovered from his illness and
endowed him a small house in his city.
As the years went on, Kfir spent time looking for his native village on
the back of his cloud glider he named Anani, but he never found his
village nor the red tower and with the years passing he spent more and
more time in Oulian until the death of king Bialden, who, being
childless his whole life, named Kfir his successor.
I am not getting anywhere.
I suspect I have a writer’s block.
A writer’s block is that strange state which I perceive as the inability to come up with Ideas. I stare at a blank page (more precisely a blank screen in my case) and my mind is just as blank. I look through my notes, but no new pictures form in my mind. This is extremely frustrating and the longer it lasts the more I doubt that my work is good enough to be published one day.
I’m trying not to put myself under too much pressure because of this, but it’s not easy. I always tend to compare myself with times before. When I was at the beginning, I had tons of ideas around and was barely fast enough to put them all down. I suspect that I even missed a great portion of them.
To make things worse, I have not yet managed to make my writing a habit, which might be beneficial to my case. I only wrote occasionally and for about 3 months I did not write at all.
I don’t like the idea of abandoning my project even temporarily. I just like the world and the people I created too much. It would feel like betraying them.
I don’t know what to do.
]]>Congress was a new experience for me and sometimes a difficult one. I still don’t handle large crowds very well. Luckily I had some kind of place of retreat at the assembly table of our hackerspace.
My problem with large crowds made it hard to visit many talks, but luckily I will be able to watch them on http://media.ccc.de thanks to the great work of the VOC team. At least I got to socialise a little with people I usually don’t meet due to geographical circumstances.
With me usually spending much time at the assembly table I indulged into programming Haskell. I wanted to see how much my project of the past few months, my game engine Affection, has grown into a usable state. I implemented a game similar to Asteroids called “Haskelloids”, whose code base can be seen on Github. It is basically playable, but I’m still in the process of refining it further. Not only the game, but also the engine are still rough at the edges.
Unfortunately I didn’t dare to make many photos at congress, but when I have my films developed I’ll upload what I have.
]]>There is still one thing I’m looking forward to this year. It’s congress time!
This year I will be attending the Chaos Communication Congress for my first time. I’m afraid of it and still I can’t wait to be there at the same time. There’s lots of people I want to meet and tons of events I want to attend. I already got my camera equipment up and running again, so I hope shortly after the event I will be able to post some impressions on Eidolon.
At congress I will also have my hacker passports with me, so you can look for me or call me at congress DECT 6350 if you want one.
After congress the next year will get interesting. If all works out right, I will start a vocational preparation after my long stay in clinic. I got released just recently, with the outlook of having to attend therapy for quite a long time.
In closing I wish you all pleasant holidays, we’ll see each other at congress or next year.
]]>Paired with my frustration is fatigue. I’m constantly tired. I can sleep almost anywhere. I will be having a polysomnography next month because of that. I dread this appointment. I don’t like being all wired up.
]]>The reason why I even started making this passport was, that I haven’t found any source files of existing hacker passports editable with free software. So I started making my own. I used Inkscape and GIMP for images and Scribus for layouting the passport. The result can be seen here in my Github account.
The reception of the passport at the event was quite good and I hope to distribute even more of them on the Chaos Communication Congress in December.
]]>I will be quitting university at the end of this semester. I’m not glad about it and it still bugs me and fills me with uncertainty about my future, but rationally it’s the only way. I couldn’t continue studying and working at the same time to pay the bills and stay psychologically healthy. It didn’t work out for the last three years and it wouldn’t in the foreseeable future.
With the university not being available as a source of qualification, I’m now trying to get a training as IT specialist. Working on and with computers has given me a lot of enjoyment in the past years. I learned to code and how to maintain Linux systems and I loved to do this in my free time. Maybe that’s my vocation.
In parallel to my training, which will not start before next year, and until then I will need a thorough psychological treatment. I can’t bury my past as I initially wanted to. It still affects me. I need to get rid of certain automated patterns I still follow. They are not doing me good anymore. I need to work on my crappy past and what happened to me. Wounds also need to be treated properly, before you can work again.
In conclusion I would like to thank everyone who has helped me so far. I hope I can repay you in any way.
]]>I promise to post more content soon. I’m preparing something.
See ya!
]]>Three years ago I started my little experiment. I wanted to see If I could run my own website, update it regularly and run all services related to that. Turns out I can and it’s fun to do it, although I don’t have a great number of readers (it’s around 10 unique visitors per day, most of them spiders). My expectation was that I would fail somehow, most likely through loss of interest, but that has not happened and is now highly unlikely.
So if you read this post and are of fleshy nature, expect more content in this blog. I will try to post more. As always you can contact me through comments to blog post and by mail.
To round things up I will write about something I stated I would right from the beginning of this blog, but haven’t yet done. It’s about tea. I mostly drink Earl Grey tea, which I brew from loose tea. I prefer loose tea, but will also use teabags, if nothing else is available. Additionally I keep Darjeeling, Ceylon and Assam teas, but I don’t really prefer one over the others. It depends on my mood, which I brew.
I hope you had fun so far with my blog. Keep being excellent to each other!
]]>Currently I am working on Haskell bindings to the GEGL library. The motivation behind this my desire to dabble in Game development and I have the need for a library to draw on SDL Surfaces. I am obviously not really a fan of the easy solutions and I try to learn new things. Like using the Haskell FFI.
While writing the bindings I encountered the problem, that GEGL exposes variadic functions in its header which I need to interface. This poses a serious Problem for Haskell because the number of function arguments has to be constant. There is simply no way defining a function without knowing how many arguments it has and of what type each argument is. This stays true even for my solution. The only reason my solution works is that I can limit the cases how to interface these variadic functions to a manageable amount.
To build my bindings I do not use the standard FFI of Haskell, but the Haskell library
inline-c to call the C functions directly without using
rigid bindings. This is achieved in inline-c by wrapping the function call into a QuasiQuoter. As I said
earlier, this still requires you to write a QuasiQuoter for every case this function gets called, but you
don’t have to clutter your code with foreign import ccall
declarations.
For limiting your cases I recommend using a sum type as a function argument. A sum type is a type which has multiple constructors. You can have a constructor for each case you need to interface and distinguish between them using Haskell’s pattern matching. You can see an example on how to make all this in my bindings.
]]>Der Sturz war tief gewesen und die frischen blutigen Schrammen von den Wänden des Schachtes
schmerzten noch, aber wie durch ein Wunder hatte er sich nichts gebrochen.
Er brauchte eine Weile, um sich an die ihn umgebende Dunkelheit zu gewöhnen, Doch er konnte
die ganze Zeit hören. Irgendwo hoch über ihm pfiff immer noch der Sandsturm, doch hier unten
erfüllte ein beständiges metallisch schabendes Geräusch die Umgebung.
Mühsam richtete er sich auf und schaute sich angestrengt um. Wo auch immer er war, die Höhle
in die er hineingefallen war, war nicht natürlich. Ein antik aussehender Säulengang führte
tiefer in die Dunkelheit, aus der das Geräusch kam. Er setzte seinen schweren Rucksack ab und
holte aus einer Seitentasche daran seine alte und zuverlässige Taschenlampe hervor. Ein
gelblicher Lichtkegel vertrieb kurz danach die Dunkelheit und brachte verwitterte Reliefs auf
den Steinblöcken der Wände zum Vorschein. Vorsichtig Schritt er den Säulengang entlang und
hinterließ Fußabdrücke im mehligen Sand, welcher wohl Jahrhunderte unberührt geblieben war.
In einiger Entfernung mündete der Gang in einen großen Runden Raum. Anders als der Säulengang
schien dieser jedoch keineswegs aus Steinblöcken gemauert worden zu sein, sondern war tief in
den Fels gehauen. Die Wände hier waren glatt, die Reliefs scharf un deutlich sichtbar.
Auch der Boden, nur hier und da mit Sand bedeckt, war nicht gefliest, sondern mit
konzentrischen Mustern versehen.
In der Mitte des Raumes war schließlich die Quelle des Geräusches zu sehen. Auf einer Säule
ruhte in Brusthöhe eine metallische Kugel. Er traute zuerst seinen Augen nicht und schritt
näher an die Säule heran, um die Kugel genauer betrachten zu können. Im Strahl seiner
Taschenlampe blieb aber kein Zweifel. Segmente der Kugel rotierten unablässig. Er erkannte
alte Hieroglyphen auf der Oberfläche, konnte sie aber wegen der ständigen Bewegung nicht
lesen.
Neugierig umschritt er die Säule und suchte Hinweise darauf, was er durch puren Zufall hier
entdeckt hatte, doch die Säule war kahl und unverziert. Die Reliefs an den Wänden hingegen
bildeten eine Vielzahl menschlicher und menschenähnlicher Gestalten ab, unter denen er auch
vereinzelt Abbildungen antiker Götter erkannte. Wieder wandte er sich der Säule zu und schritt
nahe an sie heran. Vorsichtig streckte er seine Hand nach der fortwährend rotierenden Kugel
aus. In seinen Fingerspitzen kribbelte es förmlich vor Neugier. Schließlich berührte er die
Kugel.
Vor seinen Augen verschwammen plötzlich Lichter und Bilder, abstoßende und zugleich lockende
Laute drangen an sein Ohr und seine Haut fühlte sich an als würde sie gebraten und
gleichzeitig gefroren und sein Geist war völlig gelähmt.
Als er wieder zu sich kam, stand er im Dunkeln. Seine Hand ruhte auf einer glatten, kalten und
gekrümmten Oberfläche.
Recently I obtained a new domain name for this blog, which is nek0.cat. Some people already know this, but it was not public knowledge. I almost forgot to mention it.
This also means, that my subdomains of nek0.eu, like my gallery eidolon and the comment system yacs are also available under the new domain name as eidolon.nek0.cat and yacs.nek0.cat.
This does not mean, I am dropping my old nek0.eu domain and its subdomains. These names will stay, I just added a second domain to my assets.
]]>Laut entlud sich der Druck seines Niesanfalls in das Taschentuch, das er gerade rechtzeitig aus seiner
Hosentasche genestelt hatte. Ein scharfer Schmerz schoss ihm dabei in den Kopf, dort, wo er seine
Nasenhöhle vermutete. Der Schmerz pochte noch unangenehm in der Nase, als er das Taschentuch wieder
senkte. Seine Gedanken waren bei einer Aspirintablette, als er das Taschentuch auf dem Weg zurück zur
Arbeit am nächsten Mülleimer entsorgen wollte. Nur beiläufig warf er einen kurzen Blick darauf, bevor er
es in den Schlund des Mülleimers werfen wollte, da sah er es.
Es war ein kleines schwarzes Quadrat, das da inmitten von Rotz und Schnodder im Taschentuch klebte.
Sofort blieb er stehen. Neugier hatte ihn gepackt.
Sorgfältig betrachtete er seinen Auswurf und was darin eingebettet war. Das kleine Quadrat hatte
zu allen vier Seiten winzige silbrig glänzende Beinchen, von denen sich feine blutige Schlieren durch den
klaren Rotz zogen. Es war zweifelsohne ein Mikrochip.
Wo kam dieser her? Der konnte unmöglich schon vorher im Taschentuch gewesen sein. Das ließ nur den
Schluss zu, dass dieser in seinem Kopf gesteckt hatte. Doch wie kam er da hin und was machte er da?
Seine Gedanken drehten sich immer noch im Kreis, als er unsanft von hinten angerempelt wurde.
Dieses kleine Fragment entstand heute, kurz nachdem ich von einer Technik gelesen habe, um die Kreativität ein wenig zu üben. Es handelt sich hierbei um eine Verarbeitung eines sogenannten “Writing Prompt”. Ich habe leider keine adäquate Übersetzung für diesen Begriff gefunden.
Ein Writing Prompt ist eine kleine Idee oder Zündfunke einer Geschichte. Als Autor selber liest man sich diesen durch. Er ist selten länger als ein Satz. Danach gibt man sich 10 bis 20 Minuten Zeit, etwas daraus zu machen. Genau das habe ich gemacht und nach 15 Minuten, die ich mir gegeben habe, ist das hier herausgekommen. Es ist nicht viel und ich hatte eigentlich Ideen für mehr, aber die Zeit war um. Es ist aber sehr wohl möglich, dass ich das in eine Art Kurzgeschichte ausarbeite.
]]>Was eigentlich nicht zu diesen Dingen gehörte, sich aber durch glückliche Umstände ergab, ist die Tatsache, dass ich es wieder schaffe an meinem Buch zu arbeiten. Das habe ich seit etwa einem halben Jahr nicht geschafft, aber in den letzten Tagen habe ich einen Ratschlag befolgt und habe angefangen ein “Review” des bereits geschriebenen zu machen. Das heißt, dass ich zwar nicht unbedingt etwas neues schreibe, aber dafür das alte teilweise überarbeite, wo ich es für nötig erachte.
Tatsächlich führt das schon zu einer tiefer greifenden Umstrukturierung meines ersten Kapitels und viele Dinge werden jetzt ausführlicher beschrieben, um dem Leser ein klareres Bild des Schauplatzes und der darin befindlichen Personen und Objekte zu bieten.
Nach der langen Pause tut das Review auch gut, dass ich mich wieder in die Welt und die Handlung einfinde, denn das, was mich am meisten daran gehindert hat zu schreiben, war mein Unvermögen mir Dinge im und um das Buch bildlich vorzustellen. Das klappt jetzt glücklicherweise wieder.
Was mir auch noch auffällt, ist meine mangelnde Übung im eigentlichen Schreiben. Vieles, was ich bisher geschrieben habe, erscheint mir stilistisch ungelenk. Da fehlt mir wohl der Input anderer. Wiederum möchte ich den Inhalt meines Buches preisgeben. Dadurch bin ich wohl gezwungen Fragmente zu schreiben, die nichts oder sehr wenig mit meinem Buch zu tun haben, um sie dann (hoffentlich konstruktiven) Kritiken auszusetzen.
Es werden also in Zukunft unter dem Tag “writing” Textfragmente und kurze Geschichten veröffentlicht, bei denen ich mich sehr um konstruktive Kritiken freuen würde. Das kann in der Kommentarfunktion zu dem jeweiligen Blogeintrag erfolgen, oder über direkten Kontakt zu mir. Ich bedanke mich schon an dieser Stelle bei allen, die sich dafür die Zeit nehmen.
]]>This doesn’t mean that I view this game as the pinnacle of role playing games, but it was the first game, that “sucked me in”. I got engaged in the story, identified myself with characters and sometimes even started making up stories of my own in this setting. This were things I experienced only with books up to this point.
When I started studying I already had played some good role playing games, but I already missed more intelligent interaction with other characters in the games and I missed the opportunity the express myself and the character I was playing freely. Since I haven’t had an internet connection for my free use at home, so I have never played MMORPGs, apart from a few days when I visited my brother and was allowed to play a little “World of Warcraft” on his account.
At that time I got first involved with two concepts of role playing at the same time. Role play as propagated by MMORPGs and role play as experienced with pen & paper RPGs.
I started playing “Guild Wars 2” with some friends at the time and we tried to play “in character” as it is called, but we gave up on it pretty quickly, because the surroundings did not support it. We couldn’t indulge in our role play without being distracted by other individuals conversing on broken 1337speak out of the context or aggressively advertising shady markets to buy in-game currency. It was impossible to maintain an atmosphere under these circumstances. We kept on playing, but I gradually lost interest.
At the same time I got to know some people looking for a new member for their pen & paper role playing group and they convinced me to give it a shot. All I had to lose would be some hours on an evening and I was willing to take the risk. So we set out to play “Opus Anima”, a german role play system with an intriguing steampunk setting. What I encountered was something I already had wished for: I could freely decide my characters reactions to certain events compliant to the world he or she lived in. I had not to follow a predefined plot. And I could let my character express him- or herself I found fitting for the character in that situation and was not limited to a small number of arbitrarily chosen reactions. We were fortunate having an experienced game master who could easily adapt to our reactions and change the plot on the fly.
We kept playing for a longer period of time, eventually we changed the world to “Shadowrun”, a cyberpunk setting in the 2070s. Some people left the group and others joined, but in the second half of last year our play came to a sudden halt as the group broke up with rather unpleasant circumstances. I have not been able to join another group ever since, because I can’t find any.
Having enjoyed this kind of role play, I sought to pursue it further, without being limited to the people in my geographical surrounding. With my abilities I naturally sought to find role play on the internet outside of MMORPGs. Much to my surprise I found out, that role playing was relatively closely associated to hacker culture. I learned of play-by-email RPGs in different settings and joined one, only to find out that this particular game was quite dead, as well as other games played this way. I learned of MUDs, MUCKS, MUSHes and their denizens and set to explore them, only to find out, that most of them adapted to modern MMORPGs, with mostly hack and slay gameplay, and no role play even encouraged.
So I come to the conclusion, that classical role playing, as it is played in pen & paper or those rather ancient forms of multiplayer RPGs is on the decline. I find it saddening, that young people seemingly throw their imagination out and accept what they are spoon-fed as role play. This could in the end lead to an even greater decline of artistic expression in the future. Mainstream art today is rarely worth a damn to me, but the prospect of it getting even worse is unbearable.
]]>It naturally struck me with surprise, when I learned, that the Bitcoin network is in grave danger. I have read this article by a former Bitcoin developer, which describes the current Situation rather clearly and with great detail. I will try to summarize it as good as I can, because the article is rather lengthy.
The underlying technical problem the network currently has, is the blocksize limit enforced by the protocol. But it’s not the limit itself causing the problems, but rather the setting of this limit in the implementation. When Bitcoin emerged for the first time, the block size limit was arbitrarily set to 1MB and has not been changed ever since.
This does not mean, that there have not been attempts to increase this limit, most notably by the Bitcoin XT client and the developers behind it. But the technical and philosophical divergence from the original bitcoin client was and still is not well accepted from certein influential members of the bitcoin community and a wide scale deployment of this client is now strongly discouraged because of the DDoS attacks on larger operators of this cleint in the past, which even led to the downbreak of a whole ISP network.
I hope very much, that the community as well as the developers keep in mind, what the whole Bitcoin experiment is about: The creation of a currency, which can not be controlled by a small possibly malevolent but surely selfish minority.
]]>I’m terribly sorry for the long outage. There were some Problems with the server my services run on. The lesson learned: Reboot your servers regularly. At least after every new kernel upgrade.
As the server was completely down and had to be reinstalled, I took the chance to make some changes to my configuration. From now on this site supports the HTTP/2.0 protocol. It is still a little shaky, but i think I will figure it out.
Another change I made was the change of my certificate issuer. I switched to letsencrypt, so you, the visitors, don’t need to bother with certificate imports or exceptions. This was no easy decision to make, because I personally like CACert more and I haven’t heard too good things about the letsencrypt client. So I generated my certificates manually through gethttpsforfree.
Unfortunately my image gallery eidolon could not be resurrected yet, because the database has not been resurrected yet. You have to hang in there a little longer. sorry.
]]>I continued to use the software even after the death of its underlying project. Even the audit didn’t reveal any critical vulnerabilities. But albeit the thorough search the auditors overlooked two major security bugs in the software, which became buplic just recently.
This sparked another attempt to find an alternative for truecrypt, which I gladly found in veracrypt. Veracrypt is based on the original code of truecrypt, but under the apache license. They fixed the vulenrabilities pretty quickly after they became public.
The whole user interface reminds me strongly of truecrypt, but they overhauled the encryption and hash functions and the container generations. This means, that veracrypt containers are not compatible with truecrypt, but truecrypt containers can still be mounted in veracrypt, because of a builtin “legacy mode”.
]]>With Cron simply disappearing my daily report about the visitors of my blog was gone.
I had two options:
After trying the first with no success at all, I tried to find an alternative. A friend showed me that Systemd had timer capabilities, which i could use for my problem. After some experimentation I would like to make a tutorial for Systemd timers.
Some explanation aforehand: Systemd timers are more complex than a cronjob but don’t cover all functionalities, that Cron has. For Example: You have to write two files to create one Systemd timer opposed to a single line in the crontab.
To create a Systemd timer, You need a serivce file and a timer file. I already covered how to write a service file in my Yesod Systemd tutorial, but I will cover it here again, since the service files needed for timers are simpler.
Let’s assume you want to create a timer for a job called … job
. First you create as root the file job.service
in /etc/systemd/service
with the content:
[Unit]
Description=MyScript
[Service]
Type=oneshot
ExecStart=/full/path/to/script
User=user
[Install]
WantedBy=timers.target
The [Unit]
section is pretty self-explanatory, so I will skip it. The [Service]
section defines how to run our timed service. Don’t be confused about the term “service”. Systemd has a very broad definition of a “service”. In this example we define, that your service will run just once and stop after running. in ExecStart
is the absolute path to our executable script. User
defines the user, whoch will run the script. This is optional, but if not given, the user will be root. The last section, the [Install]
section just defines, that we want to start our service when all other timers get ready.
After creating the service file, we create a timer file called job.timer
in the same directory as the service file. But first, we need to determine, what kind of timer you need. There are two kinds. First, there is the “monotonic timer”, which determines its time to execute from how long the system is running. Then there is the “realtime timer”, which determines its time to run from the system clock. The sekond kind is the one more similar to the behaviour of Cron, so we will generate one. The content of the file is as follows:
[Unit]
Description=Runs script every hour
[Timer]
OnCalendar=hourly
Persistent=true
I will skip again the [Unit]
part. The [Timer]
part is the most interesting one. in OnCalendar
You define when to start your service. for example: a daily execution on 0:20 would be *-*-* 00:20:00
. For more information on the time codes call man systemd.time
. Finally the Persistent
flag sets, what should happen, when the service should have run,but the system was offline. When true, the timer will run at the next possible occasion.
To start the timer, you need to call systemctl enable job.timer
and systemctl start job.timer
. Do not forget the .timer
suffix.
This should be it. If I have forgotten something, please tell me in the comments.
]]>The reasons for leaving are mostly because I don’t see me mining profitably in the foreseeable future. I was mining once with my graphics card three years ago, but I never had the funds to get an FPGA miner or even an ASIC miner, so i stopped mining alltogether.
I don’t hold any grudges against this pool, moreover I would like to recommend it to anyone. They are very open ybout their share policy and have been always fair and secure from my point of view. They even kept an amount of rewarded bitcoins for three years for me, which I have just recently withdrawn.
My future Bitcoin income will have to depend on Donations I receive through this blog, so please give and give generously. Every little amount will be highly appreciated.
And as always I am very grateful for any advice or comments through my commenting service or via Email found in the contact section.
]]>Ich tue mich schwer mit der Namensfindung von Chrakteren in meinen Geschichten. Sehr lange überlege ich hin und her, wie er am besten zu klingen hätte und welche Bedeutung er tragen sollte. Außerdem sollte er individuell zum Charakter passen. Um alle diese Anforderungen erfüllen zu können bedarf es eines großen Repertoires an Namen. Wie ich meines fülle möchte ich einmal darlegen.
Es gibt jede Menge Literatur über und für die Benennung von Menschen. Sie sind Betitelt mit “Die besten Babynamen” oder ähnlich. Mag kitschig klingen und auch seltsam wirken, wenn ich im Buchhandel in der tiefsten Frauenabteilung in derartiger Literatur blättere, aber beim Streifen durch diese Bücher kann einem, wenn auch selten, ein Kleinod an Namen auffallen.
Eine andere, wenn auch makabre Namensquelle sind Sterbeanzeigen. Auch dort bin ich schon häufiger fündig geworden und benutze Vor- oder Nachnamen verstorbener Leute. Genauso wie Sterbeanzeigen ist auch ein aufmerksamer Gang über den Friedhof geradezu erhellend. Insbesondere die älteren Friedhöfe. Die Namen, welche aus der Mode gekommen sind oder einfach seit einem knappen Jahrhundert nicht mehr vorkommen haben es mir besonders angetan.
Schließlich ist auch das Internet eine hervorragende Quelle für alle Arten von Namen. Es gibt ein reichhaltiges Bouquet an Ratgebern, wie man sein Kleinkind benennen sollte. Auch hier gilt: reinschauen schadet nicht, aber vertiefen sollte man sich darin nicht. Es gibt auch sehr schöne Seiten, die einem ohne viel Werbung die Wortherkunft und damit die Bedeutung der Namen verraten. Meine beliebteste Seite ist behindthename.com, welche auch gute Filterfunktionen hat und auch Namen zu verschiedenen Themengebieten anbietet.
So viel zu den Namensquellen. Was einem niemand abnehmen kann ist die Entscheidung für einen Namen zu treffen. Da hat wahrscheinlich jeder seine eigene Methode. Ich versuche im Namen ein wichtiges Merkmal der Person, die ich benennen möchte, einzufangen. Mal ist es eine Äußerlichkeit, häufiger aber ein Charakterzug. Nur selten vergebe ich einen namen nur rein zufällig.
Was meiner Meinung nach nicht geht, sind Namen, die entweder durch grobes draufschlagen auf die Tastatur entstanden sind oder indem man eine Meute Katzen über selbige gejagt hat. Das ist scheinbar insbesondere im Fantasy-Genre sehr beliebt und soll wohl den Anschein erwecken, dass da tatsächlich eine Sprache vom Autor entwickelt wurde. Wenn diese allerdings sonst nirgendwo in größeren Mengen auftaucht, außer in Namen und ein paar Redewendungen, dann kann man es getrost sein lassen. Da rate ich eher dazu den Bereich der Namensherkunft exotisch zu wählen. Beispielsweise sind Namen für Zwerge “klassischerweise” aus dem Altnordischen entlehnt. Dadurch ist dann Namen dieser herkunft für Zwerge reserviert.
Natürlich will ich niemanden davon abhalten, sein Buch zu schreiben wie er es möchte. Wie immer gebe ich nur meine Meinung kund und versuche Ratschläge zu geben.
]]>I wasn’t convinced initially, that it was for the better, but after handling the matter, I found the whole systemd ecosystem quite helpful. Creating your own service files is something really nice.
Since I’m surely not the only one using systemd for running Yesod applications I want to reiterate my previous tutorial on daemonizing a Yesod application, but this time with systemd.
So let’s create the file my-yesod-app.service
in the directory /etc/systemd/service
The typical systemd unit or service file is divided into three sections called [Unit]
, [Install]
and [Service]
. The first section contains basic information about the service for the system and the user, notably the description of the service and the conditions of startup. Basically this section could look like this:
[Unit]
Description=My Yesod webapp
After=nginx.service
In this example I am assuming, that you use nginx as reverse proxy to your webapp. This would be also the place to define your dependency on a certain database service.
The [Install]
section contains information about the installation of the service. In our case it contains only one line, which defines, that our service will be a dependency of multi-user.target
, which means that the service will be started when the server gets into the multi-user stage.
[Install]
WantedBy=multi-user.target
The last section contains information about the executable itself and the environment it shall run in. in our case we define the working directory and the user, which shall run the service and finally define the exact command for starting your webapp.
[Service]
WorkingDirectory=/absolute/path/to/directory
User=user
ExecStart=/absolute/path/to/executable config/settings.yml
Note that the paths must be absolute.
After finishing the file, you need to reload the Systemd daemon with systemctl daemon-reload
, enable the automatic startup of your webapp service with systemctl enable my-yesod-app
and finally start it with systemctl start my-yesod-app
.
So much for the explanation. I hope this turns out to be helpful for others. At the end you will find the complete service file for delicious copypasta.
[Unit]
Description=My Yesod webapp
After=nginx.service
[Install]
WantedBy=multi-user.target
[Service]
WorkingDirectory=/absolute/path/to/directory
User=user
ExecStart=/absolute/path/to/executable config/settings.yml
]]>Einige, die mich persönlich kennen, wissen, dass ich an einem Buch schreibe. Das mache ich schon seit etwa drei Jahren und bin immer noch nicht sehr weit. Jedenfalls, wenn man das fertige Geschriebene betrachtet. Von der Entwicklung her mit Geschichte und Personen ist es fertig und dass das so ist hat bisher die meiste Zeit beansprucht.
Ich werde in Zukunft ein wenig über den Fortschritt meines wohl größten und am längsten dauernden Projektes berichten und auch meine Erfahrungen die ich auf dem Weg sammle teilen.
Was die Erfahrungen angeht, so kann ich natürlich nicht garantieren, dass sie für jeden genauso gut funktionieren, wie für mich. Jeder ist individuell anders und was dem Einen hilft behindert den anderen eher beim Schreiben. Dem geneigten Leser ist überlassen selber zu experimentieren.
Eine sehr wichtige Lektion, die ich gleich zu Anfang meiner Bestrebungen lernte, ist, dass man nicht anfangen sollte zu schreiben, bevor man nicht genau weiß, wie und wohin sich die Geschichte entwickeln wird. Zum anderen sollte man auch genau wissen, wie die Welt, in der man seine Geschichte platziert, funktioniert. Beides habe ich zu Anfang nicht gewusst und habe mich sehr schnell in Widersprüche verstrickt. Ich hatte zwar eine Grobe Ahnung, aber das hat bei Weitem nicht ausgereicht.
Damit begann meine lange Planungsphase, in der ich mir um die Geschichte, die Welt und die Personen in der Geschichte lange und gründlich Gedanken gemacht habe. Man muss nicht alles Haarklein durchplanen, damit erschlägt man nur seine Phantasie, aber es sollte alles wichtige erkennbar sein. Den Rest kann man spontan beim Schreiben entscheiden, sollte das dann aber natürlich nachträglich in seiner Planungsübersicht notieren, damit man es nicht vergisst.
Vergessen ist ein großes Problem beim Schreiben, weswegen man alles, was man sich an Gedanken gemacht hat in irgendeiner Form niederschreiben sollte. Nicht zwingend in Form von Fließtext. Ich bin beispielsweise ein großer Freund von Mind Maps für diesen Zweck.
Ich meine, dass das fürs erste reicht. Speziellere Artikel werden folgen, wobei ich gerne Themenvorschläge aus den Kommentaren berücksichtigen werde.
]]>After a configuration marathon I managed to create a working configuration for my new web server. This means that all my websites are now served via SSL. Additionally the community I share the server with has an easy way to configure their certificates now, too.
]]>This upgrade made it possible to implement Hakyll’s relatively new pagination feature into my blog. After tinkering around on it for about a day I finally succeeded.
This means in conclusion, that you can skip from one blogpost to its two chronological neighbours with just one click. Pretty neat.
The next thing I would like to do ist transitioning my markup language for authoring my posts from Markdown to AsciiDoc. It has some interesting features, which I would like to use. Unfortunately the Pandoc project does not support reading Asciidoc yet, so I will have to wait.
]]>A friend of mine, who is active in web-development, pointed out, that my method for creating a sticky foooter is a bit obsolete and showed me the proper CSS3 way to do it, which I would like to share.
First you need to prepare your site for the footer, which in the simplest terms may look like this:
<html>
<head> some info </head>
<body class="site">
<div class="wrapper">
<header> Your header here </header>
<article> Content here </article>
</div>
<footer> Your awesome sticky footer </footer>
<body>
</html>
You simply wrap your entire content apart from your footer inside a div
.
Next we’re going to look on your css rules.
The site
class needs a little setup:
.site {
display: flex;
min-height: 100vh;
flex-direction: column;
}
This rules put your whole site in a so called flexbox, which in our case expands vertically by setting the flex-direction
. By doing so, wee need to specify the height of the flexbox, in our case 100vh
, which is the complete height of the viewport.
Next is the setup of the wrapper:
.wrapper {
flex: 1;
}
This is it!
Now your wrapper should be docked always on the bottom of your page or at the bottom of your content, when your content gets longer than your viewport.
The great advantage of this method over my old setup is, that you don’t need to know the height of your footer, it will fit in automagically.
]]>The truth is: It hasn’t gone anywhere. It was still there, but the domain name was no longer resolved due to the fact, that i forgot to renew it in time. I’ll do my best not to let that happen again.
On the personal side I haven’t been at all well. I don’t want to go into more detail, but mental illness is no fun at all.
]]>The server I maintain with a few friends is Member of the DN42 network and we decided to make some of our services also available there.
This means, when you come from within DN42 you can resolve the address nek0.dn42 and will be led here to my blog. I also pushed my gallery into DN42, so it is now available on eidolon.nek0.dn42.
There is not much to say on other news. I’m still working, so my free time is a bit limited.
]]>I am far from being an early adopter, but there was a time in 2012 where I was mining a little bit on my graphics card. It was not very effective, but it still has its worth (especially nowadays, where almost everybody is speculating with them).
I personally dislike the idea of speculating mith my bitcoins like in a stock exchange. The case of Mt. Gox has shown how badly things can end. That’s why I’m keeping my Bitcoins only on my own devices.
With the reappearence of my wallet and my newly emerged interest in the Bitcoin matter I decided to implement an address for Bitcoin donations. I don’t think it will come to great use, but feel free to surprise me.
]]>The last two months have been tough, but I was able to manage it. First of all I moved to a new flat and my job as student assistant demands more performance from me. I don’t see that negatively since I have the feeling of being trusted by my boss and colleagues.
Because of all the other action, my leisure time coding went down, but I still make progress. I have added the feature of pagination on the front page to my gallery system Eidolon and worked with the medium site so now all mozilla-based browsers now correctly switch the background image. This was up until now only possible with webkit browsers.
Just recently while browsing through my older posts I realized that this blog exists now for far more than a year. I recall myself wondering at the beginning, whether I would be able to update this blog regularly and I’m glad I could. So thanks to you all out there bearing with me.
(Well I at least hope, that there are some people out there reading this. I have no clue because I don’t have any form of user tracking.)
]]>Neulich wurde ich auf ein Problem aufmerksam gemacht, dass der Emailverkehr mit den Hochschulen zum Erliegen gekommen ist. Zuerst vermutete ich einen Fehler in unserer Konfiguration, doch die Wahrheit war schlimmer. Die Hochschulen und Universitäten können kein TLS.
Warum dieser Fehler erst jetzt aufgekommen ist, ist schnell erklärt. Aus Kompatibilitätsgründen hatten wir Unterstützung für SSLv3 aktiv gehabt. Kurz nach dem bekannt werden der Poodle Attacke, welche auch die letzten Stückchen Sicherheit im SSL-Protokol aushebelt, habe ich bei unserem Server die Unterstützung für das Protokoll abgeschaltet, in dem Vertrauen, dass andere Betreiber von Mailservern zeitgemäße Sicherheitsstandards bei sich durchsetzen.
Leider werde ich im Moment von den Einrichtungen, welche eigentlich für Innovation und technologische Vorreiter stehen enttäuscht. Nicht nur dass diese immer noch das veraltete SSL-Protokoll unterstützen. Sie unterstützen gar kein TLS im Mailverkehr. Überhaupt nicht. Auch die hochgelobte Exzellenz-Universität in Dresden nicht.
Es kann doch nicht sein, dass die Rechenzentren an Hochschulen keine zeitgemäße Sicherheit anbieten. Nicht nur das, sie arbeiten technisch wörtlich auf dem Stand des letzten Jahrtausends, denn immerhin stammt TLS aus dem Jahre 1999. Es ist also zwischendurch genug Zeit gewesen die Konfigurationen anzupassen.
</rant>
]]>You can reach it over eidolon.nek0.eu or nek0.zeigt.photos. Feel free to sign up and test it out. It may look a bit barren at first, but I haven’t worked much on the appearance yet.
Should you encounter any errors or miss some features, I would be glad receiving an issue at the github project page
]]>persistent
to a version greater than 2.0.
I will wait until my issues with other dependencies are closed for pushing some dependency boundaries, so it will build on the server without dependency hell.
EDIT from 30.12.2014:
After looking deeper into that matter, I have fund out, that I will be able to migrate the data. So no dataloss will happen. Sorry for the hassle.
]]>The name derives from the same greek word which means something like mirage or illusion. I can’t really say, why I named it like that, but I’m quite happy with the name.
The gallery system is almost complete and I will start stress testing it in the next year. The images in the gallery are organized in albums, which themselves belong to certain users. Additional features include at the moment:
The whole system is set up as a Yesod webapp and is written mostly in Haskell.
I have been working with Yesod for quite some time now, mostly for learning Haskell, but I found it also entertaining to make some web-development. I would really recommend using this framework. The static typing of Haskell might be a bit of a pain in the butt at first, but it also grants your applications level of security, which I haven’t observed anywhere else.
]]>Zuallererst: Frohe Weihnachten. Es gibt ja Menschen die auf so etwas Wert legen. Ich komme um Weihnachten herum nie wirklich in Feierstimmung, aber das heißt nicht, dass ich die Laune jedem verderben möchte.
Warum ich heute eigentlich schreibe ist, dass in den letzten Wochen eine nette Vereinigung brauner und bräunlich gesinnter Menschen in meiner Umgebung ihr Unwesen treibt. Die Rede ist konkret von der Vereinigung “PEGIDA”, aufgeschlüsselt heißt das “Patriotische Europäer gegen die Islamisierung des Abendlandes”, wobei ich stark bezweifle, dass die dort Teilnehmenden das Akronym überhaupt aufschlüsseln können. Das würde auch erklären, warum sich dort auch Menschen wiederfinden, die gegen die GEZ demonstrieren. Oder gegen die grenzenlose Bankenrettung. Da fragt min sich schon, ob diese Menschen wissen, wo sie sich gerade befinden.
Das die Menschen unzufrieden sind, ist verständlich. Ich bin es auch. Aber die PEGIDA ist keine Plattform für den Normalbürger, um seine Wut über die Politik zum Ausdruck zu bringen. Das zum einen. Zum anderen braucht das Abendland gegen eine Islamisierung nicht verteidigt werden. und schon gar nicht in Sachsen, wo es eh nur 2% Ausländische Menschen gibt.
Eigentlich wollte ich meinen Blog unpolitisch belassen, aber bei derartig grobem Unfug der da gerade passiert bin ich der Meinung, auch etwas sagen zu müssen. Am Ende würde ich aber durch mein Stillschweigen derartige Aktionen billigen.
]]>The first time I saw it I was completely baffled. I immediately wanted one of my own, but with some alterations. Problem is: I have absolutely no experience in hardware hacking. Luckily as a frequent visitor of my local hackerspace I know some people who have experience.
First I want to build a simplified version without that gorgeous vacuum fluorescence tube using LED-Modules as display and thus give it a longer battery life.
For now I am creating a bill of materials and looking for parts. you can check the progress at the github project I created and occasionally I will post the progress here.
]]>Before I dive into the more technical depths I would like to conclude my findings here: Generally it is possible to forward a desktop session including a window manager, but not GL applications (yet). In general this method is a possible replacement for classical VNC setups.
Before you can start, there are some prerequisites that must be met:
First you need the software Xephyr on your client system (which is the System, where you want to receive your session and work on it). To install it grab the package xserver-xephyr
with the package manager of your choice. I am assuming a Debian system here, so it might be possible, that the configuration files are located elsewhere on other GNU/Linux flavours.
Secondly there are some configurations to be made on the host system (the system you want to access remotely). You need to enable X forwarding in your SSH server in /etc/ssh/sshd_config
by stating:
X11Forwarding yes
After that you are ready to give it a first shot. Fire up a terminal of your choice on your client and start up Xephyr like this:
Xephyr :1 -screen 800x600 -resizeable &
Mark the capital X at the beginning. This command means: start Xephyr as display :1
, -screen
sets the resolution and thus the size of the emerging window. Finally -resizeable
makes the window resizeable in contrast to its normal behaviour. The last &
puts the process in the background.
After completing this you should see a new window, which is completely black. This means everything is, as it is meant to be. You have just created a new blank display within your existing X session.
Now it’s time to make the connection to your host system. This is done by:
DISPLAY=:1 ssh -Y <user>@<host>
Translation: set the display environment variable to :1
and start a ssh connection with the host. The -Y
opens a trusted X forwarding connection. Due to the setting of the display variable the X forwarding connects to your Xephyr session, which is what we want.
Now you can start up any window manager in the ssh console, preferably something lighweight like awesome.
]]>As you might know I have written my own commenting service, which up until recently I had to start manually in a screen session. Then I decided to write my own init-script.
I have to admit, that I am no experienced sysadmin or something like that, but just a random guy with a strange love (or addiction) to computers. So this is my first time doing this.
For managing the starting and stopping of the service I chose to use the start-stop-daemon shipped with the system on my server. Additionally I used the skeleton file for init-scripts, which you can find in /etc/init.d/skeleton
.
After consulting the manpage of start-stop-daemon I came up with the following command for starting the commenting service:
start-stop-daemon --start -b -u nek0 --chuid nek0 --name yacs --exec ./yacs -d /home/nek0/www/yacs-run/ \
> /var/log/yacs.log -- config/settings.yml
What this actually means: The first option ist pretty self explanatory. -b
starts the service in the background. -u
and --chuid
ensure, that the service runs as a user, not as root. I chose my own user here, but you can also use nobody
if you like. The name of the service is specified by --name
. -d
specifies the working directory of the service you want to start and finally --exec
is the path to the executable, in this case relative to the working directory. Everything after the final double-dashes are arguments passed to the executable itself.
for stopping the whole thing I use the following command:
start-stop-daemon --stop -u nek0 --name yacs
This is even simpler than the above and is really self explanatory after all the information you got above.
the whole init-script looks like this:
#! /bin/sh
### BEGIN INIT INFO
# Provides: yacs
# Required-Start: $nginx
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Start YACS commenting service
# Description: start YACS commenting service
### END INIT INFO
case "$1" in
start)
logger starting YACS
start-stop-daemon --start -b -u nek0 --chuid nek0 --name yacs --exec ./yacs -d /home/nek0/www/yacs-run/ \
-- config/settings.yml > /var/log/yacs.log
;;
stop)
logger stopping YACS
start-stop-daemon --stop -u nek0 --name yacs
;;
restart)
logger restarting YACS
start-stop-daemon --stop -u nek0 --name yacs
start-stop-daemon --start -b -u nek0 --chuid nek0 --name yacs --exec ./yacs -d /home/nek0/www/yacs-run/ \
-- conifg/settings.yml > /var/log/yacs.log
;;
status)
# No-op
;;
*)
echo "Usage: yacs {start|stop|restart}" >&2
exit 3
;;
esac
I hope this is helpful for others. If something is unclear, you can always leave a comment now ^^
]]>For all those relying on my feeds, you may have encountered problems with links going still to the old server. After I moved my server to a new location I forgot to change the feed settings accordingly. Now I fixed it.
]]>After a long time I decided to visit my old birthplace, the city of Prague. I have spent there a week with my grandmother, visiting concerts and the theatre. It has been the best time I have had in a while.
I also took the opportunity to take out my trusty old camera on the journey to take some photos. The ones I consider the best are here in this post.
Prague is a beautyful city with lots of history and legends and you need more than one visit to see everything of it. There is always something to discover and to learn.
For instance: the castle of Prague is centuries old with lots of legends. Numberless historical figures have visited this place, not only the city itself, but also the castle. The cathedral is a wonderful piece of architecture and artisanship.
Another masterpiece is Carl’s bridge, the oldest bridge of the city. according to a legend the sword of the legendary national hero Brunclík is buried in the foundation of the Bridge. On the bridge there are also statues depicting various historical and mythical events of czech history.
This is the old townhall of Prague with its famous astronomical clock. every 15 minutes the small blue doors on the top open and you can see a small procession of saints, while the clock rings the time. This is one of the greatest tourist magnets in the whole city. Regardless of weather or temperature, there is always a giant crowd in front of this building.
While I was in the city, I also took the opportunity to visit the local hackerspace brmlab. It is way bigger than I first imagined. These photos were taken only in their main room, but they have seperate labs for chemistry, biology and high voltage alectricity in the basement, which they gladly showed me. It is a great place to be, so if you are in Prague, be sure to pay them a visit.
]]>Also the blog was moved to another server, as I give up my own little sandbox of virtual server, which has become increasingly unreliable. Hence the outage from last month, for which I am very sorry. Soon I will also have set up my domain here.
As you can see, the iframes have come to life with the promised commenting system. feel free to comment anything you want under any blog post. Knock yourselves out. Unfortunately, I can’t guarantee, that your comments will stay, as this is just a test deployment and I will still work heavily on the code.
When you encounter any problems, errors, bugs or have feature requests, drop an issue at the GitHub project page.
]]>I have been busy in the past month studying. Exam season is coming rapidly nearer.
Aside from learning and the general procrastination I have worked on my own implementation of a commenting service, which is now ready to be doployed for testing. It is called “yacs” for now, which stands for “yet another commenting service”. It is written in Haskell as a Yesod web-app. Check it out on Github.
I decided to use this approach, because I wanted to know the language Haskell better. It was really challenging wrapping the logic of a commenting service aroud the possibilities I had with Haskell, since I am still very new to this language.
Right now I am still stuck in some kind of dependency hell and my project does not build on the server. As soon as I resolve this problem, the newly added iframes, which you may have noticed on the bottom of every blogpost, will come to life. After that i will write a Documentation for the whole project.
]]>Because of the non-standard license of truecrypt there has not formed a forked project yet which I could rely on. I am looking for alternatives, but have not found anything suiting my needs.
For example there is GnuPG, which can encrypt single files and also folders, but you have to do it manually every time you change something. Furthermore you can not mount it like you could do with a truecrypt container.
Then there is LUKS, which can encrypt whole filesystems, but not singular containers.
For now i will remain using truecrypt and trust the outcome of the first stage of the source code audit of truecrypt.
I know I don’t present any solutions here, but I will be looking into that matter in the future and hopefully I come out with something better than keep using truecrypt.
]]>I chose to do so, because my blog is generated by Hakyll, a static site generator written in Haskell, I wanted my site to stay in the realm of this programming language.
Since there is no such commenting service implemented in Haskell yet, I have to write my own. I chose the Yesod web framework as foundation for my project. It already has basic functionality, but because I have not implemented spam protection and moderation yet, I do not recommend using it outside of testing purposes. You can check it out at my git repository at Github here.
]]>Now I am deciding wether to put comments on my website and what service to use. Under all circumstances it will be a selfhosted service.
]]>The Answer is seafile, a pretty powerful piece of software written in C and Python. I started my own seafile service on this server and am pretty happy with it. There’s only one drawback I have found out: the upload rates are pretty low, which could be caused by crappy ISPs or the encryption of seafile itself. But even Dropbox doesn’t have the best upload rates, so what.
Additionally there are clients for most platforms and even the source code is available, so you can build it yourself, if it’s not available for your platform.
The installation itself is pretty straightforward if you follow the wiki, even if you want some specialties like nginx as your webserver.
]]>As I just recently learned the debian maintainers want to discntinue the distribution of the CACert root certificate with their package ca-certificates
. More details here.
This is particularly bad for me, as my certificates are all from CACert, for example even the certificate for the https connection. So when you come from a Debian-based system and see a certificate issue while you connect to my site, please trust this certificate, it will be the same as it ever was.
I really hope that CACert passes its oncoming audit so that the Debian maintainers will trust the root certificate of CACert again
]]>For running the mailservice I chose the combination of Postfix and Dovecot with SASL managed by Dovecot. To configure everything I really recommend the Dovecot wiki as well as the Postfix documentation. When installing from Debian repositories you get a simple working configuration out of the box.
If you want to learn to do this by yourself, just install these services and tinker with them. Thats the best approach I can recommend, though maybe not the simplest.
]]>It is my first time doing so, but I think it is very important to know your possibilities, especially in the light of recent events and revelations. This is also one of the reasons I run my own mailserver. Other reasons are just to see if I can.
On this occasion I stumbled upon the debian package “signing-party” and the tool in it called sig2dot
, which creates a nice graph out of your key signatures. Although dot has its flaws, I think this is a wonderful way to visualize your chains of trust.
first you need to define in your css or add to your existing rules:
html { height: 100%;
}
body { height: 100%;
}
additionally you need a wrapper class for your content. You need to adjust the negative margin value to your footer height. The value given here is only an example. Actually this will require some tinkering.
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 -65px;
}
now you need to wrap your site content in a div with the wrapper class.
If something is messed up, it is most likely because of paddings or margins. Take special care, that body
and html
have none of them.
The according html file might look something like this:
<html>
<head> some info </head>
<body>
<div class="wrapper">
<header> your header here <header>
<article> content here </article>
</div>
<footer> your awesome sticky footer</footer>
</body>
</html>
I hope this is helpful for your website, if you were looking for a solution.
]]>I wish you all out there happy holidays, merry christmas and a happy new year. Spend the time with people dear to you.
]]>I know I am sick and will be for some time in the future, but today I see a better future. It’s not an easy time for me, not knowing exactly, why I am sick or even what exactly it is I suffer from.
My doctors do their best to treat me and my friends are a great support. I wish to thank them all for keeping up with me.
This moment is very precious to me and I hope that once in a while everybody has a similar feeling.
]]>In den deutschen Landen ist Wahl, der wahlkampf ist auf Hochtouren.
Doch wem können wir vertrauen? Alle, die sie ihre Namen auf den Plakaten haben stehen aus schlechter Erfahrung im Verdacht ihre Versprechen doch nciht zu erfüllen.
Aus diesem Grund gebe ich meine Stimme an Cthulhu, den Herrn von R’lyeh. Warum sich mir dem kleineren Übel zu frieden geben?
nav
, article
, header
and footer
tags where necessary.This is the Typewriter I will be working with: An old Continental typewriter from Germany, built in the early 20eth Century. It might seem a bit abusive using such an old machine for it, but if I wouldn’t use it, it would just rust in some place never to be touched again. I have the intention to bring it to new life.
]]>In the future I might write posts that only matter in one country or one city. Maybe i will even comment on the politics in the country i live in, but that’s not an english speaking country.
Maybe I will write the posts in any language I see fit at the Moment and tag it with its language. That should do it.
]]>This is a post in which I try to use the markdown language for writing my own posts.
Markdown is very useful for this purpose since it does not clutter the sourcefile with tags, which need to be opened and closed and thus making it hard to read. Most of the topology of the outcoming texts like headlines, paragraphs or even more like links to different sites can be managed in a more easier and convenient way.
If you have become interested in learning how to use markdown you can look at Wikipedia’s page on markdown.
Have fun!
]]>