Thursday, 18 July 2019

Key bindings in linux for spotify

Had issues with my keyboard and the play button not working with spotify... (this was my work one).

So if you're play button is not working with spotify, then try this guys suggestion,

Sunday, 16 December 2018

Videos not playing in opera on linux

So, it's no secret i've loved opera since the day i first installed it, I think i joined the opera revolution around the 3.62 mark in 1999 apparently! (man i'm old). Anyhow - read up more about the opera history here

Since i'm this fancy new software developer type person,  i have it installed as my browser of choice at work, but we run linux here since the platforms we use are linux as well. I'm not complaining mind you, i like linux too!

But the support for playing videos is lacking :( (wuh waaahhh), I believe this is due to the license with Mpeg's and not being able to distribute the codec with the program.
From this post it appears that Opera doesn't have the rights to distribute the codec with the program. however! Google does (cos they probably have deeper pockets right?)

Anyhow - very easy to fix, we simply copy over the top of the that we have in our opera directory with one from the google chromium browser :)

sudo cp /usr/lib/chromium-browser/ /usr/lib/x86_64-linux-gnu/opera/

Restart the browser and things should be all good again :)

Tuesday, 4 December 2018

Measuring function time in linux using C

Measuring Time 

So in my job recently i had to time how long it took for a module to be plugged in before that module became "ready" ... the answer was 46 seconds.. but some careful polling changes and a change how firmware was loaded mean't that got chopped in half almost to 26 seconds!

But that's not the point, the point was how did i do such timing.

The original way i found was to use to use clock(). Clock returns an approximation of the processor time used by the program.
Using the following code..

#include <time.h>
#include <stdio.h> 
int main() 
   clock_t start, stop, length; 
   start = clock(); 
   stop = clock(); 

   length = (double) stop - start / CLOCKS_PER_SEC; 

   printf("Time for your function was %ld\n", length); 

Now, this works mind you! but there's a gotchya here, oh yes, you saw that coming didn't you.. go on - admit it..
I probably didn't read the manual (RTFM!) for clock properly.... because the times i was getting back for my function calling didn't make sense compared to time stamped outputs!?
Clock() is returning time used by the program... i know - that didn't make sense, but it does if you mention the word threading.
See i was in a multi-threaded enviroment. So while this was timing my function in this "program" (ie thread!) my "program" had been running differently (in time) from other functions (ie threads!) that made up the entired module "ready" process.

Take 2. 

So instead, i used clock_gettime() with CLOCK_MONOTONIC.
This gave me a much better accuracy across my module insertion process, and started giving me numbers that made sense with other time stamped debug statements.

So.. using the following code,
#include <time.h>
#include <stdio.h>

