Author: Jason

  • MSSQL ODBC Client on Debian 9 Stretch

    Many years ago fREW Schmidt wrote a very handy article on installing MSSQL ODBC drivers in debian. Since then Microsoft have improved their support of debian somewhat and things have changed making it easier to install, however they still (as at 2017-11-06) have not released proper drivers for Debian Stretch.
    Add the microsoft repo

    echo 'deb [arch=amd64] https://packages.microsoft.com/debian/8/prod jessie main' > /etc/apt/sources.list.d/mssql-release.list

    Add the key

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
    

    then update and install

    sudo apt update
    sudo apt install msodbcsql mssql-tools
    

    If you try and connect to sql now you get an obscure error like this:

    /opt/mssql-tools/bin/sqlcmd -S 10.0.2.13 -U xxx -P yyy
    Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1' : file not found.
    

    But the file exists:

    $ file /opt/mssql-tools/bin/sqlcmd
    /opt/mssql-tools/bin/sqlcmd: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=21a353af470e7849544daab892ec9b1bfc36dc87, not stripped

    This somewhat misleading error is actually due to the libmsodbcsql lib being linked against a very specific version of libssl. Check the output of ldd:

    $ ldd /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1 | grep 'not found'
    libcrypto.so.1.0.0 => not found
    libssl.so.1.0.0 => not found

    But it turns out this can easily be solved by manually installing the libssl package from Debian Jessie:

    wget "http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb"
    sudo apt install ./libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb

    then you should be back in business.

  • I made a braided cord bracelet

    I made a braided cord bracelet. Cordage came from Decathelon
    Instructions thanks to the WhyKnot YouTube Channel

  • I made a ukulele tuner web app

    close up of a ukulele
    Ukulele by texasfeel  (CC BY-ND 2.0)

    I got sick of all the ukulele tuner apps so I decided to make my own. The best ukulele tuner app I’ve found on the iPhone works by repeatedly playing the note you are tuning to rather than trying to analyse the audio and display the frequency of the note it detects. The human ear is still better than software at doing that in my opinion.
    It’s pure html and javascript. I used the howlerjs javascript framework for playing the audio as I found the basic javascript audio functions not precise enough for the looping.
    The audio samples came from freesound.org courtesy stomachache.
    Ukulele Tuner

  • convert mp3 to m4b on the linux command line

    I quite often want to convert mp3 files to m4b, Apple’s proprietary nastiness. There is pacpl of course but that has issues these days, particularly with copying the id3 tags to the new file.
    FFmpeg can do it when you build from source (I just found a nice script that will build it from source for you). So I came up with this way to do it from the command line. It uses an awesome feature of xargs which will run it in parallel, so one for each core.

    find -type f -name \*.mp3 \
    | xargs -n 1 -P $(getconf _NPROCESSORS_ONLN || echo 1) -i \
      bash -c \
     'i="{}"; ffmpeg -y -i "$i" -map_metadata 0 \
            -c copy -c:a libfdk_aac -b:a 128k\
            -map_metadata:s:a 0:s:a -f ipod "${i%.*}.m4b"'

    What that does is:

    1. find all the mp3 files and pipe their names into xargs
    2. then get the number of cores available and pass that to the -P argument
    3. and run ffmpeg and map all the metadata to the new file
    4. and strip off the mp3 file extension and add m4b to it

    There! Nothing to it!
    Update 2017-03-23: Added double quotes around the bash variable $i to cope with spaces. You should always do this (and so should I)
    Update 2018-12-20: Added “-c copy” so ffmpeg can cope with album art in the file

  • Build and install emacssnapshot packages on Debian Stable

    the emacs logoDespite emacssnapshot only providing prebuilt packages for Debian unstable, building and installing the packages on stable is quite straight forward.
    I wrote a script to automate it. I’m sure there are better ways to do this, but it works for me. Thanks to twb for feedback on the script. Sorry I was too lazy to implement all of your suggestions twb.

  • New host

    I migrated to a new host. If you can see this, you are looking at emacstragic on the new host.

  • Wan’t to help organise a Perl conference in Sydney in 2017? Apply within!

    Some of us at the Sydney PM group and the #australia  Perl IRC channel have
    been discussing holding an perl conference in Sydney in 2017.
    If this is something you are interested in attending or organising,
    please get in touch.
    You can find us on #australia on irc.perl.org or Join our conference
    organising mailing list:
    https://groups.google.com/forum/#!forum/sydney-perl-conf-2017
    First thing we need to do is form an organising committee. Let me know
    if you are interested to be a part of that?
    Looking forward to hearing from you.

  • Automatically lookup amazon books on booko

    Automatically lookup amazon books on booko

    I love books and I love booko. So I decided to help Amazon help me check prices on booko with a little Tampermonkey script. It makes the ISBN-13 on Amazon a clickable link that will open a new tab to booko and search for that ISBN. Give it a go!

    // ==UserScript==
    // @name         booko amazon ISBN link
    // @namespace    https://emacstragic.net/
    // @version      0.1
    // @description  Make the ISBN-13 a clickable link to booko.
    // @author       Jason Lewis jason@NOdicksonSPAM.st
    // @match        https://www.amazon.com/*
    // @copyright 2016+, emacstragic.net
    // @grant        none
    // ==/UserScript==
    (function() {
        'use strict';
        //var hrefs = new Array();
        var elements = $('#productDetailsTable > tbody > tr > td > div > ul > li');
        elements.each(function() {
            console.log($(this));
            //console.log($(this)[0].innerText);
            if ($(this)[0].innerText.indexOf('ISBN-13') !== -1 ) {
                var isbn=$(this)[0].innerText.replace(/ISBN-13:\s*(\d{3}-\d{10})/,"$1");
                console.log('isbn is: ' + isbn);
                var url = 'https://booko.com.au/' + isbn;
                var a = document.createElement("a");
                var text = document.createTextNode('ISBN-13: ' + isbn);
                a.setAttribute('href',url);
                a.setAttribute('target','_blank');
                a.appendChild(text);
                var li = document.createElement("li");
                li.appendChild(a);
                $(this)[0].replaceWith(li);
            }
        });
    })();
    
  • Finished my workbench!

    I finished my workbench. It took me about 12 months and a broken toe to do it. Very happy with the result but now I need to fit the vice. I copied Paul Sellers’ design from his YouTube videos. In fact his videos inspired me to get into woodworking to start with.

  • I am transitioning GPG keys

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1
    I am transitioning GPG keys from an old 4096-bit RSA key to a new
    4096-bit RSA key.
    This transition document is signed with both keys to validate the
    transition.
    If you have signed my old key, I would appreciate signatures on my new
    key as well, provided that your signing policy permits that without
    reauthenticating me.
    The old key, which I am transitional away from, is:
    pub   4096R/505E764E 2011-06-28
          Key fingerprint = B10B 2E72 BB30 FE47 ABC2  F1B9 FA57 1EC7 505E 764E
    The new key, to which I am transitioning, is:
    pub   4096R/93176CCD 2016-10-14 [expires: 2026-10-12]
          Key fingerprint = 4639 4DFE EFF0 344F E116  E974 C4E9 00B0 9317 6CCD
    To fetch the full new key from a public key server using GnuPG, run:
    gpg --keyserver keys.gnupg.net --recv-key C4E900B093176CCD
    If you have already validated my old key, you can then validate that
    the new key is signed by my old key:
    gpg --check-sigs C4E900B093176CCD
    If you then want to sign my new key, a simple and safe way to do that
    is by using caff (shipped in Debian as part of the "signing-party"
    package) as follows:
      caff C4E900B093176CCD
    Please contact me via e-mail at <jason@dickson.st> if you have any
    questions about this document or this transition.
      Jason Lewis
      jason@dickson.st
      14-10-2016
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1
    iQIcBAEBAgAGBQJYAC6KAAoJEPpXHsdQXnZOTMQP/10FKnXZHVcQN7w+d7dmAHFv
    A3ZKH9UxZec0m7j8pfb0FfhKjfDPh8lrVZYz7LU8dCE6qmDvCcxMg9dsOgudtfTE
    L2sx15RrGvqXrj2yYBGX8g7kunnqz9ob0jlkghYuXFvkpLpZ59zalhFA6qDQzWbu
    lKaWJC5B42nW31BofZEABSm1HnwBzDbbJF890m07TVQKMs2znzF114vU5WyxBubn
    4uielvMDbUFoa17oyKkn6EJkE2z/5c0DR9XNMo3SH0TXeF4y18uUFdioWPyjoIit
    6tvNQoJQ4itTmp2UgmZY/z7mj5VEu2gZ+TvrLG7z0vmxZfPSDaPCZ7rn0qNTRbIY
    tDg+dgSDMpDOeM+V+rDqorZR2UZHWvvpbU+2s14+CrHruriTHXzoX5l8EWY/HA7n
    Twzy6zz3wS1ODtR8AxpFpowSjfjBGeSPB9u2L4nUpDG3tRQbvZ7cE4ITh/204tEv
    obqCOvZ9sQ04ePv5AsPNP5oHbHPsxTu3RiRZvgH5IX2QTJ6U+ZXgD7M7uS2Zcdix
    l4Y+BmjQ/S73T7PU2aBeZoNMF7+bIXtMfyGE6dtfnNAs02ubgB4V8uSthyD0ViQg
    6nxuXYcCV6RcrdjZYgbnNXgh+Cr4kqUgEqSe73ac2tIEs+jbNNb03HHOkI9A1gqP
    bH7ZvpNyPzXT6b4eBZ6miQIcBAEBAgAGBQJYAC6KAAoJEMTpALCTF2zNTMQP/j94
    jb7olr2HNhT8LjLB7zAsOL2huUqpjpkJnwjAZP2p37D2xovfbMXlmOFGD08MTWqF
    C8yzJ2EnQiwNcN8Wn6OIlzdkd/ytkB2n9UW8E+zAeFo/XgZzs3iqiHpjTADbfzSK
    4Qm382SIQR/7sXGzSX9j0XFxQg7BVdkOQdrdb5uKaiYurzAcBTp0iXPk0u9gEbzm
    D3vq4WAeRR2ItD3WTAqA8VPm/4nNxaVzmbRCmHrrfLkQzx27rWzh7Ephdm1qCtVZ
    JWf8PvQQiMKMjZQLp0EuD2XXFdjhXXXeJlgjuXoRkHfXBteRVSM2ZR/UPhksanlb
    n+lfE6Qz3s+WcHQ5fjhRxelfWd/jS+BicvYuAM3WBaJnyAQR6ZZ/P0jhk+4d6sJg
    4/9fTpvQ2AfhKif0+eos2O+G6FcNeoGVEOZXpuvNgvvtxawokeIAV+5Or6AaJhB+
    qO40bIrgNW7G5DllhIB5+rImmvpoIVHQFBjbMw2ryc8rCPoeRLToXaGYKOOdezF3
    cuaXW+rvAh+D04Ch4p7BpzsrQimSO/2SixgxFggNtCFquEIfqq6YZ/fy+8XT5Lhb
    e8F/kPPCxopGWk2C6Auuf1+ecieu0pJ6BOJazQXW4uVKQbJSuvplaXHPU4ZtFS5V
    LZojNxo9l5DT+/Qcs4EtG4CJS/etx1Og2FrX1U9a
    =EP09
    -----END PGP SIGNATURE-----