Friday, August 12, 2016

TIL (Today I Learned) - various important things for Software Development

  1. When resetting a whole column on a relational database table, dropping/adding the column might be better than running an UPDATE. In my case, I had to update two columns to NULL from a table with 35 million rows.
  2. OAuth 1. I had to support a third party to use our REST service that uses OAuth 1.0a. In only a couple of days, I had to learn how this spec works and write up the details needed by the 3rd party to write a client. I'm glad that today there's plenty of resources for this complicated spec; I can imagine that this would be very troublesome to understand in the past. At least a former colleague had a lot of issues when he worked with Facebook OAuth in the past. This blog post really helped me out in quickly understanding OAuth.
  3. Monitor HTTP traffic of java programs via Fiddler. With networking setups, it is often easier said than done. By experience, I knew I would be in trouble with how to setup the SSL certs, force java to to use a proxy server, etc. Surprisingly, this is actually easy to do. I use this guide and was able to set it up in 5 mins!

Thursday, August 13, 2015

Print Plain SQL Select Statement in Slick 3.0.0


If you were searching the net on how to print the extremely useful plain SQL select statement when using Slick 3.0.0 queries; Then it's your lucky day.

Here's a working example wherein AccountActivityHistory_00Table is my table.

  val q0 = Replica.AccountActivityHistory_00Table.filter(row => (row.DateCreated >= start && row.DateCreated <= end) || (row.DateModified >= start && row.DateModified <= end))
  println(q0.result.statements)


It's in the result field, as in result.statements, this is an Iterable of Strings.

As of this writing the example from Typesafe isn't updated yet to slick 3.0.0 release:
https://github.com/typesafehub/activator-hello-slick/blob/slick-3.0/src/main/scala/HelloSlick.scala

And the upgrade guide doesn't tell us anything either:
http://slick.typesafe.com/doc/3.0.0/upgrade.html

Wednesday, June 4, 2014

Workstation Automation I: Startup Tomboy Notes

I use Tomboy Notes as my paperless way to track my working hours for almost a year now. Everyday, when Ubuntu finishes booting up, the first thing I do is to start two applications: Firefox and Tomboy Notes.

Screenshot of my May 12, 2014 worklog
Once I Tomboy notes starts; my next step is to "Create New Note", then type in the date today as the title of my work log for the rest of the day. And last, put in my time-in.



This only took my around only 10 to 15 seconds of my time everyday. Small amount of time; however, when you add the numbers for a year, it adds up to an 1 hour (262 Working days - ~20 holidays * 15 sec) + the precious cognitive load when you do this + thinking about "why can't I automate this".

Thus I finally decided to automate this and I was able to reduce the time spent to 5 sec + work satisfaction.

Here are the steps I did: By the way, I'm using Ubuntu 11.10
1.  Use "Startup Application Preferences", add in the applications you want to start automatically. In my case, Firefox and Tomboy.


2. Adding firefox is easy. However, for tomboy I need to use xargs to pass in the date today as a parameter. And for this work, I used an sh script.
#!/bin/sh

date "+%B %d, %Y" | xargs -0 tomboy --new-note
3. Learning to use the date command should be easy. xargs however is little more difficult. Fortunately, this page explained it well.

4. Save this script as tomboy.sh, then make sure that it can be executable at boot time:
chmod 777 tomboy.sh
5. Enjoy!

Friday, January 17, 2014

Me doing a talk about Eclipse at Philippine Tech Hackers meetup

Me doing a presentation for phacker's hackmakati, topic "Editors & IDEs". My presentation was for Eclipse.



It's been too long since I did a presentation like this, too long that trees can already talk. Well, specifically 2 years already.

The audience was a mixed, rubyists, groovyists, perlites (or stringmaster, as suggested by a good friend/buddy from ##programming), a few droids & even non-programmers. I hope these folks didn't get bored with me speaking in English. Yep, there were non-tagalog folks so I had to talk in English - something I did not anticipate, because the last time I went to phackers meetup (2 months ago), we were very few & all filipino.

The other talks (vim, eclipse, sublime) were great! their presentation stacks were a lot better than mine :|. At the very least, I got to show this cool image:



Lesson learned: my english & confidence skills (if they were existent) went really bad. On the positive side, it was a great experience, exp that you do not get by everyday. Thank you Philippine Tech Hackers!

Link to my presentation slides.

/* also thanks to my good friend Fuji for lending me his laptop */

Thursday, November 28, 2013

Lisp, A Brave New World

Well, at least for me, Lisp is a "Brave new world"


I finally got the urge to learn Lisp after reading Paul Grahams "The Blub Paradox".
I'm surprised to say, "Nothing beats the feeling of accomplishing Hello World".
The last time I felt this was with C (using turbo c). Not sure with Java's hello world though XD.


Achieving this is just 2 steps:
1. Download 'Lisp in a box' from http://common-lisp.net/project/lispbox/ and unzip.
2. Run the launcher and type "Hello World".

Friday, November 8, 2013

A long shot, JTyrian



 It has been years since I have done game programming. Back then it was J2ME or with Swing using a lot of JPanel. I did attempt to learn Java 3D or those popular game programming libraries like JMonkeyEngine, but nah, all I came up was HelloWorld.

But the wheel of time has turned & now there's LibGDX. It's great, IMO, documentation for beginners is not so great. Luckily I found this blog that has a series of tutorials.

So far so good, I've made the program work up to post #3. The source code is @ revision 6 & is open source here.

Thursday, November 7, 2013

Another primitive File I/O gotcha!

A part of the feature I'm writing is to load multiple regex from a file. The file is simple, each line represents a regular expression.

\b(cat|kitten)\b
\b(dog|curr)\b
\b(buffalo|tamaraw)\b

Now I needed to test my method that uses these regex:

public class Animals {
private List regexes;
public Animals(List regexes) {
this.regexes = regexes;
}
public String detectAnimal(String input) {
// for each regex, create a java.util.Pattern and at the first match, return Matcher.group()
}
}

The test data for animals is around 1 million that is stored in DB. For me to be able to test this is to use Groovy's DataSet to loop through the test data. For each iteration, run the detectAnimal method and save to DB. Easy enough.

Now here's the big Gotcha. Below is the Groovy code I used to build my List of regexes. Note that I used this code only for testing purposes.

File file = new File(Animals.class.getResource(Animals.DEFAULT_CONFIG_FILE).getFile()) Animals animal = new Animal(Arrays.asList(file.getText().split('\n')))

A character '\r' was not removed from the resulting list of regex which looks like this:
\b(cat|kitten)\b\r
\b(dog|curr)\b\r
\b(buffalo|tamaraw)\b
This essentially breaks all the regexes except the last one: \b(buffalo|tamaraw)\b Debugging this (I used Eclipse) was tricky since '\r' or carriage return is non-printable character.

To make this much more complicated, in the Java code, I have already written the code that loads the config file which uses Apache Commons IO FileUtils. This code was located in a Project wite Utils class which uses a java static block to load config files. Which, honestly, I don't like. Since using static blocks is a bad practice.

Honestly, this might have clouded my judgement of not using this Utils class. Also since Groovy is a shiny new language, so I was excited in using the new & improved File class. But apparently, Groovy's File class does not have readLines as opposed to FileUtils from Apache Commons.

TODO, make this post more readable