/* Convert the timespec struct into a seconds value
static double TimeToSeconds(struct timespec* ts)
   return (double)ts->tv_sec + (double)ts->tv_nsec / 1000000000.0;

int main()
    struct timespec start, stop;
    double time_spent = 0;
    clock_gettime(CLOCK_MONOTONIC, &start);


    clock_gettime(CLOCK_MONOTONIC, &stop);
    time_spent = TimeToSeconds(&stop) - TimeToSeconds(&start);
    printf("your function time was %ld\n", time_spent);


Hopefully that helps someone with timing issues in threads etc.. lemme know if it works for you :)

Lastly - so i don't forget (possibly)... time stamping..
I'm just gonna post the code

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf("Time Stamp is [%d:%d:%d]\n", 
        timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);

All good fun :)

Graduated!.... now what.

So you've graduated.... now what.

So that time came and went where i finished up my degree and paraded in front of my family across the stage to shake the mans hand that had never met me and get that piece of paper that now says what i always wanted to say... I'm qualified

Qualified.. I find it strange term. Its a term that says to people you know what we want you to know. But when push comes to shove..... do you?
I think the answer to that is much like the exam post, you go to an interview, the interviewer asks you the questions that we all know the answers too. So i guess... Rope interviewing? hah...

So now i've been released into the real world, to find my place, to make my 'mark' as the educators have instructed us. We have given you all the tools... we have given you the best possible start.
Sometimes it feels like i got shown to the boat, given some wood, nails, hammer and saw, and pushed off while waving goodbye i look down to find all the holes in the bottom now appearing.

Monday, 3 October 2016

Group Assignments, bad learning.

So... taking this great course (INFO263) and we are going learn up to 5 different coding languages... Just a pity that we never really get taught them.

The assignment for this course is worth like 40%, (Woah!), and it's a group assignment (Groan).

I've always thought that group assignments would be great, Really - i did... past tense..
I thought that it was a bit conveyance of what (the uni calls) the real world is all about, after all it's not like we get stuck in the corner at work and told you have 2 hours to complete this task in silence.
No - we work in teams, in groups, in lots of things like that.

However - what the real world has and our "group projects" don't have is a manager.. a boss... el captaino... big honcho .. etc etc...
This makes the real world work better, as when your fellow group member maybe not putting as much effort into the assignment as they oughta be, then in the real world.. the boss gets angry.. then turns green and smashes up the place.
Oh - wait, thats' a different boss...

Anyways - that is my point of difference is, as grumpy as you can get with different members of your group - that's all it is. Grumpiness, they don't care, all of a sudden they get a passing mark for their assignment and they've done diddly squat .. in kiwi speak - that's nothing. literally.

So anyhow - back to the topic. 5 coding languages, HTML, CSS, PHP, MYSQL, Javascript. The lecturer seems to be in his own little world with this tho, because its an INFO course, Majority of students taking it are commerce. Meaning ... it's all about the money money money (admit it - you sang that in your head didn't you).

So when he's showing us javascript on the power point, and saying (and i quote).. "I don't know why you would need all this math stuff on a business website"... its because not everything in this world is related to commerce.. thats why.
There are other reasons why you can use php other than to build a bloody shopping cart.

Anyhow - learn't more in two days of Code Academy (seriously good) than in 5 weeks of lectures, and then to top it off - the exam was all about design or proposing a solution to a website... none of which was done in class.... gah - the horror... the shame..

Anyhow - gotta run to the next class.... later gators!

Monday, 6 June 2016

Exam rants

Exams... what are they good for... really?

I realize that the academic world uses the exam process as a measure for how much information was squeezed into your brain in the last X period of time.

So they sit you down, give you a piece of paper that you quietly download your cranium onto in the hopes that in brief period of time that you are given a grade that means you know or you don't.

The problem is that.

Lets say you're like me, that sometimes a subject is interesting and that you find it invigorating to learn about it, and hence your grey matter soaks it up like a sponge to a puddle of water.
But - the person next to me finds it totally the opposite, dreary and mind numbingly aweful, and hence their brain refuses.. no matter how much they try.. to accept that this is going to be useful, and therefor prehaps you should learn it.
So - exam comes.. me.. i do really well, thats great.. person next to me does... ok - still manages to pass.

10 years pass by... (watch the tumble weeds go by)...
We both go for the same job, ohh look says mr employer... i see that you sat a course on molecular biophysics, just what we need, can you comment on ....
And here is my problem, i haven't used molecular biophysics in 10 years, i've been a truck driver... but yet - it says on my paper.. i sat an exam - and i got an X for it. At this point, i feel my knowledge is about the same as that person who was next to me....

I know - the argument here is that i was going for a job that needed that.. blah blah blah, but that aside, you see my point.

I bet for most of us, 6 months down the track - the information retained in the membrane isn't at the same level that it was during the 3 hrs that you were hurriedly scratching at a piece of paper for.

So while i can see that an exam is a measure of performance, it just sucks... esp when we get to the real world, and work in fricken TEAMS!

oh well...

Thursday, 2 June 2016

My fav little algorithm

So, just doing a bit more study and i thought i would share my favourite Algorithm so far, count sort.

I like count sort cos it's so easy and it just does it.
Count sort is non-comparison (which means it doesn't compare this number vs this number), and it's stable. This means that things are left in the order in which the appeared in the original list.

So here is how it all goes down, lets work on a list that looks like ..... alist = [2,5,3,0,2,3,0,3]

It has two stages:
Stage 1: Finding the key positions, count the appearance of that number in the list
Stage 2: Using key positions, we place the elements from the input array in the right order in the output array

To find the key positions in our list:
Find the maximum number in our list, in our example this would be.. 5
Now create a list the of [max_num+1] and fill it with zero's... so, in our case that would look like:
index   0, 1, 2, 3, 4, 5, 6
alist = [2, 5 , 3, 0, 2, 3, 0, 3]
kp=    [0, 0, 0, 0, 0, 0, 0] 

So we go thru the list and when we hit a number eg 5 we increment that index value by 1 ie...
index   0, 1, 2, 3, 4, 5, 6, 7
alist = [2, 5 , 3, 0, 2, 3, 0, 3]
kp =    [0, 0, 0, 0, 0, 1, 0] 

So when we have done that, the final array should look like
index   0, 1, 2, 3, 4, 5, 6, 7
alist = [2, 5 , 3, 0, 2, 3, 0, 3]
kp =    [2, 0, 2, 3, 0, 1, 0]

Now we have how often the numbers repeat, we need to use a running sum to organize the array to give us the true key positions we do this by... initializing our sum = 0 and our index = 0
a new c array to keep track of our sums (see what happens with that in a minute)
index    0, 1, 2, 3, 4, 5, 6
kp        [2, 0, 2, 3, 0, 1, 0]
sum = 0
index = 0
idxValue = 2

Put our sum in the array at position index position, each step here we will be incrementing index by 1
how it goes, is we get the value @ index i, switch that value for our current sum, then add the switched value to our sum value. I have tried to show this in one line, reading from left to right
index = 0  idxValue = 2 (kp[index] = 2) sum = 0 kp = [0, 0, 2, 3, 0, 1, 0]  new sum = 0+2
index = 1  idxValue = 0 (kp[index] = 0) sum = 2 kp = [022, 3, 0, 1, 0 new sum = 2+0
index = 2  idxValue = 2 (kp[index] = 2) sum = 2 kp = [022, 3, 0, 1, 0]  new sum = 2+2
index = 3  idxValue = 3 (kp[index] = 3) sum = 4 kp = [0, 2, 2, 4, 0, 1, 0]  new sum = 4+3
index = 4  idxValue = 0 (kp[index] = 0) sum = 7 kp = [0, 2, 2, 4, 0, 1, 0]  new sum = 7+0
index = 5  idxValue = 1 (kp[index] = 1) sum = 7 kp = [2, 0, 2, 4, 7, 7, 0]  new sum = 7+1

We don't go around for the last time in the array

So that gives us the key positions that the numbers should be in

Now we just lookup the value as an index and increment the value in that index
                                                                     index   0, 1, 2, 3, 4, 5, 6, 7
alist[0] = 2, kp[2] = 2 (kp = kp[2] + 1 = 3) output_list = [_, _, 2, _, _, _, _, _ ]
alist[1] = 5, kp[5] = 7 (kp = kp[5] + 1 = 8) output_list = [_, _, _, _, _, _, _, 5 ]
alist[2] = 3, kp[4] = 4 (kp = kp[4] + 1 = 5) output_list = [_, _, _, _, _, 3, _, _ ]
alist[3] = 0, kp[0] = 0 (kp = kp[0] + 1 = 1) output_list = [0, _, _, _, _, _, _, _ ]
alist[4] = 2, kp[2] = 3 (kp = kp[2] + 1 = 4) output_list = [_, _, _, 2, _, _, _, _ ]
alist[5] = 3, kp[3] = 5 (kp = kp[3] + 1 = 6) output_list = [_, _, _, _, _, _, 3, _ ]
alist[6] = 0, kp[0] = 1 (kp = kp[0] + 1 = 2) output_list = [_, 0, _, _, _, _, _, _ ]
alist[7] = 3, kp[3] = 6 (kp = kp[3] + 1 = 7) output_list = [_, _, _, _, 3, _, _, _ ]
                                                             output_list = [0, 0, 2, 2, 3, 3, 3, 5 ]

Notice in this that in red i have highlighted the two indexes that have changed, this is because we already placed a number in the position that was there, so our next number is to the right of that one.

Some code for you to try out..

def key_positions(seq, key):
    array_items = []

    for items in seq:

    # find the max in the array
    max_value = max(array_items)

    # initialise with 0's
    count = [0] * (max_value + 1)

    # count occurances of integers
    for value in array_items:
        count[value] += 1

    # make the initial sum zero
    sum = 0
    print("size of count array = " + str(max_value + 1))
    # iterate over the length of our counting array
    for idx in range(0, len(count)):
        # save the current value we have in the array
        cur_val = count[idx]
        # put the current sum to the index pos in array
        count[idx] = sum
        print("index = {0}: sum = {1} kp = {2} current_value = {3} sum-> {1}+{3}".format(idx, sum, count, cur_val))
        # add the saved value to the sum, and make that the new sum
        sum = sum + cur_val

    print("index = {0}: sum = {1} kp = {2} current_value = {3} sum-> {1}+{3}".format(idx, sum, count, cur_val))

    return count

print(key_positions([2,5,3,0,2,3,0,3], lambda x: x))