Micro: The Crow rewrite

I am currently rewriting the core of the Crow lisp language I made. I wrote the language originally over a year ago, I tried to create a hybrid between Lisp and JavaScript, however as time went on, I slowly realized that this hybrid approach was just doing both languages badly. I have recently decided to realign Crow with Scheme, the Lisp dialect I prefer, while taking aspects of Common Lisp that I prefer to Scheme. This new core is not ready to be built or used, but it is gradually being worked on over at the Crow GitHub under the “core-rewrite” branch. If you were wondering why my site has been so quiet over the past few months… this is why…

Posted in Micro Posts | Tagged , | Leave a comment

Software I Use (And Recommend)

This started as a page for my website, but gradually grew in scope to the point where I think this deserves a blog post dedicated to it. I may also make a page for it on my site, but much more condensed with the true explanations here.

Here is a list of programs I use on a daily basis. I mostly am providing this because I have been asked before questions like “What browser is the best?” or “What IDE would you recommend for X language”, so lets compile it all into a list, shall we.

Before we begin, when it comes to software, I have changed what I look for over the years. Back in 2016, I used to be a software minimalist. Going so far as to use almost every application from the terminal if possible. Over time I found that this wasn’t sustainable for me (or really anyone who gets work done) and have gradually moved to more and more normal looking applications. Now, I generally try to use FOSS software, however I even have been slipping on that. Generally I like software that is native to my platform of choice, so I will be splitting this up by platform. I also look for software that is light weight, or at least isn’t extremely bloated for what it is, and also for software that does the job I need it to do.

Operating System

Generally my advice to other people here is to use whatever feels best to you, but here is what I use and recommend if you can’t make up your mind. Do note that I come from a perspective of someone who programs for a living, and not just that, but works on the lowest level of an operating system, so my opinions on systems will be very much biased towards features that most users probably won’t care about.

For Linux distributions, I generally recommend Debian and Ubuntu, they are both remarkably stable and I have used them for years, having started on Ubuntu in 2011 and moved to Debian for my first full-time foray into Linux in around 2015. Both have served me well for the time that I have used them. As for Linux in general, I highly recommend it for everyone, regardless of computer skill. I think Linux has become easy enough to use for the layperson, and offers a much better alternative to Microsoft Windows.

As for the OS I am currently using, I have been using MacOS for almost a year now. Since the M1 Macs have bad support for Linux as of writing this, I have been stuck on MacOS, and to be completely honest, its kinda nice. MacOS is definitely UNIX like, and pretty faithful at that being based on BSD. I have found absolutely no issue porting my workflow over to MacOS other than the issue with some packages not being available for ARM64. I’m looking at you Valgrind. To be completely honest though, I see MacOS get a lot of hate from people in the programming community and I struggle to see why. MacOS is basically just a Linux (or BSD more like, but still) distro from a corporation at the end of the day. It works fine for what I need and does the job swiftly.

I generally don’t advise using Windows since I personally have grown to hate their Win32 API, as well as their developer tools. In my opinion, Windows is a product of a bygone era, one which still clings to life thanks to business and enterprise. In my opinion as well, there has never been a ‘good’ release of windows, maybe bar the first few which were impressive for their times. While I have used Windows for a majority of my life, and do have to admit I have nostalgia for it, I can’t recommend it for use in programming. I eventually will write a blog post about how bad the Win32 API is, and especially how bad the Windows POSIX layer is.

Web Browser

Lets move from Operating System to Operating System (but this time for the web).

Now adays we have very little choice in the web browser market, basically just three engines: Blink, WebKit, and Gecko. I do actively use all three of these browser engines however, mostly just to see how different they all are, but even still I do have a few favorites (and a few ones you should avoid at all costs).

For the browser I use daily, Firefox. I have used Firefox pretty much daily since around 2015, if not earlier. I have always liked Firefox since for a while, it was the only browser that Linux could truly call its own. While Chromium did exist on the platform, dubious open source violations, as well as a confusing relation with the system theming caused it to look completely out of place among the other free software on the system. Firefox has and will probably always be the FOSS browser of choice, despite having its own FOSS violations. Apart from that, despite taking a hit with the XULpocalypse, Firefox addons continue to be more powerful than Chrome extensions in my experience, and Firefox seems to have a much better, albeit smaller community.

As for Blink based browsers, I have to give the recommendation to Chromium and/or Brave. I barely use Blink based browsers, other than to load pages which Firefox cannot, or to log into Google apps. Chromium, being the open source version of Chrome (I generally recommend Chromium with the Ungoogled Chromium patch set applied, however stock Chromium is still pretty good), it does the job wonderfully for browsing the web. Brave is a little weird. While I want to like it, I can’t actually push myself to use it. It is simply a Chromium reskin, with a lot of Crypto integration sprinkled on top. I do not trade in crypto, nor do I use it in any capacity, so most of what makes Brave unique is completely lost on me. Likewise, Brave is a little annoying with how bloated it is becoming, with the integration of many extensions into the browser core itself. Every time I boot up Brave, which is generally not often, I am barraged with popups asking me if I want to enable or disable this new feature, along with sometimes multiple new icons appearing on the toolbar. However despite all of this, Brave is an amazing browser in terms of speed and privacy. I highly recommend it as probably one of the better Chromium based browsers if you don’t want to use Firefox. And it is the browser I use and recommend for iOS as well.

As for WebKit, there aren’t many options, and in general I don’t recommend them at all other than for testing. While Safari is cool, many modern websites won’t work with it, and likewise it is completely proprietary, although the web engine that powers it is not. Epiphany (gnome-web) is also nice, but suffers from a horrible rendering pipeline which causes the simple act of scrolling to be incredibly laggy, despite the browser actually loading and rendering pages extremely fast compared to other browsers. If you absolutely have to use WebKit, just use which ever browser is most compatible on your system. Oh, and do NOT use QtWebKit, it has been abandoned for years.

As an honorable mention, Pale Moon, which is based on a fork of Gecko called Goanna. Pale Moon is an awesome browser for if you need light-weight and powerful. Pale Moon was forked from Firefox before the XULpocalypse, so it retains the classic XUL extensions and platform, giving much more freedom to the user. However sadly Pale Moon has struggled to keep up with the ever changing web landscape, meaning many sites are completely broken in it. Despite this, development continues on, and just recently, full support for Google WebComponents was added, making it much more compatible with the web as a whole. I’d say check it out, but you probably won’t do much with it.

Text Editor / IDE

Emacs. Done.

Well seriously, I mostly only use Emacs for its Lisp interpreter, but it is still fun to say that’s all I use.

As for the Text Editor / IDE debate, I generally say use an IDE where it makes things more convenient, for example when working with Java or C, but a text editor when nothing really matters, for example with HTML or JavaScript.

For IDEs, I have to recommend XCode if you use MacOS. XCode is really light weight and fast in my experience. It works well too with llvm. That’s about all I can say however. I haven’t used it for much more than compiler development.

For text editors, I recommend Geany on Linux. Geany is amazing if you use Gnome or a GTK desktop. Geany works with many languages, and even integrates nicely with GNU Make. Geany however is terrible on MacOS and Windows just because GTK is not great on other platforms, and better alternatives exist.

For Windows, I recommend Notepad++. While I haven’t written code in Notepad++ is well over 5 years, I remember it being nice.

Otherwise for cross platform, use VSCodium. Its a fork of VSCode that removes some telemetry and other proprietary components. Its pretty good all things considered.

Compilers and Programming Languages

For C, gcc or clang are fairly similar, I use them interchangably. They are both amazing.

For Java, OpenJDK.

For Lisp, Scheme, particularly Guile. Racket is nice too.

Generally I program mostly in C, but for scripts and other small projects, I’m known to work in Ruby and Lisp. Most of my web apps are written in JavaScript as well, although I haven’t written one of those in a while.

Instant Messengers / Chat

For IRC, Limechat on MacOS, HexChat on Windows and Linux.

For Telegram, just use the official client.

For XMPP, Dino.

Generally I recommend IRC and XMPP for people, but I have found myself unable to leave Telegram just because of history with the platform. Telegram is horrible and people should not use it. Signal is also a nice alternative, although a bit more limited.

Media Player

VLC or MPV, depends on the type of media.

Games

I don’t really play games anymore. Just put this here to say avoid steam like the plague. Use GOG.com wherever you can.

To be continued…

If you can’t tell by how short these paragraphs are becoming, I really don’t have much to say about much other software besides the ones I talked about so far. Expect this list to be updated when I find other software I need to talk about, or maybe another blog post made about it.

Posted in Misc | Tagged | Leave a comment

Micro: Just an update

Holy crap, this has been a busy year, and we aren’t even half way through it. I have been here even though I haven’t made a single post since new years (sorry). So where has the time gone? Let’s talk about it…

First of all, Crow is progressing well. In fact crow is now much more fully featured than when I last talked about it, and steadily improving. Many of the hack-jobs like the variable system have steadily been replaced by much more robust systems like the closure system. These systems have given way to a multitude of features like lambdas. Next big project to tackle is overhauling the horrible garbage collector which has pretty much remained unchanged from the beginning. Documentation is also steadily being produced, hopefully by the end of the month, crow will be fully documented, and have a fully featured tutorial!

On a side note, I have also been working with Linux kernel development in my spare time. Mostly to create a project I’m calling CrowOS which would basically be an entirely different kernel, just basing on Linux for driver support. In doing so I have learned many things about how the kernel works, how to build a truly minimal one, and even how to develop and hack on kernel modules. I want to make a kernel module development series on this blog since kmod development isn’t very easily documented in tutorial form, probably for good reason, but I want to change that :).

Anyway, keep a close watch on both this blog and the Crow project, I will hopefully be back to posting more regularly soon.

Posted in Micro Posts | Tagged , , | Leave a comment

Micro: First!

So uh… This is the first post of the year I guess. I’m making it my goal to write a lot more this year, and probably add more interesting stuff to my website. Already I got my website working with a generator I wrote, so adding to my site is now easier than ever, and updating it is just as easy. As well as that, I have backed up the entire html directory and will begin pruning old services nobody uses in order to not only save space, but make everything more manageable.

Basically this is the year of cleaning up and streamlining.

Posted in Meta Posts, Micro Posts | Tagged | Leave a comment

Making a parser generator doesn’t have to be hard.

I’m inspired to write this because of Russ Cox’ regular expression blogpost, which follows a similar format, although I’m not about to compare my implementation to others.

Recently, I decided to create a project called CCC, or Collin’s Compiler Creator, mostly because I want to use parser generators, but feel disingenuous if I were to use an existing one like Bison or YACC. I have the same problem as John Carmack, if I didn’t write all of the code, I don’t feel like I wrote any of the code. But aside from that, I embarked on making a parser generator… and finished in the same night, and in this post we will make another.

Before we begin, the complete code can be downloaded here.

Step 0: How does a parser generator work?

A parser generator simply takes in a list of tokens to parse for, and outputs code to do the actual parsing. The generator itself only outputs the code to be used, so effectively no matter what language you choose to write it in, it is an ahead of time operation. Why would this be useful? Well, I invite you to check out the source code for Blæst, which I wrote my own parser for without the use of a parser generator. To put it lightly, that parser is a mess of spaghetti code wrapped in duct tape and glue. It is horribly inefficient, and filled with bugs. And aside from all of that is horrible to look at, and even worse to add new features to. Now compare that to a parser generator, I could’ve generated those almost 1,000 lines by just feeding it an array of tokens to look for, and when it finds them, just have it return a number corresponding to the token it found. And apart from that, rather than have each token use its own string compare (something this is slow and inefficient), it could combine them, since it knows what strings to compare ahead of this. This approach makes the code much more easy to maintain, and also makes everything easier to upgrade and even port to different languages.

Step 1: Lets get a list of tokens

For this tutorial I will use Javascript. I personally like Javascript because it is fairly similar to languages like C++ or Java, which most people will be familiar with, and if you aren’t, Javascript itself is probably familair to you. I have rarely met someone who can’t at least read Javascript. If you have a problem with this, check out the Github for CCC, its written entirely in… well… C.

The first thing we need to do is get a list of tokens. For this I’ll just create an array that is already populated, you can get these values however you wish, maybe making inputs on a website or via the command line or whatever. But the array should look something like this once you’re done.

// Our list of tokens
var tokens = ["Hello", "Hi", "Goodbye", "Good", "World", "Wordlist"];

I have chosen these specific words because when we construct trees for making the branching parser, they are going to come in handy for demonstrating how we can reuse branches.

Step 2: Create the trees

Now we need to create our actual parser tree. A parser tree is the sequence of letters needed to make the word. We call it a tree because it can branch. For example, both “Hello” and “Hi” start with “H”, so our “H” branch then branches off into an “e” and an “i” branch. This allows our parser to effectively string compare anything that starts with “H” together. For reference, standard string compares go through entire strings in one pass, it would string compare our input to “Hello” by comparing each letter of our input to “Hello”, which takes time. Then it would do the same with “Hi”. Both “Hello” and “Hi” start with an “H”, so if our input doesn’t start with an “H”, we can be assured it isn’t either “Hello” or “Hi”, so we don’t waste our time.

Creating these branches is actually quite easy. We simply walk through our word, creating branches for points we don’t already have. First we need to go through every token, then create a list of “next letters” for each current letter. If that “next letter” is the next letter of our word, just go to it and repeat. If not we add it and go from there.

// We need to create a 'state' which holds the possible next letters, and a state for those as well
var initialState = {
        id: 0,
        next: []
};

// Keep track of how many states we have made for code generation later
var stateCounter = 0;

// Loop through our tokens
for(let i = 0; i < tokens.length; i++){
  
  // Our current token we are checking
  let currentToken = tokens[i];
  
  console.log("Current token: " + currentToken);
  
  // Reset to the initial state since we are on a new token
  let currentState = initialState;
  
  // Now loop through every letter in our token
  letterLoop: for(let j = 0; j < currentToken.length; j++){
    
    // Our current token letter
    let currentLetter = currentToken.at(j);
    
    // Go through every possible next letter
    for(let k = 0; k < currentState.next.length; k++){
      
      let possibleNextLetter = currentState.next[k];
      // If the possible next letter is our current letter, we follow it
      if(possibleNextLetter.letter == currentLetter){
        
        console.log("Found branch for: " + currentLetter);
        
        // Set the new current state to the branch we are following
        currentState = possibleNextLetter.state;
        
        // Go back to the letter loop
        continue letterLoop;
      }
    }
    
    console.log("Adding " + currentLetter);

    // If we get down here, its because we couldn't find a branch, so we need to add one
    currentState.next.push({
      letter: currentLetter,
      state: {
        id: ++stateCounter,
        next: []
      }
    });
    // Now set our state to the new state we made
    currentState = currentState.next.at(-1).state;
    console.log("ID: " + currentState.id);
  }
  
  console.log("Adding end of word marker");
  
  // Add our end of word marker, this contains the token number we return
  currentState.next.push({
    letter: 0,
    state: {
        id: ++stateCounter,
        next: []
    },
    token: i + 1
  });
}

Now we should have a tree of every possible letter combination, if it were drawn out it should look something like this:

   [Start]
   /  |  \
  H   G   W
 /|   |   |
i e   o   o
| |   |   |
$ l   o   r
  |   |   |\
  l   d   l d
  |  /|   | |
  o $ b   d l
  |   |   | |
  $   y   $ i
      |     |
      e     s
      |     |
      $     t
            |
            $

Where $ is an end of token marker.

Step 3: Code generation

This is easily the hardest part, because it takes the most thinking, turning our states into code. Almost every parser generator I’ve seen uses a state machine for parsing, and lucky for us, they are very easy to implement. A basic state machine looks like this:

var state = 0;
switch(state){
  case 0:
    state = 1;
    break;
  case 1:
    state = 0;
    break;
  default:
    state = 1;
    break;
}

We just need to make our state machine slightly more useful than this one.

First we need to come up with our states… wait… we made those already. The state numbers in the case are just the state IDs we just made. So then to set the next state we just need to check for the letters… wait… we did that too. So we literally just loop through every state we generated and output the information. How easy is that!?

The generator may look complicated, but thats just because its not very clean looking. Just read through it and you’ll see it s simply just outputting switch/case statements.

console.log("BELOW IS THE GENERATED PARSER CODE");

// Print the head to our function

// function parse(token){
//   let i = 0;
//   let state = 0;
//   switch(state){
console.log("function parse(token){");
console.log("\tlet i = 0;");
console.log("\tlet state = 0;");
console.log("\twhile(true){");
console.log("\t\tswitch(state){");

// Now go though each state and print out the imporant bits
// To do this I'll simply create a recursive function.

function printState(state){
 
  // Print our case
  console.log("\t\t\tcase " + state.id + ":");

  // Make our case for the next letter
  console.log("\t\t\t\tswitch(token.at(i)){");
  
  // And our conditions
  for(let i = 0; i < state.next.length; i++){

    let condition = state.next[i];

    // If our letter is 0, we are at the end of the string, in Javascript, the string.at should return undefined at the end, so we check for that
    if(condition.letter == 0){
     // If we are actually at the end of the string, return our token number
     console.log("\t\t\t\t\tcase undefined: return " + condition.token + ";");
    }
    else{
      // Otherwise make it so we go to the next state

      // case 'nextLetter':
      //   i++;
      //   state = nextStateId;
      //   break;
      console.log("\t\t\t\t\tcase '" + condition.letter + "':");
      console.log("\t\t\t\t\t\ti++;");
      console.log("\t\t\t\t\t\tstate = " + condition.state.id + ";");
      console.log("\t\t\t\t\t\tbreak;");
    }
  }
  // Make sure if we can't branch anymore, we return 0 so we don't hit an infinite loop
  
  // defualt: reutrn 0;
  console.log("\t\t\t\t\tdefault: return 0;");

  // And finally just close up the switch/case and this current case for the state machine.
  console.log("\t\t\t\t}");
  console.log("\t\t\tbreak;");
  
  // Now go through every next state and print it out again
  for(let i = 0; i < state.next.length; i++){
    // recursion is fun
    // recursion is fun
    // recursion is fun
    // recursion is fun
    printState(state.next[i].state);
  }
}

// Call the function on the initial state and it should go through everything 
printState(initialState);

// Now finish up the function
console.log("\t\t}");
console.log("\t}");
console.log("}");

// Now everything is done

And with that, concludes our parser generator. Now this generator is not the best. For example, if the token doesn’t start at the beginning of the line, for example “gHello”, it will not match it. It will also only match full words, so “Helloworld” will not match for “Hello”. Its also case sensitive.

Running the program will output a function ‘parse’ in the console. The basic usage of this is as follows. parse(string to parse). It will return a number, 0 if it did not match, or a number 1 to … if it did. and n corresponds to the array position of the token + 1. For example, in this example, “Hello” returns 1 because it is the first element in the array.

The output of the example run here should look something like this:

Current token: Hello
Adding H
ID: 1
Adding e
ID: 2
Adding l
ID: 3
Adding l
ID: 4
Adding o
ID: 5
Adding end of word marker
Current token: Hi
Found branch for: H
Adding i
ID: 7
Adding end of word marker
Current token: Goodbye
Adding G
ID: 9
Adding o
ID: 10
Adding o
ID: 11
Adding d
ID: 12
Adding b
ID: 13
Adding y
ID: 14
Adding e
ID: 15
Adding end of word marker
Current token: Good
Found branch for: G
Found branch for: o
Found branch for: o
Found branch for: d
Adding end of word marker
Current token: World
Adding W
ID: 18
Adding o
ID: 19
Adding r
ID: 20
Adding l
ID: 21
Adding d
ID: 22
Adding end of word marker
Current token: Wordlist
Found branch for: W
Found branch for: o
Found branch for: r
Adding d
ID: 24
Adding l
ID: 25
Adding i
ID: 26
Adding s
ID: 27
Adding t
ID: 28
Adding end of word marker
BELOW IS THE GENERATED PARSER CODE
function parse(token){
	let i = 0;
	let state = 0;
	while(true){
		switch(state){
			case 0:
				switch(token.at(i)){
					case 'H':
						i++;
						state = 1;
						break;
					case 'G':
						i++;
						state = 9;
						break;
					case 'W':
						i++;
						state = 18;
						break;
					default: return 0;
				}
			break;
			case 1:
				switch(token.at(i)){
					case 'e':
						i++;
						state = 2;
						break;
					case 'i':
						i++;
						state = 7;
						break;
					default: return 0;
				}
			break;
			case 2:
				switch(token.at(i)){
					case 'l':
						i++;
						state = 3;
						break;
					default: return 0;
				}
			break;
			case 3:
				switch(token.at(i)){
					case 'l':
						i++;
						state = 4;
						break;
					default: return 0;
				}
			break;
			case 4:
				switch(token.at(i)){
					case 'o':
						i++;
						state = 5;
						break;
					default: return 0;
				}
			break;
			case 5:
				switch(token.at(i)){
					case undefined: return 1;
					default: return 0;
				}
			break;
			case 6:
				switch(token.at(i)){
					default: return 0;
				}
			break;
			case 7:
				switch(token.at(i)){
					case undefined: return 2;
					default: return 0;
				}
			break;
			case 8:
				switch(token.at(i)){
					default: return 0;
				}
			break;
			case 9:
				switch(token.at(i)){
					case 'o':
						i++;
						state = 10;
						break;
					default: return 0;
				}
			break;
			case 10:
				switch(token.at(i)){
					case 'o':
						i++;
						state = 11;
						break;
					default: return 0;
				}
			break;
			case 11:
				switch(token.at(i)){
					case 'd':
						i++;
						state = 12;
						break;
					default: return 0;
				}
			break;
			case 12:
				switch(token.at(i)){
					case 'b':
						i++;
						state = 13;
						break;
					case undefined: return 4;
					default: return 0;
				}
			break;
			case 13:
				switch(token.at(i)){
					case 'y':
						i++;
						state = 14;
						break;
					default: return 0;
				}
			break;
			case 14:
				switch(token.at(i)){
					case 'e':
						i++;
						state = 15;
						break;
					default: return 0;
				}
			break;
			case 15:
				switch(token.at(i)){
					case undefined: return 3;
					default: return 0;
				}
			break;
			case 16:
				switch(token.at(i)){
					default: return 0;
				}
			break;
			case 17:
				switch(token.at(i)){
					default: return 0;
				}
			break;
			case 18:
				switch(token.at(i)){
					case 'o':
						i++;
						state = 19;
						break;
					default: return 0;
				}
			break;
			case 19:
				switch(token.at(i)){
					case 'r':
						i++;
						state = 20;
						break;
					default: return 0;
				}
			break;
			case 20:
				switch(token.at(i)){
					case 'l':
						i++;
						state = 21;
						break;
					case 'd':
						i++;
						state = 24;
						break;
					default: return 0;
				}
			break;
			case 21:
				switch(token.at(i)){
					case 'd':
						i++;
						state = 22;
						break;
					default: return 0;
				}
			break;
			case 22:
				switch(token.at(i)){
					case undefined: return 5;
					default: return 0;
				}
			break;
			case 23:
				switch(token.at(i)){
					default: return 0;
				}
			break;
			case 24:
				switch(token.at(i)){
					case 'l':
						i++;
						state = 25;
						break;
					default: return 0;
				}
			break;
			case 25:
				switch(token.at(i)){
					case 'i':
						i++;
						state = 26;
						break;
					default: return 0;
				}
			break;
			case 26:
				switch(token.at(i)){
					case 's':
						i++;
						state = 27;
						break;
					default: return 0;
				}
			break;
			case 27:
				switch(token.at(i)){
					case 't':
						i++;
						state = 28;
						break;
					default: return 0;
				}
			break;
			case 28:
				switch(token.at(i)){
					case undefined: return 6;
					default: return 0;
				}
			break;
			case 29:
				switch(token.at(i)){
					default: return 0;
				}
			break;
		}
	}
}

With all that, I hope you enjoyed learning the joy of creating a parser generator. Overall this only took me a few hours to write, and it was quite fun to do so, so I really recommend doing it. I have uploaded a gist of the complete code for this parser, so use that for whatever you want.

Posted in Programming | Tagged , , , | 1 Comment

Micro: Brave or Ungoogled Chromium

