Circular buffer in Go

I’m proud of this one too. No peaking. I like how go let’s you do this kind of stuff in a very nice way. package circular import "fmt" //TestVersion testVersion const TestVersion = 1 //Buffer buffer type type Buffer struct { buffer []byte full int size int s, e int } //NewBuffer creates a new Buffer func NewBuffer(size int) *Buffer { return &Buffer{buffer: make([]byte, size), s: 0, e: 0, size: size, full: 0} } //ReadByte reads a byte from b Buffer func (b *Buffer) ReadByte() (byte, error) { if b.full == 0 { return 0, fmt.Errorf("Danger Will Robinson: %s", b) } readByte := b.buffer[b.s] b.s = (b.s + 1) % b.size b.full-- return readByte, nil } //WriteByte writes c byte to the buffer func (b *Buffer) WriteByte(c byte) error { if b.full+1 > b.size { return fmt.Errorf("Danger Will Robinson: %s", b) } b.buffer[b.e] = c b.e = (b.e + 1) % b.size b.full++ return nil } //Overwrite overwrites the oldest byte in Buffer func (b *Buffer) Overwrite(c byte) { b.buffer[b.s] = c b.s = (b.s + 1) % b.size } //Reset resets the buffer func (b *Buffer) Reset() { *b = *NewBuffer(b.size) } func (b *Buffer) String() string { return fmt.Sprintf("Buffer: %d, %d, %d, %d", b.buffer, b.s, b.e, b.size) }

October 15, 2015 · 1 min · hannibal

Jenkins Job DSL and Groovy goodness

Hi Folks. Ever used Job DSL plugin for Jenkins? What is that you say? Well, it’s TEH most awesome plug-in for Jenkins to have, because you can CODE your job configuration and put it under source control. Today, however, I’m not going to write about that because the tutorials on Jenkins JOB DSL are very extensive and very well done. Anyone can pick them up. Today, I would like to write about a part of it which is even more interesting. And that is, extracting re-occurring parts in your job configurations. ...

October 15, 2015 · 4 min · hannibal

DataMunger Kata with Go

Quickly wrote up the Data Munger code kata in Go. Next time, I want better abstractions. And a way to select columns based on their header data. For now, this is not bad. package main import ( "bufio" "fmt" "log" "math" "os" "regexp" "strconv" "strings" ) //Data which is Data type Data struct { columnName string compareOne float64 compareTwo float64 } func main() { // datas := []Data{WeatherData{}, FootballData{}} fmt.Println("Minimum weather data:", GetDataMinimumDiff("weather.dat", , 1, 2)) fmt.Println("Minimum football data:", GetDataMinimumDiff("football.dat", 1, 6, 7)) } //GetDataMinimumDiff gathers data from file to fill up Columns. func GetDataMinimumDiff(filename string, nameColumn int, compareColOne int, compareColTwo int) Data { data := Data{} minimum := math.MaxFloat64 readLines := ReadFile(filename) for _, value := range readLines { valueArrays := strings.Split(value, ",") name := valueArrays[nameColumn] trimmedFirst, _ := strconv.ParseFloat(valueArrays[compareColOne], 64) trimmedSecond, _ := strconv.ParseFloat(valueArrays[compareColTwo], 64) diff := trimmedFirst - trimmedSecond diff = math.Abs(diff) if diff <= minimum { minimum = diff data.columnName = name data.compareOne = trimmedFirst data.compareTwo = trimmedSecond } } return data } //ReadFile reads lines from a file and gives back a string array which contains the lines. func ReadFile(fileName string) (fileLines []string) { file, err := os.Open(fileName) if err != nil { log.Fatal(err) } defer file.Close() scanner := bufio.NewScanner(file) //Skipping the first line which is the header. scanner.Scan() for scanner.Scan() { line := scanner.Text() re := regexp.MustCompile("\\w+") lines := re.FindAllString(line, -1) if len(lines) > { fileLines = append(fileLines, strings.Join(lines, ",")) } } if err := scanner.Err(); err != nil { log.Fatal(err) } return }

October 4, 2015 · 2 min · hannibal

How to Aggregate Tests with Jenkins with Aggregate Plugin on non-relating jobs

Hello folks. Today, I would like to talk about something I came in contact with, and was hard to find a proper answer / solution for it. So I’m writing this down to document my findings. Like the title says, this is about aggregating test result with Jenkins, using the plug-in provided. If you, like me, have a pipeline structure which do not work on the same artifact, but do have a upstream-downstream relationship, you will have a hard time configuring and making Aggregation work. So here is how, I fixed the issue. ...

October 2, 2015 · 4 min · hannibal

I used to have great ideas on the toilet, but I no longer do.

