Random thoughts on programming
23 Aug 2016

Exponentiation Associativity and Standard Math Notation

Someone recently told me that TinyExpr (my math expression evaluation library) had several bugs, mostly related to the precedence and associativity of the exponentiation operator. It turned out that they thought that math notation was more standardized than it actually is.

I made TinyExpr to be used in a spreadsheet-like program. Therefore, I tried to make it somewhat compatible with spreadsheets. This makes for behavior that may surprise some people. For example, TinyExpr evaluates multiple exponentiation from left-to-right by default. This behaviour is clearly documented in the Readme and can be changed with a compile-time flag.

I thought it'd be nice to do a survey of common computer languages and tools and see how they handle exponentiation precedence and associativity.

Read the rest of Exponentiation Associativity and Standard Math Notation

18 Mar 2016

Genann - Neural Network Library

I've made a simple neural network library in ANSI C called Genann. I released it as open-source on github recently. You can find it here.

A primary design goal of Genann was to be both complete and minimal. I'm happy with how close I've come to that goal. Genann implements the feed-forward algorithm, backpropagation, and not much else. It's not opinionated about how you store your data or about how you do training. It is contained in just a single C source file and header file.

Genann is also very easy to use. For example, creating a network with 2 inputs, 3 hidden neurons, and 2 outputs is as easy as:

/* inputs, hidden layers, neurons per hidden layer, outputs. */
genann *ann = genann_init(2, 1, 3, 2);

Example neural network connection structure.

Read the rest of Genann - Neural Network Library

23 Feb 2016

Apple and the FBI

The FBI has gotten a court order demanding that Apple help unlock a San Bernardino shooter's work phone, an iPhone 5C.

This has been in the news everywhere for days, and I'm already sick of it, so I'm going to keep this short.

Almost everyone has read Apple's public response, but nobody I've talked to has read the actual court order itself. You're doing yourself a disservice if you don't read the actual court order for yourself. It's three pages, and it's much more precise than Apple's response or anything you'll read in the news.

From the order, we see that the government is asking Apple to do three things:

Read the rest of Apple and the FBI

11 Feb 2016

Succinct Code

I like simple things. It should be self-evident - I recently ditched WordPress for a hundred lines of PHP and flat-files. I'm much happier for it.

I used to write a lot of C++ code, but for the last several years I've completely eschewed it in favor of C. I can't ever see myself ever going back to C++, as I feel like C is a better language, and it's much easier to keep a large project nice and neat using it. C++ code has a tendency to grew crufty almost from the start. C++ has more abstractions, and although all abstracts are leaky, I think C++ lends itself to creating especially leaky abstractions. C++ makes it much easier to build yourself into a corner compared to C.

Anyway, a few days ago I witnessed an exchange on Stack Overflow that I thought was interesting. It pretty well illustrated some of the differences I find between C and C++ code. And also showcased some of the problems I have with Stack Overflow in general.

Read the rest of Succinct Code

01 Feb 2016

Ditching Wordpress

This site has been running WordPress since the beginning.

Today I moved it to my own CMS (which I will open-source one of these days). I've integrated comments using Disqus.

WordPress isn't bad per se, but it tries to do everything. That makes it extremely complex. I like simple things. Now I feel like I can really tweak the site's functionality. I think I'll be much happier going forward with my flat-file CMS.

Hopefully nothing was broken in the transfer. I think all the URLs have stayed the same and all the old comments transferred over.

21 Jan 2016

Math Expression Parsing in C

I published some code over at Github today. It's a tiny library called TinyExpr. It parses, compiles, and evaluates math expressions.

    #include "tinyexpr.h"
    #include <stdio.h>

    int main(int argc, char *argv[])
        const char *expression = "sqrt(5^2+7^2+11^2+(8-2)^2)";
        printf("Result: %f\n", te_interp(expression, 0));
        return 0;

Anyway, it's quite fast, and it has other features like variable binding. It's all implemented in one ANSI C source file with no dependencies. Check it out!

05 Nov 2015

Uploading to GitHub

I've decided to publish some of my side projects over at GitHub. Right now it's just PlusCallback (C++ callback library) and Minctest (a tiny ANSI C unit-testing framework). Hopefully this will help me keep a bit more organized, and help me publish some more code.

I'm currently working on several side projects I'd like to open source in the next several months:

  • A tiny PHP CMS
  • A simple artificial neural network library in C
  • A financial technical analysis project
  • A numerical optimization library in C
04 Mar 2015

OpenGL with C and Tcl/Tk

Tcl/Tk has been my language of choice lately for doing GUIs. I often combine this with a C back-end for some of the heavy lifting. A few times I've needed a 3D visualization in C and OpenGL, but was stuck without a good GUI. So the obvious solution was to combine C and Tcl/Tk with OpenGL.

There are a few existing solutions for combining Tcl/Tk with OpenGL (see the Tcl wiki). However, everything I've found has had some shortcoming. Almost all of these projects are old and not maintained. This can make even compiling them a huge pain. Also, I didn't really want to actually do 3D from Tcl. Tcl is great for text processing and glue logic, but it's not my favorite language for math.

It turns out there is a very easy way to combine Tcl/Tk with OpenGL and C on Windows. It involves making a frame widget in Tcl, and then passing its HWND to C to initialize the OpenGL rendering context.

#We'll use a frame control to draw our OpenGL.
set display [frame .opengl -width 800 -height 500 -background white -takefocus 1]
pack $display -fill both -expand 1

#Tell C where to put the OpenGL
SetRenderWindow [winfo id $display]

#Tell C when the window resizes
bind $display  {Resize %w %h}

Both SetRenderWindow and Resize are commands added in C. SetRenderWindow takes the HWND and creates an OpenGL rendering context. Resize uses the new size info from TCL to change the OpenGL viewport.

All of the OpenGL math and rendering is done from C. We use the Tcl_CreateTimerHandler function to create a regular callback for rendering.

This way it's easy to use OpenGL from C with a nice Tcl/Tk GUI.

Tcl/TK app showing 3d cube in OpenGL.

Here is the code: Tcl/Tk OpenGL Basic.