Recently I was thinking to myself, should I be recommending people Brave browser or Ungoogled Chromium. Myself, I use Firefox, however I acknowledge that most people probably want to stick with Chromium based browsers just because they are familiar, and if they are moving from Chrome, the experience should be more or less the same. That being said however, which Chromium based browser is the one to recommend. Personally, I have been and still recommend Brave just because it is a more complete out of the box experience. While I don’t (and probably never will) fully trust Brave, I can’t deny that their browser is leagues more private than Google’s Chrome. Brave also has out of the box support for extensions and widevine DRM, so you can effectively use Brave as a drop in replacement for Chrome. On the other hand there is Ungoogled Chromium. Ungoogled Chromium is literally the most private browser possible. It is Chromium with all the google forcefully removed, but because of this, it lacks many features like the webstore or widevine. While Brave lets you disable these features, they flat out come disabled on Ungoogled Chromium, and to enable them is a process. As well, the main killer for me to recommending Ungoogled Chromium is its lack of a search engine by default. I have no idea why they chose to make it “No Search” by default, but the majority of people will just load up a browser and expect it to be able to search out of the box. And how would they be able to search to figure out how to set the search engine? To be honest, Ungoogled Chromium is still probably the better browser in terms of privacy, but Brave is what I have to recommend because of its out of the box usability. Expect a blog post in the future about me grappling with being a Firefox user and explaining why Chromium is better in every way…

Posted in Micro Posts | Tagged | 1 Comment

Micro: Nano is an almost perfect text editor

Over the past few weeks, I’ve found myself switching away from Microsoft Word and Google Docs for taking notes, and moving to the humble text file. I now take notes in Microsoft Notepad/Wordpad and my notes take up half the size and use half the ram to view, and contain the same amount of information. Personally I think Notepad is the perfect text editor for well… editing text. It does its job, little extra, and it does it very well. Wordpad is for when you need things like embedded images, or anything plain text cant handle, so a rich text file is used. Wordpad is more like diet word, but still manages to be lighter weight. Personally I think both editors are great in their own regards, but notepad is literally perfect for its job. Now what about other operating systems… MacOS has TextEdit which is more akin to Wordpad, so I have a hard time counting it as a replacement for Notepad, and Linux has a bunch. The common problem between both MacOS and Linux text editors however is they all seem to do way too much. Now ever since the software minimalism crowd has invaded the text editor space, text editors have slowly become less about editing text, and more for editing code. In my text editor for taking notes, I don’t need syntax highlighting and line numbers, especially if those come at the cost of performance, and I sure as hell don’t need whatever emacs is doing. In my travels for the notepad of Unix however, I have stumbled upon my old friend, nano. Nano is almost perfect in my eyes. It is small, starts up instant, and does its job. There is little extra. While it does support syntax highlighting and line numbers, these do not seem to impact it negatively, and come disabled. Another runner up would be vi (not vim). Anyway, if any of you have a suggestion to add to my search, feel free to drop it below. Please nothing more complicated than Notepad however, I don’t want to be taking notes in vscode.

Posted in Micro Posts | Tagged | Leave a comment

Micro: I want dedicated phones to make a comeback (and you should too)

Recently I bought a Western Electric model 2500MMG from an antique store here in Boston. I had always wanted one for decoration since they are THE phone that people think of when they think of a phone, they are iconic. However other than that, I was not looking to use it. To my amazement, I found they are fully able to be hooked up to a POTS (plain old telephone system) line and work fine in the modern age. Problem is, nobody has a landline anymore, and paying for one is too damn expensive, my apartment doesn’t even have phone lines run to it. However, the fact that this literally indestructible behemoth from 1970 can still work on modern phone lines (granted you have one), but my iPhone 4, literally less than half the age of that other phone, cannot connect to cellular anymore because “3G is too outdated” is absolutely astounding to me. I understand getting rid of old technology when its cost starts outweighing the benefits of keeping it around, but that seems a little excessive, a phone bought around 10 years ago is now completely useless, meanwhile a phone from 50 years ago works fine. Dedicated phones (or a phone protocol) need to make a comeback, just so we can standardize on a system to make calls that isn’t ever evolving. Realistically if I want good sound I would use the internet. I propose bringing back something like 2G which reaches far and wide, and having it be just for calls and SMS, meanwhile data would be carried over 4G, 5G, LTE, or what not. Doing this would allow for older phones to stay connected as… well… phones, while making people have to upgrade if they want the new speedy data stuff. But hey, that’s just my opinion.

Here is an incredibly low quality picture of the phone I just bought
Posted in Micro Posts | Tagged | 1 Comment

My review of every song from Animusic 1

I was going to originally review both Animusic 1 and Animusic 2, but I am way too busy (not to mention separated from my animusic discs, and I refuse to watch the YouTube rips), so I will have to post what I have so far. A complete review and ranking of every song in Animusic 1, a whole month in the making, then delayed for about a month because of moving, then I got lazy… So here it is. Expect Animusic 2 reviews and rankings to come probably around winter, and maybe a full review and ranking comprising both discs around that time as well.

In case you aren’t familiar with Animusic, Animusic is a digital album created by Wayne Lytle and David Crognale. It was designed to be the first of its kind, a full album where every “music video” was computer animated. Animusic 1 came out in 2001 to much critical acclaim. It was heralded for its use of computer visuals and distinct MIDI style of song. Animusic 2 would follow in 2005, completing Animusic for now, as Animusic 3 has yet to be released. If you haven’t I would recommend looking into the commentary tracks for Animusic 1 and 2, as they provide the most information about the creation and reception of Animusic, and they are a great way to spend an afternoon. So without further ado, here’s a review of every song from Animusic 1.

