Jungle Coder
🦞🦞🦞🦞🦞🦞
Just added post themes! Witness The Colors, and Exult!

Color themes are out!

Color themes have been added to junglecoder.com! For now, this means that different articles can have different color themes set, to add a little flavor to things.

published Sat Nov 11

Read More...

EVA_voice: "Jungle Coder 2.0 Online"

Who?

yumaikas, aka Andrew Owen, aka me, your proprietor of all things junglecoder.com

Read More...

As the Advent is Drawn, 2021

My wife and I wanted to do a low pressure advent challenge, since creating this Snow Globe was so fun. She pulled together the challenge below. For anyone interested in following along, I’m planning on posting on #astheadventisdrawn on Twitter and Instagram.

Read More...

My Janet Story

Since Advent of Code in 2020, I’ve been doing 95% of my hobby programming in a language called Janet, which not even I woud have predicted before that. I’d just broken my “heavily multithreaded or bust” phase by using Ruby for a few things, after having been big on Nim, which I gave up because of not feeling at home in the web-development frameworks it has. Both are fine languages in their own right, but where not where my brain wanted to be. Then, I thought I’d give Janet a try during AoC 2020. I’d tried lisps in the past. (And yes, despite what the Common Lisp community has to say, Janet is a lisp, even if it’s not a Lisp), but none of them ever quite stuck for me.

As I was going through the AoC challenges, parsing came up quite a lot, but Janet didn’t have handy Regex Bindings. Instead, it had Parsing Execution Grammars (PEGs). Okay, I thought, I’ll give these a shot. And I ended up actually being able to understand and use them, even if it was a little fiddly at times. A little personal history is in order. Between the years of 2011 and 2016ish, I’d done a lot of self-directed research investingating how to build a programming language, and one of the first steps that came to mind was how to parse things. I ended up reading about a lot of different parsing mechanisms, and PEGs were among them, but the examples I’d seen where hard to follow or understand. But, for some reason, Janet’s PEGs clicked for me. Some combination of maturing as a developer, Janet’s better presentation of the PEG concenpts, or how Janet’s PEG API overlaps with parser-combinators (something else I tried, and did semi-ok at) helped things gel in my head, and I fell in love with Janet.

Read More...

PowerShell -nologo for interactive OSX shells.

The PowerShell core team has done a great job with improving PowerShell as an interactive experience, to the point that I’ve decided to use it as my interactive shell on OSX.

This will be a short article on setting up pwsh on macOS. It assumes that you have basic shell familiarity, and have homebrew installed.

Read More...

Learning without Burnout

This article is a response to the excellent question by @Nellies.

Read More...

Art Challenge: The Middle Grind

The story so far

Emily came across an art challenge on Pintrest, and suggested that we could both do each prompt for it.

Read More...

Art Challenge: First 8 days

Premise

Emily came across an art challenge on Pintrest, and suggested that we could both do each prompt for it.

Read More...

A Small Command-line Productivity Tip

I really like using the command line for automating tasks. There are some things that a GUI is handier for, but having scripts handy is a very nice place to be.

One trick I’ve started using is writing small wrapper scripts (using batch files at work) for tools like RipGrep or NUnit3-console. This makes it far easier to edit those commands, and save back examples of doing different things, especially for commands with more involved parameter lists. It makes it possible to add small things, like output delimiters between search results, or to do log actions to a file or the like. It also makes it easy to reduce the total amount of typing I have to do in a given command prompt.

Read More...

Warming up to Unit Testing

One of the things that has been a consistent part of my software career is that I often have to approach a given idea or practice at least 3 times before I start to get comfortable with it. It’s happened with managing websites, making video games (my first Ludum Dare was well beyond the 3rd time I’d tried to make a video game), programming languages (both Nim and Factor were languages I approached once, and then again with more experience under my belt), and software develoment techniques. I got a lot more comfortable with Git after I’d had a chance to use Fossil for a while.

All this to say, that I rarely pick up something completely the first time I go at it, so for any younger colleagues that might have been impressed with my mastery of regex or shell scripting, that mastery was not achieved overnight.

Read More...

Tabula Scripta: A spreadsheet for small data-driven apps

One of my hobbies of the last two years has been writing webapps. Last year, in December and part of January, I wrote an app called Gills, a journaling tool written in Go. One feature I added to it was the ability to define custom pages for Gills written in Lua. Since then, I’ve used that ability to shape Gills in a lot of different ways.

I’ve written pages that link to the cadre of webcomics I like, pages to keep a checklist of what I need to use on caters when I was working on Qdoba, pages that gave me overviews of blog post drafts, pages that keep track of notes on a backlog, and so on.

