Subscribe to RSS feed - electronic brain surgery since 2001


JavaScript CDNs by the numbers

CDNs are an excellent way to speed up the loading of common JavaScript libraries for your website:

  • because it's a different domain, your browser can load the files in parallel to your other resources
  • CDNs use a geo location near you, which should reduce latency
  • CDNs servers may be a bit faster than your shared hosting server
  • Your browser might have cached the library already so no request is needed at all

Inspired by a discussion on a pull request for DokuWiki, I was curious about the popularity of different free CDN providers. So I decided to do some research and ran a little web crawler….

Two weeks later my script is finally done checking 16 million domains and I'm happy to present the results in the following info graphic:

Last updated: 2016/12/21 10:26 · Permalink · Comments

Hello Fresh

A while ago we tried a Marley Spoon recipe box and really enjoyed it. So when my company asked if they could give us a little wedding gift we asked for another recipe box.

This time we had a trial voucher for So here's a review.

Last updated: 2016/11/30 09:33 · Permalink · Comments

A curious Letter

Sometimes I get weird letters. But today must be some kind of record for weirdness.

When I came home I found this manila envelope in my letter box:


A letter from Canada? I couldn't remember ordering anything from there. But who knows, maybe I just forgot.

However when I opened it, there was another envelope:

Last updated: 2016/11/29 19:57 · Permalink · Comments

My 3D Printer sucks

People sometimes ask me about the state of my 3D printer. It's complicated. I love having one. I love when I have the final thing in my hands. But I really hate getting there.

3D printing is hard.

First of all you need to design your piece. I usually end up using TinkerCad or OpenSCAD for that. But getting something right the first time is rare. Usually you design something, then print it, then make adjustments, then print again, make some more adjustments and maybe finally do the final, correct print. You can easily spend a whole day on a simple, small piece.

Before you can actually print something you need to create a G-Code file containing the actual print instructions. There are a million things to tune. And each filament is different. So changing filaments means retuning. You also often want different setting for different pieces. Retuning again.

Then there's the printing it self. My 3D printer was cheap. I assembled it myself. The firmware on it is ancient. My heated bed is broken. I never found a really good cover for the bed to make objects stick (for some reason Berlin hardware stores do not have blue tape). All this makes it hard to print something from the beginning.

print in progress, failed stuff in front So I often have problems with warping. Things not sticking to the bed. The printer aborting a print due to unknown reasons. And the quality isn't that great either.

Finally there's the speed. 3D printing is slow. Even small things takes at least an hour to finish. With all the aborts and retries it eats a lot of time.

Overall the experience isn't great. Which means I rarely use my printer. Not using (and maintaining) the printer of course makes it harder to use it when I do. A negative feedback loop.

So sometimes I think about buying a new printer. A better one. A more expensive one. But then I think I'm not using my current one often enough. Or would I use it more if it worked better? Would finding out be worth spending a 1000 bucks? OTOH my current one still kinda works. *sigh*

From time to time I dream about a Formlabs printer which uses a completely different technology. In my mind it should be easier to use one of those. But that might be wrong. Also spending 2400€ for their smallest model would be insane.

So here I am. Waiting for my printer to finish that piece I need. Hoping the print will succeed despite one end having lost contact with the bed already…

3dprinter, rant
Similar posts:
Last updated: 2016/11/20 14:30 · Permalink · Comments

Simple Conky Setup

I always like to know what my system is doing, so it's easy to spot when things go wrong for some reason. Til now I relied on some widgets in my XFCE panel, but the info you get there is rather limited.

The defacto standard for live monitoring on Linux desktops is conky. It's endlessly flexible and relatively light on resources. However its also rather ugly out of the box.

There are a million configurations available on the net, but I wanted something simple that can easily be customized. After few hours of reading and tweaking, here is what I came up with:

And here's the config for that. Feel free to copy and adjust it for your needs.

conky.config = {
    use_xft = true,
    xftalpha = 0.8,
    update_interval = 1.0,
    total_run_times = 0,
    own_window = true,
    own_window_transparent = true,
    own_window_argb_visual = true,
    own_window_type = 'normal',
    own_window_class = 'conky-semi',
    own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager',
    background = false,
    double_buffer = true,
    imlib_cache_size = 0,
    no_buffers = true,
    uppercase = false,
    cpu_avg_samples = 2,
    override_utf8_locale = true,
    -- placement
    alignment = 'top_left',
    gap_x = 140,
    gap_y = 25,
    -- default drawing
    draw_shades = false,
    draw_outline = false,
    draw_borders = false,
    draw_graph_borders = true,
    default_bar_width = 150, default_bar_height = 5,
    default_graph_width = 150, default_graph_height = 12,
    default_gauge_width = 20, default_gauge_height = 20,
    -- colors
    font = 'Liberation Mono:size=10',
    default_color = 'EEEEEE',
    color1 = 'AABBFF',
    color2 = 'FF993D',
    color3 = 'AAAAAA',
    -- layouting
    template0 = [[${font Liberation Sans:bold:size=11}${color2}\1 ${color3}${hr 2}${font}]],
    template1 = [[${color1}\1]],
    template2 = [[${goto 100}${color}]],
    template3 = [[${goto 180}${color}${alignr}]],
conky.text = [[
${template0 Info}
${template1 Date}                                                           ${template3}${color3}${time %a,}${color}${time %e %B %G}
${template1 Time}                                                           ${template3}${time %T}
${template0 System}
${template1 Hostname}                                                       ${template3}${nodename}
${template1 ${sysname}}                                                     ${template3}${kernel}-${machine}
${template1 Uptime}                                                         ${template3}${uptime_short}
${template1 CPU}                                                            ${template3}${freq_g}GHz
${template1 CPU\ Temperature}                                               ${template3}${acpitemp}°C
${template1 HDD\ Temperature}                                               ${template3}${hddtemp /dev/sda}°C
${template0 Processors}
${template1 Load}               ${template2}${loadavg 1}                    ${template3}${loadgraph}
${template1 Core\ 1}            ${template2}${cpu cpu1}%                    ${template3}${cpubar cpu1}
${template1 Core\ 2}            ${template2}${cpu cpu2}%                    ${template3}${cpubar cpu2}
${template1 Core\ 3}            ${template2}${cpu cpu3}%                    ${template3}${cpubar cpu3}
${template1 Core\ 4}            ${template2}${cpu cpu4}%                    ${template3}${cpubar cpu4}
${template1 Top}                ${template2}${top name 1}                   ${template3}${top cpu 1}
${template0 Memory}
${template1 Memory}             ${template2}${memperc}% used                ${template3}${mem} / ${memmax}
${template1 Top}                ${template2}${top_mem name 1}               ${template3}${top_mem mem_vsize 1}
${template0 Filesystem}
${template1 /}                  ${template2}${fs_free /} free               ${template3}${fs_used /} / ${fs_size /}
                                                                            ${template3}${fs_bar /}
${template1 IO\ Read}           ${template2}${diskio_read}                  ${template3}${diskiograph_read}
${template1 IO\ Write}          ${template2}$diskio_write                   ${template3}$diskiograph_write
${template1 Top}                ${template2}${top_io name 1}                ${template3}${top_io io_perc 1}%
${template0 Networking}
${if_existing /proc/net/route wlan0}\
${template1 IP}                                                             ${template3}${addr wlan0}
${template1 AP}                                                             ${template3}${wireless_essid wlan0}
${template1 Signal}             ${template2}${wireless_link_qual_perc wlan0} ${template3}${wireless_link_bar wlan0}
${template1 Download}           ${template2}${downspeed wlan0}              ${template3}${downspeedgraph wlan0}
${template1 Upload}             ${template2}${upspeed wlan0}                ${template3}${upspeedgraph wlan0}
${template1 Total Down/Up}                                                  ${template3}${totaldown wlan0}↓ / {totalup wlan0}↑
${else}${if_existing /proc/net/route eth0}\
${template1 Ip}                                                             ${template3}${addr eth0}
${template1 Download}           ${template2}${downspeed eth0}               ${template3}${downspeedgraph eth0}
${template1 Upload}             ${template2}${upspeed eth0}                 ${template3}${upspeedgraph eth0}
${template1 Total Down/Up}                                                  ${template3}${totaldown eth0}↓ / ${totalup eth0}↑

Now I just wish I could find something similar for Windows. Tips welcome.

conky, linux, monitoring
Last updated: 2016/11/19 15:07 · Permalink · Comments

Older Posts are available in the Archive. Keep up to date with the RSS Feed.


Older Articles are available in the Archive, subscribe to the
Full Content RSS Feed to stay tuned. You can also subscribe to the Link RSS Feed.

← Flattr me ;-)