Beyond Technically Correct
  • Entries
  • About
  • Batarim Logger
  • Wizard Scorekeeper
  • Resume
  • Wizard Scorekeeper and TypeScript

    Published on January 7, 2017

    One of my friends recently purchased the Wizard card game. We wanted a way to keep track of the score but found that existing apps were missing features like being able to undo the last set of bids or tricks input. I was interested in playing around with TypeScript so I decided to build a static web app to do it. The result can be seen at https://wizard-scorekeeper.beyondtechnicallycorrect.com and the source code is located at https://github.com/jeffcharles/wizard-scorekeeper.

  • Visitor Detector and Android Development

    Published on July 4, 2016

    I just finished working on a personal side-project to improve my Android development skills. I’ve had the opportunity to work on a few Android apps at work at Canadian Tire on the Innovations team but they were Cordova-based or otherwise using HTML for the user interface and I wanted to experience full native Android development. What has come out of my efforts is far from perfect but I have a much better grasp of the challenges and opportunities in native Android development.

  • Set NODE_ENV to reduce your JavaScript size

    Published on January 26, 2016

    With Redux’s 3.0.6 release, I learned about a new way to shrink the size of some of my webpages. A number of modern JavaScript libraries like Redux and React perform checks checking to see if process.env.NODE_ENV is equal to production in their implementations to determine whether to run code meant for development. Since this is code that is meant to running in a web browser, the comparison returns false by default. However, you can use a Browserify transform like envify or a Webpack plugin like DefinePlugin to define process.env.NODE_ENV to equal your build process’s NODE_ENV value or development by default. Setting that value to production shrunk 25% off of my total page’s size (after minification and gzipping) going from 100 kilobytes to 75 kilobytes since Webpack removes unreachable code paths.

  • Android, Kotlin, and Dagger

    Published on December 30, 2015

    I’ve recently started work on an Android side-project. As part of this work, I’m experimenting with using Kotlin as a programming language and Dagger as a dependency injection framework.

  • The Number Switcher 3000

    Published on November 8, 2015

    The Number Switcher 3000 is an application for switching how my apartment’s buzzer gets forwarded. There’s an option to forward it to my phone, my roommate’s phone, or have it automatically buzz the caller in. This blog post is a retrospective on some of the technology decisions that I made. The source code is available at https://github.com/jeffcharles/number-switcher-3000 under a 2-clause BSD license.

  • Elastic Beanstalk Deployment IAM Policy

    Published on June 8, 2015

    This is more of a reminder to myself about a good starting place for an AWS Elastic Beanstalk deployment IAM policy for something like TravisCI. This has only been tested against a single-instance environment. A load balanced one will likely require additional grants around ELBs and autoscaling groups. This assumes that you’re using an S3 bucket named after your application with a suffix of -deployments for your deployments.

  • On Apex Domains and Redirects

    Published on March 17, 2015

    I’ve recently discovered that hosting content on apex domains is generally a bad idea and it’s easy to shoot yourself in the foot attempting to redirect traffic. Apex domains are ones that are immediately below top-level domains (TLDs). For example, beyondtechnicallycorrect.com is an apex domain while www.beyondtechnicallycorrect.com is a subdomain. The reason it’s a bad idea is that apex domains are typically constrained to serving up from a static ip address while subdomains can use canonical names (CNAMES) to refer to content on another domain. Generally, you’re forced to use CNAMES to refer to content hosted by GitHub pages, Heroku, AWS Elastic Beanstalk, and a number of other services. Even if you’re not using something requiring a CNAME at the present time, using a subdomain makes it much easier to move to a service that requires it.

  • Thoughts on JavaScript

    Published on March 15, 2015

    Over the past year I’ve been working with Node.js, Angular, React, along with some other technologies. This is a post about some of my observations around JavaScript on the back-end and front-end.

  • Using Ansible with Vagrant on OS X

    Published on March 15, 2014

    This weekend I decided to switch-over a project of mine from using Vagrant’s shell provisioner to Ansible’s. For those not familiar, Vagrant is a tool that is designed to create virtual machines for developing against. Ansible is a provisioning and orchestration tool that manages deploying and configuring software on multiple machines. The set up was a little trickier than I would’ve liked.

  • Installing OpenWRT on my TP-Link WDR3600 Router

    Published on February 9, 2014

    Recently I invested in a new router, a TP-Link WDR3600. Some of the reviews on Newegg indicated that the vendor firmware’s reliability could be flakey. It’s not surprising considering that it’s rare to find a company that creates decent software, let alone both hardware and software. Luckily, there’s a few alternatives available for open source firmware for routers. Popular options include DD-WRT, OpenWRT, and Tomato. I decided to go with OpenWRT since some people indicated that they’ve had luck with it running on WDR3600.

  • Better responses for invalid JSON given Ring's wrap-json-body parse issues

    Published on May 26, 2013

    As a user of Ring’s wrap-json-body middleware, I’ve had an issue where I send up invalid JSON and receive a 500 status code since an exception is thrown server-side. This is less than ideal since it seems to indicate that the problem is server-side rather than client side. As a quick, hopefully temporary fix, I’ve written some middleware to wrap it with some exception handling to return a 400 status code with helpful response body.

  • Using the Raspberry Pi as a wireless network bridge for the XBox 360

    Published on April 20, 2013

    Today I successfully set up my Raspberry Pi as a network bridge for my XBox 360. That is to say, my XBox 360 connects to my Pi using Ethernet and accesses the Internet through my Pi’s wireless adaptor.

  • Loading and using namespaces in the Clojure REPL

    Published on April 14, 2013

    Here’s a handy little guide to using your Clojure namespaces in the REPL because it is not immediately obvious how to do this (or at least it was not for me). This assumes you’re in the repl started by running lein repl in your project root. First, you need to load the namespace using the load function passing it the namespace but as a string and as it would look as a file path without the filename extension (i.e., underscores instead of dashes, slashes instead of dots). Second, you can switch to the namespace by using the in-ns function and passing it a quoted namespace as an argument.

  • Learning Clojure

    Published on March 9, 2013

    A few months ago I decided to try to learn Clojure. Clojure is a dynamically-typed functional language using LISP-syntax with compilers available for the JVM (Java Virtual Machine), CLR (Common Language Runtime), and JavaScript. I’ve gained an appreciation for the language but still have a lot more learning to do before I am proficient in it or other functional languages like Haskell or Scala.

  • Scala Impressions

    Published on October 15, 2012

    Recently I’ve been playing around with version 2.9.2 of the Scala programming language. I used it at work for some basic XML manipulation and at home for a graphical HTTP client. I am happy with the language but have mixed feelings about its standard library and ecosystem.

  • Beautiful Haskell: Transposing a List

    Published on March 21, 2012

    Recently I’ve been reading Real World Haskell to improve my functional programming skills and learn Haskell. One thing that really appeals to me about a programming language is how well it encourages elegant solutions for a given problem and so far Haskell has been excellent at encouraging elegant solutions for the exercises I’ve attempted.

  • Fun with Java and Pong

    Published on March 16, 2012

    The last little while I’ve been working on a side project to develop my own implementation of Pong. I just finished recently and thought I’d blog about some of my experiences while developing it. If you’re interested in seeing source code, it’s located here under a BSD license.

  • How to Enable Filesharing between Linux Mint 11 and Windows

    Published on May 31, 2011

    This post will be rather short and to the point. For whatever reason, out of the box, Linux Mint 11’s public folders in each user’s home folder are not accessible to Windows clients and the process to make them accessible is easy enough but not obvious. The first step is to enable WebDAV by installing some Apache packages. The second step is to enable file sharing on the public folder. The final step is to enable execute permissions for everyone on your home folder.

  • Brief thoughts on new possible projects

    Published on April 29, 2011

    Every once in a while I try to think of new possible personal projects that would be cool to work on. Typically these are user-facing applications or subtle improvements to existing applications. I think it helps to communicate these ideas and see if any helpful readers have any feedback.

  • Comparing Bond Duration Functions in C, Python, and Haskell

    Published on April 25, 2011

    Lately I’ve been studying for a Working Capital Management exam coming up on Wednesday, April 25th. As you can probably guess, the subject matter can be dry at times so I’ve tried to come up with something productive to do during study breaks. Since it’s been a few weeks since I’ve coded something I decided to see how implementing a bond duration calculation would compare between C, Python, and Haskell.

  • Destructive Actions and User Interfaces

    Published on March 1, 2011

    I think recognizing when you make a mistake and being able to learn from it is an essential part of being a professional in any field.

  • Generating PostgreSQL Database Diagrams with postgresql_autodoc

    Published on January 18, 2011

    The following series of commands will allow you to generate a png file with a database diagram. This post assumes you are using Ubuntu Linux 10.10 or a derivative distribution. If you are not, you may need to adjust the installation command and name of the package for your distribution.

  • Lessons Learned from Developing a Django Commenting System

    Published on December 18, 2010

    Over the last few months, I’ve been developing a new commenting system for Open Source at Laurier. While Django’s commenting system does offer a lot, I felt that we needed more functionality.