RSSAmplifier

Blog

Jonas Wagner - 29a.ch

29a.chRSS feed ↗50 posts

Latest posts

C2PA Content Credential Photo Forensics

C2PA Photo Forensics in Forensically I have added support for reading C2PA metadata to my photo forensics tool Forensically . C2PA is the Coalition for Content Provenance and Authenticity . In their own words: The Coalition for Content Provenance and Authenticity (C2PA) addresses the prevalence of misleading information online through the development of technical standards for certifying the…

Impulse Response Creator

Impulse Response Creator I got a little bit obsessed with convolution reverb and measuring impulse responses over the last few weeks. As part of that I’ve built myself a few command line tools to create and process impulse responses. I have now bundled these up into a web application, in the hope that they may be useful to others. What are impulse responses and convolution reverbs If you…

Tuning Songs Instead of My Guitar

Try Fix Tuning In 1834 Johann Heinrich Scheibler recommended using 440 Hz as the standard frequency for A 4 . For various reasons a lot of music deviates from that. Deviating from 440 Hz has its artistic merits and can give music a different feeling and timbre. It’s an annoyance if you have to retune your instrument slightly for every song you want to play along with. It is possible to…

simplex-noise.js 4.0 & Synthwave Demo

View the synthwave demo I’ve just released version 4.0 of simplex-noise.js . Based on user feedback the new version supports tree shaking and cleans up the API a bit. As a nice little bonus, it’s also about 20% - 30% faster. It also removes the bundled PRNG to focus the library down to one thing - providing smooth noise in multiple dimensions. The API Change The following bit of code…

Tool to apply wood textures to 3d prints

Test the 3d print texturizer A little while ago I came across an interesting post on reddit on how a wood displacement map can enhance the look of 3D prints. Just a bit before I also played with the fuzzy skin feature in prusa slicer 2.4. That made me wonder whether the wood effect could be achieved directly in the slicer by tweaking the fuzzy skin feature. I had a quick look at the prusa slicer…

Swirly Bokeh Lens Hood - 3D Printed

Photo taken with the 3d printed swirly lens hood. I enjoy the swirly blur in the out of focus regions that certain lenses like the historic Petzval produce. This effect is also known is swirly bokeh . Just not quite enough to own such a lens myself (yet). Instead I’ve chosen to emulate it by 3d printing a special lens hood for my Sony FE 55/1.8 lens. How to get swirly bokeh with a lens hood…

Procedural Lamp Shades for 3D Printing

Play with generating lamp shades I didn’t have any lamp shades in my appartment since moving out from my parents place. I’ve decided to change that and have some fun while doing it by building a generator for lamp shades. How it works In order to test my setup with three.js . I’ve started by generating n-gons. A hexagon in this example. In order to make the result a bit more…

I made myself a guitar tuner

I first learned about the fourier transform at about the same time I started to play guitar. So obviously the first idea that came to my mind at that time was to build a tuner to tune my new guitar. While I eventually got it to work the accuracy was terrible so it never ended up seeing the light of the day. Try the chromatic tuner Fast forward a bit over a decade. It’s 2020 and we are…

Lap Timer and Analyser for GoPro Videos

During the past two years I’ve had the occasional pleasure of riding my motorcycles on race tracks. While I’m still far away from being fast I really enjoy working on my riding. This led me to considering different data recording and analysis solutions. A bit down the line I realized that the GoPro cameras I already owned actually contain a surprisingly good GPS unit recording data…

I made myself a noise generator

It’s been a while since the last release but I finally finished something again. Noise tends to eject me from my focus and flow and sometimes noise canceling headphones just aren’t enough to prevent it. In those instances I often mask the remaining noise with less distracting pure noise. There already are various tools for this purpose, so there isn’t really a strict need for…

Urban Astrophotography

The milkyway core over Zurich. One of the first lessons in astrophotography is that you better find a dark place, far away from the lights of civilization if you want to take good pictures of the night sky. Wouldn’t it be beautiful if it was possible to photograph the Milky Way in the middle of a city? I wanted to try. Step by Step I packed my camera onto my bike and rode into night to take…

JPEG Forensics in Forensically

In this brave new world of alternative facts the people need the tools to tell true from false. Well either that or maybe I was just playing with JPEG encoding and some of that crossed over into my little web based photo forensics tool in the form of some new tools. ;) JPEG Comments The JPEG file format contains a section for comments marked by 0xFFFE (COM). These exist in addition to the usual…

Principal Component Analysis for Photo Forensics

