Dynamic JavaScript Function Names

The other day I had to make a long list of functions where the name was derived from an object key name. Since programming is the art of automating stuff, I thought “There has to be a way to have the code do this!”. Searching on our good friend stackoverflow.com there were plenty of examples of how to set the name of a function by using eval, or the Function constructor. Eval has some security issues, and by extension the constructor that uses it behind the curtains. So, what other way is there?

Well, the name property of functions is read-only, so that cannot be created and just renamed. However, there is more than one way to name a function.

One way is in the declaration, but that name is fixed upon declaration.

function superCoolFunction() {
}

superCoolFunction.name === 'superCoolFunction';

The same is true for function expressions, where the anonymous function name is derived from the variable name (doesn’t that make it not anonymous though?):

const nameOrigin = function() {
};

nameOrigin.name === 'nameOrigin';

Another is through object literal notation:

const objectLiteral = {
    evenCoolerFunction() {
    }
};

objectLiteral.evenCoolerFunction.name === 'evenCoolerFunction';

But, since object literals can have computed properties we can have:

const dynamicName = 'coolDynamicName';
const objectLiteral = {
    [dynamicName]() {
    }
};

objectLiteral[dynamicName].name === 'coolDynamicName';

And thus we can have a function that creates a function with a dynamically named method and return that method!

[codepen_embed height=”320″ theme_id=”0″ slug_hash=”JyWoWP” default_tab=”js,result” user=”javver”]See the Pen <a href=’https://codepen.io/javver/pen/JyWoWP/’>JyWoWP</a> by Javier (<a href=’https://codepen.io/javver’>@javver</a>) on <a href=’https://codepen.io’>CodePen</a>.[/codepen_embed]

You may ask, can’t this be done with Object.defineProperty? Well, not really, you can create functions in the object, but the Function.name value returned will not be what you input to that function, since the function in the property descriptor will be named value. You can play around with a near solution in this pen.

Caveat emptor: this has not been benchmarked in any way or tested for JS engine optimization compatibility. Just another tool in the belt, just in case. 😉

Where is the log4j XML config reference?

When it comes to logging in Java™ there is no shortage of alternatives. The one I’ve used the most is log4j by the Apache Foundation. In its basic usage it has no dependencies and you only need to add the ones you’ll use like SMTP support for mailing loggers, JSON configuration support or a JDBC connector to log to your favorite database. The newest version even allows asynchronous logging through the LMAX Distruptor interthread messaging API that promises greater throughput than concurrent queues and lock based thread synchronization.

Since the 2.x version came out, however, the documentation for the 1.x versions has become fragmented. There are dead links everywhere and the XML configuration method reference is not even half complete. A common question about the XML format is about validation. A more thorough search can land you on the source control version of the DTD. Let’s go through the details of what makes a valid log4j XML configuration file.

Continue reading

Zero padded hexadecimal numbers in Java

A quick recipe, converting an int or long like 65 to a string like 000041. It’s useful for converting integer RGB colors to the common #FFBBCC kind of web encoded colors.

 

int number = 65;
String hexString = String.format("%06X", number);
System.out.println(hexString);

:>

Decoding Base64 without newlines

So, I was trying to decode some base 64 encoded data to verify a request’s details but openssl kept returning nothing. To see what it expected I encoded a random string and when I saw the output it dawned on me. Base 64 wraps lines of a certain length with new line characters, every 64 characters (bytes, actually).

Wrapping data isn’t that hard, but I suspected there had to be a command that already did something like that. The answer was fold. It wraps lines of input to fit a specified width. The default was 80, but it can be changed with the -w switch. The result is:

 input | fold -w 64 | openssl base64 -d | output

:>