Read More...

Nim: Scripting ease in a compiled language

Edit from November 2023

The main Nim developer has gone rather mask-off fascist. Given that, I can no longer recommend Nim as a language. Below is the original article, for posterity

Read More...

What 8 years of side projects has taught me

I’ve been a professional software developer for almost 8 years now. I’ve been paid to write a lot of software in those years. Far more interesting to me has been the recurring themes that have come up in my side-projects and in the software I’ve been personally compelled to write.

Lesson 0: Programming in a void is worthless

Read More...

The Kinship of Midnight Travel

There is a strange sort of kinship that I feel for other people I see when I’m traveling from one place to another after midnight. Part of it is that travel after everyone is supposed to be in bed means that I see things without all the people around, denuded of the hustle and bustle that often gives a place it’s charm or stress.

But then, spotting that lone trucker at 1 AM, or the lady working the airline check in counter starting at 3:30 AM, or the security guard at 4:30 AM, I know that I’m with people that also know what it means to see a place without it’s crowds. They also have seen the empty streets, the fog, the sprinklers running in the night. They know what it is to wake before the sun, or to chase the hours into the night.

Read More...

Factor: An impressive stack-based language environment

Recently the Factor programming language had a new 0.98 release, after a 4 year hiatus after the 0.97 release. Finding this on lobsters, I decided to take Factor for a spin again, after years of having left it mostly alone to work on PISC. I decided I wanted to try to build a (still slightly buggy) 4-function calculator, as I find that a good way to gauge how easy/hard it is to use a GUI system for small things, and as a way to gauge what Factor is like in general.

The (quite frankly) awesome

Read More...

Two Android Tips

Two random Android related tips:

  1. If you’re developing apps on less than common Android phones via Andriod Studio, like the One Plus One (my device), then using the [ADB network bridge][adb] will save you having to figure out which set of drivers you’d need to actually be able to connect to the phone via USB. It is cautioned against if you’re on an untrusted network, and at least the One Plus One has you confirm that you want to create a debugging connection, but it does seem a bit handy.
Read More...

PISC now has a Github Mirror

A while ago, I decided to self-host the [PISC][pisc] repository using Fossil, mostly so that PISC could be easily self-hosted on hardware that I own, rather than relying on Github. Until now, this meant that to play with PISC, you had to either install fossil (which isn’t hard, but is an extra step), or content yourself to a tarball/zip file.

As of this morning, there is now a Github based [mirror repository][gh]. While I don’t intend to do my main development and documentation there, I will accept and work with issues and/or PRs there (such as I have time to do).

Read More...

My Programming Journey Part 2: Calculators led to Parsing led to Programming Languages

Every programmer has a favorite toy problem or smallish program idea that they like to use to try out new tools. For quick testing of GUI tools, mine is a 4-function calculator. This fascination started at an early age, when I was programming QBASIC at the age of 14. I wrote one in 15 lines of code that prompted for the first number, operation and second number. When I moved on to [Envelop Basic][ebasic], I created a GUI calculator with three text boxes, two inputs and one output, with a button for each of the 4 operations.

Then, as my family was traveling from Kansas to Florida in 2011, I was introduced to Petzold’s [CODE][code-book], and advised that C# would be a good language to pick up for finding jobs. One of my key discoveries working in BASIC during my teenage years was that I had to have a project in mind if I was going to get any programming really done. So I decided that to learn C#, I would build as much of a scientific calculator as I could figure out.

Read More...

Late Night Programming

I’ve decided to tackle it
It’s going to get done
Doesn’t matter if I’m fit
Or if it should be fun

Read More...

JS: DOM Attributes are lower-cased, and getAttribute is case insensitive

A short reminder for those of us writing JS without libraries:

DOM attributes are a little strange from JS. When you iterate over them using the attributes property, all the names come back completely lower cased. When you fetch them using getAttribute(name), the attribute name argument is completely case insensitive.

Read More...

Life in PNG: Moving and moving and moving

I had the opportunity to visit my parents in Papua New Guinea this summer, and it was an awesome trip. It gave me a chance to clear my head and get away from the constant stream of information and distraction that is so baked into life as an American technologist. It also gave me a chance to get a perspective on what missionary life is like.

One example of life overseas being just straight hard work is the sheer amount of moving that is involved. First, you have to pack up your entire American life. Every. Single. Thing. All your books, clothes, cars, shoes, plates, food and everything has to be dealt with in some fashion.

