Spatialite DLL hell

Spatialite is a geospatial-enabled extension to sqlite. I must have it. I intend to use it inside our commercial java product, which has windows and linux users. The development environment is Eclipse. The OS is Windows 10.

The author of spatialite mentions that the windows environment suffers from DLL-Hell. Well yes it does.

Installing sqlite and the xerial-jdbc software is easy and not covered.

You download the spatialite files here. It isn’t well explained, but you need the “mod_spatialite-.7z file.

My preferred eclipse setup is to create a /lib folder in my eclipse project and put the jars and dlls there. Below is a simple test project showing the locations of the files. Note that the sqlite-jdbc.jar is included with a “Native library location” that points to the folder containing the dll files. This is the standard way to do things. It works most of the time.

The author of spatialize has some good installation instructions and sample code. I added the sample file and tried to run it.

The result was the following error:
Failed to load extension mod_spatialite. Trying to find file manually
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: C:\apps\eclipse-64-workspace\spatialite-test2\lib\mod_spatialite.dll
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1827)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at SpatialiteSample.main(SpatialiteSample.java:40)

This is the well-known dll hell. The eclipse launcher uses the “root” folder of the project as the root java location. Here are the details. The command line is:
"C:\Program Files\Java\jdk1.8.0_121\bin\javaw.exe" -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:57143 -Djava.library.path=C:\apps\eclipse-64-workspace\spatialite-test2\lib -Dfile.encoding=Cp1252 -classpath C:\apps\eclipse-64-workspace\spatialite-test2\bin;C:\apps\eclipse-64-workspace\spatialite-test2\lib\sqlite-jdbc-3.18.0.jar SpatialiteSample

At this point, someone gets desperate and recommends adding the spatialite path to the windows PATH variable, or drop the dlls in the /system folder. But this is intended as a professional installation, not something for the enthusiatic developer. These are not acceptable recommendations.

To simplify the problem, a good next step is to move the dlls to the root folder. Can’t miss them there, can we?

And that works. The “mod_spatialite.dll” is found in the root folder. The command line is:
"C:\Program Files\Java\jdk1.8.0_121\bin\javaw.exe" -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:57854 -Dfile.encoding=Cp1252 -classpath C:\apps\eclipse-64-workspace\spatialite-test3\bin;C:\apps\eclipse-64-workspace\spatialite-test3\lib\sqlite-jdbc-3.18.0.jar SpatialiteSample.

So we can run spatialite in eclipse if we are willing to place the dlls in the root directory. We are not.

At this point, I am extremely puzzled. To be continued, hopefully…

Java Null Pointer Static Analysis in Eclipse – JDT vs CheckerFramework – False-Positive comparison

We’re talking about this and this. For those of us who program in Eclipse using Java, what is the best tool(s) for checking null pointer exceptions.

There have been several attempts before, but nothing has made its way into the official language. Eclipse does provide good null pointer checking out of the box, but there is only so much it can do. To improve the power of the checkers, we need to add annotations.

Note: In the following, I am using JDK 1.8.

1) We have Eclipse itself, using the JDT annotations Eclipse help.
2) We have the standard checker framework.
3) We have FindBugs, which I believe is used by sonarcube.

There is great power to have something built into the environment, so the standard eclipse system has a strong advantage. Unless it has serious problems, it should be part of the standard development environment.

Unfortunately, it does have serious problems. Take a look at the following program:

public class TestNullCode {

    @org.eclipse.jdt.annotation.Nullable
    private String testJdt;

    public void testJdt() {
        if (testJdt == null) {
            testJdt = "not null";
        }
        // this line causes a false-positive warning
        // Potential null pointer access: The field testJdt is specified as @Nullable
        if (testJdt.equals("not null")) {
            System.out.println("will work because testJdt is not null");
        }
    }
}

This example shows a false-positive that is provably incorrect. The compiler issues a warning (or error, depending on your settings) on line 12, that is untrue.

Frankly, this is pretty sad. The reasons are justifiable, but the result is sad, nonetheless.

For non-final @Nullable fields the simplest strategy for avoiding any nullness related risks is to pessimistically assume potential null at every read. This means for strict checking no flow analysis should be applied to @Nullable fields..

How does the checkerframework do? Answer: No problems at all:

public class TestNullCode {

    @org.checkerframework.checker.nullness.qual.Nullable
    private String testCheckerFramework;

    public void testCheckerFramework() {
        if (testCheckerFramework == null) {
            testCheckerFramework = "not null";
        }
        // this line is ok
        if (testCheckerFramework.equals("not null")) {
            System.out.println("will work because testCheckerFramework is not null");
        }

        testCheckerFramework = null;
        // following line is flagged by checker framework
        // dereference of possibly-null reference testCheckerFramework
        System.out.println("will fail because testCheckerFramework is not null" + testCheckerFramework.toString());
    }
}

How does FindBugs do? Answer: No problems at all. Same as checkerframework , so I won’t post the identical code.

Eclipse has a workaround that costs a line of extra code:

While this appears to be a very drastic restriction, the remedy is quite easy: before dereferencing a @Nullable field it has to be assigned to a local variable. Flow analysis is then safely applied to the local variable with no risk of side effects, aliasing nor concurrency, since local variables are not shared with any code locations that would be outside the scope of the analysis. I.e., the flow analysis can see everything it needs to consider regarding local variables.

public class TestNullCode {

    @org.eclipse.jdt.annotation.Nullable
    private String testJdt;

    public void testJdtCopy() {
    	String copy = testJdt;
        if (copy == null) {
        	copy = "not null";
        }
        //This is fine
        if (copy.equals("not null")) {
            System.out.println("will work because copyis not null");
        }
    }
}

I consider this “solution” ugly. I get it, but I don’t buy it.
At some point, I would expect the Eclipse engine to get better.

So at this point, we still need the other tools.

You can download my example eclipse project here.

“Tom Rotert’s Daft Punk Chili.” We’re up all night to make chili

For all my friends in cold climates looking for some form of comfort and relief, I provide to you some thoughts on the best way to make world class chili, refined over decades of making both good and bad versions of the dish. Feel free to comment with your own observations.

Chili comes in all shapes and sizes, and I probably don’t make it the same way twice. But here are my thoughts.

I always use beef. Ground beef is the cheap way to go, but I don’t do it. If you decide to use ground beef (bleck!): brown it in a skillet and make sure to pour off ALL the grease you can.

Me? I roast a chuck. Maybe 3 lbs. I do it in the oven at 325 for a few hours, or in the crock pot on high for a few more. Either way (oven or crock pot) you prepare it the same way: Put an iron pot pan (le creuset style is best) on the stove top on high, salt and pepper the chuck roast, when the pan is hot-hot add some oil (2 Tbls), when the oil is hot, toss in the chuck and sear it on all sides (maybe a minute or two on each side). Add water to the pot until it goes half way up the side of the chuck, cover it, and toss it in the 325 pre-heated oven (or crock pot). Flip it after 1 1/2 hours if you want. If you forget to flip, no biggy. I forget to flip it all the time. Check it in 2 1/2 hours or so to see if it’s done. When it’s ready it will break apart into its muscle fiber strands easily with a fork. If it doesn’t separate easily, let it go some more. Do NOT pour off the juices that are left in the pan when the roast is done. This is going right into your chili. Don’t worry about any grease; as long as you are not using ground beef, the grease from the roast never seems to cause any issue when put into the chili.
While the chuck is in the oven or crock pot, you can get going on the rest.

One of the chili tricks I always try to use is tons and tons and tons and tons of caramelized onions. That’s right: tons. Start with 6, good sized onions, but use 8 if they will fit in the pot. I’m not joking. You are going to cook them way way down, like for at least an hour, maybe two if you can hack it, so the volume of onions will be a strangely tiny fraction of what you started out with. I full pot of onions will cook down, after two hours, to a volume of less than 15% of the pot. But BoY Howdy do those guys pack a flavor punch. Along with the choice and preparation of the meat, the use of tons of onions, cooked slow for a long time, is one of the most important aspects of a good chili IMHO. So do it like this:

Slice 6 onions; I like slicing pole to pole because the slices hold up better. Same kinda le creuset (enameled cast iron) pot on med- med/high heat on the stove. Toss in 3 Tbls of butter, when it gets frothy, toss in the onions. Once the onions have cooked and sweat (we are talking 15 minutes or so, but this is not science so don’t worry about the exact timing), turn the heat down to med and stir it every now and then. Here’s the secret trick for the big girl chefs: if you can hang near the stove for a while, once the onions have cooked way way down (after 45 minutes on medium), all the moisture will evaporate such that a fond (crust) will start to form on the bottom of the pan. Its like the onions are about to start burning on the bottom of the pan, but its not yet blackened– and leaving a crust. When this dark brown crusty fond forms in a now expanding pond size pool on the bottom of the pan, deglaze the fond. This is a classic technique (deglazing) and forgive me if I seem pedantic, but it’s the same idea as when you make a pan gravy from the crusty brown parts stuck on the bottom of the pan after oven roasting a bird. Just turn up the heat from medium to med/high and slowly add ¼ cup (or so) of cold water to the pan while stirring / scraping at the fond with a wooden spoon, until the crust has turned into a small amount of dark liquid that gets mixed back into the onions. Continue stirring intermittently until a fond forms again, and then repeat the deglazing process. The more you can repeat, the darker and darker and yummier and yummier the onions will get. Sometimes, if there is a good DJ on the radio, I will deglaze the onions more than 10 times before I give up. If you are unfamiliar with the deglazing process, there is a photo album on my facebook page called “best French onion soup” that has step by step photos to show you what to expect in fond formation and onion color. These photos might be helpful because it can be a little scary the first time you deglaze onions: you are sure that you have bunt and ruined them (you haven’t!) and the photos also show you how amazingly dark, sweet and delicious you can get the onions if you only have patience and repeat the deglazing process as much as you can bear standing over the stove. But I can’t stress enough how much tons and tons of caramelized onions add to the flavor of the chili. I would have a generally poor self-esteem were it not for people begging me for my chili recipe. And as you can see, its less of a recipe, and more of a revelation of my “tricks.”

So, those are the two big factors: meat and onions.

Also important, I guess, is the chili spice / seasonings.

Let me start out by saying that the exact brand of chili seasoning or chili powder to use, the type and method of preparation of fresh chili, and all the other tricks someone might impart to you in whispers as they reveal the secret to their chili, is all a bunch of horse hockey. To get your chili into the upper echelons of the chili world, all you need in my book is some form of deep complexity to the underlying base of the chili, with an absence of any flavors that mess the whole stew up. Do that, and everyone will agree that YOU make a great chili. The ever-changing (from one batch to the next) complexity of your chili is what makes it a chili. I mean, think about it: pre-prepared, dried chili powders might have a mix of dozens of different types of chili, some prepared in very different ways (roasted, fried, grilled) all dried and then mixed together. In my mind, what makes a good chili stand out above the rest is that it has this deep, complex mix of flavors (stewed together on the stove for a long, long time). Sometimes it seems to have a hint of sweet. Other times it’s faint with chocolate tones. Sometimes the heat is at the front of the bite. Other times it is warm only in the tummy. Just like a good wine, this is what makes a great chili – there is just a whole lot going on in a great chili, and you don’t notice all the flavors at once, but often it’s half way through the bowl.

This is the amazing (super) secret to using lots of caramelized onions: the onions on their own, if prepared this way, have a unique complexity independent of the rest of the dish; they impart a (once again) complex sweetness to the chili, and just take it to the next level in a way you have never found other chili trying to go. It is the same idea with the spice profile. Before I make comments on how to put the chili in your chili, let me expound upon what I mean when I say that a really good chili is just 1) complexity, with 2) an absence of any flavors that mess the whole thing up. This last part is crucial. I am not giving you an ingredient list with measured portions in this “recipe” on purpose. What I’m giving you is simply concepts I have refined over decades. The process of making a good chili involves the employment of a few important techniques, a good understanding of some fundamental truths (see, the onion discussion, above), and the realization that in using these basic techniques you will be encouraged, over the cold months, and the years of chili making ahead, to experiment. And man oh man do people like to pretend like there is some secret ingredient to a good chili. There really isn’t. I am so clever and I have tried them all: day old coffee, cinnamon, chocolate, balsamic vinegar, bla, bla, yuck, bla, bla. They have always been bad ideas. They have a way of over-powering the chili. Don’t waste your time (or your pot of chili). Stick to the basics. Let the chili powder / seasoning itself be the complexity. Beyond that, make sure your chili has an absence of any flavors that will mess the whole pot up.