Track 1: Future Retro

Future retro is the first song on the first disk of Animusic, so its the first experience you get to animusic granted you haven’t seen any of the viral clips making it around the internet at the time of its release, and man does it deliver in giving you a taste of what’s to come.

Future retro makes heavy use of what I will call the “synth laser” from here on out. The entire song is done in this 80s rock style, with the synth laser being the most prominent instrument, as well as the most visually spectacular. However, there is also a crazy 3 neck guitar/bass in the center of the scene, which surprisingly is mostly used for accompaniment to the laser. Along side this, there is a drum robot in the back, showing off even more of what’s to come. The song itself uses many of these instruments to create a very interesting vibe. One of the most notable things, I especially noticed it when I was a kid, was the use of the flute segment to break up the more heavy rock segments. This always struck me as an interesting choice, and a cool one at that. Along side the synth laser, green lasers and these choir synth lasers are used, which give that futuristic vibe the title implies. Overall, this song is a really solid start, and a perfect introduction to animusic. Its a song with a style that is familiar, being an 80s style rock song, and features some very interesting imagery. Overall, its biggest shortcoming isn’t anything it does specifically, but what the songs later in the album do. Solid start to a solid album.

Track 2: Stick figures

Best song in the album. Done.

Anyway, this song sums up pretty much everything I love about animusic, and even back when I was a kid, this was my favorite song in Animusic 1 by far. I even remember in school art class making a model of the bells + flute + gong instrument.

The instruments used in Stick Figures shows the full creativity of animusic at work. With the lead fretless bass, apparently called “Mr Stick” (best character by the way) to the large stack of brass horns, to even the massive array of drums, to even a few synth lasers (what would an animusic song be without them).

Just like Future Retro, most of the lead is taken by the synth lasers, however every single instrument is pretty much given time in the spotlight. One interesting thing, halfway through the song, the tone shifts to this slower darker tone, however none of the instruments change, they are just used differently, which allows some instruments which don’t fit the main mood of the song to have some much needed spotlight time. And man, the instruments really carry this song. From the opening with Mr. Stick just setting the mood, to the brass picking up, and eventually the laser taking over and really setting the song into full motion. And as the song goes on, you start to notice other instruments getting gradually added, all of which start to form a more full picture. And by the end, it comes to a satisfying close, with pretty much every instrument being active and harmonizing together into the melody of the song. Overall, I still stand by that this is one of the best, if not the absolute best song of animusic 1.

Track 3: Aqua Harp

Before i begin the review, lets talk about the transition from track 2 to track 3. Usually in an album, artists will try to fade one song into another, for example starting a drum beat which is picked up in the next song. This translates slightly harder to something like animusic since we have to establish which instruments are being played, and starting them already playing robs you of the experience of admiring the creative designs. However since animusic is a visual medium, the songs don’t necessarily have to transition, but the visuals can, and in this situation, the camera pans up to the stars in Stick Figures, which gradually turns into the star painted ceiling in Aqua Harp. A small touch, but I really like it. Anyway, on to the review.

Aqua Harp was always my least favorite song on the animusic 1 disk, but that’s not saying its a bad song. The way I would describe it is “atmospheric”. The scenery of Aqua Harp is very relaxing, with a large harp taking center stage, and also being the only instrument played, with all instruments other than the harp being connected to it. The harp itself is placed in the middle of a pool of water. Through out the song, a water sound can be heard in the background, which really helps with the atmosphere, as Aqua Harp is a really quiet song.

As for the song itself, the song is really slow and relaxing. I disliked it as a kid simply because it wasn’t as fast paced as the rest of the songs on the album, and the visuals weren’t as interesting. However, I can now appreciate the departure from the other styles of the songs. Aqua Harp uses a mix of string instruments, like the harp and cello, along side the flue and chimes. The use of these specific instruments creates a very interesting mood, coupled with the water and visuals, its very relaxing. Personally, while I do still think the song is not my favorite, I can appreciate it a lot more, and I do genuinely enjoy it a lot more too. Just sadly overshadowed by the others in this collection.

Track 4: Drum Machine

Next up we have one of the more interesting style songs. Drum Machine takes places in some machine which uses many different sizes of gears, and uses those gears to play different drums. One nice touch is in the background, the chugging of gears can be heard, and they keep perfect time with the song playing.

Over all, the drums are very cool, and it is very cool seeing all the gears moving. Lighting is also heavily used, mostly when symbols crash, but also when the rack of larger drums is moved down. This all contributes to one of the coolest scenes in animusic.

The song itself makes heavy use of percussion, in fact it only uses percussion. The song can be split up into about 3 sections, when new instruments are introduced, which happens 3 times over the song, the rhythm played on the drums changes to allow the new instruments to shine. Overall its a pretty cool sound. I’m personally not that into drum line songs, so I think most of the other songs overshadow the actual song that Drum Machine plays, however the scenery of it is worth the watch alone.

Track 5: Pipe Dream