Read More...

Why I dislike the Java Ecosystem

I am a programming polyglot. While I work by day in C#, I have wandered far and wide in my own time. Each language and surrounding ecosystem I’ve tried has a different strengths and weaknesses*, but one stands out as disappointing to work with overall: Java.

Java, the language, is a little bit on the verbose side, and a little split-brained in how it treats primitives vs classes, but it’s very far north of tolerable, especially as generics and such have been added over the years. Java, the ecosystem, on the other hand, is a case study in making things more complicated and painful than it needs to be, especially on Windows.

Read More...

Ideas for LD36

So I had a bunch of ideas for Ludum Dare 36, as I tried to come up with an idea for each idea. As luck would have it, the theme was the one that I didn’t plan for, but these ideas could still be made to work. (Edit: I wasn’t able to finish anything for LD 36 due to life getting in the way)

Enjoy!

Read More...

Adventures in using Nginx as a reverse proxy

Lately I’ve been trying to learn how to run more than one web application on a web server. I understand this often involves using nginx as a reverse proxy. I’ve been interested in rewriting my blog in Elixir/Phoenix, but I want to keep the current blog up while I’m making the changes. So I’ve been stumbling through nginx reverse proxy tutorials. I will be taking notes into this post about various things that I’ve learned about how to set up nginx as a reverse proxy for golang applications like this blog.

Currently my config is below:

Read More...

PowerShell: Organizing Desktop Detrius into Dated Folders

I was reading an article written by a linux sysadmin about the trials of good file organization. After trying various hierarchical schemes, he settled on an interesting one: Storing files by Date, in folders. I’ve also just learned about Engineering Notebooks, where ideas are logged for a company, and dated by page.

I decided to try something similar with a pile of documents on my current laptop. Hence, the following PowerShell script, run over several file extensions typs (see *.jpg).

Read More...

Make sure you're able to run timer based services on demand

My job has had me working on service applications that run on a timed interval. One aspect of debugging these services that was slowing me down was waiting for the service to get triggered. For the longest time, I compensated by having the service be in on a 10 second timeout, since it didn’t take very long to run a sync. This still slowed me down though, and it made it easier to get sidetracked while waiting for the service to fire.

The solution didn’t strike me for a good 3 months: Add a way to trigger the service on demand. It is a very obvious solution in retrospect. And it makes a lot of difference when debugging, as I can fire off the service as much as is needed to test for different states.

Read More...

A .NET breakpoint that only breaks if a debugger is attached