I used to have great ideas on the toilet, but I no longer do. And I would like to reflect on that. So this is not going to be a technical post, rather some ramblings. I already had a post similar to this one, but I failed to follow up on it, and now I’m re-visiting the question. With technology on the rise, embedded systems, chips, augmented biology and information being available at our fingertips, I have but one concern. I don’t want to sound like an old guy reflecting on history, that now everything is changing and that we need to have a sight on the past and bla bla bla. I do have one valid concern though. We are in danger of loosing ourselves. ...

September 7, 2015 · 4 min · hannibal

Sieve of Eratosthenes in Go

I’m pretty proud of this one as well. package sieve //Sieve Uses the Sieve of Eratosthenes to calculate primes to a certain limit func Sieve(limit int) []int { var listOfPrimes []int markers := make([]bool, limit) for i := 2; i < limit; i++ { if !markers[i] { for j := i + i; j < limit; j += i { markers[j] = true } listOfPrimes = append(listOfPrimes, i) } } return listOfPrimes }

July 30, 2015 · 1 min · hannibal

Quick Tip for Debugging Headless Locally

If you are installing something with Packer and you have Headless enabled(and you are lazy and don’t want to switch it off), it gets difficult, to see output. Especially on a windows install the Answer File / Unattended install can be like => Waiting for SSH. for about an hour or two! If you are doing this locally fret not. Just start VirtualBox, and watch the Preview section which will display the current state even if it’s a headless install! ...

July 22, 2015 · 1 min · hannibal

Converting numbers into string representations

I quiet like this one. My first go program snippet without any peaking or googling. I’m proud, though it could be improved with a bit of struct magic and such and such. And it only counts ’till 1000. package main import "fmt" var words = map[int]string{1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine", 10: "ten", 11: "eleven", 12: "twelve", 13: "thirteen", 14: "fourteen", 15: "fifteen", 16: "sixteen", 17: "seventeen", 18: "eighteen", 19: "nineteen", 20: "twenty", 30: "thirty", 40: "forty", 50: "fifty", 60: "sixty", 70: "seventy", 80: "eighty", 90: "ninety"} // CountLetters count the letters in a long string number representation func CountLetters(limit int) { myLongNumberString := "" for i := 1; i <= limit; i++ { addLettersToMyString(&myLongNumberString, i) } // fmt.Println("1-9 written with letters is: ", len(myLongNumberString)) fmt.Println("The string is:", myLongNumberString) fmt.Println("Lenght of string is:", len(myLongNumberString)) } func addLettersToMyString(myString *string, num int) { if num < 20 { *myString += words[num] } if num >= 20 && num < 100 { *myString += countMiddle(num) } if num >= 100 && num < 1000 { hundred, tenth := countHundred(num) if tenth == { *myString += hundred } else if tenth >= 11 && tenth < 20 { *myString += hundred + "and" + words[tenth] } else { *myString += hundred + "and" + countMiddle(tenth) } } if num == 1000 { *myString += "onethousand" } } func countMiddle(num int) string { minues := num % 10 num -= minues return words[num] + words[minues] } func countHundred(num int) (string, int) { minues := num % 100 num -= minues return (words[(num/100)] + "hundred"), minues }

July 19, 2015 · 2 min · hannibal

Selenium Testing with Packer and Vagrant

So, recently, the tester team talked to me, that their build takes too long, and why is that? A quick look at their configuration and build scripts showed me, that they are actually using a vagrant box, which never gets destroyed or re-started at least. To remedy this problem, I came up with the following solution. ...

July 16, 2015 · 7 min · hannibal

Bitwise & Operator

The first, and only time so far, that I got to use the bitwise & operator. I enjoyed doing so!! And of course from now on, I’ll be looking for more opportunities to (ab)use it. package secret import "sort" const REVERSE = 16 func Handshake(code int) []string { // binary_rep := convertDecimalToBinary(code) if code < { return nil } secret_map := map[int]string { 1: "wink", 2: "double blink", 4: "close your eyes", 8: "jump", } var keys []int for k := range secret_map { keys = append(keys, k) } // To make sure iteration is always in the same order. sort.Ints(keys) code_array := make([]string, ) for _, key := range keys { if code & key == key { code_array = append(code_array, secret_map[key]) } } if code & REVERSE == REVERSE { code_array = reverse_array(code_array) } return code_array } func reverse_array (array_to_reverse []string) []string { for i, j := , len(array_to_reverse) -1 ; i < j; i, j = i + 1, j - 1 { array_to_reverse[i], array_to_reverse[j] = array_to_reverse[j], array_to_reverse[i] } return array_to_reverse }

July 15, 2015 · 1 min · hannibal