Feb 4 2020

Software Development Checklist

During the summer, our team usually hires an intern. We find that the interns we hire are more than capable with the technical requirements but usually need some help on process. In order to help new team members adapt our process we’ve developed a number of useful checklists of some best practices. Here are some useful checklist to go through when working on new features.

Ticket Checklist

  • Add clear and concise title and description
  • Add reproducible steps
    • Use realistic sample data
  • Add specific acceptance criteria
  • Add related tickets

Code Checklist

  • Create your own feature branch
  • Check code into your branch often
  • Merge from master often
  • Run test suites on your own branch
  • Add and update test cases
  • And and update wiki documentation
  • Add comments to ticket

New Project Checklist

  • Source
    • Git Repository
    • Dependency Management
      • Maven
    • readme.md
  • Wiki documentation
    • Design Diagram
    • API Documentation
    • Common Configuration
    • AWS Permissions
    • Technical Specifications
      • Ports
      • Hardware
    • Sample log output
    • Sample Splunk queries
  • Splunk friendly logs
    • Splunk Dashboards
    • Splunk Alerts
  • Test Cases
    • JUnit
  • Release Management
    • Bamboo Plan
    • Ansible Playbook
    • Package
      • Docker Image
      • RPM Package

Jan 6 2020

POJOs Made Easy with Project Lombok

Every Java application has some sort of bean or Plain Old Java Object (POJO) to hold and manage state. Because of good Object Oriented Programming (OOP) principles we encapsulate field access with getter and setter methods. Most modern IDEs allow you to quickly create getters and getters. You can often find a Generate option under the Code menu from your favorite IDE. But generating getters and setters produces a lot of unnecessary boilerplate code.

With Project Lombok, you can reduce all that boilerplate getter and setter code with a few annotations.

The following bit of code will produce a Java class with the necessary getters and setters to access all the defined fields.

package com.juixe.core.pojo;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@ToString @EqualsAndHashCode
@Getter @Setter
public class Person {
   private Long id;
   private String firstName;
   private String lastName;
}

Given the Person class above, you can start coding the following.

   Person p = new Person();
   p.setFirstName("Boingo");
   p.setLastName("API");
   p.setId(1000l);

The getter and setter methods are added to the bytecode for the Person class by Project Lombok through the annotations. If you remove one of the annotations, like the @Setter annotation, then the setters methods will be deleted.

We just saw how a few annotation can generate getters, setters, equals, hashCode, and toString methods for simple Java classes. If you want all these methods generated for you, automatically, you can just use the @Data annotation like the following.

package com.juixe.core.pojo;

import lombok.Data;

@Data
public class Person {
   private Long id;
   private String firstName;
   private String lastName;
}

There is also a @Value annotation that is similar to @Data except that it is intended for immutable objects, so it doesn’t generate any setter methods.


Jan 2 2020

Human JSON

JSON is a versatile format to define data. I read and write JSON all the time but as a subset of JavaScript, it has a few limitations, most notably the lack of support for comments. Enter HJSON, or Human JSON. HJSON makes quotes around object names optional, it makes quotes around strings optional as well, it adds support for multi-line strings, and allows you to add comments in a number of ways. The following is valid HJSON.

{
  // use #, // or /**/ comments,
  // omit quotes for keys
  key: 1
  // omit quotes for strings
  contains: everything on this line
  // omit commas at the end of a line
  cool: {
    foo: 1
    bar: 2
  }
  // allow trailing commas
  list: [
    1,
    2,
  ]
  // and use multiline strings
  realist:
    '''
    My half empty glass,
    I will fill your empty half.
    Now you are half full.
    '''
}

There is an implementation of HJSON for most popular languages, like Java, Python, Go, Python, etc. I’ve used the hjson-java library to read HJSON file and converted it to JSON in a few lines.


Dec 27 2019

Create a HTTP Server in Java

Here is a quick tutorial on how to create a local embedded HTTP server in Java to serve JSON data. The whole code in less than 30 lines on Java.

package com.juixe.json.server;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.net.InetSocketAddress;

public class JSONServer implements HttpHandler {

    public static void main(String[] args) throws IOException  {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/data", new JSONServer());
        server.setExecutor(null);
        server.start();
    }

    @Override
    public void handle(HttpExchange he) throws IOException {
        String response = "{\"message\": \"Hello, HTTP Client\"}";

        he.getResponseHeaders().set("Content-Type", "application/json;charset=UTF-8");
        he.sendResponseHeaders(200, response.length());
        he.getResponseBody().write(response.getBytes());
        he.close();
    }
}

The HttpServer and HttpHandler classes are part of the JRE, so no additional libraries are required. Java also includes a HttpsServer which supports SSL. In the HttpHandler, you can return any data but for this example we are returning a simple JSON response.


Sep 25 2019

Oracle OpenWorld 2019 Overview

The following is a short list of tools, libraries, and projects that I found interesting at Oracle OpenWorld 2019.

  • Oracle APEX – Rapid Application Development framework built on top of Oracle’s database.  With little code, build CRUD application around database tables or even excel documents.
  • Oracle Jet – Oracle’s JavaScript Extension Toolkit (JET) for building mobile and desktop web applications.
  • WeaveWorks Sock Shop – Microservice sample app, like Java Pet Store.
  • Micronaut – Full-stack polyglot framework for building microservice and serverless applications.
  • Helidon – Collection of Java libraries for developing microservices.
  • JHipster – Generate, develop, and deploy Spring Boot + Angular/React/Veue web applications and microservices
  • OpenAPI – API description format for REST APIs. Formerly known as Swagger, used to help to design, build, document, and consume REST APIs.
  • Moby Project – Open framework to assemble specialized container systems.
  • Eclipse Vert.x – Reactive tool-kit
  • Eclipse Theia – Cloud IDE platform, runs on Docker
  • Eclipse Che – Kubernetes native IDE, allowing you to code, build, test and run applications exactly as they run on production from any machine.
  • Eclipse MicroProfile – Specification to define a microservice application platform that is portable across multiple runtimes and vendors.
  • Eclipse CodeWind – Container support in Eclipse IDE, Eclipse Che, and VS Code.
  • Docker Kitematic – GUI application to run Docker containers.

May 29 2012

Formatting an Integer to String in Java

There are times when you need to format a integer or double value into a String, with the comma for values larger than a thousand. If you need to format a numeric value correctly based on the local formatting rules for numbers use the NumberFormat class. Different locales have different formatting rules, for example in France they use the comma as a decimal point where in the United States the comma is used for delimiting large numbers.

double val = 123456.78;
System.out.println(val); // 123456.78

// Use default locale to format string
String localFormat = NumberFormat.getNumberInstance().format(val);
System.out.println(localFormat); // 123,456.78
		
String frenchFormat = NumberFormat.getNumberInstance(Locale.FRANCE).format(val);
System.out.println(frenchFormat); // 123 456,78