Friedrich Ewald My Personal Website


  • Python Base62 Encoder & Decoder

    Base62 encoding is commonly used for ids where space matters. Many URL shortener service use this and also youtube calculates its video ids in Base62. The advantages are obvious. Instead of using the id 1337, you can just use LZ. This saves 50% (in this case, usually more) of the overall traffic needed to transmit this id. However, Base62 is not an ecryption. I created an easy to use Python module and put it on my GitHub account. As I try to improve code quality, this module has 100% code coverage and also passes all unit tests.

  • Less wide Tabs in VIM

    To use less space in vim I decided to go with only two spaces for each tab stop. This also improves readability in my eyes. I set the following in my .vimrc which I found here:

    set tabstop=4       " The number of spaces count for a TAB.
    set softtabstop=2   " The number of spaces inserted when typing TAB. If not expandtab, type TAB twice, will get one TAB.
    set shiftwidth=2    " The number of spaces when auto-indent.
    set expandtab       " Use the spaces only.
    set smarttab        " Insert appropriate spaces in front of line according to shiftwidth, tabstop, softtabstop.
    set autoindent
    set smartindent
    Interesting: Now I need two tabs to have the correct indent for Markdown source code.

  • Using a Newtonsoft.JSON DLL in multpiple projects

    When building a Visual Studio solution, I had the problem that I got a TargetInvocationException when calling a method from a referenced DLL file. When running the unit tests on the DLL file, everything seemed to work fine and I could not track down the problem. The inner exception of the exception brought me then on the right track: The Newtonsoft.JSON module was installed in different versions across each DLL file and the main project.

    ' Write the exception to the console.
            response = Await client.Login("a", "b")
        Catch ex As Exception
        End Try
    The solution is simple. I just had to make sure, that the DLL is used in the same version in every project. This can simply be done with the console of the package manager.
    PM> Update-Package Newtonsoft.JSON -reinstall
    PM> Update-Package Newtonsoft.JSON

  • Experiences with Jekyll (2016)

    My first post on this blog was in December 2015 and since then, this blog is running with Jekyll. I want to take the time to summarize my experiences with Jekyll over the past year. The first thing I did, was creating a build script which I then used within a git-hook. The build script just runs jekyll build and then uses rsync to synchronize the changes to my webserver. This way, I can keep the webserver very light, serving only HTML, CSS and some JavaScript. This script is located in the root folder of the site.

    jekyll build
    rsync --update --progress -r _site/* [email protected]:/.../html/
    Now, every time I write a new post, commit it, it will be automatically published on the web and the corresponding html sites will be updated. This also works for any change in any template file.Since I wanted to allow some dynamic content on my website, I added Disqus. This adds a comment box under each blog post via JavaScript. With this technique, I am able to keep the sites static but also allow feedback. The Javascript is added just before the closing body tag which keeps the loading times very low. Google Page Speed Insights rates this page currently with a score of 71/100 for mobile and 85/100 for desktop. This is obviously far away from the optimal solution and will be a topic in another post. What I can see so far, the changes to the code should be minor and can be easily integrated into the build script. The theme for this site is from the page Jekyllthemes. This page hosts a lot of open source themes for Jekyll which are ready to use. A theme consists of a bunch of files, which have to be places in the the main folder. An easy to understand tutorial can be found here. Overall my experience with Jekyll is very positive and it makes creating a website very easy. Of course one loses a lot of dynamic features, but the point that I don’t have to worry about any security issue ever, justifies this decision. Also, load times are much fast, especially on a shared server.

  • Merging two ordered lists efficiently in Python

    To merge two lists l1, l2 in python, one can use the following

    1. Create two pointers, p1, p2
    2. Use a while loop, which is terminated, when one of the lists reaches the end
    3. Compare the entries of the list pairwise at the pointer position
      • If the entries are equal, add l1[p1] to result and increment p1 and p2 by 1
      • If l1[p1] < l2[p2], then add l1[p1] to result, then increment p1
      • If l1[p1] > l2[p2], then add l2[p2] to result, then increment p2
    4. Check, which list is not at the end and concat the tail of this list with result
    In Python code, this looks the following:
    l1 = [1, 3, 5, 7, 9, 11]
    l2 = [2, 4, 6]
    p1 = 0
    p2 = 0
    result = []
    # Loop over both lists until one list is at the end
    while p1 < len(l1) and p2 < len(l2):
        # If the values at the positions are the same,
        # copy the value to the result
        if l1[p1] == l2[p2]:
            result[-1] = l1[p1] + l2[p2]
            p1 += 1
            p2 += 1
            # One entry is smaller, increment the smaller pointer
        elif l1[p1] < l2[p2]:
            p1 += 1
        # One entry is smaller, increment the smaller pointer
        elif l1[p1] > l2[p2]:
            p2 += 1
    rest = []
    if p1 < len(l1):
        rest = l1[p1:len(l1)]
    elif p2 < len(l2):
        rest = list2[p2:len(l2)]
    result += rest
    # [1, 2, 4, 5, 6, 7, 9, 11]

Page: 24 of 28