So, as far as which chili powder or chili seasoning to use, I will say in general this is one of the less important aspects—as long as you use some kind of dried chili powder. I have found one that I use now religiously, just because I like the flavor it imparts: Amazing brand chili spice, in 99 cent packets (about one packet for each pound of meat). The “Amazing” brand makes all kinds of pre-package spices (for fajitas, for gravy, etc..,) which I haven’t ever tried, but for some reason I LOVE their Chili Spices. I’m not sure that using Amazing brand is at all critical. Well, it’s not. I made great, complex, and well received chili long before I found Amazing brand chili seasoning. So, any prepackaged chili spice is probably going to be okay. I have many times simply used chili powder, from one of the big spice companies (i.e., McCormick). Again, I don’t really think it really matters. Keep in mind that the classic chili spice is cumin. If you don’t have cumin, keep in mind that cumin is simply ground coriander. So if, after adding your cheap chili spice packs, and/or cheap chili powder, you find your chili lacking a chili-esque character and quality (tasting a bit too tomato-y or spaghetti sauce-ish), first: put in more of the cheap chili powder or spice. You will be surprised how much it takes to season your chili. Table spoons and table spoons. And, keep in mind that “chili powder” is not spicy. Also, to cure a tomato-y pot of chili, throw in some cumin, or mortar and pestle up some coriander (same thing). Once you get your chili to start tasting like chili rather than spaghetti sauce, you can spice it to your liking. Heat is controlled by the amount of (once again cheap / national brand) cayenne pepper you use. Go easy though. Unlike chili powder which is quite mild, cayenne pepper is explosively hot. And when spicing your chili, keep in mind our awesome chili making formula: complexity + an absence of any flavors that will mess the whole pot up. The level of heat is directly related to this second aspect. You may be macho in the spice department, but most people aren’t.

The only other thing that I will note about spicing the chili is that, many times before, I have sautéed and used all sorts of fresh chilis (jalepenos of course, but also seranos Anaheim, etc..,). I just sauté them for a bit and toss them in. I have long ago given up on this as a waste of time for very little flavor pay off. What I mostly do now is add in a can (either the small or large one) of Rotel (like the kind you add to velveta for Super Bowl nacho chees sauce –ewww!). That seems to accomplish the real goal of adding fresh chili to the chili (ha): giving everyone the occasional bite that is a bit more spicy. I will say this: I don’t think it does much for the chili; it’s more of a novelty. But if its just opening a can of Rotel, it’s easy enough that I usually add it to the mix. The real chili flavor punch comes from the way you infuse into the tomato sauce the dried chili powders and then let it all cook a good long while. This is what gives the chili its character—the dried chili powders. This is what gives the sauce a dark color which, if you spoon out just the sauce and inspect it, you can see is the result of hundreds of individual dark chili specks. YUM! The sautéed fresh hot peppers just don’t do that much for the flavor of the base of the chili. But hell, go to town if you want.

Finally, I will throw in to the spice discussion one last good trick: lots of either chopped or minced garlic. I prefer to slice/chop and sauté the garlic just briefly, but I have also just tossed it in the pot minced. And by “a lot” I mean: a lot of garlic. Don’t use pre-shelled and/or minced garlic if you can avoid it. And for God’s sake, don’t use garlic powder. But do use lots and lots and lots and lots of fresh chopped or minced garlic. This is once again going to give your chili a complex flavor profile and help gain you accolades from all the lazy slobs who just show up at the dinner table and afterwards never even offer to help with the dishes.

Okay. So we have discussed the crucial aspects of a good chili: the right meat, lots of caramelized onions, and the right approach to spices. Here are the less crucial aspects of chili construction:

Tomatoes and beans.

For the Tomatoes: Canned. Whole (they will break up on their own in the chili, trust me) but halved or otherwise cut will be fine. Peeled. I don’t like seeing rolled tomato peels coming out of me the next day. I usually get the canned tomatoes that advertise that they are canned in tomato sauce only, with nothing else, (no chilis, no basil, no italian spices), but I have experimented with all of these versions of canned tomatoes. I have just never noticed any real difference in the flavor from what was added to the whole, peeled tomatoes, so I don’t bother anymore.

I buy the large (28 oz cans). For a 3 lb chuck roast I will definitely use two 28 oz cans and that is what I start with. But I have extras on hand and almost always add more. I just eye it out to what looks like the right amount of tomatoes and liquid. For the brand of canned, whole peeled tomatoes, I like Muir Glenn because they have good flavor and they are organic. But, again, I’m not sure it matters. Italian tomatoes don’t seem to improve or detract from the chili either. I have probably more often than not used the cheapest (grocery store chain private label generic) tomatoes I can find.

It’s all about how the chili powder / spices mix with the tomatoes and their sauce, and blend and cook into them. So, because of that, I do always have on hand both a can or two of tomato sauce, and one tiny can of tomato paste. I use these at the very end of the process to adjust for the amount of tomato base (when I need more liquid), and only use the tomato paste when I feel like the chili is way too watery (remember, if it’s only a little bit watery, you are going to cook that chili down for a while, so hold off on using the tomato paste, if at all, until the very end).

For the Beans: Don’t you EVER waste your time soaking and cooking dried beans. NEVER EVER. You have enough time you need to dedicate to the meat and onions. You can only F up your chili trying to figure out the soaking and cooking of dried beans. Don’t do it. Use canned beans. And trust me, the beans might be the least important aspect of making a great chili. Also, when you use canned beans it’s a lot easier to eye out the proper amount of beans you want to put in the chili. Just add more cans or stop adding cans, once it looks like there are enough for your liking. I don’t usually go to crazy on the beans. I stay on the conservative side. I use slightly less in canned beans than I do in tomatoes.

For the variety and type of beans: who cares. Some people think its clever to mix beans, and there is nothing wrong with that: use 1 can of pinto, 1 can of black, 1 can of kidney, 1 can of whatever. People get excited about the beans they use and that is just silly. Beans are beans. They are all really beany, and properly add to your chili the necessary bean component, but there really isn’t much of an important distinction in flavor, texture, or aesthetics, from one type of bean to the other.

I always just use “chili beans in chili sauce.” I like the size of the chili bean (half the size of kidney and lima beans). I like the color of the chili bean. And I’m a simple man: if I’m making chili, why not use a bean that says “chili” right there on the can? The chili beans themselves blend in nicely with the rest of the chili color profile. I don’t go for a ton of color variation in my chili (so, no, I’m not a fan of “white bean chili”), but I can’t justify or explain my preference for chili colored chili, so you won’t get any snickering from me if you like more of a multi-bean chili Kaleidoscope. Just don’t go pretending like the kind of bean you use is some big chili secret. It’s not. It just don’t matter. I will say that I prefer “chili beans in chili sauce” additionally, however, because the small amount of “chili sauce” that is added to the can is generally not either offensive or obtrusive in its flavor and, if anything, seems to add just a bit of complexity to the overall character of the chili, once it is all cooked down, and so it fits in perfectly with my chili philosophy (great chili = complexity + an absence of distracting or disgusting flavors).

So, then, what else do I use in my chili? Well the rest of what I have to say about what to put in your chili comes from years of experimentation with conscious adherence to the maxim: avoid distracting ingredients. This process has been harder than it sounds, because everyone has the idea that a good chili has some secret list of ingredients (we already talked about this: it doesn’t), and so the motivation to put crazy things in your chili runs strong. Yes, I have tried coffee, and coffee grinds, and cinnamon, and chocolate, and balsamic vinegar, and a bunch of other things. They were all a distraction, and I only tried them once. I have long ago given up trying anything new in my chili. Below is the short list of things I have landed on.
I don’t use green bell peppers. I don’t like the flavor they add. But, I do like using red bell peppers. The flavor is qualitatively different from the green bell peppers. Make sure to remove ALL of the white interior portion: this tastes bitter and the bitter taste does not go away after cooking. Slice them long: it’s aesthetically pleasing. Use a couple.

I have discussed fresh chili above. I gave them up on a cost / benefit analysis. I use a can of Rotel Chili instead and that seems to work great.

I have used sautéed mushrooms before as well. Like onions, these really cook down, so don’t be afraid to use a pound or more of fresh. I like that they don’t have an overwhelming flavor, and there is something interesting about the texture that stands out against the rest of the texture of the chili. When I use mushrooms, I frequently will sauté them and add the garlic.

Vegetable lovers can sometimes go crazy with chili. Common additions are: carrots, celery, zucchini, leaks, bla, bla, bla. It’s not my style, but do what you like. If you are going to have chili, with that deep chili flavor, I just don’t think most vegetables fit into the mix. Chili is kind of a mushy dish to me. The meat is soft and tender, the beans are tender, the tomatoes are almost macerated, and that is all okay. I like it that way. I don’t need the dish to be balanced out with crunch (or if I do, I can deal with that on the backside with crackers or something like that). Chili is a winter dish. For cold winter weekends. If I want some crisp spring vegetables in my pot, I will wait a few months and make some minestrone.

If I have had an extra shallot laying around for a while, I might throw that in, but I wouldn’t add it to my shopping list.

That’s pretty much as fancy as it gets.

The meat is crucial. Use a lot of it. It breaks up really well (into its individual strands) and is masked in the chili such that even when you have a lot of meat in the pot, you won’t get any comments from people to that effect when they are just surveying their bowls. But there is something about the texture of a chili and the substance it adds to your bites when you use plenty of really tasty meat.

So, throwing it all together it goes like this:

Prepare the meat.

Prepare the onions.

Toss them both in the pot and add the tomatoes

Add the beans.

Add the Chili powder / seasoning

Turn up the heat.

Chop or mince the garlic and toss it in with the mushrooms if you are using mushrooms. If not, sauté the chopped garlic for a few minutes on med low (do not burn it or it will overpower the flavor of the whole pot), or if you are mincing the garlic, just toss it straight in.

Clean, slice and sauté a couple or three red bell peppers and toss them in.

When it reaches a boil, turn it down and simmer the chili (no lid) for an hour, stirring occasionally and being careful not to let the bottom burn. After a bit, check the flavor and adjust for additional chili powder / seasoning and cayenne for heat.

The flavor gets more complex and beautiful after a night in the fridge.

A few comments on accoutrements:

Sour cream goes great. So do chopped white onions, green onions, and/or grated (medium or sharp) cheddar cheese. Soup crackers or saltines are a natural, as well.

My mom always served chili over macaroni and cheese. Don’t laugh. This is brilliant.

Also, a splash of white wine just before serving suits some palates.

There is, as you may know, 1980’s elementary school cafeteria lore attesting to the serving of chili with cinnamon rolls. I’m pretty sure that nobody actually spoons chili OVER the cinnamon rolls, but what do I know.

I wouldn’t waste good chili on a hot dog or hamburger, but that is a matter of personal taste as well. Enjoy, and be creative, once you have your chili nailed down, but remember: don’t get too creative. You have more to lose than gain in getting clever with your ingredients. Bon Appetit!

Tom Rotert

Flaky Internet Connection? Gather the evidence first

So the home internet connection has become poorly this last month. Seems like a few times daily that everything just freezes up. Facebook posts don’t load, chrome just hangs, and within a minute my son is complaining that his xbox is down. I look at the AT&T router flashing its green lights, and then see a hiccup as the lights go out, the box makes an audible click, and the system reboots. A minute later and all is well.

Call the internet service provider and ask if anyone else in the neighborhood is having problems? Who isn’t? Have the service guy come out and poke around? It’ll work perfectly when he is here.

First things first. Gather the evidence. How often does the internet go down?

Should be a free program for that. I can launch a command line, type “ping -t 8.8.8.8” (see here), and see how things are going. Just need a timer (do it once every 30 seconds), and write to a log file so I can check it daily and see what it happening. 10 min to write a script for this, right?

But someone should have already written something like this. However, a google search for something ran into all sorts of problems. Lots of programs out there, but they charge? What? Or a free download and 30 days trial? No thanks.

Oh here is a free tool from a reputable site. Got all the right names, “Internet Connection Monitor”. But I installed this pita and the icon just sat there in my taskbar and wouldn’t load a window. Tried to uninstall it and windows locked up for about 5 min. Even revo-uninstaller is spinning its wheels. May have to reboot before deleting this poc. But enough about that.

Try Internet Connectivity Monitor. Does exactly what I asked for, doesn’t install anything (just run it out of the downloaded/extracted folder), and there you go.