Friday, 9 March 2012
Wandering mind
I have no real evidence from this other than observing people that go to the gym. What I mean is someone who goes to the gym and stretches their arms to the limit for example by lifting heavy weights will generally see an increase in the size of their arms the more they do it. I am starting to think that the same may be true of the brain, the more you use it the better it gets.
I take this one step further by saying that because I work a very sedentary job I have to exercise my muscles outside of work, and when I was a youngster working in a factory I used to have to exercise my brain outside of work by learning languages e.t.c.
I think this is a good practice and think that maybe not enough people do this kind of exercise, just a thought.
Wednesday, 29 February 2012
Are we in a democracy?
Democracy is an egalitarian form of government in which all the citizens of a nation together determine public policy, the laws and the actions of their state, requiring that all citizens (meeting certain qualifications) have an equal opportunity to express their opinion.
This got me thinking about whether I live in a democratic country and according to this definition the answer has to be no. I do not have an equal say in what happens, even the person that is supposed to represent me and my best interests isn't the person I voted to represent me, nor could I guarantee that they would have my best interests at heart.
Here's why
The things that are important to me and matter greatly to me don't effect most of the people who work in Westminster. Most have never had the joy of getting electricity via a card that has to be topped up like a pay-as-you-go mobile, or had to make the choice between a new pair of shoes or filling the car with fuel.
I guess what I am trying to say is that the people in charge in Westminster have a different agenda, this is why there are new laws past to protect the already rich with lower inheritance tax and stamp duty e.t.c. and yet they can vote to close libraries and hospitals and post offices because there is another one only 10 miles up the road. This is fine if you drive and can pay for the fuel as the politicians obviously can but for those that can't it may as well be a million miles up the road.
I recently read an interesting article in Dodgem Logic#2 (I know there are now 8 issues I am trying to catch up) that suggested a random selection of the real public should be chosen to govern for a limited time only before swapping, the reasoning is that the decision making politicians would be more inclined to make decisions that are beneficial to the general public as they would soon be rejoining the general public. The only bad point in the article was that it held up Greece as the shining light of this principle and frankly the Greek government balls the whole lot up! The article did raise the point that anarchy isn't a bad word, it simply means without leaders, i.e. everyone is seen as an equal. This sounds a bit like the foundations of Marxism/communism, I know they are different but no one has succeeded in explaining the subtle differences to me yet so I view them as synonymous with each other and anyone who has read Animal Farm (George Orwell, not the porno) will immediately think "...but some are more equal than others". There in lies the rub, it takes a great deal of self control to not want to post yourself as the leader, is it human nature, can it be avoided or are we doomed to always be a people led rather than equals?
My Utopia
My idea of a utopian land would be one in which everyone was free to think/do/say and learn whatever it is they wish to as long as it didn't interfere with someone else. I think this was the general idea behind 1930's pursuit of happiness but I am not sure. Anyway it would be nice if the goal of every human was to better themselves for humanity rather than the acquisition of wealth or power (vaguely remember Capt. Picard saying something similar). It does sound a little far fetched at the moment, but doesn't it also sound good, and something worth aspiring to. I sure as hell think so which is why I view a day in which I haven't learnt something as a day to regret and I don't want to live a life full of regret, who does?
Saturday, 7 January 2012
While I wait for some photos to upload to Google+ I thought I'd jot down an idea that I've been playing with for some time now. But first, don't you think it's great that Google+ lets you upload full resolution pictures, it makes for a wonderful offsite backup facility!
Back to my idea;
For a long time I have worked with people that all have their own views on the way in which code should be formatted, these formatting styles only effect the way the code is viewed and have no effect on the way the code functions because white space is ignored in the languages I have used in industry unlike python which is undoubtedly a good language IMO.
The way I decided to solve this problem was to store metadata along with the code, basically a program sits between the developers IDE and cvs that alters the code the developer writes and stores it in cvs as XML the view of the code is then determined via some xslt that the developer has decided upon.
I extrapolated this idea along the inevitable evolution and decided that by being able to apply metadata to classes, methods even code blocks, if cases e.t.c. I could get the vm that was going to run the code to use this extra information to decide how to priorities the calculations in order to make concurrent programming far simpler.
I'll keep you posted on how it goes this entry was just so that I am forced to make a start on an idea I've had for a good few years now!!! How time gets away from you and these ideas never come to fruition, just like the energy generating compost heap idea I had when I was 12, I still hold out hope for that some day :)
Sunday, 23 October 2011
Single Sign on
This post is a bit of an experiment, rather than like most of my posts where I come up with an idea and document it once complete I am going to blog about my progress getting this to work as I go, a sort of impressionist blog, which is most likely the way they were originally intended to be done.
What is SSO?
The way I see single sign on, which may not be the right way to view it, is that a user in a company has to interact with a multitude of computer systems, each of which requires some form of authentication before access is granted and single sign on means that a user once authenticated in one system will auto-magically be authenticated in the others without being prompted for a username and password or whatever.
The first method that I am looking at is Kerberos, the way I think this works is that a user signs in using whatever means at their disposal (card reader, password or biometric scanner) then that user has a token that is given to any other systems that require authentication.
The premise here is that there is a single secure token provider that every application within the enterprise/corporation then trusts.
JAAS the java way
Being a Java developer on enterprise systems I would have been lucky to have not had to have some experience with using JAAS the java authentication authorisation service. This is a pluggable system like much of the JEE components where any particular vendor can make their own implementation, and as luck would have it there is already a Kerberos version available.
JBoss
I am going to use JBoss (likely version 4 but maybe 7 as I kinda like where that's going) as my application server, I may show using GlassFish too, plus I may also show it being used in tomcat just for kicks.
Step 1
In order to actually test these things out I need to actually have a kerberos system setup, as I tend to use Linux the instructions for setting this up will be linux orientated.
I followed these instructions for installing and setting up a kerberos system.
I rapidly hit a stumbling block with the first pre-requisite of the installation
Before installing the Kerberos server a properly configured DNS server is needed for your domainD'oh! I don't have a DNS server, so I went to get one and set it up. Doing a quick google I found these instructions which are for Ubuntu and as I am using a Debian system thought it would work. I didn't bother following any of the reverse DNS lookup instructions as (a) I am lazy and (b) I want to move on quickly from setting up a dns. The only thing to note at this point is that nslookup gw didn't give any results.
Back to installing Kerberos
So now that dns seems to be installed time to go back to the kerberos instructions.
Everytime I try kinit steve/admin I get
kinit: Cannot resolve network address for KDC in realm "RLJASSOCIATES" while getting initial credentials
I altered the instructions for both dns installation and kerberos installation so that the domain is RLJASSOCIATES.
I found a forum that states;
"each host's IP address must reverse-resolve the canonical name."so I guess it's time to go back to the DNS setup instructions once more, damn it serves me right for being lazy in the first place!
Ok the DNS setup doesn't work right off the bat but I did find a nice little utility to test called named-checkzone which I can use to check the zone files for correctness. Needless to say they weren't. Well I've been over those DNS instructions many times now so I can be absolutely sure my setup matches and guess what...they don't work so I guess they're crap!
I think there might have been a missing entry in the RLJASSOCIATES.db file so I added these lines
ns IN A 192.168.1.34
@ IN NS ns.RLJASSOCIATES
and that seems to allow nslookup gw to work.
however running sudo kinit steve/admin still results in the error
kinit: Cannot resolve network address for KDC in realm "RLJASSOCIATES" while getting initial credentialsSetting up krb5.conf
I remembered that after the first fault with the kerberos setup I uninstalled it, then when I re-installed it I was never asked the same questions about default domains once the installation was complete, this may have been the route cause of this last failure.
Essentially there is a file called /etc/krb5.conf that seems to list settings that are relevant for different domains, so I took a guess at what to write and put this in;
RLJASSOCIATES = {I have no idea if this is correct or not apart from when I ran this command kinit steve/admin instead of it failing with the usual error message shown above it prompted for the password, which I typed in and ... nothing happened which still means no error :)
kdc = rjohnson-acer.RLJASSOCIATES
admin_server = rjohnson-acer.RLJASSOCIATES
default_domain = RLJASSOCIATES
}
The next fault to get over in the kerberos instructions is
#> kinit steve@RLJASSOCIATESOnce again I have no idea what is causing this to happen, so on to professor google.
kinit: Client not found in Kerberos database while getting initial credentials
Not actually sure this is an error as the list of principals is now
kadmin: list_principals
K/M@RLJASSOCIATESThe big issue is that it says I am not entering the correct password for kadmin/admin and yet I know damn well what I entered so this might be an issue with the re-installation I tried earlier ooops!
kadmin/admin@RLJASSOCIATES
kadmin/changepw@RLJASSOCIATES
kadmin/history@RLJASSOCIATES
kadmin/rjohnson-acer@RLJASSOCIATES
krbtgt/RLJASSOCIATES@RLJASSOCIATES
steve/admin@RLJASSOCIATES
JBoss
I am going to start with a vanilla installation of jboss-4.2.3.GA, simply because I wanted to start with a version 4 and this was the latest 4 I found on jboss community site, don't worry I'll show the same kerberos stuff on jboss-7.0.2, I would want to use 7.1.0 as this is the version where remote ejb calls are supported but it doesn't exist yet tee hee :)
The current setup for security on this app is;
<authentication>
<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
<module-option name="usersProperties">props/jmx-console-users.properties</module-option>
<module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
</login-module>
</authentication>
</application-policy>
So in order to use the same login that I want to use for kerberos I've created a user called steve and I've added that to the props/jmx-console-users.properties.
So I changed the login-config.xml to read
<application-policy name="jmx-console">
<authentication>
<login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required">
<module-option name="debug">true</module-option>
</login-module>
</authentication>
</application-policy>
Hooray
It looks like I was successful, the usual prompt popped up so I logged in as Steve and hey presto got this in the log
10:38:00,978 INFO [STDOUT] Acquire TGT using AS Exchange
10:38:01,056 INFO [STDOUT] principal is steve@RLJASSOCIATES
10:38:01,057 INFO [STDOUT] EncryptionKey: keyType=3 keyBytes (hex dump)=0000: FE 75 E3 7A 1A 29 7C A8
10:38:01,057 INFO [STDOUT] EncryptionKey: keyType=1 keyBytes (hex dump)=0000: FE 75 E3 7A 1A 29 7C A8
10:38:01,057 INFO [STDOUT] EncryptionKey: keyType=23 keyBytes (hex dump)=0000: 3D 8C CB 99 50 CC 9A 13 69 12 6D AA BF E7 C6 4E =...P...i.m....N
10:38:01,058 INFO [STDOUT] EncryptionKey: keyType=16 keyBytes (hex dump)=0000: 79 75 9B A7 67 EC BF 2F 7A 32 C1 C8 9E AB 57 0D yu..g../z2....W.
0010: 5B B3 3D D0 64 F4 34 4F
10:38:01,058 INFO [STDOUT] EncryptionKey: keyType=17 keyBytes (hex dump)=0000: 87 17 D5 4C 61 35 48 4D D4 8B 14 58 91 E5 E8 AE ...La5HM...X....
10:38:01,078 INFO [STDOUT] Commit Succeeded
Actually do SSO
- a way of automatically sending a username to do the login, this wouldn't just be a username but would need to be the TGT.
- a way to set the Subject to the user signing in, currently we only have the principal.
Done...I think
Not sure if this is done now but it seems to be which is strange as I've set virtually nothing up?
login-config.xml
<application-policy name="jmx-console">
<authentication>
<login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required">
<module-option name="debug">true</module-option>
<module-option name="useTicketCache">true</module-option>
<module-option name="doNotPrompt">false</module-option>
<module-option name="useKeyTab">true</module-option>
<module-option name="useKeyTab">true</module-option>
</login-module>
</authentication>
</application-policy>
But is it SSO
The simple truth is I don't know at the moment I haven't tested it and this is because I am not sure how to test it, so lets look back at square 1 what was the criteria;
- not be able to access resource (/jmx-console) if I am not authenticated.
- authenticate via the KDC.
- once authenticated don't get prompted for authentication again.
One More Piece of the puzzle
I've not had much time to look into all of this stuff at the moment and tidy up this rambling blog post, this link looks like it'll be quite useful.
http://download.oracle.com/javase/1.4.2/docs/guide/security/jgss/single-signon.html
http://download.oracle.com/javase/1.5.0/docs/guide/security/jgss/tutorials/JGSSvsJSSE.html
http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html
Thursday, 13 October 2011
Exceptions (again)
This is the fairest assessment that I think I've ever made of exception (specific to java, possibly).
Exceptions are a very good way of having more than one return type on call. Originally they were invented so that constructors could inform the caller of something rather than having to have a special "error" type of every class.
Handling exceptions early isn't always the best idea, code where an exception occurs may not be best suited to remedy it as the lowest level tends to be a generic handler of something.
Take for example the File API, if a file can't be found it is highly unlikely that the File object should be made to handle every failure adequately. Maybe it should simply return a null, but how then do we know the file couldn't be found rather than it couldn't be read? These 2 scenarios should be handled in very different ways (1) file not found: get the user to pick another (2) read error: try again X times then fail. Scenario 1 requires user interaction so bubble the exception up through the code so the user can pick another file.
There is also an argument against interpreting an exception at a lower level and sending specific "error" style replies up the chain.
- Multiple levels in the call stack will have to handle error return states.
- The returned objects would each have to have an error version created i.e.
public A getA() public B doB() public C getC()each return type A, B, C would have to have an error version created, plus each call would have to handle this. - There is already an adequate mechanism to repeatedly send exceptional responses up the stack regardless of method return type.
- Sometimes it is impractical to escape from a normal flow and return a meaningful error, the use of try catch blocks greatly simplifies this.
Also
Also the idea that exceptions are errors is flawed, exceptions are an
exceptional flow, the clearest use of this fact I think is the Thread
usage of InterruptedException. When things are running concurrently (even
pseudo concurrently) a message should be sent at any point during the flow
and the way to handle this is with exceptions.
The problem is that with legacy old shit (and I mean it is shit) does
the biggest sin of all which is to catch ALL general exceptions and simply
throw it without adding a cause to it. No attempt is made to handle the
exception where it is relevant which means the final resting place of a
thrown exception is the client which is why some people believe that the client
shouldn't handle them because 9 times in 10 the client is the wrong place
to handle them.
Sunday, 19 June 2011
IT Confidence
Developer confidence / arrogance
I had a sudden realisation about why most developers come across as arrogant. Ok, so in a lot of cases it is because they are, but I am always accused of being arrogant (mostly by my wife) so decided to look into why that was.During a developers career they are always trying to sell their solution to a problem, usually without any evidence, the manager in charge has to be convinced that your idea is the correct solution over and above all other solutions in order for you to win the right to implement it. I think this is where it all stems from you have to have ultimate confidence in an idea and it is this confidence that could be observed as arrogance.
Friday, 3 June 2011
Religion
Things I noted were that religion is a very good form of control, it uses some clever psychological tricks to reinforce its ideals such as chanting and mob vilification. It is a commonly understood fact that people when acting as a group rather than as free thinking individuals are capable of vilifying something that is different from themselves for the simple reason that its not them. Another time when this psychological trick was used was by Adolf Hitler when he managed to turn a country against a race via clever propaganda and the mob reflex of human beings.
By acting as a mob in this way a persons individuality is damaged, keep it up for long enough and it is destroyed, when a persons individuality is destroyed they then become automatons, very susceptible to suggestion almost regardless of the nonsense of the suggestion.
I used to attend church as a child however I was lucky enough to have very intelligent and sensible parents that neither wanted to push me away from religion or enforce their own doctrine on me. They wanted me to experience religion and for me to make up my own mind, this is all that can be done if a child is to retain their individuality and it encouraged independent thought and reinforced the belief that I should question everything. I don't think I was liked in church for the fact that I would ask questions and follow them through to their logical conclusion without prejudice, malice or preconceptions. I will always remember one particular discrepancy in the logic of the bible “if god forgives all sins then why does hell exist...it's for people that have committed sins...which are presumably forgiven so they no longer have sin...they will always have sin...so what does it mean to be forgiven...it means your sin is removed...so god forgives all sin and it is removed, so why does hell exist...it doesn't work like that...so god doesn't forgive all sin?...yes he does...so hell is empty...no hell keeps all sinners e.t.c. Keep following these arguments through to their conclusion again without emotion and you come to a few plausible conclusions 1. that religion is full of discrepancies, flaws and illogical leaps that are nonsensical. 2. you need to have a leap of faith!
A leap of faith, this is religious parlance for ignoring what you know to be true in favour of mob rules.
A nice quote in Dracula is something like "faith means convincing yourself of something you know not to be true actually is." - I'll try and find the actual quote later
It is this “leap of faith” idea that is very clever when it comes to control, as explained before when under the control of mob mentality you freely adhere to the reality that is put before you and the more ridiculous it becomes the more likely you are to reject it, but not if you are made to bring yourself into question which is where the “leap of faith” comes into its own. People already indoctrinated into religion will shun those that question things rather than accept what they are told at face value, which makes those people doing the questioning into the vilified culture which they don't want to be so weak of will take a “leap of faith” and those that don't serve to reinforce the beliefs of the rest of the mob.
Religion is a remarkable control mechanism that works best on the masses which is exactly what it was invented for.
The problem occurs when the original people who developed the control are no longer around and the followers are left to try and make sense of things. Without someone to give direction the discrepancies are fudged until a new leader takes over. This can and has caused factions to form while the mob lurch around like a hydra with a head missing, the scary thing is that there is no control over the leaders that gain control and hence fanaticism is allowed to take hold.
This could all be remedied if everyone simply retained their own individuality. As I said before I judge these things without emotion, I truly have no feeling good or bad towards religion. In certain circumstances it is a good thing it provides support groups and if everyone made a promise to be nice to one another the world would be a better place but sadly no such religion exists (although Buddhism comes pretty close).
Saturday, 12 March 2011
QCon London 2011
Once again I went to London, and once again it did not disappoint :) this is by far the best meeting of the minds that I have the pleasure of going to. Although I must admit I find the choice in flavours of cake a bit weird, chocolate and lime ?!?!
I heard some interesting talks, I wish that I had the confidence to ask questions when I am there as there are many people I would like to pick the brains of. Maybe next time I'll pluck up the courage to ask why "facts" displayed by two different talks were in complete opposition or why the facebook team seem to think the problems they have faced are unique to them.
So on with my break down of some talks I personally attended, the following is a series of opinions. The thing about opinions is they are mine and you almost certainly won't agree 100%.
Wednesday
Why Don't We Learn?
This was an enlightening, informal chat with the audience that explained the principles of learning combining many ideas from the psychology field rather than IT. The speaker Russ Miles was enthusiastic and fluid not having to read from slides and making sure that his voice projected. A brief mention of the placebo effect was the only item that wasn't accompanied by facts, a simple read of some Ben Goldacre could solve that.Software quality - you know it when you see it
Once again a very practised talk that conveyed in a short time the fact that you really do know good code when you see it, or rather you can tell when there is bad code. Erik Dörnenburg produced a slick series of graphical views of code that can make a series of issues clearly visible even to inexperienced personnel that don't code for a living. Such things that we all know are bad such as monolithic classes a high degree of coupling as well as pointless interfaces.Learning and perverse incentives: "The Evil Hat"
This was one of those choices that I was unsure of at the time, I needn't have been. The speaker Liz Keogh was a brilliant speaker, she mixed up real life experience and sarcasm just the way I like it. The actual content of the talk was essentially carrot works better than stick and if you set a kpi prepare to have it gamed! She cited one example of a kpi being gamed that rang true with circumstances that I've had the misfortune of coming in contact with. One of her friends said he had a new project manager that had told him that the project was to be listed as "in trouble" and that he was calling an emergency meeting. The project was meeting deadlines and bugs were minimal so he couldn't understand why it needed saving. Liz asked a simple question, "are pm's bonuses related to rescued projects", bingo, the pm would get a bonus for simply saying a project was in trouble so that he could be seen to swoop in and "save" it.Agile Operations - optimising the business on shell script at a time
I am going to be slightly controversial on this one, so be warned. Dan as always was a brilliant speaker as was his co-host (I resist the term side-kick) Chris Read. However the talk didn't really do it for me, the comedy was good but over-played. I will admit that it's probably just me that doesn't yet get it as Dan North himself admits he didn't "get it" straight away. Yes it is nice to be able to deploy an image across multiple servers at the press of a button and send changes out in a similar fashion, but this doesn't seem new to me as it seems obvious.Java without GC Pauses
Gil Tene was a comfortable speaker, I did get the impression from his demeanour on stage that he was beginning to get tired of having to explain the same things over and over again and people not getting it. I have to admit that this is the talk I had wanted to see the most all day, I like the clever stuff that happens at a low level thus my love of the JIT e.t.c.The solution to the compaction problem seems so simple once explained, it uses virtualisation so that rather than change physical memory during compaction (the long part of a full GC) you alter the vector table of memory. The only issue that this has is that Azul's GC (C4 I think) does require being installed in unison with some virtualisation server...as I understand it anyway??? This idea seemed so obvious and if the charts are to be believed it is very effective so it seems a no brainer that virtual-pointers become the next change for the linux kernel. Loved this talk immensely, however on day 3 of QCon it was bought into question.
Thursday
Testing for the unexpected
This talk given by Ulf Wiger was a surprise for me, in a pleasant way. To be honest I had no idea which presentation took my fancy and as it is always good to learn something "totally" different from normal I went along. I didn't really know how we possibly could test what was not expected and in walk quicktest. Essentially you fill a series of tests up that are then filled with essentially random data. I tend to do this as a matter of course so the fact that there is a framework for it probably means I am missing a trick.Data Architecture at Twitter scale - Nick Kallen
I can't really say much but it was a good talk, no surprises also no exceptional solutions to problems. The fact that I've written less about this talk doesn't mean it was less brilliant than the others it was great maybe I'll add some details later :)Releasing Fast Code: the DevOps Approach to performance
I can't remember this one, hmmm need to review my notesBetter is Better
This was a somewhat strange talk. It was billed as being a bit of a rant and to be fair to the speaker that is exactly what it was. I did feel a bit sorry for the speaker as he was new to public speaking and had fallen into the same traps that all new comers do, slightly mumbling and stumbling. Things weren't helped by the fact that he moved off mic as he paced on stage. All this is rather negative at the end of the day it was his personal experience as a story, I found this quite interesting as I do enjoy hearing about the history of computing. The history of computing is very important at the moment as we seem to be re-living it, I'll blog what I mean on this later.I went to another talk on Thursday but can't find the details for it unfortunately.
Friday
High performance web applications in Haskell - Steve Vinoski
I had high hopes for this talk, sadly totally unfounded. The speaker was very arrogant and childish, never passing up an opportunity to bad mouth another language. These "my language is better than yours so there nerr nerr nee nerr nerr" talks drive me mad. I feel like grabbing the guy shaking him and saying "Ok I get it you hate anything that isn't your language, tell me why yours is good not why any other is bad." these people say this language is more concise without realising that there is context to this claim for example recursion makes for very concise code in a lot of cases but not all plus there are other concerns to a language readability, maintainability, performance (that's right sometimes functional is not faster than procedural sometimes it is), plus there is always the expertise of the people looking at the code.Anyway I digress this guy got off to a bad start, he did reign it in once he concentrated on the idea of the talk, however I waited to hear some Haskell my functional language of choice only not to hear any he did mention Erlang and throw some (badly formatted) slides containing very basic Haskell up but there was no depth to it. I actually tweeted a bad thing which I don't like doing as concentrating on the negative is not good, unless it's funny :)
HTML 5 Design/Development Tooling (+HTML and Flash)
Not really a talk this one, more of a sales pitch from the Adobe guys. I liked seeing what can be done but would have liked to have seen what was going on underneath the tools if that makes sense. I'll admit I am no longer into web design and GUI's as I find the server side more interesting so have fallen behind with HTML5 seeing what can be done in this talk has prompted me to learn about it especially as the company I work for use flex to produce their GUI. My work colleague who joined me for this presentation was not interested in the talk as all of the tools being demo'd he had already seen so sorry @DavidArno but I did enjoy it to a point. There is however the danger that QCon talks will start to become more about selling stuff than pure knowledge sharing which would be a terrible thing to happen. On that note there seemed to be more talks around a product (twitter, facebook, dynatrace, atlassian, adobe, azul ...) than last year so maybe the knowledge rot has already started.Performance Tuning for Java Applications
First of all this room was far too small for the number of people that attended the talk, it got really hot and at one point I had to leave to prevent myself passing out only to return to find someone sitting in my seat which I had left my belongings on to inform anyone that I was going to return, some people are dumb.The speaker was great, it felt like an informal chat about how he tests products at Atlassian I don't know if it is a cultural thing but most Australians and Australian companies seem to foster a very easy going style that I respond well to George Barnett spends his time at Atlassian performance testing and really knows his stuff. I was however concerned at one point though as the charts he showed for heap size were in complete contradiction of the ones the Azul guy showed on the first day. George said if you have the memory available then use it in the heap and showed the performance increase even when the complete heap wasn't being used, whereas Gil Tene showed that compaction increased in stop-the-world length of time to run which had a marked effect on system performance. The only thing I can think that could make them both right is that the applications they used for testing were utilizing the heap in very different ways. confluence and jira for example should have short lived classes of small size so that even if they live long enough to reach old space the gc could easily remove them with concurrent mark sweep and not have much compaction whereas Gil may have used a system with irregular classes and life expectancies. This is something that George made clear at the start of the talk he was ONLY using Atlassian products and that anyone who blindly applied his performance tweaks to their system deserved every bit of failure they got, unless the system they were tuning was an Atlassian product.
Following on from this I did learn that in order to performance tune an application you have to know the application, how it uses memory and indeed what the current performance is before making any changes otherwise how do you know if you are making any improvements.
Using a Graph database to power the web [Rick Bullota & Emil Eifrem]
I did really enjoy this talk, it didn't expose me to anything new but was nice to hear that a few areas of mathematics that I enjoy are bubbling up to the surface graph theory and set algebra. The talk could have been more weighted to neo4j than thingworx as I was interested in the technology used more than they was a single solution was applied, but case studies are a way to learn I suppose as long as you remember each situation carries it's own unique attributes.HTML5 and the dawn of rich mobile web applications
I didn't hold out much hope for another html5 talk given the sales pitch Adobe talk from earlier, but boy was I wrong.This guy (James Pearce) was so enthusiastic and enthralling that you couldn't help but fall in love with the subject matter every bit as much as he obviously had. He started by demo'ing how we have learnt that the web is not just sitting at a desk and that it isn't just a change in screen size that we need to take into account but the whole interface and what visitors to sites want to do. He cited some good and some unexpectedly bad examples of where this is not done before showing some simple code and explaining more about offline html applications. This was a fast paced exciting talk I was blown away especially as it was a subject that over the past few years I've shown less interest in.
#qconlondon
Wednesday, 5 January 2011
3D stole my sequel :(
I have now seen the sequel and it was nice, but no smash hit.
Pros and Cons
| Pro, plus or good point | Con, bad point :( |
|---|---|
| Jeff Bridges as always is fantastic | 3D was rubbish and actually a gimmic that took away some of the magic, Tron consists of massive contrast of bright colour and blackness. Sadly when your wearing 3D specs that act like sunglasses this fact is somewhat muted. |
| CGI is amazing (maybe too good, if that's possible). | I like Daft Punk, but the music should be secondary to the action, supporting it and adding that extra depth and not a lead role in it. The music for the first quarter was intrusive and frankly didn't fit what was going on. |
| Garrett Hedlund was much better than I had anticipated | Some parts were so camp I thought I was watching a sequel to Flash Gordon. |
| Paying tribute to the original especially the line That is a big door | To make up for a lack of story we were subjected to a number of travelling periods, moving from one place to another where nothing much happened, presumably showing off some of the superb cgi that has been employed. |
| Some of the dialogue was a bit trying at times. I have to tread carefully here as the bits in question may have been good actors ad-libing. But using words like my bag and trip in an 80's style down with the kids manner was a bit gag enducing. |
With all that said this wasn't a bad film, neither was it a great film, I left the cinema feeling "blah" about the whole thing.
maybe I expected too much but I am fed up of films consisting of pretty people not generally acting very well and letting gimmicks like 3D or CGI take the place of good story telling!
Monday, 20 December 2010
Fan Boys
A Fanboy is someone that holds one particular thing be it a manufacturer, programming language or producer in high regard to the exclusion of all other alternatives without a logical justifiable and measurable reason.
2. Why I dislike Fanboys
I am a scientist by heart and a software developer by profession, this makes analysis my bible and the search for explanation my pilgrimage. Fanboys seek to get in the way of this quest for no obvious reason other than lack of interest in intellectual discovery and experimentation, this to me makes them unworthy of sentience.
The reason I make this seemingly harsh conclusion is that the thing separating us from beasts (I say the thing although there are many) is our ability and intonation towards discovery of facts based upon previously acquired knowledge in the same manner, rather than surviving on our instincts as beasts do we improve upon past breeds by education and investigation.
This is at odds with the fanboys stymied regards for investigation.
Tuesday, 19 October 2010
Access properties as if they are constants
for example with this enum
enum Colours {
BLUE(1), GREEN(2), RED(3);
private int num;
Colours( final int i ) {
num = i;
}
int getValue() {
return num;
}
}
enum KFType {
type( "type", ConversionType.INT ),
words( "words", ConversionType.STRING ),
//example in overriding the getter
special( "special", ConversionType.INT ) {
@SuppressWarnings( "unchecked" )
@Override
T getValue() {
Integer t = super.getValue();
return (T) Integer.valueOf( t.intValue() + 10 );
}
};
private ConversionType c;
private String tag;
private static final Properties keyFile = new Properties();
static {
try {
keyFile.load( new FileInputStream( "path to props" ) );
} catch ( IOException ioe ) {
ioe.printStackTrace();
}
}
KFType( final String t, final ConversionType con ) {
c = con;
tag = t;
}
T getValue() {
return c.convert( keyFile.get( tag ) );
}
}
@SuppressWarnings( "unchecked" )
enum ConversionType {
INT {
Integer convert( Object o ) {
return Integer.valueOf( o.toString() );
}
},
STRING {
String convert( Object o ) {
return o.toString();
}
};
abstract T convert( Object o );
}
Monday, 11 October 2010
Kindle
Sunday, 22 August 2010
Goddamn UbuntuOne
Saturday, 31 July 2010
Alonso, loser
Hooray, He's learnt
I am impressed by the way that Alonso has turned himself around, at least in my opinion. Lately he has been congratulating those that beat him, thanking his team for being good and generally being magnanimous in defeat. Also to be honest with his new opinion he seems to relish the fact that he will be (or rather is) able to compete against these people using driving rather than underhand politics.
Never thought I'd hear myself say it but he's turned around and I find him a much better racer for it, of course he still has to keep doing what he's doing to prove himself but so far so good.
Sunday, 2 May 2010
Exceptional Exceptions
Exceptions
Exceptions and exception handling isn't something that should be difficult to do, and nor is it in Java. However the trouble with exception handling in Java is that no one can agree on a sensible method for handling them.
It is for this reason that I have written what I believe to be the most adequate way to handle exceptions, and the reasons for making these decisions.
I feel that the best way to get my point across is with some simple, all be it contrived examples. I am from this point on going to assume that anyone reading this document is familiar with the concept of a try..catch..finally block
Lets start with a bit of background, there are Throwables, checked exceptions, runtime exceptions and errors within java. The easiest way to categorise these and a some what glossy high level view is to say that every exception is a Throwable, so we shall ignore this semantic verb for now. A checked exception is an exception that a method may throw when it is called, by being a checked exception it gives the user of the API a sort of heads up letting them know that they should handle the exception in whatever would be the appropriate manner given the context in which the API was being used in. Then there are runtime exceptions, these aren't listed as possible outcomes of calling a method but they can be caught and dealt with if the API user believes it to be worthwhile, for example if the opportunity for an array to be incorrectly accessed is a possible outcome of a method being used then perhaps some programming logic can be put in place to mitigate the problem slightly, this sort of issue is usually an indication that a better design should be put in place so that, for example, an array is never incorrectly accessed. Then there are errors, it is true to say that these more often than not should never be caught as they tend to be things that are not recoverable such as OutOfMemory which means the status of the JVM can no longer be relied upon.
Good practice when designing an API means that the usage is examined from the perspective of a typical user, I prefer to use Use Cases to examine the problem from the users perspective. For anyone not familiar with this method it simply means putting together a story of the course of events of a user using the particular API call. The useful thing about use cases is that there is a specific section set aside for what should happen as an exceptional case which can then be related directly to the implementation of the solution.
Example
As an example lets imagine a simple system in a hotel lobby that is used to lookup the room that a person is staying in by using their name as the search criteria. The Use case might look something like;
- type name of guest
- hit search*
- system displays the room number
public Integer getRoomForGuest( String guestName ) throws GuestNotFoundException;Now behind the scenes the getRoomForGuest method may be accessing files, or a database or some other magical method of storing guest against room numbers, the point is that the user of the API shouldn't care about the fact that a FileNotFoundException or a SQLException may occur as this betrays the inner working of a method. Imagine the system is upgraded in the future from using a file system so that now it uses a database, if the API used to throw FileNotFoundException or IOException it would surely now have to throw a SQLException. Therefore through having a checked exception that is tighly coupled to the underlying implementation when the method implementation is altered the developer would have to alter every location where this method was called, and if the API was being used in another company their code may stop working which could result in them having to re-design/implement a new solution and this added cost could convince them to stop using your API. A friend raised the point that this could cause an exceptions true cause to be lost, I took it for granted that if anyone catches an exception they will as a matter of course add it to any exception being thrown as the "cause". Another point to raise here is that we should throw any exceptions that we really can't deal with. In the example above you could safely assume that an adequate response to not being able to find a person in the directory due to a FileNotFoundException or other IOException would be to say the person could not be found to the user. However many real life calls are not this simple, for example a with a different call it may be acceptable to inform a user of FileNotFoundException and other prescribed obviously solve-able exceptional cases but any other IOException that occurs should be considered more serious. In this case I would make the method call throw CallSpecificException (not the real name just an example) and IOException. The idea here is that the caller of our method would catch the specific exception and most likely tell the user but anything else would be dealt with differently most likely throwing to a higher authority in keeping with the idea of escalating exceptions that our caller can't directly deal with. Read on this idea should become clear.
I hear many people argue that we should not use checked exceptions instead make everything a runtime exception. I find this a little ...well...foolish, you see by having checked exceptions an API designer can give a hint to its user that here is something that could go wrong, or be out of the ordinary and you should think about how to handle it. The designer of the API is surely going to be more knowledgeable about the types of things that can go wrong during the operation of their code. If we were to replace these checked exceptions with runtime exceptions then the API user now has to either instinctively know what could possibly go wrong within someone elses code, which might be closed source and undocumented which means the only hint of what exceptions may occur is the method signature which now no longer has any mention of exceptions, this is why it seems a nonsense to turn everything into a RuntimeException.
Throwing and Catching
Another issue with exceptions seems to be when should they be caught and when should they be thrown, some people believe code should catch every Exception and some people believe you should catch nothing!!!Crazy surely we want to deal with exceptions that are pertinent to the code which has caused it and throw or escalate any exceptions that we weren't expecting and hence have no clear knowledge on how to recover from.Lets look at the first option, catching every exception. By deciding that you want to catch every exception must mean that you intend to write code that can suitably handle every possible exception, that's fine until it isn't, that is to say in the typical mundane run of the mill processing, exceptions that you expect could happen are dealt with exactly as expected. However programs have a tendency to change like the shifting ice of the North sea, and with this change comes brand new exceptional cases that were not part of the original design. So where does this leave us? We are now catching an exception that we don't know what to do with, so our program responds by logging the problem and continuing as normal. The problem could be a simple one for example couldn't find a config file or something that any user should be able to rectify, or worse it could be a catastrophic failure that could be avoided if only the right people were notified, for example an upstream service has failed preventing a circular queue from being processed and thus will start to wrap around after X number of failed calls anyone handling a large throughput can understand just how serious a problem such as this can be. Many people still believe that the best, and sometimes only thing to do with exceptions is to log something exceptional occurred and continue. This denies the intent of exceptions they are not all meant to indicate that something went wrong in the program but merely that a path other than the norm should be pursued within the use case.
The next option is to catch nothing, i.e. throws Exception should be written at the end of each method signature. I see this as lazy coding, and not the good kind of lazy that leads a developer to automate repetative processes, but the bad kind of lazy that turns into a birds nest that someone else will have to unravell at a later date. The only thing this kind of coding goes to serve is to provide fodder to the WTF Blog. So should we never throw exceptions at all? Simple answer of course we should throw exceptions, but only when the design intends it to. Consider the throwing of an exception to be the escalation of an exceptional case, everything is being executed within the stack and the higher up this stack the more prevalent the process. What I mean by this is that in general the higher up the stack we get the more likely we are to want to shout about an exception happening, by thinking about this process it must surely seem obvious that if your code can't immediatley address the exceptional case occuring then it should let a higher authority know about it. Take the earlier queue underrun issue, you API deals with a small portion of the overall system that relies on the queue, your code doesn't know how to deal with this problem so it should escalate the issue by throwing it.
No one should see a Stack trace
This is both true and false, if no one was ever to see a stack trace there would be no need for them. In fact seeing a stack trace is very useful in solving the issue. I think this mantra has come about due to the fact that most developers are lazy when it comes to putting in simple handling code, we see it all the time an NPE occurs on some web server somewhere and the user gets shown a stack trace. The trace is useful to a developer (usually) but pointless to someone who is simply trying to buy something from the site. It is incredibly easy to redirect the user somewhere to say there has been a problem please bare with us while we try to fix it whilst at the same time sending the stack trace to someone that knows how to deal with it. The fact that this doesn't always get done is simply laziness....or at least only see a meaningful stack trace!
Not all developers were created equal, not all developers know how all parts of the systems they work with function, not all developers have the necessary skills to fix all problems a system can and will encounter during its normal operation. It is for this reason that 1st, 2nd and 3rd line support even exist. What might mean something to a 3rd line guru might as well be a foreign language to a 1st line and sometimes vice versa. By throwing specific checked exceptions at an appropriate level the correct trace can be sent to the person (or system) that can handle the exceptional case in the most appropriate manner. Working on large international systems it makes sense to have context sensative logging that will send stacks from a US system to the US support rather than to an Asian support desk or the user.Conclusion
We all want to make systems that are good, that we can be proud of and say I don't think anyone could do a better job, it is for this reason that some forethought must be put into what exceptional cases are going to occur that I can deal with and anything my code can't deal with should be escalated. It is lazy to catch all exceptions with a catch (Exception... that simply logs what went wrong and continues.Monday, 1 February 2010
a sign of things to come
HTTP Status 500 -
type Exception report
message
descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
exception
java.lang.NullPointerException
note The full stack traces of the exception and its root causes are available in the Sun GlassFish Enterprise Server v2.1 logs.
