Skip to main content

Posts

Showing posts with the label java

Build Java webapp and run it with Tomcat in Bazel

The official support of Java web application in Bazel is bazelbuild/rules_appengine , which comes with a number of problems as discussed in a previous post . After some effort I realized I can not manage to have appengine rule accurately serve my needs. Since there doesn't seem to be another option, I decided to go ahead and create one. https://github.com/jiaqi/bazville With bazville I was able to change the demo project angular-on-java to build web application correctly without assuming it runs in appengine, and run it with Tomcat in bazel. Please take a look at the project github docs if you are interested.

Spring, Angular and other reasons I like and hate Bazel at the same time

For several weeks I've been trying to put together an Angular application served Java Spring MVC web server in Bazel. I've seen the Java, Angular combination works well in Google, and given the popularity of Java, I want get it to work with open source. How hard can it be to run arguably the best JS framework on a server in probably the most popular server-side language with  the mono-repo of planet-scale ? The rest of this post walks through the headaches and nightmares I had to get things to work but if you are just here to look for a working example, github/jiaqi/angular-on-java is all you need. https://github.com/jiaqi/angular-on-java Java web application with Appengine rule Surprisingly there isn't an official way of building Java web application in Bazel, the closest thing is the Appengine rule  and Spring MVC seems to work well with it. 3 Java classes, a JSP and an appengine.xml was all I need. At this point, the server starts well but I got "No ...

Project Euler 359 - Hilbert's New Hotel

Problem 359, Hilbert's new Hotel Had no idea where to start at all, the only thing I could was to write a small program to print out first hundred numbers in naive way. [ 1 , 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91] [ 2 , 7, 9, 16, 20, 29, 35, 46, 54, 67, 77, 92] [ 4 , 5, 11, 14, 22, 27, 37, 44, 56, 65, 79, 90] [ 8 , 17, 19, 30, 34, 47, 53, 68, 76, 93] [ 12 , 13, 23, 26, 38, 43, 57, 64, 80, 89] [ 18 , 31, 33, 48, 52, 69, 75, 94] [ 24 , 25, 39, 42, 58, 63, 81, 88] [ 32 , 49, 51, 70, 74, 95] [ 40 , 41, 59, 62, 82, 87] [ 50 , 71, 73, 96, 100] [ 60 , 61, 83, 86] [ 72 , 97, 99] [ 84 , 85] [ 98 ] As you may see, the result is very interesting. The numbers on the first column seems to be ( row + 1 ) / 2 * ( row / 2 ) * 2. Note that row/2*2 != row since all operations are integer operations. If we calculate the delta values between consecutive numbers in each row, we got 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 5 , 2 , 7, 4 , 9, 6 ,11, 8 ,13, 10 , 15, ...

Project Euler problem 220 - Heighway Dragon

This document goes through a Java solution for Project Euler problem 220 . If you want to achieve the pleasure of solving the unfamiliarity and you don't have a solution yet, PLEASE STOP READING UNTIL YOU FIND A SOLUTION. Problem 220 is to tell the coordinate after a given large number of steps in a Dragon Curve . The first thing came to my mind, is to DFS traverse a 50 level tree by 10^12 steps, during which it keeps track of a direction and a coordinate. Roughly estimate, this solution takes a 50 level recursion, which isn't horrible, and 10^12 switch/case calls. Written by a lazy and irresponsible Java engineer, this solution vaguely looks like: Traveler traveler = new Traveler(new Coordinate(0, 0), Direction.UP); void main() { try { traverse("Fa", 0); } catch (TerminationSignal signal) { print signal; } } void traverse(String plan, int level) { foreach(char c:plan) { switch(c) { case 'F': traveler.stepForward(); break; ca...

Reflection is expensive? Illusion!

Reflection invocation is a little bit more expensive comparing to the direct call, but it wasn't very slow and it's not slow at all now in JDK 6. It is looking up by name that takes long time. Operation 2000/11 (probably jdk 1.3.1) 2003/1 (probably jdk 1.3.1) 2004/10 (jdk1.4.2_03) 2007/2 (jdk1.6.0_b105) 100,000 regular calls 2664ms 281ms 203ms 78ms 100,000 reflection calls without lookup 4216ms 297ms 250ms 78ms 100,000 reflection calls with lookup 45505ms 938ms 562ms 203ms 1,000,000 regular calls 27840ms 2578ms 1828ms 594ms 1,000,000 reflection calls without lookup 43863ms 2782ms 2485ms 641ms 1,000,000 reflection calls with lookup 47097ms 5453ms 9343ms 1984ms 10,000,000 regular calls - 25906ms 17766ms 5063ms 10,000,000 reflection calls without lookup - 27891ms 24813ms 6141ms 10,000,000 reflection calls with lookup - 54843ms 93611ms 20093ms Link: What are the performance costs involved in Java reflection? E.g., looking up a method by name and then invoking it.

4-states state machine for CSV parsing

Parsing CSV file is easy, it's nothing but splitting string with comma delimiter, which can be easily done in Java... The first thing came to my mind when I'm about to parse CSV file in Java is just like that. Now, reality is that following examples are all possible valid lines in a CSV file 1,Bender 2,"Bender" 3,"Bender, Bending" 4,"Ben""d""er" 5, Ben"der 6, Ben""der Line 7 might be arguable but anyway, two basic rules are If there's comma in field, use double quot to wrap field, otherwise double quot wrapper isn't required. Inside double quot, double quot is used to escape double quot. Suddenly the problem is complicated to something more than string splitting, however it can be simplified into a finite state machine with 4 states. States: 1. Ready for new field (initial state) 2. Field without double quot 3. Field with double quot 4. Escaping or end of double quot Transitions *Direction*|*Condition*|*Ac...