As mentioned earlier I have been playing around with Principal Component Analysis (PCA) for photo forensics. The results of this have now landed in my Photo Forensics Tool . In essence PCA offers a different perspective on the data which allows us to find outliers more easily. For instance colors that just don’t quite fit into the image will often be more apparent when looking at the…

Ditherlicious - 1 Bit Image Dithering

While experimenting with Black and White Conversion using PCA I also investigated dithering algorithms and played with those. I found that Stucki Dithering would yield rather pleasant results. So I created a little application for just that: Ditherlicious . Open Ditherlicious I find that it works really nicely on high key photographs like this: Photo by Tuncay (CC BY) I hope you enjoy playing with…

Black and White Conversion using PCA

I have been hacking on my photo forensics tool lately. I found a few references that suggested that performing PCA on the colors of an image might reveal interesting information hidden to the naked eye. When implementing this feature I noticed that it did a quite good job at doing black & white conversions of photos. Thinking about this it does actually make some sense, the first principal…

Smartcrop.js 1.0

I’ve just released version 1.0 of smartcrop.js . Smartcrop.js is a javascript library I wrote to perform smart image cropping, mainly for generating good thumbnails. The new version includes much better support for node.js by dropping the canvas dependency (via smartcrop-gm and smartcrop-sharp ) as well as support for face detection by providing annotations. The API has been cleaned up a…

Normalmap.js Javascript Lighting Effects

Back in 2010 I did a little experiment with normal mapping and the canvas element. The normal mapping technique makes it possible to create interactive lighting effects based on textures. Looking for an excuse to dive into computer graphics again, I created a new version of this demo. This time I used WebGL Shaders and a more advanced physically inspired material system based on publications by…

Let's encrypt 29a.ch

I migrated this website HTTPS using certificates by Let’s Encrypt . This has several benefits. The one I’m most excited about is being able to use Service Workers to provide offline support for my little apps. Let’s Encrypt is an amazing new certificate authority which allows you to install a SSL/TLS certificate automatically and for free . This means getting a certificate…

Play it Slowly

Play it Slowly is a software to play back audio files at a different speed or pitch. It does also allow you to loop over a certain part of a file. It's intended to help you learn or transcribe songs. It can also play videos thanks to gstreamer. Play it slowly is intended to be used on a GNU/Linux system like Ubuntu. Features Plays every file gstreamer does (mp3, ogg vorbis, midi, even flv!)…

Time Stretching Audio in Javascript

Seven years ago I wrote a piece of software called Play it Slowly . It allows the user to change the speed and pitch of an audio file independently. This is useful for example for practicing an instrument or doing transcriptions. Now I created a new web based version of Play it Slowly called TimeStretch Player . It’s written in Javascript and using the WebAudio API. Open TimeStretch Player…

Noise Analysis for Image Forensics

People seem to be liking Forensically . I enjoy hacking on it. So upgraded it with a new tool - noise analysis. I also updated the help page and implemented histogram equalization for the magnifier/ELA. Open the noise analysis tool Noise Analysis The basic idea behind this tool is very simple. Natural images are full of noise. When they are modified this often leaves visible traces in the noise in…

Forensically, Photo Forensics for the Web

Back in 2012 I hacked to together a little tool for performing Error Level Analysis on images. Despite being such a simple tool with, frankly, a bad UI it has been used by over 250'000 people . A few days ago I randomly stumbled across the paper Detection of Copy-Move Forgery in Digital Images by Jessica Fridrich, David Soukal, and Jan Lukáš. I wanted to see if I could do something…

Light Leaks in the Film Emulator

Inspired by the feature in the recent release of g'mic , I added a new feature to my Film Emulator , light leaks . G'mic seems to use predefined images for the light leaks. I decided to go another route and created a procedural version of it. The benefits are clear: Now big images to download, and an infinite variation of light leaks. The implementation is also rather straight forward,…

Javascript Film Emulation

I hacked together a little analog film emulation tool in Javascript. It's based on the awesome work of Pat David . I wrote it mainly to play with some new tech but I liked the result enough to share it with you. You can try it here: View the Film Emulator It also works on android phones running chrome, give it a try! How the Film Emulation works I guess the most interesting part for most…

Full-text search example using lunr.js

I did a little experiment today. I added full-text search to this website using lunr.js . Lunr is a simple full-text search engine that can run inside of a web browser using Javascript. Lunr is a bit like solr, but much smaller and not as bright , as the author Oliver beautifully puts it. With it I was able to add full text search to this site in less than an hour. That's pretty cool if you…

Source Maps with Grunt, Browserify and Mocha

If you have been using source maps in your projects you have probably also encountered that they do not work with all tools. For instance, if I run my browserify d tests with mocha I get something like this: ReferenceError: dyanmic0 is not defined at Context.<anonymous> (http://0.0.0.0:8000/test/tests.js:4342:44) at callFn (http://0.0.0.0:8000/test/mocha.js:4428:21) at timeslice…

Desktop rdiff-backup Script

Updated for Ubuntu 15.10. I have recently revamped the way I backup my desktop. In this post I document the thoughts that went into this. This is mostly for myself but you might still find it interesting. To encrypt or not to encrypt I do daily incremental backups of my desktop to an external harddrive. This drive is unencrypted. Encrypting your backups has obvious benefits - it protects your data…

smartcrop.js ken burns effect

This is an experiment that multiple people have suggested to me after I have shown them smartcrop.js . The idea is to let smartcrop pick the start and end viewports for the ken burns effect. . This could be useful to automatically create slide shows from a bunch of photos. Given that smartcrop.js is designed for a different task it does work quite well. But see for yourself . I&apos;m sure it…

Introducing smartcrop.js

Image cropping is a common task in many web applications. Usually just cutting out the center of the image works out ok. It&apos;s often a compromise and sometimes it fails miserably. Evelyn by AehoHikaruki Can we do better than that? I wanted to try. Smartcrop.js is the result of my experiments with content aware image cropping. It uses fairly simple image processing and a few rules to attempt to…

2D Wingsuit Game - first preview

I&apos;m not dead. I&apos;m working on a 2D wingsuit game based on hand drawn levels. It&apos;s going to be cool. :) What do you think?

Wild WebGL Raymarching

It&apos;s been way too long since I&apos;ve released a demo. So the time was ripe to have some fun again. This time I looked into raymarching distance fields. I&apos;ve found that I got some wild results by limiting the amount of samples taken along the rays. Demo View the demo Behind the scenes If you are interested in the details, view the source. If left it unminified for you. The interesting…

New Website

Updating this website has been long overdue. It has been running on zine , a blog system that&apos;s no longer maintained since 2009, for way too long. After looking for a replacement and not finding anything I liked I decided that it would be fun to write my own. ;) I tried hard not to break any existing content. If something is not working anymore, let me know. A few details about the system My…

Fixing bash autocomplete on ubuntu 13.04

The updated git package in ubuntu 13.04 changed the way bash completion works for git. Which resulted in the following error: completion: function `_git&apos; not found. This is because git completion is now using autoloading which does not work with aliases. The solution is to simply manually source the bash-completion function: # from my bashrc alias g=&apos;git&apos; source…

xbox360 wireless controller on Ubuntu/Steam with xboxdrv

The driver for the xbox controller built into the kernel (xpad) seems to be quite broken. Luckily there is an alternative. Here is how to set it up under Ubuntu, other Linux distributions might differ. Blacklist xpad kernel driver The first step is to blacklist the xpad kernel driver to prevent it from being loaded. # as root echo "blacklist xpad" >> /etc/modprobe.d/blacklist.conf #unload module…

WebGL Fluid Simulation

A little while ago I released a canvas based fluid simulation demo . Now I have the WebGL version ready. It&apos;s doing roughly the same thing as the canvas one. It&apos;s nicely illustrating how much faster the GPU accelerated WebGL version is compared to the canvas one . As an added benefit, it does not explode anymore because the boundary conditions are now properly enforced. Demo View WebGL…

WebGL Voxel Worlds

I have worked on this demo for quite a while. The initial plan was to do a voxel based multiplayer shooter. It didn&apos;t turn out to be all that much fun (the movement is clunky and blowing stuff up doesn&apos;t provide too much lasting entertainment). So rather than just leaving it all to rot in a dark corner on my disk I decided to just release my prototype as it is. Experiment Play with the…

HTML 5 Canvas Fluid Simulation

I started to look into fluid simulation a little while ago. It turned out that it&apos;s not quite as trivial as I had hoped. That is unless you go for the hacky way as I did back in 2010. So after getting familiar with the problem and some solutions I implemented a simple fluid simulation using the canvas element. You can find it in my sandbox . The plan for the next step is to create a WebGL…

Simplex Noise in Javascript

I extracted the simplex noise implementation of my recent voxel experiments into a simple library. You can of course find the source on github . Check out the READ ME or the npm package for more details. Simple demo

WebGL Terrain, Ocean, Fog

View Demo I&apos;m happy to finally release something new. I have been playing around with terrain rendering using webgl for quite a while now. I initially planned to release the finished result as a simple game or flight simulator. But because I&apos;m very busy learning to paraglide right now I simply don&apos;t have the time for this at the moment. Rather than releasing nothing I decided to…

Using CSS Preprocessors Effectively

Photo by Horst Gutmann I recently did a talk on css preprocessors at djangocon.eu . They did a good job at recording it so you can enjoy the talk even if you were not there. Links Video Slides Analyzing the talk The great thing about having a video is of course that I can analyze my performance. So here are my conclusions: Plus Dry mouth management went well except for the very end. Except for the…

Image Error Level Analysis with HTML5

Click here to open the tool! Image error level analysis is a technique that can help to identify manipulations to compressed (JPEG) images by detecting the distribution of error introduced after resaving the image at a specific compression rate. I stumbled across this technique in this presentation by Neal Krawetz and decided to do a quick implementation in JavaScript. How to use this tool To…

rvm on ubuntu 11.10

2012-03-02 - updated to use ruby 1.9.3 and official instead of system rvm. When trying to install ruby 1.9.2 using rvm I got a nasty suprise: ossl_ssl.c:110:1: error: &#x2018;SSLv2_method&#x2019; undeclared here ( not in a function ) ossl_ssl.c:111:1: error: &#x2018;SSLv2_server_method&#x2019; undeclared here ( not in a function ) ossl_ssl.c:112:1: error: &#x2018;SSLv2_client_method&#x2019;…

fuckNaN(), seriously

I generally like dynamic languages and in generally don&apos;t run into much trouble with them. Having that said, I hate the way undefined and NaN work in Javascript . This turns a simple typo into a NaN apocalypse. After half of your numbers have turned into NaNs it&apos;s hard to find out where they came from. var o = { y : 0 } , # NaN 1 / o ; # NaN var x = 1 / o . x ; # NaN var y = x * 10 ;…

Review: Ubuntu Linux 11.10 on Thinkpad X1

I got myself a new toy - a Thinkpad X1. I wasn&apos;t really sure whether I should get the X1 or a Macbook Air. The main reason I decided to get the Thinkpad is because I prefer Linux for coding and I actually prefer the style of the hardware. It looks like a hackers tool and not like a shiny fashion accessory, but that&apos;s of course just my taste. It&apos;s also a lot more powerful in terms of…

Swiss Address Visualization with WebGL

29a.ch/sandbox/2011/addresscloud/ As some of you know I work for local.ch . I was looking for cool visualizations to do with our data for quite a while, missing the obvious - plotting all our 3.7 million geocoded addresses in 3D using WebGL! I&apos;m actually quite impressed by the accuracy of the data. But go and have a look for your self. Controls WASD + Mouse (drag). Velocity is scaled with…

High-performance Particles on a Canvas

View Demo Some of you might remember my Chaotic Particles demo from last year. That demo was featuring 10&apos;000 particles on a plain old 2d canvas. I decided to optimize that demo a bit in order to support 100&apos;000 particles . I also fixed a little issue where numeric inaccuracy allowed particles to escape and made the influence map more fine grained. Want to see the source? Just use view…

Neonflames generative art demo

View Demo I think this is my favorite canvas demo I have created so far. It is an interactive drawing tool based on particle effects. It is the result of me trying to create some generative art using canvas. The techniques used are actually pretty similar to the ones shown in my frontendconf talk on particle systems. In short: p . vx = p . vx * 0.8 + getNoise ( p . x , p . y , 0 ) * 4 + fuzzy (…

Frontendconf 2011 talk on canvas and particles

Video Video from my talk at frontendconf on particles and html5 canvas, 100% live coding. Video on ustream Demo View Demo Sourcecode on github Note This is an experiment. It&apos;s hacky and you should not use it as an example of good style - it&apos;s not.

Uploading directly from HTML5 canvas to imgur

For an upcoming canvas project I want to give the users the ability to upload the content of the canvas to an image sharing service. When looking for a suitable API I came across imgur.com the registration was trivial, and they support CORS and base64/dataurl uploads, perfect! // trigger me onclick function share (){ try { var img = canvas . toDataURL ( &apos;image/jpeg&apos; , 0.9 ). split (…

WebGL Error Statistics for my Demo

A few days ago I released my first WebGL demo which was using some slightly advanced WebGL features. I was well aware of the fact that this would mean that my demo won&apos;t run on a lot of setups. The two features in question are texture access from vertex shaders and floating point textures . Texture access from vertex shaders is used for displacement mapping . I used floating point textures…