Now if you saw any animusic clip, its probably this one. This song went viral on the internet due to its unique scene, and man, is it unique. Its probably my favorite scene of them all. Pipe Dream takes place in some factory, with a bunch of pipes shooting metal balls into instruments to create a sound. The creativity in this is crazy. You can see the level of detail in the pipes snaking around the floor, to the position of the instruments, to even which instruments where chosen. The thing that made this song so magical at the time was the idea that “this _could_ exist.” Hell, I even knew some people who thought it *did* exist. Hell it really *DOES* exist. Thanks Intel.

Anyway, the scene aside, this song is really solid. The opening to this song, with the gradual buildup of the banjo like instrument is awesome, just to have it pass the torch to a smaller, higher pitched banjo, just to then pass the torch to the drums, which might I add are some of the coolest drums in animusic. As well the bells this time being in the form of the bell flower, with chimes that descend from the ceiling. Also as the song goes on, marimba pieces scroll across a track above the drums, which basically take over the melody of the song. All of this creates a very unique song, one that I don’t think could exist on something that wasn’t animated. I still have to say most of the fun of this song comes from watching the balls hit the instruments and eventually find their way back home. And not even to mention, the song itself is really good to boot. Overall one of the most iconic songs of animusic and for good reason.

Track 6: Acoustic Curves

As a kid, is disliked Acoustic Curves a lot. I think it was completely due to the opening riffs, which are kind of annoying to me even today. But after listening to it again I just can’t stop. The main chorus of the song is incredibly catchy, despite not having any lyrics.

The overall scene for this one is very simple compared to the rest of the songs on animusic so far. This one seems to just take place in some wooden void, with wood paneling stretching from the dark depths to whatever the light is coming from. Weirdly enough, as a kid this one always reminded me of my Dad’s office, since all of the furniture in his office had that same wood panel look, and even the same color. Weird how some memories just stick with you like that. Other than the lackluster scene though, the instruments are really well designed, and really cool. The gimmick of this song is that almost all instruments are acoustic as the name implies, and they are played by small hammers that rest near the string being played. This is really creative, and grounded in reality. I really like it personally.

As for the song itself, it has a really cool style of being layered, with new instruments gradually descending from the heavens, ultimately forming the complete song towards the end, before gracefully deconstructing. This style is always something I’ve loved, so I’m not really sure why I didn’t like this as a kid. The instruments played are also really cool. I’m not a really big fan of the first two “guitar” like things, but once the bass and drums get into the mix, the song really takes off. I really like (as a bass player) their inclusion of a slap and pop. This lets the bass play more of a slap bass style, which sounds incredibly good. Its also cool to see things modeled like a sustain damper which gets turned on when the song really starts to take off. Overall Acoustic Curves is really solid, I really like it. Now if it could only get out of my damn head.

Track 7: Harmonic Voltage

I remember always disliking Harmonic Voltage as a kid as well because it meant that the movie was over… However I really like it now. In fact, just like Acousitc Curves, its now completely stuck in my head. For some reason these old melodies just come back to me and don’t leave.

As a kid I was obsessed with technology infrastructure for some reason, and I really liked the design of Harmonic Voltage, looking like it was power lines and radio towers, with this cool laser stuff shooting off of it. The center of the stage has a power pylon which is the source of the guitar sounds, with the synth guitar being purple, and the guitar solo guitar being more of a green. Under the pylon is a set of drums along with a synth bass. Overall its pretty cool to look at. Surrounding the pylon is a set of radio antennas and pylons that look like they supply or catch the voltage of the center pylon. There are also these cool little antennas with blue lights that make a cool dropping tone.

As for the song itself, It has a very cool sound. It has a more hybrid rock sound, sort of like an 80s rock song, but mixed with more of an early 2000s electric synth music sound. I particularly love the electric sound that is portrayed with the lasers. I also always liked the green rings that make that cool dropping sound as a kid. The guitar solo being played on the central pole was also a really cool touch.

Anyway, fade to credits. And that’s animusic 1. What an absolutely solid end to an absolutely solid album.

Animusic 1 rankings

  1. Stick Figures
  2. Pipe Dream
  3. Future Retro
  4. Acoustic Curves
  5. Harmonic Voltage
  6. Drum Machine
  7. Aqua Harp

To be honest, Animusic 1 is completely solid. There is not a single song that falls flat, and as well, there is not a single song that feels like it wasn’t take to the absolute maximum with creative potential. Such a solid album.

Posted in Misc | Tagged , , | 1 Comment

Micro: web design is getting out of hand…

I have to use a website called “Cognella” for a textbook at my university. It gives you one of those standard cookie prompts. Which allows you to enable or disable cookies, pretty standard right..? Well when you click “disable”, it logs you out immediately, and when you log back in you just get the same message to enable or disable cookies. So disabling cookies is the equivalent of hitting “I’m not 18” on a porn site. I’ve heard of them just being placebo, but never just outright refusing to serve you unless you consent to their tracking… great trend we are starting up guys. Guess they’re technically GDPR compliant. Turns out never mind, they’re fucking not!

Posted in Micro Posts | Tagged | 3 Comments