Sunday, October 27, 2019

old proxy tunneling issue with java

So you happen to work in an environment where you're behind a proxy. Not a big deal you might think, a bit annoying, yes. Until the moment when you run e.g. the gradle wrapper and hits you back with
a
Exception in thread "main" java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required"
exception. But surely you have configured everything correctly, including the proxy authentication. You never had this before, but then again you were never before behind an authenticated proxy. You run curl against the same gradle.org address to get the distribution with those exact proxy settings and it just works!

There's a simple explanation for that: since jdk8u111 Basic authentication for https tunneling is not allowed. To override this for gradle you may pass systemProp.jdk.http.auth.tunneling.disabledSchemes="" to gradle.properties. More generally you can pass/configure jdk.http.auth.tunneling.disabledSchemes jvm property to empty or remove Basic if already there, or do it globally in net.properties of jre/lib.

Monday, October 21, 2019

random ids in idea

Stop entering ad-hoc magic constants or 1,2,3,... sequences in your intent request codes, or build scripts to generate random translation keys. Embrace randomness and just use groovy scripts directly in IntelliJ live templates. A random positive integer might simply be $RANDOM$=groovyScript("new Random().nextInt() & Integer.MAX_VALUE"), a short $RANDOM$=groovyScript("new Random().nextInt(65535) + 1"), and a fixed 7-digit, 0-padded number $RANDOM$=groovyScript("String.format(\"%07d\", new Random().nextInt(999999))"). The definition for the latter would be:

<template name="rnd7p0" value="$RANDOM$" description="Generate a random number up to 7 digits, left padded with 0s if needed." toReformat="false" toShortenFQNames="true">
    <variable name="RANDOM" expression="groovyScript(&quot;String.format(\&quot;%07d\&quot;, new Random().nextInt(999999))&quot;)" defaultValue="" alwaysStopAt="false" />
    <context>
      <option name="OTHER" value="true" />
    </context>
  </template>


Or, you can install the randomness plugin.

Friday, June 21, 2019

comments formatting

Some people argue that if you do not intend to produce javadoc for your project, you should not clutter your comments with unnecessary <pre>s, <blockquote>s and the likes. I tend to disagree. The reason? Ctrl+Q.

Sunday, June 05, 2016

enums IV

So you find yourself calling values() lots in your code. Since this allocates a new array every time and this does not get optimized away, you might want to create a local copy, or an immutable collection and use that instead:

public enum Day {
  MONDAY, TUESDAY;

  private static final Day[] values = values();

  ...
}

or alternatively use an immutable Set.

Thursday, May 26, 2016

enums III

Enums have a name() method. And it has a very precise meaning. Now imagine:
public enum Day {
  MONDAY("code1"), TUESDAY("code2");

  private final String code;
  private Day(String code) {
    this.code = name;
  }

  public String getName() {
    return code;
  }
}
Now good luck finding out what is Day.name() and what is Day.getName(). You'd be much better off calling this other method of yours getCode(). If name looks like a good name for your attribute, think long and hard to find an alternative.

enums II

Imagine:
public enum Days {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,SUNDAY;
}
Then is it:
Days day = MONDAY;
or is it:
Days days = MONDAY;
How about a set of days? Would you call it days? Is it a set of days or a set of dayss? It can get worse: DaysEnum or DayEnums? Don't call your day days... To be fair such atrocities already exist in jdk, like LayoutFlags or CssFlags (these particular ones thankfully in the bowels of com.sun.javafx). Not one of their best moments.

enums I

Imagine Month being MonthEnum. What is Monday? A month? Or a monthEnum? Do everyone a favour then and stop calling your enums, well, enums.

Monday, December 24, 2012

test your timestamp server with openssl

Generate the timestamp query:
openssl ts -query -data <filename> -out tsareq.tsr
You may optionally set the policy adding the -policy object_id parameter.
View the generated request in human readable form:
openss ts -query -in tsareq.tsr -text
Send the request to the timestamp server and store the timestamp response:
./tsget -h <timestamp server url> -o tsarep.tsr tsareq.tsr

View the reply in human readable form:

openssl ts -reply -in tsarep.tsr -text

You may find that tsget is stored in /usr/share/ssl/misc.
Alternatively, you may also send the timestamp request manually, and have finer control over the protocol and transport headers. One way would be using the almighty curl:
curl -X POST <timestamp server url> -H "Content-Type: application/timestamp-query" -H "Content-Length: <tsareq.tsr length>" --data-binary @tsareq.tsr -v -o tsarep.tsr

Saturday, September 22, 2012

generate HTML for your web services

Grab a copy of Tomi Vanek's wsdl-viewer.xsl. Then use your favourite transformation tool. Yes, it's that simple. I recommend xsltproc, the open-source command line XSLT processing tool, bundled with most Linux distributions, also used in soapUI. Windows fellas can get the binaries prepared by Igor Zlatkovi─ç. Then simply type:
 
xsltproc -o the-wsdl-report.html wsdl-viewer.xsl your-wsdl-file.wsdl

Saturday, June 11, 2011

why zmeeagain?

I think my -not so many- readers long deserved an explanation on the seemingly peculiar choice of the word zmeeagain for my web persona. Here it is: