-
Notifications
You must be signed in to change notification settings - Fork 1
/
fixture.coffee
72 lines (65 loc) · 203 KB
/
fixture.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@CustomContent = new Meteor.Collection('custom-content')
@Posts = new Meteor.Collection('posts')
if Meteor.isServer
if @Posts.find().count() is 0
@Spomet.reset()
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - The Beginning", text: "Summary Page\nAlmost a year ago I read the book: \"New Programmers Survival Manual\" by Josh Carter. Overall I liked it and special parts such as \"Get Your Tools In Order\" inspired me to personally change some things. There was one chapter about keyboards and touch typing. I have tried to learn touch typing before. But I was infected by the idea once again. This time I was willing to force myself through the first weeks of nightmare slow writing and aching forearms. To support that I chose to switch to a different key layout. So that it would be useless to look at the keyboard. Besides QUERTY (actually QUERTZ on my German Keyboard) there is the DVORAK Layout. It is quite old, standardized by ANSI and optimized for speed and writing English texts. The problem was, no \"Umlaute\" and you need those for the German language. Yes I know there are adapted versions, but while looking around I stumbled upon NEO2, specially optimized for German and with a quite extended strategy for different key layers or levels (reachable through modifier keys, e.g. shift, alt). Giving each layer a special purpose. Level M4 for example makes all special symbols that you typically use for programming tasks easily accessible. Take a look at the NEO2 homepage for more information (it is German, though). So I started and was so damn slow it was a pain.\n\n\n\nI became used to the new layout, though. And after one month I was able to write half as fast as with my prior 4-fingers-keyboard-dance. After 3 month I was faster writing code then before I switched to NEO2. After 9 month I had beaten my old speed for prose.\n\nAnother thing that draw my attention in Carters book was the recommended Kinesis Keyboard. While looking where I could order one, I found other similar keyboards. Especially the Maltron keyboards and the TypeMatrix seemed interesting to me. I struggled deeply. But I couldn't get myself to order one of those because neither seemed really what I wanted. By that time I had a quite clear understanding of how a ideal keyboard for me should look like:\n\n\tFor esthetics and because I am quite used to notebook keyboards the keys should have a flat profile.\n\tThe keys for the left and right hand should be separated, so that you can move them around. Reposition them independently of eachother to your actual sitting pose.\n\tThe keys should be ordered in a matrix instead of the classical staggered rows - that was a hart time learning to move my left hand pinky under the ring finger to press the \"Z\" key (in NEO2 there is the \"Ü\") and stretch the right hand pointer to reach the \"Y\" (in NEO2 the \"K\").\n\n\n\nInspired by the interesting selfmade and selfmodified keyboards layouted in NEO2 that you can find on the layouts homepage - especially this one looked adoring: Tastaturselbstbau von Daniel V - and because I remembered Arduino - and that I was looking for a worthwhile project I might tackle with it - I said to myself: \"Hey, why not create your own keyboard\". The constrain was to keep the material costs beneath the price tag of 359€ for the Kinesis Advantage Pro and to create a somewhat nice looking and quite practical solution that I could really use in my day job.\n\nSo that's how it all began. To give you a preview of how it all ended these two pictures of an intermediary version of \"TheTasTaTur Mark1\" should give you a good feel for it. Later I added a thumbstick and mouse buttons. I have no picture of it yet.\n\nRead the stories about how it went from there and about key modules and key caps, the keyboard matrix and resistors, arduino uno and power saving, bluetooth hid and RF as well as debouncing and mouse moves by thumbstick in one of the next posts in this category.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Requirements and Key Switches", text: "Summary Page\n\n\nIf you want to know why I am doing this, read my previous post. I stated there, that I decided to create my own keyboard, that would meet my own special requirements. I used to work as a requirements engineer a while a go, so I realized I had to come to a clear understanding of the \"problem domain\". I really had no idea where that would lead me. I began researching. The first question that needed an answer was: how does a normal keyboard usually work? The Wikipedia article on keyboard technology gives a quite good summary. There were other resources - I don't remember all of them - but I can recommend this in depth discussion about mechanical key switches.\n\nI had a starting point: I needed to decide witch type of key switches (or key modules) I would like to use. Nowadays you often see Cherry MX mechanical switches in high end gaming keyboards as well as the Kinesis. But those are \"huge\" (at least for me) standard keys that I absolutely don't like. But Cherry also has a flat mechanical key switch: the Cherry ML. It is a little more expensive and shouldn't last as long as the MX key switch. Nevertheless I ordered 100 of them for a price of 90¢ each. Phew, a lot of money gone. Luckily those key switches were the most expensive parts I needed. The second most expensive part were the Arduino Unos, I needed one for each side, but thats the content of a later post.\n\nBack to the ML key switches. They do have a very special \"foot print\". Nothing that would fit without drilling holes of different sizes on any prototyping board I found. At this point I had no idea, how to solve this problem. I decided to postpone a solution to this problem until I had the key switches in my hand. Another problem were the keycaps. I couldn't find any retailer with acceptable conditions to deliver as few as around 100 pieces to Germany. Moreover it was unclear how I would mount and arrange the keys: how big should the key caps be? It became clearer and clearer that it would be impossible to make a detailed plan. There were simply so many unknowns and a quite restricted budget that I couldn't afford to many trials. Buying expensive tools and order self designed PCBs - I'm no electronics expert, so I didn't felt able to design the circuit upfront - from Fritzing Fab or similar was no option either. I decided on a rough concept and took a more incremental approach.\n\nThe cornerstones were:\n\n\tUse two Arduino Unos one for each side, I didn't even check in depth if it was technically possible to create a keyboard with them, but as it turned out it was indeed possible.\n\tBe wireless, to circumvent crawling on the floor every time I had to connect the keyboard to my computer.\n\tCommunicate by Bluetooth with the host. I stumbled upon the BlueSmirf HID. That seemed a nice fit.\n\tAvoid a hardware driver at all cost (I use Linux, Mac and Windows and writing keyboard drivers for each operating system was no option for me). Use a standard key layout on the host machine and map key presses to NEO2 on the fly (with the Arduino). So I don't have to install anything.\n\tThe left side will send key presses by simple RF communication to the right side and the right will pick up those and send the whole keyboard state to the computer.\n\tThe case and the key caps should be made of wood. It is easy to work with it compared to plastic or metal. And I already had the basic parts and tools, at least I thought at that time.\n\tEach part is powered independently with a LiPo battery and charged via USB. I had no idea how high the capacity of a battery should be.\n\tUse things you already have and be pragmatic.\n\nAs the key switches arrived and I understood which pins are relevant (on one side there are three - all connected to each other - and on the other side is only one) and how the switches as a hole are working I had an idea how to mount them. I took a TriPad stripboard and cut it in stripes of a few holes width. The top three pins were mounted in the lower holes of one stripe and the lower pin in the upper holes of another stripe. So the switch hangs a little in open air. But I was able to circumvent drilling holes for the switches and with a few extra supporting wooden slats it should be stable enough. This design was the reason for some headache later: the distance between the holes in the stripboard doesn't meet exactly the distance of the pins from the key switches. And I learned that mechanical key switches sometimes are somewhat intolerant regarding tension on the connecting pins. So in the end I had to drill a few holes to release the tension on some keys.\n\nAfter calculating a reasonable distance - so that in the end I would have keys the size of around 2 x 1.8cm - between the keys switches, I decided how many holes high the stripboard stripes should be and how many holes away the key switches should be positioned. In regular distances I glued supporting slats to the stripboard stripes. What else is needed to get a keyboard matrix working, what the overall key layout would be and how to poll the matrix with Arduino will be the topic of a next post.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Keyboard Matrix and Key Layout", text: "Summary Page\nHow does a keyboard actually work? This question is still unanswered. The simplest and most expensive solution would be to treat every key on it's own and provide a interrupting GPIO (General Purpose Input/Output) pin for every key. The approach usually taken by professional keyboards today is different and you only need none-interrupting GPIO pins one for each row and column of keys. And it basically works as follows:\n\n\tSwitch all row pins to LOW.\n\tTake the first row and switch it to HIGH\n\tRead the state of the first column pin. If it is HIGH the key at row number one and column number one is pressed. Else it is not pressed. If the state of the key changed, compared to it's previous state (from HIGH to LOW or from LOW to HIGH), the change is send to the computer. Remember the actual state.\n\tProceed with step 3 for the next column pin until every column was read once.\n\tSet the row LOW. Proceed with step 2 for the next row pin until every row was set HIGH once.\n\tStart all over.\n\nMy first test program resembled this steps (also known as polling) quite closely, ignoring all those pitfalls I already read about. But first things first: actually build the keyboard matrix. I glued and soldered the key switches to the prepared stripes of stripboard. I made the rows by connecting the TriPads with solder. At the end of each row I connected differently colored wire that were long enough to reach to the top of the keyboard case where the Arduino would live. Six rows an each part of the keyboard and six pins on the Arduino. I connected the other end of each row with a 10K resistor to GND (pull-down).\n\nWhen I first encountered keyboard technology I was confused with all the fuzz around ghosting and key rollover. Basically it's just marketing by the keyboard industry and boils down to a problem with the current flow, witch you can counter with diodes (they let the current flow in only one direction). So I decided to give every switch a diode (they are quite cheap, just a few cents each, so no big deal for the budget). Ghosting eliminated. I know a purist might argue that I still have a blocking problem because I'm using the standard Bluetooth HID protocol for communication, and that it is restricted regarding the number of keys (6 none-modifier keys) one can simultaneously press. Actually it is the same restriction as for every USB keyboard. Only PS2 allows unlimited concurrent keys. I thought about it and couldn't imagine any situation where I would want to press more keys at a time.\n\nThe first attempt for the hardware columns was to create them from the legs of those diodes. That approach was quite time consuming and fiddly. So after three diode columns I took a different approach. I dismantled a none-flexible three-core electric installation cable and used a copper strand for every column. I bend them so that the ends face downwards and drilled holes in the top and lowest stripboard stripe for the ends of each strand. I soldered them in place. From the strands I connected every switch with a diode. On each copper strand I soldered a uniquely colored wire reaching to the Arduino. The right hand part of the keyboard had eight columns on the left there are seven. I connected those to the Arduino. Before I show you how the actual Arduino code looks like just a few words about the key layout, which is a modified version of the usual NEO2 layout.\n\n\n\n\n\nAs you can see I decided to move the \"Enter\", \"Backspace\" and \"Entf\" (Remove) keys to the middle. The TypeMatrix keyboard inspired me in this regard. I also have two of them one on each side. So I can actuate \"Enter\" with my right as well as my left hand pointer. If you have looked closely to the finished keyboard you can see that in contrast to the conceptual layout all keys have the same size. It was impossible for me to stabilize longer keys without professional keycaps with clamps. The keycaps - their creation was the most labor intensive work - are the subject of a later post. For now I assumed I could simply use two key switches to make bigger keys. This plan didn't work out. And it was not the only one.\n\nHere is a Github Gist with the keyboard-matrix-polling relevant parts of my Arduino program (written and compiled with the Arduino IDE). These are really only parts of the program for the left hand keyboard, some used functions. I omitted variable and constant declarations. So don't expect this snippet to compile. For the right hand I defined the \"Key\" struct a little different so that it holds the actual key code, that has to be sent to the computer as well as the type of the key (e.g. normal key or modifier). I hope the code is somewhat self-explanatory. If not leave me comment.\n\n\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Key Debouncing", text: "Summary Page\nIn my last post, I explained how I scanned the keyboard matrix, in the code snippet shown I omitted a few things. Most importantly the debouncing of the keys. That is truly a critical step. If you don't get it right you will have more letters on your screen then you intended. Every bounce might get counted and every key press might result in 2, 3 or 4 letters being send to the computer. But wait, what is (de-)bouncing actually? Hopefully this explanation is somewhat comprehensible: whenever you close an electric circuit by contacting two parts of a conductive material, they always don't instantly close, instead they swing back and forth (at an atomic level), closing and releasing the connection a few times before they rest and establish a lasting one. The problem is when the key matrix scanning is fast enough it will catch the swinging (bouncing) and react as if the button is released and then pressed again (which is actually the case). The Arduino is fast enough! Even when using those Cherry keys, that have a comparatively short bounce time of 5ms.\n\nThere are a few strategies to handle bouncing. For an in-depth discussion you might find this site interesting. I decided to implement the debouncing in software. There, I feel truly home. I found the Arduino debouncing library. But as it is designed to debounce only single buttons directly connected to the GPIOs of the Arduino and it felt quite cumbersome to bend it to be usable with my keyboard matrix, so I decided to implement my own debouncing strategy. Just in case you didn't read my previous post here is the matrix scanning function:\n\n\n\nSoftware debouncing basically means: when a key has changed it's state ignore for some time (the bounce time) subsequent state changes. So here follows the actual debounce code:\n\n\n\nThe \"bounceTimes\" array is responsible for storing timestamps of all bouncing keys. When a state change of a key is found by scanning the key matrix the function checks if the key is bouncing. In case it is not bouncing, the change is acknowledged, the current timestamp gets stored in the \"bounceTimes\" array and the index of the array field gets stored in the \"Key\" objects \"bounceKey\" field. In case it is bouncing, nothing happens.\n\nThe lookup if a key is bouncing gets handled by the function \"checkStillBouncing\". The value of the \"bounceKey\" field of the \"Key\" object is its parameter. If the value is \"NOT_BOUNCING\" than false gets returned. If it is a different value, the timestamp from the \"bounceTimes\" array at index \"bounceKey\" is retrieved. If the current timestamp minus the retrieved value is bigger than \"BOUNCE_TIME\" than \"false\" gets returned, as the key has probably finished bouncing, otherwise \"true\" is returned.\n\nYou might argue, that I could have stored the timestamp directly in the \"Key\" object. That would have made the implementation a lot simpler. But as the Arduinos working memory is quite limited I decided for the presented solution. I safe a lot of memory this way as each key now only stores an one byte integer instead of a four byte long value. As I succinctly added further functionality I never encountered low memory problems. I never calculated the memory consumption, though, so the simpler solution might have been enough.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - The Final Version", text: "\nSummary Page\nBefore I forget it, here is a picture of the final version I took a few days ago. You can see the thumbstick for mouse moves on the left side - I switched my mouse hand a while ago - as well as the mouse buttons on the right side. How to integrate them will be the topic of a post on its own. The idea was to be able to use the mouse without taking the hands from the keyboard. If I find some time I will take a video showing me touch typing and mouse moving on \"TheTasTaTur Mark1\".\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Bluetooth HID and Key Layout Translation", text: "Summary Page\nOne requirement for \"TheTasTaTur Mark1\" was, that it should be wireless. Because I planned to carry the keyboard around and didn't want to crawl on the floor every time I needed to connect it to my computer. As the keys are somewhat loose (see this post for the reasons) I stopped carrying the keyboard with me and left it at my \"cubicle\". Nevertheless it is still wireless (besides the cable between both parts, of course).\n\n\n\nI used the BlueSmirf HID (actually an older version), which utilizes the Roving Networks RN-42 chip with a HID (Human Interface Device) profile and SPP (Serial Port Profile) firmware preloaded. I connected the hardware data flow control pins (RTS and CTS) to each other, because I didn't want to use them. And used the TX and RX pins (digital pins 0 and 1) of the Arduino to connect them with the RX and TX pins of the BlueSmirf (TX to RX and RX to TX). This design is somewhat tricky because to get your programs on the Arduino you have to use the hardware serial which internally uses the same pins. I made a little switch (male and female pin headers) that I could pull to power-down the BlueSmirf and then load my programs to the Arduino.\n\nEarly on, I decided to use raw hid reports and soon realized that I needed a way to see what my Mac actually receives. After searching a while I found hidapi. Included is a TestGUI. It is simplistic but you can choose to sniff out any USB device connected to your computer. In the bottom is a stream of received packets listed. This way I could reverse engineer the behavior of my Mac keyboard (‹cmd› key, ‹fn› key, ...) and make \"TheTasTaTur Mark1\" mimic this behavior as far as feasible. After all the keyboard should not only work on my Mac but also on my Windows machine, which I have to use in my dayjob from time to time, as well as Linux which I prefer to use at work.\n\nBefore I could get down to programming the keyboard behavior I configured the BlueSmirf to name itself as \"TheTasTaTur\". For that purpose I made (just for the main development phase) a sketch that allowed to switch back and forth between SPP and HID mode by pressing a certain key. Actually I can not remember which key this was, because after integrating the mouse buttons I rewired some rows and columns. This way I could configure the device wirelessly. Here is a gist showing the sketch:\n\n\n\nI have found it somewhere deep in my sketchbook and I guess it wouldn't work anymore (because of the rewiring and the newer version of the BlueSmirf). So use it with caution. After switching to SPP mode you can connect the BlueSmirf as a serial device (actually I have a strange feeling, that I had to do something more, but I can't remember right now) and communicate with it, for example using CoolTerm or better the command line tool screen. The actual command to change the name is \"SN,TheTasTaTur\". There are many more configuration parameters, like different modes of operation, but the documentation is quite good and for further information you should check there. Especially since there seemed to have changed (made better) some things in the new version of the BlueSmirf HID.\n\nAs you might have read here, the left side keyboard sends its key state, whenever it has changed, to the right hand side. Actually there are only arbitrary numbers send, representing the keys that are pressed and an empty package when the last key is released. I will show the subtleties of the communication between both keyboard parts in a later post.\n\nThe program in the right hand side has an array containing all left side keys. The numbers that are send represent the indexes of the keys in this array. The keys of the right are kept in a matrix, similar to matrix of the left side. The keyboard matrix polling is the same, too. But the Key struct is a little different:\n\n\n\nFinally I know which keys are pressed on both sides. Now I have to translate the actual pressed keys to the right key codes. Remember I'm using the NEO2 layout. As it is no problem for the primary layer (no modifiers) - I can simply send the key code \"as printed on the keys\" - it becomes interesting when modifiers come into play. I have to remap a few keys respecting the pressed modifiers. The excerpt of the following function does exactly that:\n\n\n\nAfter translating the actual keyboard state to the corresponding key codes of the standard German key layout I have to create the bluetooth HID packets and send them to the BlueSmirf through the serial interface of the Arduino. The following gist does that:\n\n\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Arduino Uno and Power Part 1", text: "Summary Page\nAt the beginning of this project I had only little experience regarding microcontrollers. As a teenager I programmed the basic stamp controller, automating a model of the V2 teststand and launchpad for the Peenemünde Historical and Technical Information Centre. But this was more then 15 years ago and since then I focused on desktop and web programming. I had heard of the Arduino long before and was intrigued. But I needed (as always) some more motivation - some concrete goal I would like to achieve - then just to play around with it.\n\nSo as an Arduino and microcontroller beginner I decided to buy Arduino Unos, as suggested by different sources. Because the keyboard should have a somewhat appealing look I soon realized - when holding the Arduinos in my hand - that this was a rather bad choice. The Arduino Uno is really big and overall the board was to high to be integrated in an as-flat-as-possible case. Actually I had the same problem with the LiPos I ordered in the first place. They had high capacity but they where to big. Instead of making the case more complicated I decided to remove or cripple all extruding parts from the Arduino and get some smaller batteries at the local Conrad store.\n\nBasically I ground a few millimeters from the top of the USB connectors (they are still working in case you wonder), removed the female pin headers and the power connector and cut some other pins a little shorter. I guess pictures say more than words so here is a photo from one of the crippled Arduinos inside the keyboard case.\n\n\n\nAs I stated in another post I had to take a incremental route to build my keyboard so these hacks were absolutely unavoidable. At one point in time - I hadn't begun to make the keycaps, but both bottom side cases where finished, the matrizes and Arduinos where soldered and I was struggling to get RF communication between both sides working - I had forgotten to turn the keyboards off (back then through disconnecting a jumper wire). The result: a bloated LiPo.\n\nThat made me think: \"Is it really such a good idea to use LiPos in a wooden case? Can I guarantee to get them under control?\" I thought I already had LiPos with some protection circuits integrated. The same day I removed them from the keyboard and ordered NiMh batteries (Sanyo Eneloop AAA) with external chargers (because I couldn't find a breakout or simple circuit for charging NiMh batteries through USB).\n\n\n\nAt the same time I gave up on the RF communication (this is a story on its own), connected both parts with an old USB cable and used SoftwareSerial for sending key presses across. I needed only one wire because only one way communication was necessary. Now it was possible to power both circuits from one battery pack using two other wires from the USB cable. As there was not more space in the keyboard case, I decided to put 6 batteries under the wrist rest of the left side. I made three batteries in series and two of those packs in parallel. I thought that would be power enough. Unfortunately not. When I first tried to use the keyboard it took a few hours (when I remember correctly around 3 hours) and the batteries were exhausted. The next project appeared: making \"TheTasTaTur Mark1\" saving energy when possible. Another point against the Arduino Uno because its energy saving capabilities are quite limited. In the end it was possible to quench a hole workday out of the batteries. That again is a story on its own.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Power Part 2", text: "Summary Page\nThere is one post missing I announced a while ago: how I got a whole work-day out of the batteries. The Atmel chip (ATMega328) of the Arduino has quite decent power saving possibilities, sadly the Arduino Unos voltage regulator, as well as the onboard LEDs limit the amount you can save. I guess that is the reason I could quench only hours (instead of the initially hoped weeks) out of the created powering solution (two times in parallel three AAA NiMH in series for both halves of the keyboard). I don't own anything to measure the actual power consumption, the only way was testing in the field. That made the task a lot harder and I was satisfied with a somewhat practical solution.\n\nThe basic mechanism was clear right at the beginning: when there is no state change (e.g. pressed keys, moved mouse) for a while power the Arduino down as far as possible, connect some sensor to an interrupting pin and when it senses something (ideally a key press or a hand approaching) wake it back up. At first I thought about somehow sensing the keyboard matrix without actually polling it. But how should that work? Some kind of proximity sensor was my next idea: a PIR (passive infrared), a capacitive sensor (like a touchpad) or a FSR (force sensing). After thinking about it a little bit and checking available solutions I decided to go with a FSR. I chose to order this one and put it under one foot of the right side. I later realized I made a little mistake. I should have orderd two FSRs and put one on each side. When you take a break and then start working again with using the left side (most freqently: move the mouse) the keyboard stays frozen.\n\nAt first I tried to follow the Adafruits tutorial. But that didn't work for me. After creating a working solution on a different path I can't imagine how that tutorial could really work. Maybe their FSRs are working differently. I basically followed this guide choosing the FSR threshold switch configuration (on page 21). After finding this solution I had to somewhere \"steal\" a LM358 OpAmp. My old burglar alarm system came in handy and had some LM358 not that difficult to desolder. It was somewhat fiddly to connect wires to the pins. My electronics starter kit contained a potentiometer which I also needed for the circuit. You need the poti to adjust the sensitivity. Basically you can configure the strength of the force that is needed to trigger. The whole thing looks quite ugly (see the pictures) but it works.\n\nI used this LowPower library to simplify the use of the power saving capabilities of the Arduino. The following gist shows the corresponding code:\n\n\n\nBesides letting the Arduino sleep, there are clearly power saving possibilities in the BlueSmirf. Generally there are more things I could optimize. I think this optimization potentials and further ideas regarding self made keyboards will be the content of the last post in this series.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Simple RF Trials", text: "Summary Page\nI found the idea to move both sides of \"TheTasTaTur Mark1\" fully independently from each other very appealing. So I first planned wireless communication. Letting every part \"talk\" itself to the computer was no option. Because I didn't want to write hardware drivers for the different operating systems - that would be necessary to integrate both key states, for example pressing ‹M3› on the left and ‹N› on the right should produce a ‹(›. I'm not aware of a \"syndication\" feature in bluetooth. If it exists a link to specific information would be really nice.\n\nNevertheless I planned that the left side should talk to the right and the right side integrates the keys of the left in a single neat bluetooth report and sends that to the host. After studying the wireless buying guide of Sparkfun (back then it looked quite different) and trying to keep the costs low I decided to buy these. With them very basic radio communication - one sends, the other receives, no two-way communication - should be possible. Besides the usual GND and VCC connections you simply connect the sending pin to one of your Arduinos and the receiving pin to the other (using SoftwareSerial or the hardware serial interface on digital pins 0 and 1). On the software side you initialize both with the same baudrate and then you can write one byte on one side and on the other side this byte is received. That's the theory and almost the reality.\n\nAs you might have read in some of my previous posts I dismissed RF and used a cable. Because it's not that simple and easy. At least there is a reason why more sophisticated wireless solutions exist. I got it working though. But not really with the quality or speed needed to be useable in a keyboard. In fact that were the tradeoffs I experienced. Either I got reliable communication and a noticeable delay or instant reactions and missed key presses and garbage.\n\nThe basic problem - at least I think it is, feel free to correct me if I'm wrong - is that the receiver needs some time to adjust to the signals of the transmitter. This seems quite logical because this devices actually have a quite big range and can accommodate to signals of different strengths. When you don't send anything the receiver tends to pick up a lot of garbage from the air, because it \"thinks\" the sender is far away and makes itself more sensitive. When you begin sending it will be \"overwhelmed\" with the signal strength and \"slowly\" adjust to the actual strength. After this adjustment phase it works reliable.\n\nSo basically I had to come up with a decent protocol, that filters the garbage out and initializes the communication properly. I tested two different strategies. The first was to continuously send a keep alive signal or carrier signal to keep the receiver at a certain signal strength. I looked deep in my sketchbook and found the receiving and sending code using this strategy. The functions displayed in the following gist do the actual sending:\n\n\n\nThe next gist shows the receiving code of the right hand side.\n\n\n\nThis version was the one that turned out to be too slow in the end. I guess thats because of the communication overhead and the quite limited baud rate of the devices (4800 baud/s). In addition it seemed - I haven't tested it though - that I could get problems with the power consumption of this solution. Basically the sender sends either a package from a key press or every five milliseconds (I experimented with different durations) a carrier signal. The receiver waits for a start package, dissects the following packages, does some checking and translates them back to key presses until a stop package is received. The key presses are integrated with the key state of the right side, packaged in a bluetooth report and send to the host.\n\nThe second strategy was to wake the receiver through a number of pull-up signals before the real keyboard state is send. I couldn't get this solution to work without error and missing sometimes the first keys. Almost regardless of the amount of pull-up signals. Unless I send really a lot of them, but then it reverts to being to slow. However here is the code for the sender using the second strategy:\n\n\n\nThe next gist shows the code for receiving the key states send using the pull-up technique. I made this exclusively for testing the communication.\n\n\n\nMaybe the whole solution is a little flawed. For example I could have tried to make a little delay between every pull-up signal. But that would have meant a bigger refactoring (maybe I will try this in a later project). For then, after days of trying to get it work and because around the same time the powering solution didn't work out so well (read here for my blowing LiPo experiences) I decided to simply use an old USB cable and dismissed RF between the keyboard parts.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Thumbstick and Mouse Buttons", text: "Summary Page\n\n\nRelatively at the beginning of this project, with my second or third parts-order, I bought a thumb slide joystick and a beginners kit including some micro switches. I hadn't any concrete plans to use them, though. While further reading about keyboards, mice and input devices in general as well as the ergonomic aspect of them, the idea settled to further minimize the length of the ways I had to move my hands on a normal workday. Since I'm habitually using the mouse a lot and with the parts already there, I decided to integrate the thumb joystick in the left keyboard part (a while ago I switched my mouse-hand) and mouse buttons in the right side.\n\n\n\nSo after getting the keyboard to work smoothly I decided to add basic mouse behavior. The goal was to integrate the mouse in such a way, that I could do basic navigation and clicking with my thumbs. Nothing really fancy. Luckily there was enough space and I didn't had to modify the case much. Basically I just made holes for the buttons and the thumb joystick. In the latter case I had to grind off a little bit from the top of the case, so that the stick could freely move. I hadn't really the time and energy to varnish the case and the buttons afterwards. So it still looks a little unfinished if you look closely.\n\nThe thumb stick essentially behaves like two potentiometers, e.g. the resistance changes when you move it. You supply VCC and GND to the corresponding pins and connect each output to an analog pin of the Arduino. The device has a quite broad resting area. For example when you move it to the right and let it move back to the middle the measured value is 585 or less and when you move it to the left and release it the value is around 455 or above. The same is true for the Y-axis (top and down). I remember a tutorial using this thumb stick, unfortunately I can't find it anymore, the values there were quite different compared to mine and the author stated, that you have to experiment to find the actual resting values. The next gist shows the code to read the thumb stick:\n\n\n\nThe code to send the mouse move to the right side of the keyboard will get explained in a later post. For now I come to the second part that constitutes a mouse, the mouse buttons. They are simply connected to pins of the Arduino of the right hand side and polled and debounced similar to the keys of the keyboard matrix. The following gist shows that:\n\n\n\nAfter reading the thumb stick and the mouse buttons their combined state has to be send to the computer. To be able to do this - sending mouse reports in addition to keyboard reports - I had to change the device class (COD) to \"COMBO\". You can achieve this by configuring the RN-42 HID module (see the documentation for details). Afterwards you can send raw mouse reports and the computer acts accordingly. Finally here is the code that does exactly that:\n\n\n\nI had to experiment a lot with the actual values for the report interval as well as the strength of the mouse move. Again the test gui of the hidapi helped a lot to find out how real mice behave. Nevertheless I'm not really satisfied with the outcome. As fully wireless-nes would have been nice. Another aspect with tweaking potential.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Parts, Labor, Costs and Duration", text:"Summary Page\nIn this post I will try to recall which parts I bought and which I really needed as well as how much time I spend on designing, programming, testing, soldering, drilling, grinding, sawing, wiring and gluing the keyboard. I will begin with the parts that are now integrated in the final - may it be prototypical - version of \"TheTasTaTur Mark1\", ordered by expensiveness starting with the most expensive in sum:\n\n\tCherry ML key switches. Originally I ordered 80 pieces. Later I ordered a few (20) more, because I broke some while hunting down the tension bug. The price for each is around 90 cents. In the end there are 79 usable key switches integrated. This sums up to around: 70€.\n\tTwo Arduino Uno for 26€ each: 52€ in total.\n\t12 AAA Sanyo Eneloop, to always have a charged set available and two chargers, roughly 45€ in total.\n\tOne BlueSmirf HID: 36,50€.\n\t5 sheets of indo ply wood. 3,30€ each, sums up to: 16,50€.\n\tThree TriPad Stripboards for 3,50€ each: 10,50€ in total.\n\tSolder, different color wire, glue: roughly 10€.\n\tWooden strips of different dimensions and wood type around 9€ in sum.\n\tAs I learned later an unnecessary 5V boost regulator (but it is still integrated): 5€.\n\tA 4mm force sensing resistor: 5€.\n\tThumb slide joystick: 3€.\n\tAround 100 diodes (I can't remember exactly but I guess this ones) for the price of 2 cents each: 2€.\n\tAround twenty 10k resistors for 10 cents each: 2€.\n\tA power switch, extracted from a toy: 0€.\n\tSwitches for the mouse buttons, extracted from another toy: 0€.\n\tOpAmp (LMV358) extracted from our old burglar alarm: 0€.\n\tAn old USB cable: 0€.\n\tA potentiometer extracted somewhere I can't recall: 0€.\n\tScrews I already had somewhere: 0€.\n\nIf I haven't missed anything that's a total of around 270€. If I would have been able to build the keyboard without any trespasses, I already had all tools and I ignore the labor costs I saved around 90€ compared to buying the Kinesis Advantage Pro. But that is naive fallacy. Alone the parts that are now waiting in my spare parts cabin for a new project: 4 LiPos, 2 LiPo charge circuits, another 5V boost regulator, RF sender and receiver, another BlueSmirf, 2 Analog/Digital MUXs ... maybe more, would rise the costs above the 360€ deadline. But when it comes to labor costs the comparison gets totally pointless.\n\nSoldering the keyboard matrix took around 16 hours effort. The case around eight hours. Creating the key caps was the hardest and most time consuming part. I sat for three weeks almost every evening for three hours in our basement. I first glued two sheets of ply wood together to make the key caps a little thicker. I then glued a printed out stencil of the keys on the ply wood and sawed the keys following the stencil lines. The most difficult part was to properly attach the key caps to the key switches. I found some metal pins (they were too long, so I had first to shorten them) that fitted tightly in the openings of the key switches. I drilled four holes in every would-be-key-cap (remember the stencils) and glued the metal pins in. Unfortunately this connector is a real weak point. Because it was nearly impossible to get the distances right. So some key caps are quite loose and fall off when you turn the keyboard up side down. But hey, why should I turn it up side down ... aargh, every time I have to change the batteries ... Painting the letters and varnishing the case and the keys took me the final eight hours of manual labor.\n\nComing to the brain work. Planning and research took around 16 hours effort. The programming, bug fixing and testing around 50 hours effort in total. I'm not able to separate the effort spent by feature. I know that the bluetooth low level communication and the radio communication between the keyboard parts were bigger points as well as the late integration of the mouse behavior. I took an incremental approach and switched back and forth from brain to manual work. From creating the case and wiring the circuit to program and test it.\n\nI started in December and \"finished\" in March. And even when I spent a lot of time with this project, alone the things I learned and the good feeling of having created a keyboard which is still fun to use are priceless. Somewhat geekish ... I have to thank my wife for tolerating this.\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Wired Communication", text:"Summary Page\nWhile talking about the perils of getting wireless communication between the keyboard parts working I forget to show the final wired solution. I guess the post is long enough though. So here follows the actual implementation. At first you have to configure both serial interfaces to the same baudrate. I do this in the \"setup()\" function. I use the hardware serial interface on the left side and on the right side I use SoftwareSerial (the hardware serial interface is used for communication with the BlueSmirf HID). The following gist shows the sending of the key state:\n\n\n\nAs you can see I still use some basic protocol. It is a remnant to the RF trials but as soon as I integrated the mouse behavior it came in handy. Sending the mouse move to the right side of the keyboard is straight forward, too:\n\n\n\nThe next gist shows the receiving of the signals on the right side of the keyboard. Basically I'm looking for the beginning of a key or mouse message read the following values until the message end signal is received:\n\n\n\nThat's all there is to it. Much simpler than the RF solution and more reliable and faster. Praise the wire. But now I have to fight the ever twisting cable. Fortunately I chose the cable to be long enough (around 1,5 meters).\nSummary Page"}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - Sum Up", text:"Summary Page\nThe last few weeks I mentally tried to go back in time to remember everything I did to bring \"TheTasTaTur Mark1\" to it's current state. For me it was (once again) an astounding trip and the outcome (more the experience than the working keyboard) was worth the struggle, even when there are still some things far from ideal. This post is about the aspects that are improvable either in the current keyboard or in a future attempt to make an even better one.\n\nI left off with energy saving. So I guess this is a good starting point. There are a few different paths I could follow, so far I couldn't decide for one. The main question is: do I want to keep the keyboard wireless? The answer is yes and no at the same time. If I ever make a keyboard again it would be wired, I guess. I would use the Arduino Leonardo (back then this model didn't exist) or a clone as USB HID device and could save some money and hustle.\n\nBut for the current keyboard I would keep it wireless and use power saving Arduino clones (maybe this one from Olimex, or maybe a PIC or ARM controller). Further I would spend more time evaluating LiPos as the power source. Olimexes clone already includes a LiPo charge circuit and so ubiquitous as LiPos nowadays are, it can not be that difficult to keep them in control, right? In the course of switching back to LiPos I even would try to remove the wire between the keyboard halves and use some other wireless technology. I experimented a little with ZigBee, that might work better than simple RF.\n\nI also should exploit the power saving capabilities of the BlueSmirf to extend the recharge cycles even more. In conjunction with that, I should add better bluetooth connection behavior. At the moment I have to actively reconnect the keyboard from the host side every time the keyboard is powered back again. Instead the keyboard itself should try to establish the connection to known hosts, simply when you press a key.\n\nI'm thinking about rearranging the keys a little. I more often use ‹backspace› than ‹remove› though they should be switched. When talking about keys some of them are not working that smooth others have flaws in size and proportion. I definitely should replace some of them with new ones. Maybe I could even find a better way to connect them to the key switches. Any ideas are welcome.\n\nAnother thing are the key columns: when building a new keyboard I would stagger them, so that they follow the different length and position of my fingers. That way I don't have to crumple my middle fingers and at the same time stretch my pinkies. Maybe it would be more ergonomic if those staggered columns are moved apart at the top and kept close together at the bottom. This would reflect more the (at least my) hand-opening-motion. Eventually the keys should have different sizes for each finger, to acknowledge the range, flexibility and accuracy of my different fingers.\n\nI avoided to code a hardware driver. But that means now I only have the limited character-set of the default \"QUERTY\"-layout. Some characters from the third level and many of the 4th, 5th and 6th level are missing. To use the full power of the NEO2 layout I should write hardware drivers. When doing this I could even switch to two fully independend keyboards, each connected via bluetooth to the host, letting the driver combine the input from both halves. I could even add a third part: an independent number pad or a special gaming part, for example.\n\nOne thing that really sucks is the thumb stick. Yes you can move the mouse pointer with it, but if you have ever tried mouse-moving on a game console, you know that it is not working as smoothly as it should. The little red thing on IBM notebooks, the nipple mouse (officially called TrackPoint), might work better. Or maybe a trackball. Back in the 90s I put my mouse aside for some time and used a trackball until the Counter Strike era began. You have no chance with a trackball. But that time is gone and for me a trackball might be the right choice (again).\n\nWhen making a new one I would invest in a professionally manufactured PCB, now I feel able to draw the basic circuit (at least with Fritzing) and they are not that expensive anymore. In addition I would invest more time and money in properly fitting keycaps. Maybe I could let them make with a CNC machine. There are a few companies that provide CNC services for prototyping and small quantities. Regarding the overall material, I guess I would still stick with wood. It simply feels good.\n\nI guess the next post: I will make a short video showing me type on the keyboard, will be the last post regarding \"TheTasTaTur Mark1\". So any questions - whose examination also could be the content of another post - and general recommendations, are welcome.\nSummary Page"}
@Posts.insert {indexed: false, title: "Putting Node.js on the Olinuxino A13", text: "Out of curiosity and steamed up by the current arm-based-development-board-hype (prominently represented by the Raspberry PI) I purchased - along with some Pinguino clones and one Maple clone - an Olinuxino A13 WIFI dev board directly from the manufacturer Olimex. I tested the Olinuxino on the day of its arrival and it ran perfectly the integrated Android 4.0. My first impulse: put Linux on it. The guide provided by Olimex didn't work out well: while booting and recognizing the SD card and u-boot correctly it stopped at \"Starting kernel ...\". I had recently not much time so my intermittent attempts to make it work were not very fruitful. Until some days ago a comment to the original guide pointed me to a revised version (which I highly recommend) and brought the breakthrough. Since yesterday Debian Wheezy is happily running on the A13.\n\nThat was the first step. Now I had to bring it online and install the things I desperately needed. For example the very simple editor: \"joe\". I admit it: I hate vi and it's derivates. Of course vim was preinstalled and I had to fumble with its \"modes\" and special keys until I could connect to the net. Since I had no idea what was already configured in the kernel and installed in the rootfs I prepared mentally for the worst case. A first check with: \"ifconfig\" revealed only the loopback interface. I began to shiver and asked google for help. This guide at debian.org and executing the command \"iwlist scan\" brought me back on track. The result of the command showed that there already exists a wlan interface, somewhere. This means the driver is included in the kernel.\n\nThat verified I could further follow the guide. Because I'm at the command line I had to configure the interface in the file \"/etc/network/interfaces\". As soon as there is an appropriate entry \"ifconfig\" shows the device. At first I attempted to connect to my WPA protected 3G-wlan bridge. With no luck and no error message.\n\nSearching for \"wpasupplicant\" on the A13 filesystem revealed that it was missing. And as far as I understand the matter wpasupplicant does the actual authentication handling. So no wonder that it was not working. I disabled any security on my 3G-wlan bridge and changed the configuration file accordingly:\n\n\n\nI brought the interface with: \"ifup wlan0\" up and suddenly was connected. The first command I issued after I verified the internet connection, as you might guess: \"apt-get install joe\". The second one was \"apt-get install wpasupplicant\". After installing both packages (including some dependencies) I - now smoothly - changed \"interfaces\"-config file to it's (at least for now) final state:\n\n\n\nFor completeness, to create the encrypted version of your network key you have to issue the following command:\n\n\n\nOK. Now we are connected. Actually you might have to reconnect. \"service networking restart\" should do the trick. The fun can begin. To install Node.js I followed this guide. As prerequisite I had to additionally install python2.7 and I switched to the most recent stable version of Node.js: \"v0.8.14\". But I got some errors when running \"make test\".\n\nGit and npm were giving me also some errors. Which I ignored at first or disabled through setting an environment variable. But after looking closely at the messages and thinking a bit about it, I finally got it. The Olinuxino doesn't have a realtime clock. So every time there was SSL involved the server certificates were recognized as faulty (actually as issued far in the future, because the system thought it was 1980). Installing \"ntp\" through aptitude helped and I could for example install CoffeeScript via npm.\n\nYou might ask: What the heck do I want with those boards? The honest answer is simply to play a little with them and in the end get an impression how developing for more sophisticated hardware than Arduinos feels. The still somewhat fuzzy plan is to make a robot for and with my sons. We already have extracted some useful parts (motors, cogs, screws, wheels and more) from old computer hardware and toys. As soon as we create something noticeable I will surely report in this category.\n\nUpdate:\n\nI had, like many others a problem with rebooting and shutdown. Some \"no handle\" message on UART. This forum post helped to get rid of it. Basically you have to use the stable 3.0 kernel version, rebuild it and replace the existing image, script.bin and modules. I didn't had to start from scratch. But to be on the save side make a dd copy of your existing card, just in case."}
@Posts.insert {indexed: false, title: "Twitter, Facebook and Co. are so lame ...", text: "I don't get it! What makes those social media stupidness so appealing to so many people and even established companies? I was on Facebook (and a few localized clones) for some time. The reason: checking what everyone whom I used to know is actually doing ... OK I checked that and it exited me for around a week or so. One or two moments of: wow I have never thought that she/he could do this. Sharing some delightful moments - the birth of my first child for example - felt somewhat ... right. That were the positive things I recall.\n\nAfterwards followed a long period of not looking at it. Introduced with a few weeks of decreasing interest in what else you can do there. Then Facebook began with this stupid games, where you could post \"things\", that you actually did in the game, and get rewards when the receiver responds to this or enters the game or something. I never played games there, so I don't exactly know. That was the point were it began to annoy me and shortly after I removed my Facebook account. Deep delete ... I hope they really did it. I can understand, to some extent, why companies engage Facebook. After all their customers are there und you get a quite decent platform for almost free viral marketing and some more public relation and marketing tricks.\n\nBut why is the user base that large and so engaged? I even personally know people that are actually posting almost every step they are doing during the day. Is it simply that they are on a mission to spoil the world with their meaningless everyday actions? I asked them! But I couldn't discern any, close to logical and even not an emotional explanation, at least that I could follow.\n\nMaybe I'm too humble. I think I don't have to say anything that anybody that I know must hear. You might say: \"Hey, why are you writing this blog\". But that is a different story. Nobody I knew through Facebook would be interested in the things I wrote here so far. And even if they were, they could google this blog up on demand. Even if it is not on the first page, when you really try to find some in-depth information, you look at more than the first goole search page.\n\nI wouldn't have started to write if some of my colleagues, I consulted during my keyboard project, didn't \"force\" me to write it down. Their reason: maybe someone else is trying to do the same. Making things accessible that I have done and problems I have encountered might help them along the way. Furthermore I write because I think it is an important skill in the IT business. And to become good at it, you have to practice. Wooaaah, what an exhausting workout ...\n\nBack to the topic. The last weekend I stumbled over the film \"The Social Network\". It was on TV and because of the advertisement breaks I didn't see it completely and even missed the last ca. 20 minutes. You get some explanations of why Facebook is working like it is. But you also get the impression that everyone - of coures, with the exception of Mark Zuckerberg, but that is hollywood-nerd-hero-pathos - is overwhelmed by how well Facebook is received by the users.\n\nPsychologically it might be, that the essential embodied urge everybody (consciously or not) has, to give their live some meaning and to leave their traces in the ground, is the reason. Facebook might look like a cheap and easy way to achieve that. The almost instant feedback you receive from \"friends\" might even further encourage you. But what is the outcome, the purpose? Maybe one shouldn't ask that question.\n\nThe title suggests that this post is about Twitter, too. And it is: You can apply almost everything that is true for Facebook evenly to Twitter. They will become essentially the same, they only begun from opposite directions. Twitter begun with meaningless chatter. Facebook with personal information. Now either moves in the direction of the other. I never used Twitter, so I don't really know what else they are offering. But I often ask myself: how much time active twitterer (is that the right term?) spend on tweeting that could be spent much more productive?\n\nI must admit I'm not completely out of the social stuff. I do have a Google+ account. The reason: they are not bothering me and my wife loves to share photos this way with our geographically spread family."}
@Posts.insert {indexed: false, title: "The Craft of Research - A Biased Review Part 1", text: "In one of my last posts I boldly stated that for me writing is generally an important skill. Actually I have a very specific reason to tone my writing skills. Especially in English, which is a whole different story than writing in your mother tongue. I often fall back in German language habits. I sometimes can't believe that anyone can understand my babble. If you find errors or stumble upon twisted grammar, feel free to leave me a comment, so that I can learn from my mistakes.\n\nThe reason: almost 5 years ago I enrolled in a graduate program to achieve my master of science degree. The program is mainly virtual, with short attendance phases to write tests. And it is specially targeted to part time students with a day job, like me. I'm doing quite good,and although I'm almost done, the biggest writing exercise, the thesis, is still to come. For over a year now, I struggle to find a decent topic. A long time even considering the interruption of my second sons birth and the accompanying arrangements. I abandoned a first topic because it felt so ... irrelevant. At least I have some cornerstones:\n\n\tIt will be written in English (that's one reason for writing this blog in English)\n\tIt will be broadly focused on Artificial Neural Networks and their applications.\n\tAs my university program is Business Informatics, the outcome has to be applicable in some business sense.\n\tIt should have some significance.\n\nTo better prepare myself I read some books on writing and research. For me and my current situation the best was \"The Craft of Research\" (3rd edition as e-book) from Booth, Colomb and Williams. So in preparation to revive my thesis-writing-project I actually read it again and present in the following paragraphs a kind of (strongly biased) review. In later posts I will not be able to withstand to bore you with the summarization and review of some sources (practicing and better memorization, you know). I wouldn't mind if no one ever read those. I hope I find the time to intersperse some posts from other arguable more interesting topics. Like my DIY-robot-toy-project: \"Raphbot Alpha\" and some more software centric topics. I'm currently experimenting a lot with programming languages like Io, Lua, Google Go, CoffeeScript, Xtend and again Smalltalk and make some really awesome interoperability \"apps\" to bridge some legacy business systems. I'm not sure how far I'm allowed to tell you about the latter. But I guess I will be able to either get approval from my boss or write it in a more theoretical style.\n\nBack to the book and at first its overall structure. It is divided into five parts. Where the first and the last part provide some general information and thoughts about research, researchers and readers as well as the inherent ethical aspects. The three parts in the middle reflect the main aspects of the research method. At first I was thinking about going through the book chapter by chapter and extract and present the essential message. But this doesn't feel appropriate.\n\nAs soon as I reached the second chapter \"Connecting With Your Reader\" I realized that I'm not following the advice given in the book. I already violated it with my scribblings here. I know this post is far from being a research paper, but nevertheless I do write for an audience, even if it is a small none-academic one. Instead I decided to take you through the book by applying the rules, as far as appropriate, to this blogpost itself.\n\nThe motivational first chapter is not really applicable. I do realize the importance of research, why writing it down is a good idea, I understand what research basically is and that it requires some formalism (depending on the special research community). The second chapter \"Connecting With Your Reader\" gets the things going. Who are my readers? How can I describe an archetypical reader of this post? Lets try:\nYou are a student of computer science and face your first big assignment, questioning yourself if it is worth buying the book. I guess you are expecting some entertainment factor otherwise you wouldn't open a blogpost. Moreover I think you know a few things about research already but are seeking for a structured plan to tackle your actual assignment.\nThat might be to narrow. But I guess you get the idea. A word of caution: your are not writing it for your teacher in his teacher role! Instead you dig up new and interesting information on a topic, discover new things or find answers to important questions and teach your unknowing teacher about it.\n\nThe next step: What can I offer you? What do I have learned or discovered what you might not know? Well at least I read the book, twice. So I can tell you about what I have read, hopefully in a way that sheds some light on the the art of research and still encourages you to buy the book. But it can go further: Do I have found a solution to a practical problem or even an answer to an important question? In the context of this post I have to say: No, I didn't. But you might, in your real research project. By the way: good luck to you.\n\nIn my next post I will continue with the second part of the book."}
@Posts.insert {indexed: false, title: "Better Reduce For Xtend", text: "A coworker pointed me to yet another \"better Java\" named Xtend. I currently have to use Java in my day job because of the excellent support to access MSSQL server. After fighting with Java for some days now, I hoped Xtend would make the job a little more pleasant. After tinkering a bit and stumbling a few times over the static type system I came across a real glitch, at least for me: the ubiquitous \"reduce\" function. It is realized as an extension method, which means one can simply call reduce on every iterable and its subtypes, and it looks quite neat:\n\n\n\nBut there is one big problem with it: the elements in the iterable and the return value have to be the same type! I have never encountered a real world case where I would want that behaviour. Another thing I missed is a optional start value. The following gist shows a different prototypical implementation of reduce, with an initial value and a return value of a different type:\n\n\n\nI'm not sure why the original implementation is so restrained. Maybe future versions will make it better. Except the painful static typing and this glitch I think Xtend is quite amazing and can make me more productive in the Java world."}
@Posts.insert {indexed: false, title: "The Craft of Research - A Biased Review Part 2", text: "After sort of reviewing the first part of \"The Craft of Research\" I will continue in this post with the second part of the book. It is named \"Asking Questions, Finding Answers\" and is supposed to help the want-to-be-researcher find an appropriate topic, asking a worthwhile question, stating a research problem and identifying and engaging sources. I will again take the twisted meta-route of viewing this post as far as possible as the to-be-written-research-paper. That said, the broad topic is quite clear: the book \"The Craft of Research\". And I guess it is actually specific enough. If I didn't had the topic already, the first sub-chapters would help me find concrete topics among my interests.\n\nThe remainder of the first chapter tries to show me ways to reach at a significant research question. What might be a worthwhile question regarding my topic? The authors suggest to begin with asking the default questions applicable to gain knowledge: what, when, who, where, why and how. But concentrate on why and how. So what about these questions:\n\n\tWhy was the book written in the first place?\n\tWhy is there a third edition?\n\tHow did the authors figured out what works well and what not?\n\tHow does the book help you in writing your first research paper?\n\nI think the first three questions might be interesting in their own regard, but not so much for my audience, I guess. The fourth question points more in the right direction. But it assumes that the book actually helps in writing a research paper. This is an unproven claim. But leads to another question: does reading the book and following the books advises enable one to create good research papers? Does the answer to this question have any significance to my readers? I would say: of course. As my readers might be students tackling their first major research project (I discussed my potential target audience in the first post reviewing the book), and they certainly would like to have proof that the book helps them get good grades. At first it looks hard to find sources and reliable evidence. But to take the question any further you have to be sure you can come to an answer. So maybe some freely available numbers might tell us something. I googled the following phrases and looked at the hit count:\n\n\t\"The Craft of Research\" better grade - 579.000 hits\n\t\"The Craft of Research\" worse grade - 56.000 hits\n\t\"The Craft of Research\" success - 195.000 hits\n\t\"The Craft of Research\" failure - 289.000 hits\n\t\"The Craft of Research\" works - 340.000 hits\n\t\"The Craft of Research\" sucks - 46.800 hits\n\nWithout digging any deeper in the search results, I guess it is obvious that there is a strong tendency towards the usefulness of the book. Additionally there may be other resources for hard numbers: positive vs. negative reviews at Amazon.com or Goodreads.com. You even might conduct a survey that asks for the grades of students, and if they read and used the book. To sum it up, here is the three step \"significance test\", discussed in sub-chapter 3.4:\n\n\tI'm studying the usefulness of the book \"The Art of Research\"\n\tBecause I want to find out if it actually helps students and researchers to write better research papers\n\tIn order to help my readers understand if the book is worth reading in preparation of their first major research project.\n\nThe next chapter is focused on the transition from step 2 to step 3. In doing so you state a problem focused towards your readers, whom might agree that a solution to that problem is needed. Actually I feel quite lucky with the example I have chosen here. In my own real research project: my master thesis, I'm still struggling trying to do the same for any topic I have looked at so far. The chapter discusses common aspects of a problem and the differences between a practical and a conceptual problem. Let's come back to the example. A practical problem, might be:\n\n\ta situation or condition: a recommendation to read the book to become better at writing research papers\n\tthe cost: the loss of some money to buy and time to actually read the book\n\nTo arrive at a conceptual problem you have to state something that must be understand by your readers or is currently unknown for them:\n\n\ta situation or condition: the student or want-to-be-researcher doesn't know if the book does help in writing research papers\n\tthe consequence: possibly bad grades or reviews when not reading the book and following its advises.\n\nBut why this hassle? The authors argue, that it is crucially important that your readers understand and acknowledge the reason for doing the research. When they do see your problem worth pursuing, they are longing for the solution you might present them. I agree with the authors. I even think there is a deeper pattern as I see similar statements in many different areas. Maybe it's just that everyone tries to do meaningful things and avoids \"monkey work\".\n\nThe next sub-chapter addresses a further distinction of research: pure versus applied. I guess most of us have a quite clear understanding of this. But in short: the former seeks out problems for the sake of just knowing the answer. The second has some practical relevance. You can act upon finding a solution to the problem. As you might have guessed, my example falls in the second category. The rest of the chapter gives hints at finding a research problem worth pursuing. As I already identified an example research problem - may it be not that extraordinary - I will only summarize the key points:\n\n\tNot knowing the concrete problem to solve is not a big deal at the beginning of your research project - many researchers identified theirs on mid-flight and contributed often more, than those who found a solution to a well known problem.\n\tTalk to others about your topic and the questions they ask might hint at a problem worth pursuing.\n\tWhen you are reading papers look out for possible contributions, corrections or open questions.\n\tReread your own drafts. When writing things down you serialize your thoughts and often find gaps in your thinking that might offer research problems on their own.\n\nThe chapter continues with some further information on how to work with your problems. It finishes with encouraging words regarding and overcoming the inexperience everyone feels, who is new in an area of research. In short: accept that uncertainty and anxiety are unavoidable, get control over your topic through writing about it, divide et impera and define achievable concrete goals.\n\nThe subsequent chapter exists to help the inexperienced researcher find sources. At this point you have to have at least a research question and one ore more promising answers. Wait a second, what actually is a promising answer? Two things came instantly to my mind. The first: this point wasn't touched so far. The second: is 'Yes' a valid answer?\n\nI guess 'Yes' is indeed a valid answer. But how can I possibly proof that it is the correct answer. I should make my hypothesis more narrow: focused on specific contents of the book or circumstances in which the book can be applied.\n\nBut before diving into developing a promising hypothesis I will continue with the further content of the chapter. Which discusses a totally different matter. Maybe the announcement of a \"promising answer\" was just one small glimpse on what will come later? I don't really get it.\n\nNevertheless the book continues with some theory about the distinction between primary, secondary and tertiary sources and some tips on how to find sources in the library and the internet. As I will NOT go to the library to find sources on \"The Art Of Research\", I omit an in-depth discussion of the library hunt. The internet search part is quite useless in my opinion. But the next sub-chapter: \"5.4 Evaluating Sources For Relevance and Reliability\" has some decent hints on the topic. In sum, when deciding to use a source, you should always consider: your paper/thesis is only as reliable as the sources it is built upon and that it is meaningless when it is based upon outdated or even worse, proofed wrong information.\n\nThe fifth chapter concludes with a quick tip regarding the implications of using people as sources and demands that a researcher willing to take this route should check back with her institutions \"Human Subjects Committee\". That might be US specific, though.\n\nThe sixth chapter: \"Engaging Sources\" starts of with some cautious words regarding the bias to read sources in favor to the first solution we think we have found and are simply overlooking contradictions and problems. It continues with a distinction of different kinds of evidence that is accepted by your readers. The right choice depends mostly on the area of research and in my case the option last presented fits best: \"quantitative data gathered in laboratory experiments and surveys.\" As I'm rooted deep in the natural sciences and favor facts over opinions, this presents the channel to convince me on something.\n\nThe authors make a big deal of proper note-taking. Because it is not really important for the example I have chosen, I will not dive into details here. The same is true for sub-chapter: 6.3, which discusses strategies to read important secondary sources thoroughly by first reading open-minded with good will and more critical in a second run, as well as to question blunt claims even from authorities. The next sub-chapter goes a step back to the topic of finding a resource problem - not really interesting in the examples case either.\n\nThe chapter concludes with a sub-chapter on planning your argument - which seems quite natural and obvious, but it is worth reading nevertheless - a sub-chapter on the nitty-gritty details of note-taking and finally a quick tip regarding moments of anxiety. The quick tip holds some encouraging words and some strategies for the people feeling lost in their notes.\n\nThats it for part two of the book. I guess the third part will fill another quite long blog post. The fourth and fifth parts will be combined in one post. But I don't really know when I will find time and energy to engage those. To be honest, writing a review this way is really exhausting. Hopefully not the reading. If it is, I sincerely apologize and promise to make it better the next time.\n\nBefore I close one final thought.\n\nWhile writing this blog posts I was going through the book at a real slow pace. I kept moving back and forth and reread certain parts a few times. I must conclude: the books structure is not perfect. Some, I thought closed, topics are reopened. Other things are not properly introduced. I guess there is some room to improve in a fourth edition."}
@Posts.insert {indexed: false, title: "Project Portfolio Optimization with Genetic Algorithms", text: "Right before I tackled my keyboard project I turned in my second mandatory project report as part of my graduate program at the university of Duisburg-Essen. As my grade was really good and I liked it as I reread it recently, maybe it has value for someone. The report covers the idea of optimizing the sequence of doing project activities across different projects through the utilization of a genetic algorithm. The report is in German though (here it is nevertheless: ProjektArbeit).\n\nI will give an overview of its content in this post. Additional to the written report exists the implementation freely accessible at squeak source. The sources are in the package: Phase2-POGA. It is written in Pharo Smalltalk, and you should use Monticello to load the sources to your image. Everything else needed should be included in the standard Pharo image. I tested it lately with Pharo 1.4, and it worked fine. If you need any advice in using Pharo and Monticello, there are really good freely accessible books available referenced from the home page of Pharo.\n\nAt first it is important to make a case for the topic. So why would one spend time to implement a genetic algorithm (What the hack is a genetic algorithm, by the way?) to order the tasks of projects? Well, at my work place (as maybe the case in many others) there are plenty of things to do and many of them are undoable in the recent future given the existing people and their knowledge. So we have to make the most important things first. But there are around one hundred people and around 50 most important projects with scores of interrelated tasks. No one I know is able to create a plan that ensures, that the tasks are tackled and finished in a given time frame, that in the end provide the most business value.\n\nGenetic Algorithms take techniques and ideas from natural evolution to tackle optimization problems. There are basically the following steps involved:\n\n\tCreate a random initial population of individual solutions.\n\tRank the solutions regarding some criteria.\n\tTake the best and breed them somehow.\n\tApply mutation to some degree.\n\tTake the Y best resulting solutions and eventually mix them with the X best solutions from the previous generation so that in the end the size of the initial population is obtained.\n\tContinue with step 2 until some abort criteria is reached.\n\nThe challenge is to find a good representation of the optimization problem so that each step can be applied in a meaningful way. The picture of the problem I drew above has to be transformed into a more specific form. I chose this one (there exist and might exist other valid representations):\n\n\tThere are a number of resources (individuals or teams) with individual capacities for time frames of individual length.\n\tEach of those resources estimates a number of existing work units in an arbitrary unit (e.g. Story Points - maybe this post will help understanding it.) related to there capacity and their time frame length.\n\tThere can and should be more resources estimating the same unit of work (which will differ, see the post linked in the prior step.)\n\tUnits of work have an arbitrary number representing their overall business value.\n\tUnits of work may be related in two ways: one unit of work must be completed to be able to begin with another unit of work (I only implemented the simplest and most often applicable relation, others should easily be addable). The other relationship is the part-of relationship. One unit of work may be composed from an arbitrary number of other units of work (like a project is) and can not be finished until all those \"child\" elements are finished. Those composite units of work do still have an own business value and estimates from one or more resources. Because the whole can be more than the parts.\n\tYou specify a time span in which the optimal amount of work units (with the highest business value in sum) should be completed. The amount of open work units should exceed the possible accomplishable work for that time span, otherwise you could simply finish all work.\n\nAfter deciding on this basic rules and cornerstones it is time to tackle the question of how to represent such a project portfolio in terms of a genetic algorithm. I termed the individual in the genetic algorithm population a scenario. A scenario contains the order of tasks for each individual resource. How that tasks can be outlaid (respecting the tasks relationships) on the timeline defines how many tasks can be accomplished in the timespan and thous how much business value will be generated.\n\nAt the beginning, remember step one from above, a (configurable) number of scenarios will be randomly generated. The order of tasks as well as which resource will work on which task (remember: for one task may exist more than one estimating resource) are the variables. The scenarios are ordered by comparing their achievable business value for that timespan respecting the relationships of the tasks and the capacity of the resources. The top scenarios are selected (step 2).\n\nIn the breeding process (step 3) the selected scenarios are randomly crossed with each other until the size of the original population is reached. When crossing two scenarios the order of tasks in the child is composed from alternately taking tasks from one of the parents (respecting of course already contained tasks). In the next step (step four - mutation) are certain tasks taken from their current position and moved to a random other position or even given to another resource if applicable. Mutation is generally applied at a relatively low rate (again configurable).\n\nIn step five the resulting population is ranked, and the best children are combined with the best parents. The rate at which the parents are kept is also configurable. The process starts over at step two. The genetic algorithm stops when their wasn't a better solution for a configurable number of generations.\n\nI used morphic to visualize the scenarios in a more or less rudimentary way. That's basically it. I still think this is a nice approach but their are some shortcomings. Generally you won't get concurrent estimations, and a project is usually given to a single team. This might change: for example the book \"Agile Software Requirements\" by Dean Leffingwell (a great book by the way) states an approach that might better fit the optimizing technique described in this post. Furthermore (at least) I notice some trend that fosters internal competition and parallel development. That might further fortify the described approach.\n\nAnother shortcoming is the one-number-business-value of the units of work. It would be tough work to get the decision makers to reduce their multiple-factors-world-view to one simple comparable number. Whereas the comparability might be the hardest part."}
@Posts.insert {indexed: false, title: "Creating Your Own Keyboard From Scratch - The Movie", text: "Summary Page\nI promised a while ago to post a video showing me touch typing on my self made keyboard: \"TheTasTaTur Mark1\". So no more words, here it is:\n\nhttp://www.youtube.com/watch?v=f2erEf9_8I4&feature=youtu.be\n\nI feel I have to justify my slow typing speed and the many errors that you might see. Well I make so many typing errors when I feel observed, it is embarrassing. Also I haven't used the keyboard for a while. I was the last 2 month more or less not using it because I was in parental leave (hope that this is the right translation for \"Elternzeit\").\nSummary Page"}
@Posts.insert {indexed: false, title: "The Hobbit Chopped Apart - My Reason To Avoid It", text: "Recently my coworker diminished my anticipation for the upcoming film: \"The Hobbit: An Unexpected Journey\" to below zero. Simply by telling me that they made three parts of it. For me this is the culmination of the make-more-parts-out-of-one-film-and-spread-them-over-the-years-stupidness. I understand: you can make a lot more money this way. You get the people to pay three times for one movie. And the same people buy the blue-ray of the previous film before they come to see the actual one. That is really a lot more money than simply one film.\n\nAnd on the cost side you even spare some dimes with this strategy. You can recycle a lot of things (costumes, settings, ...) in the next movie. And you have a crew that is accustomed to each other. That's also worth a lot of money, of avoided hassle. But what about us, the fans? Actually I don't hate seeing an open-ended film. I sometimes like it, when it is plausible and makes me think. But with \"The Hobbit\" that is a different case. I know the book, and I know that there are more films coming. Why in the hell should I go to the cinema right now? Self-punishment?\n\nThe argument, that they widened the content and included parts from the Silmarillion as well as side stories relating to \"The Lord Of The Rings\", doesn't convince me fully. It is alluring a bit. But in the first place: why did they omit the \"Tom Bombadil\" story from the first part of \"The Lord Of The Rings\"? Tom was my hidden hero, since I read about him. Now they are blowing up a decent story with none-related material. I don't get it. I was so happy that \"The Hobbit\" gets made into a film. But now I really hate it!\n\nI decided to simply avoid this movie, as well as the next, and maybe I will rent part one and two in 2014 and go to the cinema to see the third part (or wait until all parts are available on blue-ray). In sum this might still be more then I would have paid for simply going once to the cinema, but as a Tolkien fan I guess I have no chance. But I will not support this money-driven exploitation of good base material. At least not to its full extend: by going thrice to the cinema and buying the blue-rays. I hope others will join me in simply ignoring this first film, so that this audience-kidding-movie-making-strategy doesn't bear fruits any longer. Otherwise, it will go on and on and on and might even get worse. In the end every at least a little bit anticipated film gets chopped apart to quench out more money off us."}
@Posts.insert {indexed: false, title: "The Famous \"forEach\" But With Return Value", text: "In my last post regarding the programming language Xtend I showed you IMHO a better version of the famous reduce function. Whose default implementation is quite crippled. Now after picking up the work on the project where I have to use Java (and try to avoid it with Xtend), I tried to become productive with the language and its features. To incorporate my version of reduce I made a utilities class holding it. As well as an again modified version of reduce, where you don't have to specify an initial value. Now I could use those through the \"import static extension\" mechanism.\n\nWhile plodding along I stumbled over a point I don't like. It is nice to have those collections enriching extension methods available, but their applicability is quite restricted compared with the rich collection interface others (for example Smalltalk) provide. For me the basic problem is, when you call one of those functions you provide an anonymous function that gets called for each element. It is just that. You don't have access to the context of this anonymous functions creation. The Xtend blocks are not closures, only lambda expressions. This Stackoverflow question, better its answer, explains the difference quite decent. To explain what that means in practice consider the following gist:\n\n\n\nIn the first function I'm trying to return from within the block body, assuming I'm breaking the loop and return the surrounding method. It is the naive approach one would take if \"forEach\" would be essentially the same as a Java for loop. The compiler forbids it. The second function defines a local variable and tries to reassign it with a different value from within the block. The compiler forbids it, stating that, when in a block, you can only access variables that reside outside that block if they are final (vals in Xtend parlance). And now? Revert to a for or while loop. Abuse some other extension function like my version of reduce? Nothing felt really good.\n\nI decide to roll my own version of \"forEach\". Giving it a return value and the functions user a handle to break the usual control flow. The following gists display the code of the utility function and a necessary helper / trigger class:\n\n\n\n\n\nBefore I waste many words, here follows a gist that shows you how you can use this extension method.\n\n\n\nBy the way I didn't like the square bracket notation for blocks in the first place, because of its unnecessary derivation of known syntax for basically the same thing (a function or method body). But now it even feels misleading. Because everyone with Smalltalk knowledge assumes that they are true closures. And because the creators of Xtend chose consciously the Smalltalk notation for blocks, they provoke that analogy."}
@Posts.insert {indexed: false, title: "Avoid if-cascades in Xtend with Options", text: "One thing I continuously get taught by books that suppose to teach good programming style is that you should avoid if-cascades (for example: http://antiifcampaign.com) at almost all cost. But at answering the question on how to achieve this, everyone tells different things. And from my experience I must say: right so. There truly exist different paths which are equally valid. And you have to decide considering the situational factors. On local cases one could use the switch statement. Or return early when certain halt conditions are met. The strategy pattern solves the problem with more ceremony. There also is double dispatch. Others state, that you missed the mark of the problem when you encounter such cases and can circumvent the problem with a better domain model.\n\nBut sometimes there are cases when you must decide between different solutions simply by looking at the values of a handful of properties. In the prototyping phase or early in development I often have only two cases. If-else comes here fast to the mind. But later when you add more, I find myself in situations where I would have to add a third or fourth if-else branch. Whenever I encounter such situations I force myself to halt and put some more thought on a better solution. Often finding myself redesigning big parts of the program. I must admit, my software designs are to a big extend evolutionary, so I wouldn't wonder if any line of code has changed at least once between its birth and the finished program. I must also admit that early in my software-developer-life I had some difficulties finishing at all. You might argue that no software is really ever finished. When I say finished I mean a first version that gets the job done to a degree that the customers and projected users are satisfied.\n\nBack to the topic: in my current project I again stumbled over the problem of the dreading if-cascades. I'm actually making a validator, that checks different aspects of a JSON object that gets send as a string via a simple HTTP request. It's not mainly the validity of the format. It is more the data, which partially has to get checked against a database. By the way an MSSQL database, the whole reason for using Java again, because of the excellent freetds driver, and the lack thereof in other languages. At its heart I'm using the composite pattern (not in its pure form, I have no explicit leave-type) to put validation steps for different aspects under validator-hats which again can be combined under validator-hats. I created some building blocks from whom actual validation steps inherit from.\n\nOne of those building blocks is the class SimpleStringValue. This class checks if a certain key is present in the JSON object, if its value is a string and if this string has a certain minimum and maximum length. The latter three aspects are by default optional and can be defined as mandatory ... HOLD IT! ... as I'm writing this, I realize that I really can avoid the whole if-cascade-situation inside this class. By making itself a validator-composite and checking the length constraints, the existence and the type in composed validation steps. Plugging them in the composite if mandatory. You know: separation of concern and one responsibility by class ... . Another good reason for writing: you discover logical holes in the things you did so far.\n\n\n\nBy now I missed the topic of this post by miles. OK, then without a concrete example, simply assume you a have a situation where you have to decide between different options by acknowledging the values of different parameters. Take a look at the following gist. It shows the application of some little helper classes I made to deal with cases were you need to avoid if-cascades and couldn't come up with a better design:\n\n\n\nIn the first part I define possible options (objects of type Op). They are held in a container which applies the first valid option and stops then (class ExOps). I make use of some static helper methods, so that it looks a little nicer. Every option is defined by a lambda expression, wrapping the target behavior, and zero or more expectations (objects of type Exp). When all expectations of an option are met the option is taken, and the provided function (lambda expression) gets called, provided with the input (a list of objects of type Del, which stands for delivered) and is expected to return an object of type Res (a simple wrapper around any value).\n\nNext I define a lambda expression that acts as a test executor. It takes the to-be-tested-string and a boolean value (that marks the string as optional) as input parameter and creates Del objects from this input. Notice that I directly use if-else expressions and rely on their return value. Which in the second case can be null. A really nice language feature of Xtend. Those Del objects are used as parameters for the apply method of the ExOps object from above. The wrapped value of the returned Res object is used as the return value of the local lambda expression.\n\nThe last step are some tests with different input parameters and should be quite self-explanatory. The following gist shows the classes which enable this behavior. No need to spread the classes over different files like in Java, in Xtend everything can be put in one file:\n\n\n\nHere are some more tests of the basic behavior:\n\n\n\nAnd finally an extension method I'm using:\n\n"}
@Posts.insert {indexed: false, title: "Hacking 10 Fast Fingers", text: "I resisted the temptation quite long. But now I did it. I guess you know 10 fast fingers. If not, check it out, it is quite addictive. As I competed with my coworkers yesterday and utterly lost. I made it. A little bit jQuery and voila I am the fastest (along with the other cheaters). Here is the code:\n\n\n\nSimply add it to your favorite browsers JavaScript console line by line and wait till the clock ticks down ... you could include a timer to get more realistic results ... I am ashamed!\n\nUpdate:\n\nHere is a one line version with a timer. Actually set to 500ms. This results in around 120wpm:\n\n\n\nFurther stuff:\n\nI guess you like or are intrigued by speed typing, So you might be interested in alternative keyboard layouts. Switching forces you to really learn touch typing, because it doesn't help anymore to look at the keyboard. For native English speakers I guess Dvorak is still the state of the art. For Germans I can recommend Neo2. If you are even interested in making yourself a custom keyboard take a look here."}
@Posts.insert {indexed: false, title: "Back After Flu-Break, With Plans For The Next Year", text: "After a flu-break and some voluntary holiday related away-from-keyboard time, I'm finally back. I know, I still owe you the next part of the review of the book: The Craft of Research. And it will come, I promise. Actually, I read - while pushing our baby buggy through town - at least four (I might have missed one) other books: The Effective Programmer by Jeff Atwood, The Developer's Code by Ka Wei Cheung, Designed For Use by Lukas Mathis and The Art of Woo by G. Richard Shell and Mario Moussa. The last one is still reading in progress, though. It is a quite tough read. I have the electronic version, and it feels that the real book must be a tome. As soon as I have some opinion about each of those and some spare time I will write reviews as well.\n\nI even did get some more books as Christmas presents. Most notably: Cocoa Programming for Mac OS X by Aaron Hillegass and Adam Preble. I skimmed it a little, read the introductory chapter and feel my first OS X app will come soon. I will report and share it here. In the evenings, I was further playing around with my recent day-job project (which inspired my previous Xtend related articles: here, here and here). Despite my illness I do have a looming deadline to present some functionality working under real conditions. So the next post will cover another technical different aspect of this work. Basically, the integration part: how did I extended the legacy \"closed source\" web app - as closed source a web app can be, when you have admin access to the web app server - with custom information from arbitrary other sources. There will be some CoffeeScript, jQuery and cross site XHR hacking involved. But as you will see, not much magic.\n\nYou even might remember that I was fiddling around with the Olinuxino A13 and that there was some distant plan to build a robot with it. I still plan to do this and did put some thoughts in it. The first version will:\n\n\thave two driven wheels and a supporting furniture wheel.\n\tNOT be autonomic in any sense a robot can be.\n\thost a web server (node.js based) and allow to control the robot through a web interface.\n\thave a 12V 7Ah lead battery.\n\tuse the XBOX Kinect for vision (RGB and Depth).\n\tstream the visuals through the web interface.\n\nThats basically it. I guess that should be possible and not that complicated. Furthermore, it looks like a solid base for sensory and actorly extensions and leaves the possibility to implement autonomous behaviour later on. Possible routes would include: mapping the rooms of our house and finding and connecting to its recharge station when power goes low.\n\nAnd finally there is still my biggest project for 2013: my master thesis. I wrote a little about my plans regarding my thesis here. In the last days I thought about the basic assumptions again and must confess that I still have no real research question I think is worth answering and I'm thinking about changing the topic completely. You might remember that I looked broadly on artificial neural networks. Recently I thought about focussing on randomness and chaos in neural networks. But that might be too theoretical, as my master program is more business oriented. I will check back with my professor soon. My second thought was to take my day-job project as the basis and look at integration schemes to enrich arbitrary web apps with external information. A totally different topic and professor. I'm working on it and will report as soon as I made some progress.\n\nIn case you wonder, I will definitly not make a new keyboard in 2013! But maybe the following year and maybe I will make some modifications to Mark 1. If this happens I will as well report here."}
@Posts.insert {indexed: false, title: "2012 in review", text: "The WordPress.com stats helper monkeys prepared a 2012 annual report for this blog.\n\n\n\nHere's an excerpt:\nThe new Boeing 787 Dreamliner can carry about 250 passengers. This blog was viewed about 1,700 times in 2012. If it were a Dreamliner, it would take about 7 trips to carry that many people.\nClick here to see the complete report."}
@Posts.insert {indexed: false, title: "Hacking Closed Source Web Apps With jQuery", text: "In a recent project I had to extend the functionality of a web app at the user interface level. I am sort of administering this web app, so I have admin privileges on the server (Windows Server 2008) and full access to the web pages, ASPs in this case. That helps a lot. But you have to resist the seduction to wildly modify files. Because whenever you have to update the app you have to possibly fix or recreate the hack. And even worse you have to remember and/or document everything you changed.\n\nWhen you have no access on the filesystem level there might be other strategies: In my case, many information get pulled from a database. There even exists a functionality that allows you to define arbitrary SQL select statements and get the resulting database columns and rows displayed in the corresponding HTML table form. The retrieved data can include HTML. Which will be interpreted by the browser. This way you can use database values to pull some seed script in and subsequently redefine anything on the page without ever touching a ASP.\n\nBut the current case was a little trickier, than earlier encounters. I haven't found (yet) any opportunity to mix my HTML hook into the page, without messing up the well-formedness of the page. It is an inhouse app, so it would be tolerable if there are some minor visual bugs, as long as it is possible to do, what needs to be done. In the end I decided to take the simpler route: modify a single ASP file and document the changes well. I added two lines: the first is a comment describing the change and making it easier to find, in case I have to search for it later. The second line just includes my javascript file. The site uses jQuery itself, so I didn't have to pull that in.\n\nOK, the script gets loaded. Before taking the next step, I feel it is appropriate to talk about the things, I actually had to modify on the page. The bigger goal of the hack is to generate a unique order number per business unit. The host system doesn't provide a way to achieve this goal. It is possible to define custom fields and forms, though. The strategy is to create a custom field that holds the number and hand the actual generation of the number over to a small service that accesses the field on the database level to find the next free number. That number gets returned and displayed on the page.\n\nThe to-be-hacked-page has a custom form designed to display and edit custom fields. Holding of course the order number field and besides that, some element to trigger the creation and deletion of the order number. For that purpose I defined a drop down box called: \"Generate order number\" with two values: \"Yes\" and \"No\". Usually you simply insert values and save the data or cancel the changes. So the page is generally built to reflect this purpose. That forced me to change some aspects to achieve the desired behavior:\n\n\tWhen the page loads, the script \"looks\" if there is already an order number defined in the field. If yes, the drop down box is set to \"Yes\". If not, the drop down box is set to \"No\".\n\tWhen the user selects \"Yes\" , a AJAX request is send to the server. There the next free number gets generated, is returned and gets displayed in the order number field (read-only for the user).\n\tWhen the user selects \"No\", a AJAX request is send to the server, the server deletes the number from the database, an acknowledge message is send back and the order number field is updated to display the default value ('undef') - meaning no number exists for that particular element.\n\tTo make it more obvious to the user, there must exists only one button that finishes the form and returns to the calling page. Instead of the usual \"Save\" and \"Cancel\" buttons which don't have any special purpose in the actual case.\n\tThe drop down box holds by default a third possible value: \"\". Which gets removed to further reduce the chance to confuse the user: What should happen if she selects this option?\n\nThe first step is to ensure the script gets executed when the hacked page is loaded. The widely known jQuery hook comes in handy:\n\n\n\nAt first I have to check if the page is responsible for generating the order number. That means, if it is displaying the order number field and the generate-trigger drop down box. The function: \"isOrderNumberGenPage\" is responsible for that.\n\nThe following gist shows the called functions that finds the actual fields. As those fields are accessed quite often I save the jQuery selector results in local variables:\n\n\n\nBack to the page load hook from the first gist. The whole purpose of the \"jQuery.support.cors = true\"-expression is to allow cross site scripting in Internet Explorer 8, sadly it's still my companies default web browser. More on AJAX requests later, as it is a little complicated. The \"handleButtons()\" function call shown in the next gist removes the \"Cancel\" button and renames the \"Save\" button to \"OK\":\n\n\n\nThat's quite easy and self-explanatory if you have ever worked with jQuery. The next gist shows the \"handleGenerateSwitch\"-function as well as the functions this one calls. Together they are responsible to hide the third option from the drop down box and selecting the right one on load time:\n\n\n\nThe last call in the hook registers an anonymous function to the change event of the generate trigger drop down box. It simply calls the function: \"handleOrdernumber\" when executed. I introduced this indirection for debugging purposes, e.g. looking at the received event. The next gist shows the called function. It looks at the selected text in the drop down box and decides which action to take. Either send a delete or create request:\n\n\n\nThe next and last code snippet shows both functions and the function that does the actual sending of the request. The fourth function discovers the id of the actual element for which the order number should be created.\n\n\n\nBefore explaining the AJAX stuff here is for short the purpose of the fourth function. The hacked-page contains an HTML form and its action attribute a URL that includes the parameter: \"code\". This parameters value is the id of the element, the page is displayed for. The function extracts the id and returns it.\n\nNow the hardest part. I struggled for days to get it working in IE8. In modern browsers this part is a lot easier. One central aspect is the \"dataType\" property. In case of \"json\" you have to set \"jQuery.support.cors = true\" and always respond with the right headers defined. In my case, since I'm using custom headers for selfmade basic authentication, different HTTP methods and change the \"Content-Type\" header, the following should be set:\n\n\tAccess-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS\n\tAccess-Control-Allow-Headers: x_auth_user, x_auth_password, Content-Type\n\tAccess-Control-Allow-Origin: *\n\nIE8 doesn't send preliminary OPTIONS requests. In case you have to support modern browsers as well, you have to deal with them. Usually responding with the above Access-Control-Allow-??? headers defined and an empty body should work well. But it depends on the server implementation and is out of scope for this post.\n\nAnother IE8 hint: you have to be careful to define the charset correctly (e.g. to \"utf-8\"). The browser throws an error and spits some strange number out in case it doesn't understand the charset."}
@Posts.insert {indexed: false, title: "Open Business", text: "Do you know DHH and/or Jason Fried? If you have anything to do with software development and sincere business making you definitively should. In the latter case you should read the book:"}
@Posts.insert {indexed: false, title: " TheTasTaTur Mark 2", text: "\n\nI know, I said I will not make a new keyboard in 2013. But ... you know ... it is quite hard ... and I already ordered a few parts ... and the plan for Mark 2 takes concrete shapes in my head. I guess the winter month are keyboard-making-month ... A few days from know I will have some time and eventually something to report. For now here is a photo of the partially disassembled Cherry keyboards I bought at Ebay for nuts (10€ each). I will use the key modules and maybe even the keycaps. But it's to early to say definitely.\n\nSome more facts about the amazing second version:\n\n\tThe keyboard will not be made from wood, but cast with polyurethane resin.\n\tIt will be wired. Using a Teensy 3.0 as the main controller.\n\tIt will again be made of two parts.\n\tEach part will have a Olimex Pinguino clone as the controller reporting to the Teensy.\n\nThe rest is still somewhat fuzzy or top secret ;-)."}
@Posts.insert {indexed: false, title: "Patents?!", text: "I guess everyone who has ever tinkered a little bit and actually reached at a somewhat working prototype, thought about patents in essentially one of two ways. Either: am I violating some patents with those things I create - in case I would sell them or found an enterprise around them? Or: this is such an original idea, I should protect it with a patent. How complicated can this be?\n\nBoth ways arrive at initially answering the single question: Does someone else already own a similar applicable patent?\n\nI did some patent research for split keyboards. There are a few patents that might match. As far as I can tell, though. As the described things are usually somewhat hard to grasp and you soon get lost in details unable to envision the whole picture. Here is an example abstract:\nA keyboard includes a plurality of keys associated with alphanumeric characters including the letters A-Z and at least the numbers 1-9. The keys are split into a left side section and a right side section. The left side section is oriented at least partially above the right side section, or the right side section is oriented at least partially above the left side section. A mobile communication device includes the keyboard. A method for inputting alphanumeric characters into a mobile communication device is also provided.\nThe whole thing can be found here.\n\nWhat does \"at least partially above\" actually mean? The picture on the left answers that question. As this description targets the keyboards usage to a mobile communication device, it might be fruitful to look for another patent for a none-mobile device. In case you have some masochistic tendencies: read it here.\n\nBoth talk about one keyboard case with separated key \"areas\". Nothing about both sides in cases on their own and communication (by wire or wireless) between the two. Here is an old patent (1974) describing a typewriter! that has its keyboard fully separated in two parts each for one hand. The vertical orientation is somewhat cumbersome (see the next picture on the right) but as far as I can tell: no invention on my side. But maybe there are no fees, cause it is expired? Do patents generally expire? I looked it up: in Germany a patent expires after 20 years.\n\n\n\nTo actually see the images, sketches and drawings accompanying patents it is advisable to use Google Patent Search. It allows for, in my opinion better search, and provides the pictures in a more internet friendly format then the US Patent Office. I couldn't bring my Mac to display their TIFFs.\n\nAdditionally Google Patent Search offers a button above each patent, getting you to the \"state of the art\" at the time the patent was established. Pressing the button results in a meta-search. Using this meta-search, looking at the more recent past, brought me a patent from 1983. The picture on the left shows it and provides a link to the patent itself. And yet another one from 1993 (see the picture on the right). Actually were is the innovation? Maybe their are subtle things, you can find in the descriptions. It didn't bother me that much, as to actually seek the differences out.\n\n\n\nNevertheless, I looked up the costs of filing a patent in Germany. 400€ fee only for the application and the examination - no guarantee it's approved. Plus the costs (1,500€ - 4,000€) for a patent attorney wording the patents texts - which the patent office highly recommends. I guess otherwise it wouldn't be possible to deliver a text matching the other patents texts - at least regarding the attorney mumble. Plus rising annual fees for keeping the patent up. And when you go international ... the EU patent office for example, actually charges around 36,000€. Thats a lot of money, but there are currently plans to significantly reduce the fee (around 5,000€) and at the same time simplify the patent application process.\n\n\n\nI found out a fact about patents that makes the whole idea of patenting my keyboard impossible. The German patent office gives some information on the prerequisites a patent must fulfill. One is novelty. And novelty is defined as:\nEine Erfindung ist neu, wenn sie nicht zum Stand der Technik gehört. Der Stand der Technik umfasst alle Kenntnisse, die weltweit vor der Anmeldung der betreffenden Erfindung in jeder erdenklichen Weise der Öffentlichkeit zugänglich waren. Auch Informationen, die Sie selbst veröffentlicht haben, zählen zum Stand der Technik. Achten Sie als Erfinder also dringend darauf, Ihre Erfindung vor der Anmeldung geheim zu halten.\nIt translates - hopefully I get it right as Attorney-German isn't my mother tongue either - to something like: an invention is new when it does not belong to the state of the art. The state of the art contains all knowledge that was, at the time of the patent application, publicly available anywhere in the world in every possible way. Even information you published yourself counts to the state of the art and will prohibit a successful application.\n\nWell I wrote everything down about my keyboard in this blog. So for me - even in case I invented something new - there is no patent possible anymore. But wait, no one could steal it and apply himself for a patent either, because I published everything. Did I get that right? I think yes, but when it is enough to publish everything to \"protect\" your invention from being patented by someone else and in the consequence render your own invention not freely usable by yourself and anyone else not owning the patent, where is the whole point of patents? Everyone could simply publish everything and claim ownership, depending on the associated rights he decided upon publication.\n\nWhen asking a coworker what he thinks about patents in general and patenting my keyboard, he basically said this: \" ... I don't think you can apply for a patent for such a trivial thing as splitting a keyboard in two parts ...\" Oh well, I haven't shown him yet how many patents I have found, which are basically build around that trivial thing. But despite this apparently wrong patentability assessment, he answered the question I raised in the previous paragraph: what are patents generally good for?\n\nPatents exists to protect the initial investment a company or person made in inventing a novelty. So that the company or person has the chance to get the initial investment back through applying the invention in products and sell those products to the mass market (or a niche, whatever fits). The competitors are not allowed to actually compete until 20 years are over or the inventor decides to allow competition through fair licensing agreements.\n\nThe justification for all of this is, that it would be unfair if a competitor, who didn't need to make the initial investment, competes with the original inventor, who has lost lots of money in inventing the novelty and therefore has a disadvantage. A patent is there to remove the fear, that someone else simply takes the innovation and makes products himself. In the ultimate end patents are supposed to foster the technological progression of human kind.\n\nStrange, technological progression of human kind based on distrust in human nature. The whole concept is based on the idea that some bad guy will steal your invention and the stupid customers out there don't care who originally thought those things out and just decide based upon the price. I don't act like that. Do you? I think, as there might be some truly bad people out there, in most cases, provided relevant information is easily accessible, the customers won't decide for the bad guy, just to spare a dime. I wouldn't.\n\nI appreciate competition and having the choice between many alternatives - may it be just slightly different solutions, though. For me the original inventor would be impossible to be beaten by a simple copy cat - even if it is a large company. In case there is nothing more to the copy than a slightly better price tag, I wouldn't even think about going with it.\n\nBut aren't most people like that? I still believe it.\n\nYou must admit, that when you look very closely, the products from the original inventor are simply better in some way. May it be just in some minor details or in a subjective feeling towards those products, glimpsing the labor and the love the inventor had put in his invention.\n\nI conclude:\n\n\tPatents are basically \"invented\" for medium sized to big companies who can afford the hassle.\n\tI will avoid patents.\n\tI will stick to publish everything.\n\tI will stick to have good faith in my fellow humans.\n\nI close with one question to think about: What would the world look like if there never existed the concept of a patent?"}
@Posts.insert {indexed: false, title: "Let the Trees Live", text: "I guess it is unavoidable, but I know certain members of my family very well. So I decided to make an explicit wishlist for the last Christmas. Besides K2 Fatty Pro inline skates (don't ask, it is some kind of youth trauma), the list included two music albums and some books I liked to own. Just to make sure they get it right, there were even links to the music and books at Amazon. The mp3 and electronic versions of course. Guess what I found in my gift pack - I didn't even expect packs, since I have no idea how to put a mp3 album, let alone an ebook into a box - two paperbacks and CDs!\n\nThey argued opening boxes and the holiday spirit belong together, they are two sides of the same coin, or something like that. I'm no big fan of holiday spirits, so that argument didn't convince me. But they are my family after all and I got what I wanted - in some way. I didn't further stress the point, to avoid hurting some feelings. I even managed to smile and pretend happiness.\n\nMaybe they even have a practical point, as it should definitively be easier to make digital gifts. Time for Amazon and Apple to sort that out. How about buying an album as a gift and deliver it at a certain date, her birthday for example.\n\nI'm a proud owner of a Kindle for over a year now and I like it so much. It weights less then a real book and I can flip pages with one hand, even in both directions. I'm pushing our baby buggy with one hand and can easily read, holding the Kindle in the other hand. That's amazing. I don't know how many books I have read this way, around 30 I guess. I thought about it for a while, but I can not imagine any use case where a paperback would outperform an ebook.\n\nI even make myself believe I'm doing something good by going fully digital. The obvious thing: no more trees must die (at least to make books). The not so obvious thing: do something against the publishing industry. By bypassing their established distribution channels and getting books directly from the authors, for example. Do you know John Locke, look him up if you need more arguments.\n\nIn Germany the situation is really bad, the publishers, print shops and established authors are like behemoths, desperately trying to keep the current state, blocking any new invention, keeping their ecosystems closed and charging ridiculous high fees for the electronic versions of their books, if those exist at all.\n\nI don't really know how it is in the USA, but from my viewpoint it doesn't seem that bad. There are some publishers I have faith in: O'Reilly and PragProg come instantly to my mind. It is easy to buy ebooks there, they usually provide versions for my Kindle, they have quite good content, at least for a nerd, like me and the prices seem fair.\n\nAh! One thing where real books beat their electronic alter ego: looking nice in the shelf."}
@Posts.insert {indexed: false, title: "TheTasTaTur Mark 2 - Resin Casting and Keypods Making", text: "I just poured the first blackened polyurethane resin in the mold of the keyboards case' bottom part. I'm quite exited. This post's intended to give a short interim report. What I achieved so far and what to come next. I will not go very deeply in the details of what I have already done. There are mainly two broad topics to mention: resin casting and keypods making.\n\nBut, to better draw a picture of what I mean by keypods, I have to describe in more detail the overall design I have chosen for the new keyboard. I criticized the unnatural orientation of the keys on standard keyboards as well as on Mark 1, so I came up with the idea to place the keys exactly as my hands are and naturally move. Also, I had some difficulties mounting the Cherry ML keys in Mark 1, so I had to come up with a better plan for that and alongside acknowledge, that the keys can be placed organically and easily moveable in the assembling phase, allowing for some late configuration. That's were keypods come into play.\n\nBasically, each key switch is still mounted on the original PCB. I simply cut the PCB in parts, so that each part has one key switch on top. Look at the next picture. You can see parts of the originally Cherry keyboard.\n\nUnder each of those switches with PCB I hot-glued a super magnet using toothpicks as spacer. The bottom part of the cases integrates a steel plate. This way the keys are moveable and at the same time, stick quite strongly to the case. The top cover will be made of two parts. One part is fixed and possesses a big opening. That hole is the area where the keys can be positioned. The second part is a blend, covering the opening and having small openings corresponding to the final key positions.\nThe next picture shows the master (the bottom part and the top part with the key-area-opening) I constructed from wood, sheets of polystyrene, some plasticine and a little glue.\n\nFrom each of those parts I will cast negatives using silicone. For the bottom part I did that already. It worked quite well in the second try. I underestimated the amount of silicone rubber needed and initially bought not enough. It was condensation cure rubber and turned out not that ideal in handling.\nThe third part of the case, the blend reflecting the key positions, will be cast directly, using the master of the other top part. More on that later. The next picture shows the second silicone negative of the bottom part, I made using additive curing silicone rubber.\n\nThe next picture shows some keypods sticked to a can and the picture there after shows the wired key matrix of keypods sticked to a metal plate.\n\n\nAnd here is a picture of one raw bottom case extracted from the mold. I will wait a few days so that it arrives at its target hardness (Shore-D 75). You can see the steel plate through the unintended bubble holes. I don't have a vacuum pump and vacuum chamber, so I guess I have to live with the bubbles. I will fill up the big holes and grind everything to an even level. After grinding and polishing all around, it should look quite nice.\n\nThere is one more thing I already did. As I wrote before, I chose Pinguino clones from Olimex. I had to tune them a little to fit in the cases. As the cases should be as flat as possible I had to remove the Olimex typical UEXT and the LiPo connector. I haven't done any programming so far. I guess it will still take some time. But I will be back soon with in-depth discussions regarding the keypod-making and my resin-casting experiences."}
@Posts.insert {indexed: false, title: "Picking a JavaScript Framework - My Journey to Meteor", text: "This article is motivated by my current day-job project. I have to come up with a decent and cheap solution to manage project requests. Before I delve into the perils of deciding for a JS framework or a set of libraries some words about what I try to achieve. That is very important in my opinion. For different purposes exist different best JS frameworks. I will from now on use the term 'framework' interchangeable with 'set of libraries'. We (me and the systems users) already agreed to some extend to the basic workflow and requirements.\n\n\tEveryone (in our local intranet) can sign-up for an account.\n\tYou need an account to create project proposals yourself.\n\tYou can make the proposal public our keep it private for now.\n\tIf you decide that the proposal is ready you can turn it in and have to make it public therefore.\n\tThe decision maker can now examine the proposal and eventually accept it.\n\tThe decision maker also can reject it.\n\tThe requestor gets it back with some hints of what might be missing or wrong.\n\tThe decision maker might also decline it. Meaning the proposal is dead.\n\tThe requestor gets information why that's the case.\n\tAnonymous users may view all public project proposals regardless of their progress.\n\nBesides this functional must-have requirements exist a few others. For example, as above already mentioned, simple and fast to develop and without license fees. Additionally I want the resulting app to look gorgeous, to respond really quickly as well as to be simple and straightforward. I made some mock-ups with Moqups to get a better understanding of how the UI should look like. Here is a picture of the main functionality.\n\nBeware this is an unfinished draft, doesn't present the whole picture and at the same time displays some additional experiments (the star-rating). I was just going so far as to come to a sound understanding of the main building blocks and the overall layout. The page will look quite similar for different roles. Different roles require other groupings, a different filter for the projects and other buttons on the project summary headers. I omitted the actual project proposal form. Since the details regarding the input fields are still a little unclear.\n\nHow it should behave is clear: you should be able to click on every projects summary header to open up the details right in place. The other projects and headers simply move down. You can edit every value in place by double clicking it. Assumed you have the appropriate rights to do so, of course.\n\nWell I looked around and stumbled upon many different frameworks and approaches. I found some mainstream solutions as well as some niche players which might fit. Here are the obvious main players: AngularJS, Meteor, Ember.js, Derby, Backbone.js, Knockout, batman.js. All of them follow a quite similar route: provide client side middleware for binding, templating, routing, dom manipulation - in short providing the pillars for a model-view-something design. Some take it a bit further, others quite not so far and need additional libraries to complete the picture. The two extremes: Meteor exists even on the server side and manages persistent. Backbone provides barely more than binding and custom events. \n\nBesides those at present very popular HTML, JavaScript, CSS embracing frameworks exist different ones that are agnostic to those technologies. For me it always felt wrong to squeeze the obviously more document centric technologies of the web into something, that might resemble the foundation for a full-fledged application. It is quite a stretch, to be good at both.\n\nOne thing that might change the situation was introduced in HTML5: the canvas. You can draw in it using JavaScript. At it's basis it is like classical low-level desktop drawing. But there already exist UI toolkits, similar to GTK or Cocoa, that speed up app-development to a reasonable level. The existing frameworks might not yet be that sophisticated, but they are definitively more the way to go for real apps than HTML-bending. I looked at morphic.js. It is part of the programming learning environment Snap! / BYOB from Berkeley. I like Morphic, since I first stumbled upon it, in Pharo Smalltalk. Unfortunately it looks like a remnant of the 90's. Besides that, I have to support IE8, which knows shit about canvas.\n\nBut there exist even more approaches. A few years ago I made a web-app using ZK. This is a server-side framework allowing to write the whole app in Java as well as in some own XML markup. But it feels somewhat slow and heavy and the licensing might become a problem. And it is Java! There might be other server-side frameworks out there, but I decided to take the client-side approach and provide simple REST/JSON services on the server side.\n\nI stumbled upon Cappuccino and Objective J. The later being the Objective C for JavaScript instead of C. Since I'm looking at Cocoa programming for a private project, it sounded like a good syntheses. You describe the UI similar to a native OSX app. You even can use Xcodes Interface Builder to some extend.\n\nI decided to take a closer look at Cappuccino. But it began horribly. The installation was nightmarish. After a lot of trial and error, I did get it running, though. On my Mac as well as the Ubuntu machine, which would become the target environment. Whereas the latter was even easier. I don't remember all the steps. It simply worked after the fourth time reinstall from scratch (and source) and rebooting or something. Well, I still was into it. I made a project stub using the 'capp' command:\ncapp gen -l -t NibApplication ProPro\nOpened the project in Xcode and started designing the UI in the Interface Builder. The whole time I had some bad feeling and some questions were nagging at me: Can this really be that easy? Did they really cover all available Cocoa controls? How will it look and behave in the browser? What about different windows? Do I make multiple Nibs? I tried to find some more information, but get stuck relatively soon. Before going any further I decided to \"compile\" the \"MainMenu.xib\" to a \"MainMenu.cib\" with:\nnib2cib ProPro/Resources/MainMenu.xib\nand examine the results. At this point I also had a login-HUD-window designed and choose the controls simply by their look. Well that didn't work out so well. Buttons were drawn differently. Sizes didn't match. I used boxes to group things together, which resulted in a bad look, because of all the shadowing stuff. But the worse was, that the windows were drawn as moveable windows. My intention was, that the main window would fill the whole browser area and the HUD window would be hidden and later used as a pop-up. I couldn't repair it.\n\nI made a new project, copied only the inner view over and redesigned the user interface: different buttons, no boxes but custom views. Here is the look of it in Xcode as well how it looks in the browser:\n\n\nWell, both versions look quite similar, but neither I would consider gorgeous. I would rather go with the mock-up from above. The OSX look of things don't seem to fit very well in a browser window.\nI opened the projects \"index.html\" file directly in the browser. On my Mac this works only in Safari. On Ubuntu it works in Firefox, too. But even this half ready, no latency, simple example took some time to load. Maybe there are ways to speed things up, but for me it was too much then. I was frustrated and began the framework-search anew. Not totally from point blank, since I found other options already, mentioned above. So I decided to take a closer look at those popular HTML-bending frameworks. Starting with the most intriguing, at least for me: Meteor.\nThe installation was a breeze. One command:\n\n\ncurl https://install.meteor.com | /bin/sh\n\nEntering the sudo password and everything was there. It downloaded and installed all dependencies (mongodb, npm, node.js) in the background. I created a sample meteor app with:\n\n\nmeteor create ProPro\n\nIt doesn't do much, just generate three files: ProPro.html, ProPro.js and ProPro.css. You can instantly run the application through issuing \"meteor\" in the apps folder. It sets everything up and responds from now on to http://localhost:3000. The clou is, you can change everything while the server is running and see the result immediately in all browsers pointing to the apps address.\nBesides this goodness, that lets my old Smalltalkers heart feeling warm and home, there are some really valuable packages you could simply add to the project. CoffeeScript for example. Entering the command:\n\n\nmeteor add coffeescript\n\nis all that is necessary to use from now on \".coffee\" files instead and besides of \".js\" files. Meteor compiles those CoffeeScript files on the fly to JavaScript. There are even packages that implement basic user management. Besides CoffeeScript and the user management packages, I decided to make use of the following well-known JavaScript libraries, that are also available as Meteor packages: Bootstrap, Less and Handlebars.js.\nI decided to develop the app in small steps, focussing at first on the user interface and pushing the server functionality and interactivity in the background for now. I made progress quickly. Many things I tried without looking at the documentation worked straight away. So I guess I'm quite attuned to the Meteor-way. Here is a screenshot of the current UI (almost no functionality, though).\n\nThere were some bad moments also. Especially to mention is the dreaded soft-tab vs. real tab problem, when working with languages that infer structure from spaces. I wasted a few hours to hunt down a problem, whose source lay in the different editors I used and their default setting regarding tabs. But on the other hand, the braces saved typing and the much cleaner look of CoffeeScript compared to JavaScrapt is worth the hassle (in my opinion).\nYou can find the Meteor project here. It is far from finished right now. It just reflects the mockup from above and provides some minimal functionality. I might omit, change and add a few things for the real app, running at my company. Many things for them might not be of general interest, though. I will only include things that I developed in my spare time and that are somewhat general applicable.\nTo end this post here come my killer features of Meteor (in no special order):\n\n\n\tEasy to setup and get you running.\n\tAllows for continually modifying your app. Live updates.\n\tQuite good documentation.\n\tRelying on modern quite established technologies.\n\tEasy to change and extend.\n\tPersistence out of the box.\n\tUser Management included.\n\tEasy to grasp how it works.\n"}
@Posts.insert {indexed: false, title: "Accessing an MSSQL Database from Meteor", text: "I recently wrote about my journey to Meteor, deciding for it, as the basis for the development of an in-house app. Well, I drew a somewhat rosy picture of Meteor. As always, when something shiny new hits the stage. But you know, if I would have learned only one thing the last 15 years, stuck waist-deep in the software-world, it would be: there is no perfect solution, no silver bullet, not even a best practice.\n\nIt started to get a little messy, when the idea, to replace the planned Xtend based API to our legacy project-portfolio-management-app, with a lean solution integrated into Meteor, struck me. Initially the Meteor app should make REST/JSON requests directed to the API, which is still in development and has to be extended to incorporate the requirements originating from the development of the Meteor app.\n\nBefore I can go on, I have to confess: I have the tendency to over-abstract. That said and provided with the fact, that I worked on the API for some weeks now, with no clear usage scenarios drawn out, you might imagine how the API code looks like. Actually the API is used in other integration projects, so it is not useless, per se. It just feels, from the distance of a few days Meteor-hacking and much more understanding of what I still need from the API, way to abstract and in the consequence to complicated.\n\nWell, I should have learned that by now. There are three factors that let me always loose sight of the bigger picture: getting lost in nitty-gritty details of bending technology to my will, not knowing exactly what is truly needed and working basically alone.\n\nEnough whining and back to the topic. I searched for pure JavaScript solutions to connect to the MSSQL database, which holds the data of the project-portfolio-management-app, and found Tedious. That looked promising, and a quick connection test to the database, using just Node and CoffeeScript, did show that it was indeed functional. Here is the test code:\n\n\n\nA few month ago, when I decided to make the API and take the Xtend-(Java)-jTDS route therefor, I also found Tedious, if I remember right. But it wasn't really working back then. It still has some flaws. The documentation says, that there should be a 'done' event when all rows of a request are fetched, but my callback was never called. As I learned just now, those 'done' events (there are more: 'doneProc', 'doneInProc') are somewhat low-level and not really defined through the way of invoking the request. You are supposed to use the constructors callback to execute something when the query finishes.\n\nOK. I can query the database. But how do I put the Tedious NPM package into the Meteor environment. Here it comes:\n\n\tGo to your Meteor projects folder.\n\t\"cd .meteor/local/build/server\"\n\t\"npm install tedious\" - you might have to prepend sudo, if you get errors. I had to use sudo on Ubuntu, on my Mac it worked without it.\n\nI have found this steps in the answer to a StackOverflow question. To use the package you have to 'require' it. That works a bit differently in Meteor than usual. You have to use:\ntedious = __meteor_bootstrap__.require('tedious')\nYou can use 'tedious' now to create Connection and Request objects like in the example from above and query the database. But there is still one thing missing. If you try, for example, to put the received data into a Meteor collection you will get a nasty error, stating that you are not in the same fiber.\n\nNode is inherently asynchronous, so are most of the packages. Meteor is different, there the server code runs in a single thread per request, it uses Fibers underneath to accomplish this behaviour. I usually like the async-style of Node more, but synchronous feels right in Meteor. So what to do? This guide has the answer. You have to use Futures. A Future is basically a tool that allows you to wait, until the result of an async call has returned. See the next gist for an example of using a Future, while a database is queried using Tedious. Putting the results into a Meteor collection:\n\n\n\n \n\nUpdate: I made a new post, displaying the Npm-way you can take since Meteor 0.6.0."}
@Posts.insert {indexed: false, title: "Structuring Meteor-resque Handlebars-Templates", text: "I don't like the whole idea of HTML-templates very much. But I guess I have to take that route, at least at the moment. Many modern web-app frameworks and libraries use template engines to structure their views. So does Meteor and since I have chosen it for my current project, I'm into it, if I want to or not. And I must say it isn't only bad.\n\nAfter my smooth start with Meteor I had a hard time learning, how to use templates right. I'm still a little doubtful, if I really got it. I couldn't find a complete guide covering all of my use cases. So I decided to write my own guide. And had also the goal in mind, that that would lead to a better understanding. This often happens, when I have to linearize my thoughts.\n\nMeteor basically uses Handlebars, and just wraps some sugar around it. This has positive effects as well as negative ones. On the pro-side the Meteor-guys made it easy and natural to write templates and the associated helpers. I looked at the pure Handelbars code and had immediately question marks in my eyes. 'How do I include this stuff in a meaningful way into my app?', felt to be the hardest thing to grasp. On the con-side the handlebars documentation can't be applied straight away and requires some thinking-around-corners when you get stuck somewhere.\nThe Basics\nThe basic stuff just works. So I don't mind loosing many words and let the code speak for itself in the following gists. They cover the foundations from different angles. At first a really bare example. Each mustache-expression ({{some_value}}) lets Meteor call the corresponding helper function and replace the mustache with the returned value in the outcome.\n\n\n\nThe next gist arrives at the same outcome. I grouped the to-be-displayed data in an object and returned the whole thing from a different helper. This way the object becomes the context of the template and the mustaches directly access attributes of the context-object. In case you wonder: when there is a naming conflict between helper function and context attribute, the helper function wins.\n\n\n\nThe block helper: '{{#with ...}}' sets the context inside the block to the specified value (or return value of the called helper function). In a nested structure of templates you could achieve the same result by changing the HTML-file to this:\n\n\n\nThe 'carBody'-template doesn't have any helper methods. They are not necessary. The invocation of the template: '{{> carBody fullcar}}' sets it's context to the object we get from the 'fullCar'-helper method, registered at the 'car'-template and can subsequently access its properties simply by calling them. Still easy and straightforward.\nSimple Nesting\nWhat about more complex objects and accessing the parent context? Look at the next gist.\n\n\n\nThe '{{#unless}}'-block, which basically means '{{#if not}}' is quite self-explanatory. The only thing that I didn't get instantly was, that you can't use comparisons. You simply have to call a helper function or access an attribute and if it evaluates to false then the unless-branch is taken, otherwise an optional else-branch. The same is true for '{{#if}}' blocks, the logic is simply reversed. You can use it with '{{else}}' this way:\n\n\n\nTake special notice of the '{{../make}}' notation in the first gist of this section. The dots allow you to access the parent context, like parent folders in the file-system. The double-dot is not always available, meaning it doesn't always reference to the parent context. While it works with: {{#with ...}} it doesn't work, the way it is implemented in the following gist:\n\n\n\nWhen you pass the context to the template while it is instantiated, it forgets or never knows about the parent context. If you don't specifically pass something the context of the caller ('this') is passed. When you first pass the full context and then later select sub-parts with '{{#with ...}}' you have access to the parent context inside it. It took me a while to figure that out.\nCollection Elements as Values of a Select-Element\nAnother stumbling block were collections. Look at the following model:\n\n\n\nImagine I want to create a dropdown-box in the view from the 'wheels'-values of the model. That seems at first quite easy using the '{{#each}}' block:\n\n\n\nSo far so good, but what about selecting the right value as defined in the objects root-level attribute 'selectedWheel'. At first I tried to solve it with conditional logic and simply comparing the value of 'this' with '../selectedWheel'. That didn't work because you cannot actually compare values and act on the comparison inside a template (I already mentioned that above). This restriction is consciously in place, to constrain the amount of logic you can put in a template.\n\nInside a '{{#each}}'-block you actually have access to the parent context. I tried to move the actual comparison to a helper function and still use an 'if' inside the template. The next gist shows the corresponding code.\n\n\n\n\n\nSadly this evaluates to broken HTML. The picture on the right shows the outcome and the next gist shows the generated HTML code. I don't exactly understand why this happens.\n\n\n\nTo circumvent this, I decided to let the helper method deliver the 'selected'-attribute as a simple string or an empty string in case the element is not selected. That finally worked. The next gist shows the code.\n\n\nCollection Elements in Separate Templates\nIf you think this was cumbersome, hold your breath for the final. I encountered for now, two more scenarios, while working on the structure of my user interface. The next scenario is simple and works as, at least I, expected. I tend to mentally connect it with loose coupling in object oriented programming. Let me try to explain why.\n\nImagine a context-object with self contained parts, or identifiers, that can be used to retrieve the full parts elsewhere. Each part is handed down to a template specifically designed to lay that part out. The part becomes the context-object in the target template. The target template lacks the possibility to access the originating context, since the template, per definition don't care about its origin. The origin might even be different in different situations.\n\nIn OO speak: Receive pointers to aggregate or entity objects (or object ids) from a call to a composite object. Those received objects, don't have a reference to the composite object that delivered them. They again might be referenced in many different composites.\n\nThe next gist shows the code for handling collections of loosely coupled objects:\n\n\n\nRemember the case from above: when instantiating a new template the parent context is lost, so you have no chance to access the 'car'-context from the 'wheel'-template.\nCollection Elements in Separate Templates - with Access to the Parent Context\nYou sometimes need strong coupling - when the parts of the object are meaningless without their container, for example. In times like this - and I could imagine further scenarios - you might need access to the whole object, to the parent context. The '..'-access doesn't work in Meteor and it doesn't work in plain Handlebars. I searched a while and found many other developers complaining about it. There are feature requests, issues and some fuss about the right way to access the parent context. This one wants to make the '..'-context available in templates (you often find the name 'partial', which I treat interchangeably with template).\n\nAfter some research, trials and thinking I found a solution I can live with. Whenever I need access to the parent context in a template. I wrap the parent context together with the current element in a new object. I then hand this object down to the template, as its context, utilizing a helper method. The next gist shows this. (I know the example gets less and less meaningful.)\n\n\n\nI thought about generalizing this, so that '..' becomes the identifier of the parent context as well as 'this' points to the element itself. But first, I actually have no idea, how I could achieve this and second I feel safer, to have to specifically treat such situations. Otherwise I fear to find myself soon in a '../../../../'-multi-level-value-accessing-hell, discussed here as well.\n\nThat's it. I feel a little more comfortable now and I think I have covered all necessary use cases. But I think it is unavoidable that I get stuck again. In case this happens and I find a proper solution, I will share my new findings here."}
@Posts.insert {indexed: false, title: "To and Fro with Bitcoins", text: "I lost almost 900$ US Dollar.\nAnd that's not the worst. I boasted just recently about being so clever to \"invest\" in Bitcoins, in front of my coworkers. I feel duped and so endless dumb. Yet another example where I trusted in someone, and was betrayed. I'm already such a cynic. How cynical does one have to be?\nI don't want to tell someone. Not my coworkers. And not my wife. But all twelve Bitcoins, actually worth 72$ US Dollar each, are gone. I exchanged them for classical money around a year and a half ago, at BitMarket.eu. Back then, the first popularity wave (with a top price of around 30 bucks each coin) has just ceased, and I only paid around 80 bucks for all of the coins.\nThere were many stories about hacked Bitcoin wallets ...\nBefore I continue, I think some of you might not be aware of Bitcoin, so there might be some background information necessary. Let me introduce Bitcoin to you. Just some opinionated major points, for the real in-depth introduction go to bitcoin.org. Bitcoin is first and foremost a digital currency. Well, like the majority of all other currencies by now, too. OK, that doesn't make them special. What makes them special is, there is no one controlling the amount of money.\nNo government or agency can simply order to produce more of them. It is possible to forge Bitcoins through computing power, though. But there is a hard limit (21 million) and a throttle. The closer it gets to the limit the more difficult it will get to produce new ones. The same is true with the overall computing power that exists in the network: when the power rises, the difficulty is adjusted. All that happens transparently by the Bitcoin-network itself. Besides being a currency, Bitcoin is a P2P-network, as well as the communication protocol.\nBut don't fear that there are no coins left for you. Every coin can be split, actually down to 8 decimal places, but with plans for further breakdown. A 0.00000001 Bitcoin is called a Satoshi, honoring the original inventor, whose whereabouts are still very mysterious.\nBack to the wallets. A wallet stores some arbitrary numbers: Bitcoin addresses. A Bitcoin address is like an IBAN, if you will, to which coins are bound. As I stated above there were stories about hijacked wallets on local computers, so I decided simply to let my coins reside on my Bitmarket.eu account.\nGuess what happened recently. One of the site's administrators took the coins from many customers, including me, and put them on Bitcoinica. Which simply faded away and took all the stored coins with it.\nBitmarket.eu is openly providing information regarding this incident and was, I believe, even honest to some degree. The reason for taking the customers coins is still somewhat fuzzy. I learned through their own public announcements, that the service was not profitable, so I guess they (or even only this particular administrator) tried to gamble a bit, to make it profitable.\nThen only a few weeks ago they came up with a restoration plan. I did put hope in that and readily agreed to go with it. Since I thought I could get my coins back. I'm not in a hurry, because I took the whole thing more as a long term investment. I still had some hope to get my full twelve coins back some day.\nAfter being attacked some days ago, Bitmarket.eu was down and is now closed. The site has been back up since yesterday. The plan for restoration is now visible in my user account. Regrettably it has changed somehow. Maybe because of the exploding market price. I can only hope to get 10€ each coin paid out someday or get Bitcoins worth 120€, which are only a little more than two coins taking the actual market price.\nI don't want to give them my bank account information. And in fact, still want to own Bitcoins. But twelve not two. Maybe I just hang in there a little longer, till the price makes another deep-dive and request my 12 coins back then. Since, I guess when the price falls again under 10€ each coin, they won't give me coins worth 120€, anymore.\n\n"}
@Posts.insert {indexed: false, title: "Bloated Equality", text: "Since I already passed out on last week's writing challenge, I have to write something this time. And it feels a lot easier. The last challenge was really tough. I made a few attempts, but couldn't keep me going. That was really strange. I feel better now. The actual challenge's title: \"State of the State\", is promising and after a night, sleeping over the topic, some ideas worth pursuing have emerged.\n\nI'm quite opinionated political wise. I don't think my government is particularly good at anything at all and that no one need it much, anyway. Bloated. That's the word best describing it. It all started somewhat well with really good ideas and a purpose. It is such a thing with good ideas. As long as they are lean and shiny and new everything goes quite well. But then there are some special situations here and some unfair treatment there and soon someone has the idea, that you must define it very clear and succinct, covering as many cases as possible. With all those details, subtleties, not-to-hurt feelings and lobbies to gratify the original purpose gets soon lost, and most are blindly following some arbitrary rules and regulations.\n\nAs long as there are some real humans doing the work as it must be done, it all holds together, somewhat, but it is far from being steerable from above or from anywhere else. I guess that's the crux with every social system of considerable size. This pattern is visible in all bigger business organizations, as well, especially the old ones.\n\nBut, heh? It has been working this way since ... Ever. In case one could do something about it, would it really be necessary? Those systems are going and going and eventually collapse or are flexible enough to adapt. Everything changes, transitions from yesterday to tomorrow. There is nothing wrong with that. But you have to embrace change to stay profitable and survive in the long run. The book: \"eXtreme Programming eXplained\" by Kent Beck wears \"Embrace Change\" as its subtitle and initiated a deep change in the way software projects are managed.\n\nA similar change in the way how governments are managed is long overdue. \"Lean Government\", would be catchy phrase. I'm just a layman in this regard and don't mind to present any solution. Just some ideas.\n\nThere is a root problem (maybe more): the concept of equality. It is misleading, at best. Those that have less, do interpret it as: \"When we are equal, we should own the equal amount of things.\" Those that have more, monetary or ability wise, don't want to be treated the same way as those others. The professor stands in front of the students, because she has special knowledge the students lack. No one would question this.\n\nI guess everyone wants to be someone special in some regard. Be it, very special in creating buildings, helping others, cooking meals, programming web-apps or publishing nonsense.\n\nYes, everyone deserves equal treatment by the law. But even that's not universally true, when you take, for example, the person's age into account. A kid shouldn't be allowed to sign contracts. Agreed? The age. That's a good example. In the US you are allowed to drive by 16 and drink alcohol by 21. In Germany you are allowed to drink by 16 and drive by 18. Well I think our teenagers are quite equal to America's.\n\nWe have young adults totally irresponsible regarding alcohol by the age of 25 and some kill themselves due to high speed driving at the age of 28. Luckily they survived that long. Others drink and drive responsibly at the age of 18. They are different, treat them different. Individually assess the effect of drinking alcohol on them, their family background and take science into account: there are some genes favoring alcohol abuse (just wild speculation and hearsay.) If they have them, don't allow them to ever get drunk. Luckily you have to get a license to be allowed to drive. But why the fixed age? Assess their state of mental development, ask teachers, friends and family to decide if they are mature enough.\n\nSimilar to equality, but better suited seems the term: fairness. Everyone has a different background, different abilities and different preferences. The government should be designed to be able to promote and support individuals on an individual level, so that it enables them to contribute to the common welfare, in their own special way. That seems fair.\n\nWell, there lurks a second root problem: the shiny world of stars, starlets and wannabees presented by the media. Especially young adults are blinded by the fame and richness of athletes, actors, singers and self-presenters. They take it seriously, not as it is: pure entertainment.\n\nI stop here. It feels like a never ending story, no silver bullets in sight, ..."}
@Posts.insert {indexed: false, title: "Usedom", text: "Once upon a time, there was an island on the southern shores of the baltic sea, which had no name. The island was tremendously beautiful for many days of the year. The sun was shining much more often, then in the rest of the country it belonged to, whichever it was at the given time. That changed over the centuries not only once. The island had beaches made of the finest quartz sand you can find. Old-growth forests of oak and beech trees nestled the beaches and resembled a natural wind shield for the small towns that lay beneath. The summers were warm and the winters not so badly cold. All in all, a very nice place to be.\n\nWell, if this darn thing just had a name. It was really tough to get the postal service deliver things to a place without a name. It was equally tough to explain the mainlanders, where you actually come from. Yes, even back than you had to leave the island from time to time.\n\nSomeday the unnamed island's inhabitants decided that they must give their loved home a decent name. It was not the first time they decided to try that. But it should be the last time. On the latter, they all agreed upfront. All reasonably sane residents gathered in the big hall of the central town. That town had no name, too and was supposed to get named after the island, itself. There were long debates about the right name. Many proposals were made: \"Little Rügen\", \"Wunderinsel\", \"Sunnyplace\", \"Whitebeachisland\" to name a few, that were not totally absurd.\n\nBut, they couldn't settle on a name. After many days of debate, there was still no name in sight, that was even close to being acceptable. Those Western Pomeranians are generally a sturdy and stubborn bunch and the islands inhabitants were no exception. The opposite might be true. Even after four and a half weeks they still had the will to give their, by now, not so much loved home, a name.\n\nThe other day the major of the biggest and most prestigious town said: \"We really should come to an end. Even if it means that we name the island and this town after Satan himself. I don't dare to favor any proposal we have heard so far, so I suggest that we name the island, after the first word, that gets carried into this hall from the outside.\" The other men - exhausted, tired, hungry and in desperate need of a toilette - agreed quickly. Well, all sane men were inside the hall and it wasn't allowed, that women enter the town hall. Sad days it were, back in this dark century. So guess what happened.\n\nThe main door broke open and one of this not so sane men walked giggling into the hall. The first thing he said: \"Oh, so dumm ...\", which translates to: \"Hey, that dumb ...\". The rest of his uttering is unfortunately lost. But the islanders, proud and stubborn, called themselves from now on: Ohsodummer and their island and the central town: Ohsodumm. Time gave them a favor and ground it down to: Usedomer and Usedom.\n\nThat is basically the story I was told by my granny, when I was a very little Usedomer. The photo above shows the beach of Koserow, the town I grew up. In the foreground is my eldest. In the background you see our pier and farther back the infamous highest hill of Usedom: the Streckelsberg.\n\nI'm writing this post in response to this weeks edition of the Weekly Writing Challenge. The topic is \"Iconic\" and gave me a quite hard time. The task was to find or take a picture of something that's a symbol for yourself, that stands for something you value, and wrap a story around it. I decided to take the silhouette of the Streckelsberg at Koserow's beach. Unfortunately I don't have a photo that displays it more prominently and I live now around 800 km away from this place. So no chance to quickly drive by and take a picture. But to make amends for the not so visible iconicity, here are some more photos from my hometown and Usedom.\n \n\n"}
@Posts.insert {indexed: false, title: "My first Award ...", text: "Just tonight I have been nominated as the 11th of 10 award winners by Rana from Virginia the Viruliferous. I feel honored and like to thank you again, this way.\nActually I can choose between: \"Sunshine Award\" and \"Very Inspiring Blogger Award\". I'm not sure if I deserve the former, since I feel more on the cloudy side of life. The latter is closer to the mark of my intentions for this blog. But I'm not sure if I'm really VERY inspiring. Nevertheless she has chosen me, be it as the extra one.\nSince I'm quite new to the \"blogger scene\" and this is my first nomination, I only start to grasp the meaning and dynamics of those awards. I do my best to play the game by the rules. As far as I understand the whole affair by now, I have to answer a few questions and nominate blogs that I think also deserve the awards. The questions part looks easier. The nominations will become a little trickier, I follow not so many blogs by now and some of them are rather professional and I think are therefor not so good choices.\nThe Questions:\n1) What inspired you to start blogging?\nMy colleagues urged me to do so. I had build my first keyboard from scratch and they argued that I should share my experience. In case someone would try to do the same, she could find relevant information here and therefor avoid some pitfalls. I had a hard time finding out everything I need to know and agreed with them. I started blogging in October 2012. I had so much fun writing those keyboard-related things down, I simply kept blogging after everything had been said about the keyboard.\n2) What is your favorite blog that you like to read?\nMake, came almost instantly to my mind.\n3) What is your favorite color?\nDarkblue.\n4) What are your passions?\nThere are many, here is a list (no special order):\n\n\tMy kids\n\tGood red wine (I favor Spanish)\n\tLearning\n\tOpen source software and hardware\n\tSoftware developing in general\n\tProgramming languages\n\tSoftware architecture and design\n\tUser interface design\n\tTinkering with electronics and mechanics\n\tReverse engineering, hacking things (software as well as hardware) apart and trying to understand how they work\n\tFantasy books, Elaine Cunningham being my favorite author\n\tMangas and Animes: One Piece, Bleach\n\tStrange movies: Sucker Punch, Crank, Fear and Loathing in Las Vegas, Snatch\n\t... maybe more\n\n5) What is your favorite animal?\nThis is easy and has one simple answer: the snowy owl. It is a deep old love. I consider the snowy owl to be my totem. As a little boy, when we were visiting the zoo, my parents had to take me straight to the snowy owls aviary. I was intensely watching them for many minutes before we could continue to other animals. Even now there is no zoo-visiting, without sitting for some time in front of those amazing creatures.\n\n Found on Wikipedia. This file is licensed under the Creative Commons Attribution 2.0 Generic license. Originally posted on Flickr by Connormah.\n6) What is your dream job?\nBeing a founder and technical lead of a small but quite successful IT company selling the products (mainly software, but maybe also hardware) I designed. Nothing big like Facebook. More like 37signals. Their business model is amazing and an inspiration for me. I can highly recommend their book \"Rework\", written by Jason Fried and David Heinemeier Hansson.\n\nUnfortunately I still lack the guts, the charisma and the connections. I would at least need a partner for those representational and bizz-talking things, a CEO if you will. Someone being able to code the nitty-gritty details with passion, would be great also.\n7) How much time do you spend blogging?\nThat depends. In a normal week around 5 hours, I guess. But when the fever gets me, I think I spend around 20 hours blogging a week. Some weeks I don't blog at all.\n8) Do you watch TV? And if so, what are your favorite shows?\nI try to avoid the TV. It is the main time killer, in my opinion. But sometimes I get sucked into, then I love to watch \"The Big Bang Theory\", \"The Mentalist\" and ... simply the things that are on air at the time.\n9) What is your favorite flower?\nMy favorite is the famous and almost invisible No-Flower. I hate flowers. \"Sinnloses Gestrüpp\" - I don't know how to translate that.\n10) Looking at the posts of other nominees, the final questions seems to be free to choose. Well: Which country would you choose to live in, if you had to move?\nUruguay. I don't know really why.\n\nI said that once to my colleagues, back when Uruguay was semi-finalist in the FIFA soccer world championship and I bet on them becoming the champion. Now it is some kind of running gag. By now I know some things about the country and it might really not be the worst place to be.\nThe Nomination\nI nominate the following blogs for the \"The Very Inspiring Blogger Award\" as well as the \"Sunshine Award\". It's your choice:\n\n\tLearning By Shipping - is a very insightful blog about the perils in the software industry. It's a must read for anyone being in it.\n\tThe Thesis Whisperer - is a blog that helps you in getting your thesis done, which I (un-) fortunately still have to do.\n\tTracy Cembor - Tracy Cembor's blog has amazing art work, very good steampunk stories and recommends music I have never heard of (which is generally a good thing). The whole site seems to be a piece of art on its own.\n\tRarasaur - as long as I'm following it, this blog was updated daily and picks up every weekly challenge and daily prompt with fresh, insightful and well written posts. Always a pleasure to read.\n\tharm•less drudg•ery - a clever blog about words, their meaning and grammar, from a rule maker (err, better a rule finder). That one made me realize, that the English language is so very rich and complex and that I still know shit about it.\n\tGenieve Gelada - if I ever travel to the Philippines I will book her for a photo session with my family. Very nice and atmospheric photos.\n\tcappy writes - Cappy furthers an amazingly wild blog with many outrageous and strange things happening.\n\tKristen Otte - Kristen Otte's blog has really good written posts. She covers writing, book recommendations, reviews and features indie authors you should check out.\n\tEric John Baker - Mr. Baker shares many ideas about writing from the viewpoint of a freshly baked author. It's very inspiring.\n\tMr. Rhapsodist - provides some nice fantasy stories and fantasy book reviews as well as many thoughts and information regarding the fantasy scene.\n\nPlease don't feel pressed to respond to this nomination in any way. For me it was quite insightful to answer the questions. But for you, heavily admired nominees, it's possibly an old hat wandering about. If you feel bothered, I apologize."}
@Posts.insert {indexed: false, title: "TheTasTaTur Mark2 - Right Hand Key Layout", text: "I'm progressing quite slow with my second self-made keyboard. But slow doesn't mean I don't make progress at all. I finished casting the basic parts for the case: upper and lower parts of both sides. I clipped the extra material, ground everything to an even level and polished the right side. The left is still raw from the mold.\nThe right side looks still rough but has a very good touch. Unfortunately, after grinding and polishing THE bubbles are quite prominently visible. In the raw state it didn't look like a problem. The next time I try something new I will listen to the guide. Well, I don't have the extra money and space for a vacuum chamber and pump. I have to live with it, I guess. The look is not the most important thing.\nThe most important thing for this second keyboard is the natural positioning of the keys. I made distinct key areas for every finger, considering the length, position and flexibility of it. Four thumb keys in the lower left. Above are the keys for the pointer. The long column in the middle is for the middle finger. The smaller column for the ring finger. And finally the area on the right is for the pinky. I followed roughly the Neo2 key-layout. The only mayor difference is the <B> (on QUERTY the <N>), it moved from the pointer to the thumb. This was necessary, because I have difficulties reaching down-left with the pointer.\nRegarding the thumb keys, yesterday I rearranged them a little (not reflected in the photo). I turned the <F3> (ALT or M3 in Neo-speech) and <F4> (M4 in Neo) by 90 degrees so that they are now facing the thumb, this way they move more easily.\nAs you might have observed I omitted many keys. No real <F> keys, the <F> keys I installed serve as switches for the different layers (F2 -> M2/Shift, ...). The only <F> key I ever use is <F5> for refreshing or reloading. But I can live without it or maybe integrate only this key later on. I have no arrow keys, either. Those are on the fourth layer (M4) in Neo2, so you don't need them separately.\n\nI did basically finish the key-matrix and wired the whole thing to the Pinguino clone. The columns to the digital pins two to eight and the rows to analog pins zero to four. The final wire is for pulling down the rows.\n\nI tried for many days to get the Pinguino IDE work on my Mac. I couldn't make it. In Ubuntu it worked. There were still some things to install and to configure, but at least it worked without major complications. The first program, letting the LEDs blink in some interval, was easily written, compiled and bootloaded. Tonight I will try to finish the polling of the keyboard and the debouncing. Maybe I have enough time to wire up the Teensy and can actually see keypresses.\n"}
@Posts.insert {indexed: false, title: "The Next Big Language", text: "For some time now I'm thinking about the Next Big Language (NBL). Before Java there was C, and to some big amount it's still there. But what is the next big thing? Java's successor? For quite a few years there were and still are some aspiring candidates. Python, PHP, JavaScript and Ruby are the obvious candidates from a web and scripting background. C# and Objective C are strong candidates, especially Objective C having gained a lot of traction, but have a very limited vendor specific applicability.\n\nNevertheless, none was even close to rival Java and C's first and second place.\n\nYou might look at the TIOBE index to get a good feeling for the current situation and the history. But TIOBE's picture is to wide, at least for me. There are some languages, that are only useful in quite limited circumstances. Here are some examples: NXT-G for programming Lego Mindstorms, ABAP for the SAP stack, Visual Basic for scripting Microsoft products. Nothing to look for the NBL.\n\nAnother thing is, TIOBE seems to move really slow, and for my taste, modern languages are underrated. As an alternative source you might look at GitHub's language ranking, which gives us a quite a different picture, but has probably a strong tendency towards web development.\n---\nWhy is (was) a specific programming language widely adopted: a big language? What are the intrinsic characteristics of current and past big languages? What were extrinsic factors bolstering their rise? In recent years I witnessed a quite big number of new programming languages emerge or older ones (at least conceptually) reemerge. Almost a Cambrian explosion in the programming languages universe. One could conclude, that there must be a strong need for something new. And I would wholeheartedly agree.\n\nThe answers to: What traits do the newcomers share? What makes them appealing?, have also to be taken into account, when looking for the NBL. All leads to the question: what are the characteristics of and boundary conditions for the NBL?\n\nBefore diving into answering this questions, we have to tackle the next one first, what actually are programming language characteristics and boundary conditions? I will spare you the distinction as the borders are fuzzy and give you an admittedly quite lengthy list of things to consider, with short explanations in no special order:\n\nExecution Performance\n\nHow fast is the programming language and it's environment? I will see if I can come up with a simple benchmark. Exact numbers are not relevant, I guess. Just some factor comparing to a C solution, or something.\n\nEcoverse\n\nOn what execution environment(s) - e.g. JVM, .Net, V8, BEAM, ... - is the language built upon, respectively uses? Or is it something entirely new, everything written from scratch? What are the drawbacks? What the chances?\n\nMaturity\n\nHow stable and bug-free is the programming language? How feature complete is it? Is it hardened by production use? Are their big and serious projects that use that particular language in a major way?\n\nCore Team\n\nHow big is the core team? What experience does each member bring to the table? Is there a single strong leader? Or are changes incorporated rather democratical? There are some further factors to consider: a shared vision and a feasible roadmap, for example.\n\nCommunity Size and Engagement\n\nHow many people are using the language? How many third party libraries are around? How active is the community? Is the community growing or shrinking?\n\nBig Company Support and Financials\n\nIs there a big company supporting the development? What are the companies motives for doing this? Is the further development properly funded? Are the core members working fulltime and properly paid for it.\n\nReception\n\nHow is the general reception in the media? Is the language rather unnoticed or is (was) it hyped? What do experts say about the language? How far is the blogosphere embracing the language? What is the general mood of early adopters? Are they cheerful? Rather reluctant?\n\nPresentation\n\nIs there a single web site that serves as an easy access point, summarizing and presenting the language easily approachable for beginners, and at the same time gives advanced programmers access to further material? Is there a nice logo? Does the presentation keep up with current web design flavor?\n\nDeveloper Productivity\n\nThis is a hard one and taken to far, would spur discussions that can not be settled, I guess. To preserve some objectivity, factors like: the amount of code necessary to express some concept and the existence of higher level language concepts might be valid criteria. (Hopefully)\n\nSyntax Style\n\nIs the language C like, with curly braces and semicolons? Or more like Python, where structure is inferred from the usage of space? Maybe the language has some different style or mixes them?\n\nComplexity and Simplicity\n\nHow many distinct keywords, constructs, concepts and paradigm does the language support? How many different ways are available to express the same thing?\n\nType System\n\nThe old questions of: Strong versus weak typing? Static versus dynamic typing? Type inference, yes or no? Duck typing, the messiahs? What is the default mechanism. Is it possible to optionally move away to a different type system? Is the type checked during runtime or compilation in case the latter is necessary?\n\nConcurrency and Distribution Schemes\n\nDoes the language support multi-threading, multiple processes, multi-core machines, code execution (transparently) distributed to multiple machines?\n\nHow does the language support the developer in coping with concurrency in general?\n\nMemory Management\n\nWhat are the mechanisms the language provides to work with and control the computer's memory? (garbage collection, reference counting, ...)\n\nTarget Computing Domain\n\nWhat kind of development is the language intended to be used for? What kind of programs is the output in most cases? As I'm looking only on languages that are general purpose, the correct question should rather be: In which computing domain does the language shine?\n\nComputing domains are:\n\n\tOS scripting\n\tEmbedded\n\tRealtime\n\tRich clients\n\tServer programming\n\tWeb clients\n\tMobile clients\n\tand more\n\nReason for its Existence and its Ancestry\n\nWhy was the language developed? What was the intended purpose? Languages aren't imagined from nothing. There is always one or more language that certain ideas and concepts are 'borrowed' from. What are those languages? What cherries did the author(s) pick and why?\n\nProgramming Paradigms\n\nFunctional vs. object-oriented vs. structural vs. imperative vs. declarative vs. logical vs. ... Which paradigms does the language support and to what extend and purity?\n\nDevelopment Environment\n\nHow mature are the tools to create software, real systems using the language? What tools exist? Which are needed? It's not just an editor with syntax highlighting. It's continuous integration tools. TDD and BDD tools. Debugger. Profiler. Tools to support refactoring and to extract and enforce metrics and style.\n\nConsistency and Standardization\n\nAre there different, concurrent versions of the language? Does one have to expect major refactorings, when switching from one version to the other? Is a standards body controlling the language features and further development?\n\nIntegration\n\nHow far and how well is the language connectable to common external technologies, systems and protocols? By itself? Or by addable extensions (through libraries or modules)? How hard is it to find out about and use those. Among others: persistency and data storage (relational, nosql, ...), HTTP, XML, JSON, HTML, payment systems, social media APIs (Google Maps, Facebook, Paypal, ...).\n---\nThis was only the first step. The next is moving towards answering the question, what are the actual properties the NBL should/might/will have for each of the properties from above? Is there even more to consider?\n\nAs this post is already extraordinary long, I will postpone answering this question to a later post.\n\nThis post is actually the start of a series \"In search of: the NBL\".\n\nIn the next post of this series I will look at the factors that current big languages have in common and discuss some aspects next big languages might tackle differently and why this might be a good idea.\n\nThe posts afterwards will look at intriguing programming languages, one at a time. I will provide a cheat-sheet summarizing the factors from above for each of them and rate each regarding the NBL-factors to be outlined in the next post.\n\nI will try to come up with some (pseudo-scientific) rating scheme, where everything boils down to a number stating the chance a language might become the NBL. Possibly I might come up with an estimate when this could happen and what further conditions need to be met. I won't lean myself to far out of the oracle's window, though.\n---\nMy goal is to publish a new language analysis every month, say every first Thursday, until I run out of strong candidates.\n\nI guess the NBL properties analyses will take some time, so the first language analysis might be online on September the 5th. I'm not sure which language it will be. Current candidates are Elixir, CoffeeScript and Io. But I think I will go with CoffeeScript since I used it recently a lot.\n\nThis will be a fun journey and the first time I commit to a publishing schedule. I will try hard to stick to it.\n\nIf you have any ideas how to make the method better, more accurate, more fun, more relevant, whatever, feel free to contact me. I'm open minded changing things while we go.\n\nAdditionally, if you know of interesting programming languages feel free to promote them for an analysis. I will pick them up.\n\n(well as far as I can wrap my head around them, so please spare me Haskell)"}
@Posts.insert {indexed: false, title: "Latent Needs and Unleashed Programmers", text: "Recently, I visited a one-day conference sponsored by a tool vendor. The talk I most vividly remember was given by Professor Gassmann from the University of St. Gallen, Switzerland. He broadly talked about innovation and argued: to survive in the long run and to let your company flourish, you have to ignore the customer's explicitly expressed requirements and instead search for their latent needs.\n\nHe further argued, that customers and users can't think out of their box. That they live in the current state, can only express their wishes in terms of that state and therefor are unable to leave it by themselves. And finally that, to develop something truly innovative, you have to take a broader approach, look at different business areas for inspiration, or other cultures, the natural sciences, in your neighborhood, the government, whatever.\n\nFind out the users underlying motivation and address it properly.\n\nYou might have guessed that he was referring to Steve Jobs a few times. But besides Jobs, he chose BMW as a second example.\n„Unsere Aufgabe ist es,\ndem Kunden etwas zu geben,\nwas er haben möchte,\nvon dem er aber nie wusste,\ndass er es suchte\nund von dem er sagt,\ndass er es schon immer wollte,\nwenn er es bekommt.“\nRoughly translates to:\nOur mission is: giving the customer something he wants, but he was never looking for. And that he will say about: I was ever longing for it, when he finally has it.\nAt the same time Professor Gassmann constantly cautioned, that unleashing the engineers, giving them the freedom to build whatever they imagine, will lead to products with no market.\n\nI have wondered since: where is the line? Looking for latent needs, means basically ignore explicitly stated requirements. That leads to: give the developers the authority to decide what the users truly want. That leads to: let them do what they think is right. Unleash, or empower the developers. Who might be able to decide when they have crossed the line and might actually miss the target market or any substantial amount of customers a new market might provide? No manager can do this. There are no real numbers available supporting any decision.\n\nGoing a step upward, I asked myself: is there actually a line, a true difference? Isn't it the same thing? The only distinction I could come up with was, some were successful, others not.\n\nI developed the following thesis: lucky unleashed programmers address latent needs of many people and become stars and billionaires. Whereas unlucky unleashed programmers address anybodies needs, latent or explicit and will be ironed out, or if they have the stamina become castaways or rogues in a small niche.\n\nBut luck might play only a small role. There are other factors to consider. How well is the individual developer (the core inventor, if you will) attuned to some big enough market and has, at the same time, the necessary distance to come up with a disruptive solutions? That seems to be important. In the create-a-new-market case: does the developer have the ability to imagine, create and address a truly new market?\n\nMarketing skills play a big role. The presentation. The package. The design. The time. The market entrance strategy. First receptions. Early adopters. Connections to important companies and the relevant media.\n\nAll this can not be managed in the classical sense. Managing is keeping the current state and concentrate on making the operations more efficient. Optimizing locally.\n\nTo make true innovation happen, you have to keep the managers out. Instead there has to be a really small number of unleashed people: coders, developers, business analysts, testers, whatever their role is, that have a shared understanding of their product in development. The catch is, that the product is new in some major way, it's not existing, it's purely imagined, and cannot be easily explained.\n\nTo achieve a shared understanding, it seems necessary that people know each other really well, that they trust each other, that they have faith in each others abilities, in the product idea and in the person that initially brought the idea up. Everyone has to adopt her brainchild, care for it as if it's his own and raise their princess to a beautiful and strong queen.\n\nProduct development is the art of creating something that many people are eager to buy. Initially attract them is only one side of the coin though. Equally important is, that your customers are happy to use your product. You have to give your customers reasons to come back and look for more products you offer. Your goal should be, building up a reputation of having magnificent products. Well done Mr. Jobs.\n---\nAs an aside I used the terms: programmer, coder, developer, engineer, ... somewhat interchangeable. Even if there is a slight distinction, I'm almost always talking about the person with the initial product idea and the skills (technical and/or people) to make that idea happen.\n\nProfessor Gassmann was actually talking about real engineers that build complete and tangible products. I feel more comfortable in the software world, so I have narrowed the focus. I'm hesitant to use the term engineer though, software development isn't engineering. "}
@Posts.insert {indexed: false, title: "English Language Traps, I tend to fall into", text: "This post's purpose is to provide myself with an explanation on (is on right here?) the correct usage of my most common English language pitfalls. That way I can look up things quickly. I have also the silent hope, that writing about those things, makes them stick.\n\nI learn by mentally connecting different domains of knowledge. Trusting my intuition, fail and try again, trying to remember the failures. That is especially true for human languages. I have never put any effort in memorizing word lists. As a result I wasn't particularly good at exams testing those without context. Given a context I performed much better.\n\nWhen reading, the context gives usually enough information to understand the meaning and the intended feeling of some unknown or less known word. Besides their plain meaning, words have a subtle intent, that gives their meaning a slight shift in some direction. This feeling part is very difficult. Sometimes you might guess the true intention from the word's pronunciation though.\n\nI'm quite good at guessing how to pronounce an unknown word. Even in languages I know less, Italian or French for example. But there are pitfalls. Here is an example, the famous gem. I did some ruby programming, so gems lay always on your path there. I always thought the G was pronounced like in garlic and I pronounced gem that way. At the same time I was a aware of the Gs pronunciation in genetic, which is the right way.\n\nActually, I don't have the chance to speak English (or some other foreign language) on a daily basis. So in case I actually have to talk English, it happens that I pronounce words absolutely wrong (like gem), but with such self-conception that my dialog partner doesn't dare to correct me right away. Just a little bit later she drops the word, with the correct pronunciation, of course - leaving me just a little bit embarrassed. But that's the way I learn such things.\n\nWhen writing, I often have to look up words and phrases. It is hard to decide for the word that hits the right tone and mediates the intended feeling. Picking phrases that imply the correct meaning and are used regularly in today's language is even harder. The internet isn't very helpful here.\n\nBuilding sentences and paragraphs as well as editing them, happens by listening to my gut-feeling. I have basically no theoretical knowledge about correct grammar. I have read a lot of books in English. I have even read some books about writing (most in English). But I don't know how far I have inhaled the good examples, the knowledge and the wisdom that they provide. It just flows - or not. In the latter case I rearrange things until they do flow.\n\nThe English language has many traps. And the rest of this post discusses some, I tend to fall into again and again.\n\nThan vs. Then\n\nIf you use the words consciously it's quite easy. I know Then is related to time or logical order and Than is used in comparison. Nevertheless I mix them up. I catch most cases when editing, but sadly not all.\n\nThere vs. Their\n\nBoth words have quite different meanings. There is used to point at the location of something. Their is a plural possessive pronoun. But again I mix them up.\n\nLive vs. Life\n\nThose are harder. I always forget when to use which one? Basically Life is the corresponding noun - meaning the existence of something - to Live the verb - the act of existing or reside at some place. But there are two sources of confusion: the plural of Life is lives and the sole existence of Live shows. I still don't get it: why Live shows?\n\nOff vs. Of\n\nOff has many usage scenarios. Switch the light off. Might be the simplest. Something is off, when it is moved far away from a central topic, the spotlight or a conventional or acceptable state. The voice from the off. Off odors. It is also used when you put something away. Take your clothes off. No, you don't have to. This was just an example. Additionally it's used as preposition to emphasize a relationship where the thing doesn't belong anymore to or onto some other thing. The robot's arm is off.\n\nOf has a similar amount of use cases. A lot of, part of and because of, being the most common, I guess. But there are others. Of is used in conjunction, as part of, some verbs. Take care of, ashamed of, for example. And it is used as a preposition to show that something is taken from a certain set of things. One of the apples.\n\nAt vs. On\n\nThrow something at your head or throw something on your head. Just one word but quite a different meaning. One being much more offensive, ha?\n\nThere are many more cases when I struggle to pick the right preposition. Even in cases I have consciously spotted a questionable usage, it's sometimes hard for me to come up with the right one.\n\nDo you know of other pitfalls? Some usage scenarios where you struggle deciding for the right word? Or maybe some traps I constantly fall into without even realizing it?"}
@Posts.insert {indexed: false, title: "I lost my right arm, the left eye, half of my tongue and seven teeth", text: "Not literally, but well, it feels like. I'm sad to the bone, also. All energy has drained.\n\nI fear, I have destroyed my MacBook. \n\nAll I wanted was the best, but ... the worst case, the Super GAU, has happened.\n\nYesterday in the early morning I decided to clean my MacBook. Removing all the remains my greasy junk-food fingers have left over the past weeks. Paper towels, some water and a little bit of soap.\n\nBut, the towel was a little bit to wet. That's my conclusion, at least, for what happened afterwards.\n\nAt first it was behaving almost as usual as I switched it on. Only the trackpad did strange things: the pointer was going in random directions by itself and it was always right clicking. Then a moment later some keys weren't working anymore. Another moment later it was going down and didn't respond to pushing the power switch.\n\nPANIC!\n\n I opened the case. Put it on its side, the lid open and placed a ventilator in front of it. I have no hair dryer in the office.\n\nMeanwhile I did look up similar cases in the internet and was shocked by the rate of complete destruction because of some droplets of water.\n\nAfter two and half hours, impatiently waiting, I tried to switch it on in it's drying position. And it responded. But I decided to give it a few more moments drying, just in case.\n---\nI attached the bottom case back again, tried to switch it on. NO RESPONSE. I unscrewed the case again. Put it back in it's drying position, tried the switch and it WORKED.\n\nI investigated further, attached the power connector and locked in. The power indicator in the menu bar displayed a black cross. The power connectors weren't showing any lights. The battery charge indicator wasn't responding.\n\nPANIC!\n\nI unplugged the MagSafe power cord and pulled the battery connector from the logic board. I learned how to do the latter while skimming through the last words of other poor souls. After that, the Mac did boot by itself when reconnecting the battery to the logic board.\n\nBut strange, the fan ran at full speed all the time and the power button didn't respond. But I could shut it down pressing power for a few seconds.\n\nPANIC (but resignation mixed in)\n\nI urged my colleague to do something productive - some report we promised a while ago - basically as a distraction and to have that feeling of success to improve my overall cloudy mood.\n---\nQuitting time. I attached the case yet again, took it home, the kids to bed, found the right screwdriver box and spend the rest of the evening, another three hours, disassembling, drying and reassembling it. Nothing improved.\n\nRESIGNATION\n\nBut after a short night, I remembered the SMC-thingy and that I didn't reset it after the in-depth drying procedure last night. So I grabbed the straw and decided to take the MacBook to the office. After doing the reset. The battery indicators where lighting again.\n\nYEAH\n\nUnfortunately the MacBook is still behaving somewhat strange when switching it on and off. And worse, the keyboard isn't working at all. The 'O' is working, and that's basically it.\n---\nI haven't lost faith to get it fully working again. There are at least some life signs and the situation has improved, so it's not absolutely lost.\n\nMaybe I should disassemble it again. This time tearing the keyboard from the uppercase, I saw at least a million screws I would have to unscrew, though. So I'm hesitating.\n\nMaybe I should replace the keyboard/uppercase? That's not so expensive like a new logic board, after all. But that could be not enough. On the other hand, the power indicators are working again, so I have faith, that the logic board is ok.\n\nShould I bring it to the next best Apple dealer? For a professional check? I don't trust them much, though.\n\nDo you have any tips or tricks I could try to bring my MacBook (it's a MacBook Pro 13'' early 2011) back to full life?"}
@Posts.insert {indexed: false, title: "Review: The Night I Walked Off Of Boot Hill", text: "By circumstances I cannot recall, I follow many blogs of self-publishing authors. It's not that I knew their books beforehand. If that would be the case I wouldn't follow them. I guess. Because the admiration and respect for their craft and art, would have held me back. Thinking I'm unworthy to invade their holy circle of creativity.\n\nI think I follow them because of their marvellous blogs, but I haven't finished any of their books, until yesterday. I started reading another two, one of which I will finish soon and review as promised (twice).\n\nIt's not that I fear that I might not like their writing. I read their blogs because of their writing capabilities, that's why I'm following them in the first place. No, it's the genre. I'm pretty picky. Usually I read non-fiction, and when I read fiction, it's fantasy.\n\nNow I have just finished: \"The Night I Walked Off Of Boot Hill\" by Briana Vedsted. Go check out her amazing blog when you have finished here.\n\nIt's a western.\n\nThe reason for me to buy (0.89€ at the German Kindle store) and read it, was: the cover. Everytime I came across Briana's blog, I thought: 'Oh shit, that cover is really really ugly\". Sorry for the frank words.\n\nHer posts are generally great, so that bothered me. Quite a while to be honest.\n\n'If her writing is similar to what I know from her posts, that cover really pulls it down.'\n\n'Damn, there is no way I can't come up with a better one.'\n\nContinued my thinking.\nA short review\nTo understand what the book is about I bought and read it. A quick read. Actually I think it's too short. As much as I appreciate short books, there is not enough time to develop the characters properly.\n\nFor example: towards the end of the book Tom talks about Jim as if he knew him for years. But they just met a few days earlier. The intensity and trust they show for each other isn't believable for me. A side journey, doing some outlawish things, the three years, until Tom could file a claim for himself, would have given them the time to become much more acquainted and build a real father-son relationship.\n\nThere are no ups and downs, either. It builds steadily up, until the - to be expected - climax. In no point in time is their journey disturbed by anything major. The small interlude with the Indians doesn't work as such.\n\nAdditionally I have found a minor organizational mistake: there are two chapter 4.\n\nBut nevertheless, it was an engaging and fun read. In the moment I finished it, I really liked it, and there was no point in the story where I didn't enjoy reading it.\n\nBut then my analytical mind took it apart. I realized, it won't be anything I will remember in a month or so. It's simple and straight, not much to think about, but I couldn't put the book down until finished, either. So there is something in it. Maybe it is how the genre works and I don't just get it, fully.\n\n4 out of 7 stars.\nA new cover\nNevertheless I have imagined the perfect cover art. Perfect in my opinion, at least. I won't talk about the current cover, more than I already did above. But here are some thoughts about a possible new one:\n\nIn the center of the cover is a picture of a cemetery located on top of a hill, Boot Hill. No trees of course. It's the desert, after all. Maybe a cactus. Some tombstones and wooden crosses. You see the back of a cowboy, ghostly white and blurred. A trail leads across the hill. The cowboy walks the trail. Behind him the trail is blood red. The red color increases it's intensity to the bottom and grows as wide as the whole cover. The authors name, in white letters sits in this red area at the bottom.\n\nIn the ghost-cowboy's walking direction the trail gets lighter and slimmer like a tunnel. It leads into a white light. You see the shade of a little girl, a horse, a mule and another more slender cowboy. Above, the central picture flows into a black area at the top of the cover. There is the books title, again in white letters.\n\nI will work on it a bit and show you soon a first draft. But it's one thing to imagine something and quite a different thing to make it happen. I will give my best and I'm quite excited how the result will look like."}
@Posts.insert {indexed: false, title: "R.I.P.", text: "My MacBook is no more. Last night it has send Indian smoke signals into the stratosphere. I don't understand those, but I guess their meaning was: \"Fuck off asshole! I quit!\"\n\nI smoked the logic board with my latest repairing attempt. I will spare you the ugly details, but in case you come across a similar situation, I can teach you certain things you should and shouldn't do:\n\n\tBe very very gentle to the logic board connectors. They can be removed quite easy. If they don't come out easily, you should check if their is a securing bracket. At least the keyboard, the keyboard-backlight and the display connectors have securing facilities.\n\tDon't try to glue a socket that has fallen apart. The glue gets sucked into the socket and then the male connector won't fit anymore.\n\tDon't try to remove the glue with a razor blade. You will cut yourself, and you will further damage the socket.\n\tDon't connect anything to a broken socket, when the contacts are freely floating in the air. You will short some contacts and that might lead to a glowing and smoking resistor on the main board.\n\nActually I figured, that only the keyboard was screwed and could have been replaced. Last time I checked you could get one for around 50€.\n\nSo as I'm waiting for the new MacBook to arrive I'm still feeling quite amputated. A cook without knives. A tailor without scissors. A blacksmith without hammers."}
@Posts.insert {indexed: false, title: "Humble eBook Bundle 2", text: "\n\nHi there, I just received the notification, that the second Humble eBook Bundle is going. I will certainly go for it. Alone Wil Wheaton's book is worth a look. Additionally there is a Cory Doctorow novel included. Haven't read one, but heard only good things. The other books are looking intriguing as well.\n\nTo get the most out of it, you should be patient and wait for the additional books that certainly will get included to the end. Or you might want to pay twice, the authors would certainly appreciate it."}
@Posts.insert {indexed: false, title: "Humble eBook Bundle 2 - 4 books added", text: "\n\nJust yesterday four new books were added to the humble bundle. Three short story collections and \"xkcd volume 0\", a collection of geek humor web comics. Holly Black's looks most interesting for me.\n\nSo in case you didn't snatch your bundle already you might go ahead now, or keep patient for the last-second-additions, that are probably coming. There are still more than 6 days left."}
@Posts.insert {indexed: false, title: "Un-amputated, finally", text: "\n\nAfter three days waiting for my MacBook Air to be ready to be shipped (do they build it in this time?), it made a decent journey across the Eurasian continent, which culminated in sight-seeing the Rhine-Ruhr metropolitan region.\n\nThere might be some configuration work left, but I feel fully able to work again."}
@Posts.insert {indexed: false, title: "Triple Review: The Alchimist, The Crimson League, A Monster Calls", text: "I have read The Alchemist by Paulo Coelho, The Crimson League by Victoria Grefer and A Monster Calls from Patrick Ness in parallel. Hence reviewing them together, feels somewhat natural. I was reading the first book in front of my elder son's room. We have some a going-to-bed ritual that involves, me waiting in front of his door for a few minutes. There is also a bookshelf and I randomly picked The Alchemist up.\n\nThe second book is from a fellow wordpressian and my current Kindle read. Victoria Grefer has an awesome blog about writing and after hesitating for some time (further down I will explain why), I finally started reading her Herezoth series, with the first book: The Crimson League.\n\nThe third book was a recommendation on another blog, I don't know exactly where. And as recommended I bought the paper back version. It wasn't actually more expensive this way and the great illustrations are worth flipping real pages - and a lot more. Let's start with the last one:\n\nA Monster Calls. I admit it, I was weeping badly. The last time has to be some years ago. As a result my head aches today (Because of low inner-eye-pressure? Unlikely!) and thinking about the book turns my eyes wet again. Oh shit. I'm not just getting old but also sentimental."}
@Posts.insert {indexed: false, title: "The Next Big Language: Attributes, Method and Rating", text: "Welcome to the second post in the series: In Search Of The Next Big Language (NBL). In the first installment I discussed the internal and external factors a programming language might be characterized by. Now I will try to argue what language characteristics the NBL might have. Agreed, this sounds like fortunetelling and well it is to some extent, but I will nevertheless try to found my decisions on some sound argument. I will further discuss the method I will use to examine each language and the rating scheme. Each of the following posts of this series will then take an in-depth look at an aspiring candidate.\nAttributes\nMethod\nRating"}
@Posts.insert {indexed: false, title: "A New Cover: The Night I Walked Off Of Boot Hill", text: " 1) First digital draft\n\nRecently I read and reviewed: The Night I Walked Off Of Boot Hill by Briana Vedsted. In that review post, I described how I would imagine a better cover and I committed myself to try to create it.\n\nThat set a few things off. Besides delaying other projects, I bought tech, YEAH! my favorite hobby. I always wanted a Wacom drawing tablet, and this incident made me finally by one. I decided to go with the very basic thing: Wacom Bamboo Splash Tablet. A budget-driven decision, mostly. Additionally I couldn't imagine what an integrated touch control could be useful for.\n\n 2) Coloring the main areas\n\nI was determined to learn how to use the tablet and what is better than learning by doing. I already had Corel Painter Lite (from the last MacHeist bundle).\n\nEverythings worked quite natural. The correct use of layers was a problem at first, but I discovered soon how they work. This was a fun project and after three evenings experimenting with different brushes and getting used to absolute positioning on the tablet I finally have something presentable. I distinguished different steps and will present them in chronological order.\n\n 3) First details\nThe Vision\nI changed a few things from the first vision I presented in the review-post mentioned above.\n\n 4) Details Finished\n\nIn the center of the cover is a picture of a cemetery located on top of a hill, Boot Hill. No trees of course. It’s the desert, after all. A dark scheme, because it is night time. A tombstone and wooden crosses. You see the back of a cowboy, ghostly white and blurred. Quite big on the left side of the cover. A trail leads across the hill. The cowboy looks down the trail. His back sticks in the blood red lower part of the cover. The author's name, in white letters sits in this red area at the bottom.\n\nThe cowboy views down the hill, his gaze follows the trail, as it gets lighter and slimmer in the distance. It leads into a white light. You see the shade of a little girl, another slender cowboy. Above, the central picture flows into a black area at the top of the cover. There is the books title, again in white letters.\n1) The First Digital Draft\nI made two or three paper drafts, those first experiments are the source for the changed vision. I was still waiting for my new MacBook to arrive, so paper was the last resort. Here is the first digital draft, which is quite close to the last paper draft.\n2) The Coloring\nThe second step was to roughly color the different areas. I used the drawing from the first step as a blueprint.\n3) The First Details\nI decided to detail the cowboy first. As this was supposed to be the hardest part. I changed him later, and I'm still not fully happy with the outcome. Who would think that drawing cowboy hats is difficult.\n4) The Details Finished\nNext you see the final version of the cover art, minus the book's title and the author's name. I struggled a little bit with the correct angle of the tombstone shadows.\n5) The Finished Cover Art\nI didn't find a way to add text to a picture in Corel Painter Lite (e.g. a text tool). I was to lazy to use something else, so I experimented a little bit with the brushes that might be useful to 'draw' text. I discovered the calligraphy pen and drew the text with it. It took me some time to get the font look somewhat coherent. I'm unsure if it is quite good or just awful.\n\nI know there are a lot of things missing for a real book's cover, the back, being the obvious. But I guess this could be used as a starting point.\n\nWhat do you say? Is this cover any good? Do you have any suggestions how to make it better? What beginner mistakes did I make?\n\n 5) Final\n\nDisclaimer:\n\nI'm donating this work to Briana Vedsted, just because the other cover is so ugly and I had so much fun creating this one. She may decide about any licenses and stuff."}
Meteor.publish 'posts', () ->
Posts.find()
Meteor.publish 'custom', () ->
CustomContent.find()
if Meteor.isClient
Deps.autorun () ->
Meteor.subscribe 'posts'
Meteor.subscribe 'custom'