Category: Software

  • electrum server on a cubox

    I don’t even remember if there were alternative wallets available when I started with BitCoin. I used the reference implementation exclusively for a long time. Now there is a wide variety to choose from. They fall in three main categories: full node, light client and web wallets. They are nicely listed and explained at bitcoin.org

    full node

    Every hardcore bitcoin enthusiast should run at least one full node. That’s how the system was envisioned. It expresses the peer to peer nature. A full node maintains the complete history, and can verify transactions. It has lots of connections to other nodes, and helps propagate the transactions and blocks through the peer to peer network. The downside is that the size of the blockchain has grown so large to make it impractical, especially for mobile devices.

    light client

    Most mobile wallets fall into this category, as well as my favorite: electrum. The main reasons why I prefer electrum are that it has been in the apt repository for a while, and it has good support for hardware wallets. Light clients communicate with servers that in addition to the blockchain of the full node also maintain an additional database. This is required to serve requests for addresses, that the full node doesn’t have in its wallet. The client is responsible for managing the keys, and thus signs the transactions locally before distributing them.

    web wallets

    This is mainly for new users that don’t know how to secure their private keys.

    electrum server

    The main downside of light clients compared to full nodes is that there is a layer between your light client and the peer to peer network. You depend on these servers to be available. The server you connect to, could connect your BitCoin addresses to your IP address. They theoretically could also selectively filter transactions. But what they have no way of doing, is steal from you. As I understand it, electrum talks to multiple servers not only to protect your privacy, but for various reasons. There are about 7’000 publicly reachable full nodes, but only about 20 electrum servers. To protect your privacy, you can run your own electrum server in your basement. That’s what I do, but it’s more to support the system then out of paranoia. There is a strong incentive to mine BitCoin, but the incentive for running a full node or an electrum server is not monetary. Still I think it is very important to have many of these around.

    I had a cubox small quad core arm box around that already ran a BitCoin full node and p2pool as well as some smaller stuff. It had some more capacity, but I didn’t know if it was enough to run electrum server. As it is not really apt-get installable, I didn’t want it on my main server. Electrum server uses a leveldb to keep track of all the information that it needs in addition to bitcoind. At the moment this database has about 11GB. Building it from scratch can take a long time, so they advice to download it form the foundary, and grow it from there. It didn’t work out initially, so I tried to build it from scratch. After computing for a week it slowed down too much at the blocks of mid 2012. So I downloaded from the foundry again, and this time it worked. For about two weeks I tested it in private. Then I had to enable IRC to make it public. You find the public servers in the #electrum IRC channel,  they start with E_. My electrum server is probably one of the slower ones. The cubox is a cool device, but not a typical server. It has performance comparable to a smartphone. Sometimes it lags a few blocks, but in general it keeps up quite well. I can see hundreds of clients connect to it.

  • HW1 tiny BitCoin hardware wallet

    While the trezor is certainly a great device for securing BitCoins, I’m also interested in alternative hardware wallets. Even in my very first discussions about increasing the scurity of BitCoin we talked about SmartCard solutions. After all, that’s also how I secure my GPG keys. But a regular SmartCard alone only protects the keys. If the computer is malware infected, it could sign another transaction than the one you initiated, and thus spend all your coins at once. The trezor solves this problem nicely with displaying the transaction details on the screen, waiting for a button press to confirm. Then came the HW1, a tiny BitCoin hardware wallet, based on smartcard technology with some extras. Since it has no display nor buttons, I was ready to get somewhat reduced security compared to the trezor. But in fact they are also very clever, and it turns out the security is just as high at the cost of a bit of convenience. But as I understand it, that level is configurable. I just opted for the more secure option.

    So, If I want to spend some Coins from my HW1, I plug the dongle which is smaller than a regular key on my keychain into an USB port on my computer. Then I start up electrum, and send the coins. Now the HW1 has to sign the transaction. It asks me to remove the dongle and plug it into another computer, that is preferably not connected to the internet. If I don’t have too much funds on this wallet, I can also plug it into the same one again. A text editor should be opened beforehand, and it should have focus. The dongle then acts as a keyboard, typing the transaction details along with a TAN code to validate the transaction. Next I remove the HW1 again, and plug it into the former computer. I type the TAN code, HW1 signs the transaction, and electrum distributes it to the BitCoin network. That’s it: simple and secure.

    Just as electrum itself and trezor, the HW1 uses a deterministic hierarchical wallet. To be sure I can trust the device and the method in general, it was not enough for me to test that I can spend from it. I wanted to also be sure I keep my coins in case the device gets damaged or lost. That means I have to be able to restore it from a seed. The seed is generated when I first initialize the dongle. And like the TAN code it is printed out in HID keyboard mode. If you have it print it on a machine that could be compromised, there would be no point in using a hardware walled in the first place. So have it print the seed to an air-gapped secure computer. If you already initialized your HW1, you can’t restore another seed onto it, unless you reset it first. I couldn’t find any documentation on how to reset it though. A developer told me to enter a wrong PIN three times to reset it. After that, don’t choose restore, but initialize. In the BTChip personalization manager that follows, you choose restore. I did this on a machine where I removed the harddisk, and booted from a fresh USB stick. Getting electrum usable with all the required plugins and libraries was the most work. Before typing in the seed, unplug the network cable and disable WiFi. After the seed was typed in, and the dongle restored, I issued “sudo dd if=/dev/random of=/dev/sda” and waited for the kernel to go belly up. That’s for making sure no sensitive information remained on the USB dongle. Don’t do this on your regular computer.

    In conclusion, I can say that:

    1. The security is just as high as with the trezor, if you let it type the TAN on a computer that is temporarily offline. But the convenience obviously suffers.
    2. If you only use it to store medium value funds, you can have it type on the same device, at reduced security. In that setting the convenience is about the same as with the trezor.
    3. Where the biggest difference lies for me, is restoring the device from a seed. Preparing a fully equipped air-gapped computer to securely restore the dongle from a seed proved to be quite some work. While with the trezor, you don’t need an additional computer. Luckily that’s a task that is required infrequently.

    While the experience with the trezor was smooth from the beginning, I tested a lot with the HW1 to gain confidence with it. I found some minor bugs. I had the computer freeze a couple of times. I saw lots of messages about dongles not found. I had to reconnect and start over many many times. Some things were not documented or not obvious. All these problems became lesser the more I tested it. I can only explain it that way that I grew a sense for the correct timings and steps required. In the meantime I use it without problems, but I have the feeling that it is not as robust as the trezor. It will work in the end, but you might have to try a few times before it does.

    I packaged the python library that is needed for the plugin for ubuntu. Once all parts and dependend libraries are out of beta, I will also try to get it into debian. On ubuntu, you can install it like this:

    sudo apt-add-repository ppa:richi-paraeasy/bitcoin
    sudo apt-get update
    sudo apt-get install python-btchip

    Ah yes, and there’s the price difference. A trezor costs $119 while a HW1 is just $20. At the moment they have a 2 for 1 offer, so go hurry.

  • The Rise and Rise of BitCoin

    As part of the Zürich Film Festival last week, they presented “The Rise and Rise of Bitcoin“. I couldn’t make it to one of the screenings where the director and the main actor were present. The room was fully booked, which I noticed with delight. I didn’t learn too much from the film on the technical side, as I’ve been involved with the topic for some years. But it was interesting to get to know some of the famous players a bit better. The movie was not very technical, and that’s on purpose. It does a great job in explaining BitCoin to the average people, and maybe get them interested in the future of money.

    To test my knowledge in the area of BitCoin and crypto currencies in general, I recently took the test for “Certified BitCoin Professional“. While most of the question are not that hard if you’ve been involved in BitCoin for some time, the time to answer is limited. You have to answer 75 questions in 20 minutes. So I forced myself into flow mode and gave the answers swiftly. After 16 minutes I hit submit on the last one, and was presented with “73 correct out of 75”. They won’t tell which ones were not correct, nor do they specify how many you need to get the certificate. Only the fee stops you from trying it over and over again. I’d be interested in your scores.

  • Presentations with code that actually works

    I don’t do presentations that often these days. And if I do, more often than not, they contain some form of source code. With most things you write, you refine it over and over. This is especially true with stuff that you present. Applied to code snippets, that can mean you test it initially, but once it is in the presentation it is a burden to copy it back and forth to verify every change, and then start over again with the formatting. So you often end up changing your code snippets in the presentation, without verifying if the code is still valid. Sometimes you find these errors during proof reading, but even famous presenters caught compile errors during the presentation. That’s how it works when you use the traditional PowerPoint style of products. As I expressed earlier, the Office suite and their opaque file formats doesn’t belong to my favourite tools.

    Thus after I recently learned LaTex, I wondered if presentations could be done with it. Sure enough TexMaker offers a good set of templates for just that.

    Next I wanted to see if I could link in code from external files, and sure enough, there is the listings package for LaTex. Now that enables me to have the code in files that I can actually compile.

    But wouldn’t it be cool, if I could compile the code snippets for verification and generate a pdf file from the tex source all at one go? Sure enough there is a cmake UseLATEX package.

    Now wouldn’t it be even cooler, if I could edit and generate all from within the same console window, without having to exit the editor, start the editor from a specific directory, or type complicated commands? Sure enough I found out how to write project specific .vimrc files. With everything prepared, I just have to type :make in vim to trigger the process, to get a new pdf file with all code snippets verifyed.

    A small project to demonstrate the technique is at: https://github.com/ulrichard/experiments/tree/master/initializerlists

    And you can find the resulting pdf file at: https://github.com/ulrichard/experiments/releases/download/initlist_0.1/initializerlists.pdf

  • The phone book of the internet age

    When I was a kid, the main means of communication with remote friends was using telephones. If I didn’t know the phone number of their parents, I looked them up in the phone book. The phone books also contained the postal address. So if I wanted to send a letter or a packet, I could also consult the same source for where exactly to send it.

    Nowadays we have many more means of communication (mobile phones, email, xmpp, IRC, BitMessage, Twitter, Skype, WhatsApp, ICQ, FaceBook, Hangout, Forums…), but in this plethora of options, discovery is sometimes more difficult. On some services you just search for name, on others you have to know the user handle beforehand. But most important, you need to know on which service to look in the first place. In addition, an increasing number of people choose not to be listed in the phone book, or their online counterparts any more. So when I recently wanted to send a package to a friend who just received a child, I couldn’t find his postal address anywhere and had thus to ask him.

    I’m sure in addition to the online versions of the regular phone books, there are lots of registry services where people can sign up to be listed. The problem is though that they are scattered all over the place, and mostly for local communities. There is one notable global directory, but that is for domain names rather than for people. DNS has problems of its own. As I experienced recently first hand, you’re at the mercy of the registrars if something unusual happens. And if you forget to renew, or lost access to the account your friend registered your domain (don’t get me started on passwords), some troll may catch your domain and use it for blackmailing.

    Namecoin is here to solve both problems. It is a descendant of BitCoin, the famous cryptocurrency. Namecoin is a decentralized store of information such as domain name registrations, personal information… you name it. As it uses a block-chain it is completely tamper- and censorship-resistant. The rules are very clear. The first one to grab a name gets it. When a name expires it is available again. Registration or update is very cheap, in the range of a few cents. Since it is merge-mined with bitcoin itself, it inherits the protection against 51% attacks.

    All you need is an installation of a namecoin full node (I’m not aware of any thin clients). The block chain is a lot smaller than that of bitcoin, so it is no problem to run it on your notebook. Once installed, you can register your domain. The GUI has fields for the required information. If you have a static IP address, you can just use that for registering and skip all the DNS stuff. The client side is a bit harder at the moment. To get the full security the system offers, you need to install a browser plugin, that is still a bit clunky. But there are already DNS providers that resolve .bit domains. That can be a lot more convenient at the cost of some security.

    But the reason I’m writing about namecoin is an alternative usage, namely as a kind of modern phone book. I can’t remember how I found the site  nameid.org. I think it was from some guy writing about integrating it with the BitMessage client. As BitMessage addresses are hard to remember, that makes a lot of sense. Using namecoin for OpenID is also a nice idea, but I don’t use that part. I’m still looking for an OpenID solution based on OpenPGP where I can use my OpenGPG Smartcard. There was a great project started in this direction called EnigForm, too bad it has been stalled for some time. But I’m diverting again.

    So, you can pick a short name (“ulrichard” in my case), and register selected information about you (email, blog, phone number, postal address…) with namecoin. The process is not as straight forward as with domain names, as the GUI has no fields for that yet. So you have to construct the json string yourself. The wiki documents the various fields and their types. You then only have to provide your short name as kind of digital, updateable business card. Yes, and updateable business card, isn’t that cool? Since not all people have namecoin installed, instead of the short name alone, you can provide a link to a website that nicely formats the information : https://nameid.org/?name=ulrichard . Once namecoin is integrated with other services, you no longer need to send mass-messages to all your friends when you change your eMail-address or phone number, you just update your namecoin id record.

  • Trezor BitCoin HardwareWallet

    Today I received my Trezor BitCoin HardwareWallet. When I ordered it in June 2013, the expected delivery Date was October. But as it happens all that often with BitCoin related hardware, the dates get pushed back. They offered a device with plastic case for XBT 1 and one with an alloy case for XBT 3. After the Bitcoin price skyrocketed end of last year, they stopped taking pre-orders. The devices we early backers received, have a nice “First Edition” label at the back.

    The trezor is the first hardware wallet for BitCoin that is mass produced. It has a small screen, two buttons and a microUSB connector. So it is actually a lot more secure than if you just stored the private key on a SmartCard, as could be done with a HW1 or a YubiKey NEO if the software was finally released. You can see the balances on the different addresses in the client on the computer. When you want to send some coins, you see the receiving address and the ammount on the small screen of the trezor. Once you confirm using two button presses, the trezor signs the transaction, and the client on the computer propagates it to the BitCoin network.

    Build quality and form factor look quite nice. It is actually a bit smaller than I expected, which is a good thing. Fifteen Swiss Francs in Coins would require about the same space. I guess it helps in that regard that it doesn’t require a battery, but is powered from USB.

    The first thing I did was setting it up with the browser plugin from https://mytrezor.com. It’s an easy process where you have to write down the seed which consists of 24 words. Then I sent a small amount back and forth. Only after seeing this succeed, I transferred bigger amounts to the addresses of the device.
    Then I wanted to test the electrum plugin that slush recently noted, would be merged soon. I found it in a pull request on github. It didn’t work initially, but several people were quick to help. After all issues were sorted out, also sending with the trezor from electrum works fine.

    It wouldn’t be a security device if it worked without entering some kind of secret. Entering the secret on the computer would make it less secure, as some malicious software could record it. Entering it on the device with only two buttons would be cumbersome, as not that many people these days are fluent in morse code. So, I was curious, how they solved that problem. The solution they came up with is actually quite nice. They display a 3×3 grid of buttons with question marks on the cumputer, while the trezor shows a 3×3 grid with digits 1 to 9 in random positions. That way, you enter your pin on the computer using a mouse or touch screen, using the positions found on the trezor screen. Even after playing with the trezor for only some hours, it’s evident that a lot of thought went into it.

    I wonder what will happen next in that space.
    I was not fully convinced by the HardBit. Indeed it turned out, somebody found out how to activate WiFi and bluetooth of the repurposed SmartPhone. That makes it way less secure. The developers seem eager and friendly, but it might be just not the most secure platform to begin with.
    Recently I backed an interesting project called PRISMicide on Indiegogo, but with only 8% funding after half the time, it looks as if they won’t make it.
    The picture and description of the BitSave from ButterflyLabs look really slick. But they have a history of overpromising and delivering late.
    And finally, I’m sure SatishiLabs, the creators of trezor, will work on a follow up device that is even smaller and communicates with SmartPhones.

  • key signing

    I have been using gnupg for a couple of years for digitally signing emails and debian packages and occasionally for encrypting files as well for ssh authentication. I wanted to participate in the web of trust for a while. But so far, all key-signing-parties in my region were on dates, that I couldn’t attend. Then I met the organizer of the last key signing party that I could not attend, on the last BitCoin meetup in Zug. Hence, we exchanged Id’s and key signatures, to sign the keys later. He briefly explained the procedure to me. Back at home, I wanted to sign his key, but was presented with an error message indicating that parts of my private key were missing. A quick search revealed that it was because of my setup, where I have the private sub keys on an OpenPGP smartcard, and the private primary key on an air-gapped machine in a secret place, guarded by orcs. Everything else can be signed using the signing subkey on the card, but other keys have to be signed using the primary key. Now, I began to think about moving all keys that I want to sign to that air-gapped machine and back using qr-codes. I didn’t like that Idea, and found a better solution: store the private primary key on a second smart card. Once it’s done, it works very well, I just insert the second smartcard when I want to sign someone’s key. But the procedure to get there is cumbersome to say the least. Luckily there was a concise description of what steps to perform.

  • Generating flight vouchers with LaTex

    Learning LaTex was on my todo list for many years. Like most people of my generation, I learned wysiwyg text programs in school, and used them for a long time for most stuff that ended up on paper. Actually, to be exact, the first text processing program I learned in school didn’t fall into the wysiwyg category, but was DOS based. I think it’s name was “Farsight”, but I can’t find any information about it on the internet. Since I am no friend of proprietary lock-in systems, I switched from MS Word to OpenOffice a long time ago, and more recently to LibreOffice. But even though their file format is open, it’s still binary. I know, I know, Word and ODF offer textual formats. I think they are mostly XML based. But the last time, I looked at one of them, I could not believe how overloaded with useless trash they were. The most annoying limitation of binary formats, is when you want to store the documents in a version control system, and compare different revisions. I used html for a while for documentation purposes. Although it is very good for these textual diffs between revisions, I’m not artistic enough to make it good looking. Hence, I thought for a long time that LaTex would be worth learning.

    Also, for a long time I wanted to automate the vouchers for our tandem flights at paraeasy.ch. Even-though I knew that this was a perfect match, I had too many other things to do. As I’m currently reading a book about LaTex, I have my perfect hands on exercise. Hence, I prepared a template tex file for the vouchers and one for the invoices. Then I wrapped a python script around, that handles the rest.

    The traditional way to keep track of which vouchers are active, and which ones were redeemed, is to keep a list. But after reading all the buzz about smart property, I figured that BitCoin is actually a perfect solution in itself. I generate a unique BitCoin address for each voucher, and load it with some coins. That way I can easily check, if the voucher is still valid. In fact, even other pilots that fly for us, can easily verify the validity of our vouchers. Now the perfect solution would be to load it with the full value, but since the BitCoin price is still quite volatile, the risk would be too high. After all, I need to be able to pay other pilots in case of a BitCoin crash. So I decided to load the voucher addresses with half the value. That way I can better tackle the risk.

    As an opensource believer, I pushed my scripts to github, hoping they might be useful for somebody. I didn’t go to full lengths, in making it a configurable drop in solution. So, if you want to use it, leave me a message, and I will help you set it all up, and make it more configurable along the way.

    Now, what happens if somebody orders a flight voucher on paraeasy.ch?  After the customer fills in all the required fields, and presses submit, I receive an email with a html table containing all the information. I then save the mail with evolution to a folder as an mbox file. Next, I start the python script which performs the following:

    • Generates a new unique number for the voucher.
    • Parses the information from the mbox email file.
    • Generates a BitCoin address that contains the initials of the passenger.
    • Replaces the placeholders in the tex files with the actual information.
    • Generates a qr code with the relevant information, and a gpg signature thereof.
    • Generate pdf files for the voucher and invoice.
    • Add the new entry to the list of active vouchers.
    • Add the pdf files, the updated list as well as the encrypted private key for the BitCoin address to my private git repository.

    The system is not finished yet, but it already looks like a big relief. In the future, it might also generate the email to send the pdf file back to the customer.

  • Smart Radios

    For a couple of years I have been running mpd (music player daemon) on an Alix, connected to a stereo in the office. The Alix runs headless, but I have a variety of options to control it: gmpc on the notebook, Droid MPD client on the phone and fookebox in the browser. Over the years I read a multitude of articles about home built jukeboxes based on something like a RaspberryPi, a simple display and some buttons. I thought, that’s cool, but I didn’t have the requirement for this in the office.

    Some time last year, I thought it would be cool, if my wife could access our full music collection from the kitchen. As her old radio started to disintegrate, I had an idea for christmas. So the first idea was to build something myself. But the kitchen is not the ideal place for something thrown together with loose wires, and I couldn’t expect her to reboot it in case something locks up. So I was looking for something pre-made and a bit more consumer friendly. I didn’t want to loose freedom though, so the ideal would be if it was also based on mpd. I didn’t find the device I was looking for, but the device that came up most in my searches was the UE Smart Radio from Logitech. It seemed to cost a lot more than a RaspberryPi with some additional components, so I looked further and went to several shops. The selection in this area is very sparse, which surprised me a lot. All the other devices in the shops, except the insanely expensive ones, sounded like through a long cardboard tunnel. But the UE (Ultimate Ears) one, although mono, sounded really good. Another feature that made it stand appart from much of the competition is, that in addition to the WIFI, it also offered connectivity through an ethernet port. This one was a must, since my Wife is very concerned about electro smog.

    So I went for the UE Smart Radio from Logitech. It was received well by my wife. At first we only used it to listen to live streams of radio stations around the world. It worked perfectly for that. But connecting it to our music library didn’t work out so well. I assumed, It could just access the files over a network share. So I set up a samba share on the server that contained all the music files. After all, that’s how the media players fetch the movies as well. I just couldn’t figure out how to find the music from the radio. All it said was to install some proprietary software on the computer and the phone. I don’t particularly like such proprietary stuff, and always try to find ways around, but this time I had to bite the bullet. The android app gave some additional configuration and remote control options, but insisted on installing also something on a computer to be able to stream the private music collection. So I had a look at http://www.uesmartradio.com. It offers the download only for Windows and Mac. Now this is where I started to question the purchase. I agree that some clueless managers might be familiar with only these two options on the desktop. But do they really insist on everybody having their desktop computer running just to listen to their music in another room? No way!!! I think by now at least a NAS system if not a small server is in most households that care to have their music available electronically for devices like this radio. And what operating system do they usually run? Windows? MacOS? They must be joking!

    At first, I wanted to dissect the Windows package in the hopes to being able to reverse engineer it to get something workable. But all information I found about that package on the internet, indicated that it is an unholy mess consisting of a multitude of dlls and executables. So I checked on the MacOs package. The information I found indicated something perl based and much cleaner than the Windows version, but I had no tools readily available to decompress it. Luckily I found a forum thread where other people already complained about the very same issue. One pointed out that there are unofficial nightly builds for a range of other targets, one of them being a debian package. That solved the problem for the moment. Installation was smooth, and so was setup and operation. The only soar point that remains was also confirmed by the Logitech support: The packages for the more useful platforms are not officially supported and they don’t know if they will continue to build them at all.

    K810 Bluetooth Keyboard

    With a keyboard also from Logitech I had a similar issue. I have always preferred standards such as Bluetooth over proprietary protocols such as Logitech’s Unifying. So I was delighted when I spotted a slim, nice looking bluetooth keyboard in a store some years ago. It was meant for the iPad, but I thought, if it’s bluetooth, it should work with my computer and phone too. Pairing was no problem, as was operation under Android. The problem arose when I wanted to use it with the Computer. The keys that were there, worked perfectly, but the problem was the missing function keys (F1 – F12).  Without them it’s very hard to operate just about any debugger in an IDE that I know of.

    So, I was even more delighted, when I discovered the K810 in a store last year. It can pair with three devices, and easily switch between them. So I could for example use it with the workstation, the notebook and the phone without having to re-pair each time. The first one I bought was for the office. And I became a huge fan of this keyboard. So I bought also one for at home. I noticed in the office, that the default mapping of the function keys is awkward to say the least. By default, the alternative functions like the brightness of the key back light or the multimedia controls are activated, and to use the regular function keys, you have to press the FN key. It’s hard to guess what they smoked when they decided to make this the default. Imagine your mother wants to refresh the page in her browser by hitting F5 and instead the keys get brighter. Or imagine she wants to rename a file by hitting F2, and instead the keyboard disconnects from the computer and sends subsequent key-presses to the phone. Let alone operating a debugger. Luckily this setting is easy to change with the Logitech SetPoint software….. unless …. there is no SetPoint software for everything but Windows and MacOS.

    Luckily somebody already reverse engineered the relevant information, and compiled a small utility program, that corrects this setting. Thanks Mario for sharing. Your utility saved my day.

  • vim meets VisualStudio

    There are two camps of neckbeards: Those who use emacs, and those who use vi or vim. I can’t tell which is better, and most of the arguments seem to be rhetoric. Until about three years ago, I perceived both as insufferable. I was however curious to learn either of them. The question was which one to pick. During my uncertainty, vim was praised more on hacker news. So I gave it a try. At first, it was awkward to work with, but after a while I managed to get along. People often tell how blazingly fast you are editing with vim. But for a long time, I was not nearly as efficient as with other editors. At the moment I’m reading the book “Practical vim” which has a ton of good tips. It seems the flood of shortcuts is never ending. In a way memorizing more commands and shortcuts is like having more keys. That kind of reminds me of an article, I once read. It compared working with a GUI vs on the console to listening radio vs playing piano. I can’t find the article right now, but it had similar reasoning as this one.

    So I’m constantly improving my vim skills. In the meantime I’m about on par with how efficient I am at using the style of editors, that I have been using for two decades. To improve further, I thought I would need to practice more. So the natural progression was to use it on the job. For work we use VisualStudio, and unless I could easily compile and debug out of vim, switching back and forth would be counter effective. So I was thrilled to find out that there is a plugin to bring vim style editing to VisualStudio. I only just started using it, but it certainly looks promising.