This is a helpful little function that I wrote when I found out about the [System.Diagnostics.Debugger.IsAttached](https://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.isattached(v=vs.110\).aspx) property. I found it useful for debugging a synchronization service that I was working on at work.

What other little utilities like this have you made?

Read More...

Academic Portfolio

EDIT: These are rather old compared to what I’ve had time to do since.

Below are some links to some of the more interesting programs that I’ve done for school. None of these programs necessarily represents my best work, but you find might them entertaining or educational. This list will get updated as I add more of my learning-experience programs online.

Read More...

CKEditor setData failing - Documenting the Arbitrary

UPDATE:

The lead CKEditor developer responded to this blog post via a ticket.

Read More...

International Bible Day

I found out this evening that today was the International Day of the Bible. In celebration, I bring a verse and a call.

Verse

Read More...

Meta: Bugs and Suggestions

Thank you for reading my blog. This website is currently done on my spare time, often during late nights (like much software). Because of this, there’s occasional bugs and ugly pages. I’d love to know when that happens, so that your reading experience isn’t sullied by it.

If you notice a bug or horrendous UI, it’d be awesome to either create an issue on this site’s github repository, or leave a comment below.

Read More...

Counting lines of C# using Powershell

I recently wanted to see how many lines of code were in a particular C# project. Google lead me to the following article: http://www.limilabs.com/blog/source-lines-of-code-count-using-powershell

I refined that script to exclude most of the designer files that Visual Studio generates via UI tools. The results are below in a gist.

Read More...

Performance Gotchas in .Net 2 - Regex timeouts

Every programming framework has certain corner cases suck the performance out of an application. The .Net Framework is no exception. I’ve discovered a few in my work with C#, and blog about them as I find time.

I love using regex for search/replace/text manipulation tasks in programming. You don’t have to go to full perl mode for the awesomeness that is Regex.Replace("(\w+)-(\d+)", "$2-$1");. This awesomeness is counter-balanced with the risk of [catastrophic backtracking][0] when using the non-regular varieties of regex, like Perl, Javascript and, most pressing for me, .NET.

Read More...

Life as a Pedestrian: My First Few Days in Bellingham

Note: This is a piece that I wrote towards the beginning of my time in Bellingham. I plan another article soon as I am on the other side of my internship

The world is a bigger place when you have to walk everywhere. This is my profound discovery of these first few days in Bellingham. Walking is one thing that I’ve done a lot over these past few days. It gives you a different perspective on life. I’m thankful to the many drivers that have stopped for me to cross the road these past few days.

Read More...

My programming journey: Part 1 - QBasic

One of the things that I’ve been blessed with is the opportunity to start programming from a young age. What follows is the start of that story, what abstractions and tools I picked up then, and what crazy things I was trying to do with them (more than I knew what I was getting into, usually). This post covers the 12-14 year old me learning ropes of programming (as remembered 8 years hence).

The Olden times: QBasic and Boy Scout Magazines

I started in programming for the same reason as many others: I had video game ideas that I wanted to make on the computer. My father, a Bible translator, set me up with QBASIC. My textbook was a pile of Boy Scout magazines that I found in the kid’s room at the Pioneer Bible Translators offices.

I started by copying a relatively short program out that described a dog sled race. It was around 20 lines of code, but it had more going on than I could easily understand. IF statements seemed natural enough, but the FOR loop syntax was tricky to copy correctly. I was able to get it working however, and found that I understood enough to try my own ideas.

Read More...

Jules

There are stories of rubber ducky (or teddy bear) problem solving, where the only thing that a person needs to do to solve a particular problem is articulate that problem to someone else, or in this case, something else. This leads to stories of engineers being able to solve their problems by explaining them to inanimate objects. When I explained this to my family, I suggested that I might want a rubby duck for Christmas, so that I would have something to explain my programming problems to.

So it was great fun to get a rubby duck for Christmas from my sister. She added a little story to it, projecting what Jules (the rubber duck) would be doing with me as I work on my programs. (She hadn’t read the wikipedia article that I linked to.)

Read More...

Mechanical and Creative Work

I have a very active mind. As a home schooler, I read around 1000 books (of various lengths) between learning to read and graduating. I also tend to have at least one program/board game/story idea percolating in the back of my mind. I started programming so that I could build a few of those ideas.

The creative process carries a great deal of intrinsic motivation. But there is also a mechanical side to programming that can’t be escaped. The mechanical side of programming is where a program gets its polish, but it can feel a bit gritty and tiresome at points. I find that it happens when performing ports to a familiar technology, or when writing yet another simple* SQL Query (YASSQ).

Read More...

Performance gotchas in .NET: BindingList<T>

Every programming framework has certain corner cases that can drain performance when mishandled. The .Net Framework is no exception. I’ve discovered a few in my work with C#. I’ll be blogging about these as I find them.

These are not micro-optimizations like using String.Concat instead of += "" over a small string. These problems will suck the performance straight out of your application, and are inconspicuous in the code, requiring a some kind of profiling to realize what’s going on.

Read More...

The People you Play with...

My brother and I rolled dice and commanded armies, testing our strategy against the wits and armies of Kaser the Kaiser, as he like to call himself. Wars waged went back and forth over the RISK board, to the sound of much hilarity, fun, and explanation of rules. My first RISK game, colored by nostalgia and entertained by the fun nature of Mr. Kaser, seems like one of the funnest ones I've had. The people you play with have a dramatic effect on your board gaming experience.

Since then I've played RISK several times, but over time I've realized that it is a game that is fundamentally drawn out. My relish for RISK has faded with experience. I've moved on to other games that have more intrinsic fun, like Dominion, Settlers of Catan and Race for the Galaxy. These games bring better pacing, balance, and variety to family game night. But you can't escape the importance of the chemisty with your fellow gamers.

Read More...

Well Factored Code : Calling SQL

Disclaimer: None of the SQL refers to data that I use at work. They were inspired by golang's database/sql package documentation

One of the things that I've been learning as a programmer is what well factored code looks like. There are several concerns that go into it, but one very important part of well factored code is the principle of Don't Repeat Yourself (DRY). The net result of DRY is that when you only have to write the unique elements of your code, removing repetitious noise. This helps you focus on actual differences in code, instead of trying to to filter the signal out of the noise.

Read More...

About Me

Who am I?

I am a Benevolent Outsider. I grew up everywhere and nowhere. I am a young fish who can see the water of America. I have been Other, in many places I don’t belong. I welcome people with dignity, because they are human. I give the benefit of the doubt, and wish the best I can for those I encounter.

Read More...