<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7461275049781191261</id><updated>2012-01-31T02:51:30.148-08:00</updated><category term='technology'/><category term='scale'/><category term='archtitecture'/><category term='mongo'/><category term='clojure'/><category term='Intellij'/><category term='NFJS'/><category term='Web Services'/><category term='JSR299'/><category term='web beans'/><category term='java memory btrace'/><category term='java memory jmap jhat'/><category term='architects'/><category term='Security'/><category term='conference'/><category term='Java'/><category term='complexity'/><category term='SOA'/><category term='JVM memory'/><category term='JavaOne'/><category term='NoSQL'/><category term='Heap Space'/><category term='tools development'/><category term='PM'/><category term='grails'/><category term='EJB3.1'/><category term='speakerconf'/><category term='Git'/><category term='Agile'/><category term='polyglot programmer'/><category term='software engineering'/><category term='functional programming'/><category term='Perm Space'/><category term='JSF'/><category term='project management'/><category term='Spring'/><category term='grails plugin jmx'/><category term='jps Java Groovy'/><category term='Speaking'/><category term='JSR318'/><category term='Mac OSX'/><category term='BTrace'/><title type='text'>Ken's Technical Thoughts</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4384339181115730031</id><published>2011-12-20T11:49:00.000-08:00</published><updated>2011-12-20T12:55:01.147-08:00</updated><title type='text'>Constant Pain with Non-Constant Constants</title><content type='html'>This thought has crossed my mind before... since it is on my mind now I thought I might share.  Perhaps it will help someone on their software development career path... or perhaps it is just me venting...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Art of Coding&lt;/h2&gt;&lt;br /&gt;One of the greatest challenges of coding is being able to understand it.   Skill in coding is being able to understand the problem well enough to create a solution (otherwise known as coding).  &lt;em&gt;Great Skill&lt;/em&gt; is being able to write a solution so that someone else (including the future you) can read and understand what it is they are looking at.    This concept isn't new, but yet we seem to be either challenged with the concept... or distracted. Even back in 1952 (yes 1952!!), in the computer history archive a &lt;a href="http://archive.computerhistory.org/resources/text/Fortran/102653981.05.01.acc.pdf"&gt;set of lecture notes&lt;/a&gt; which in them states: "It is quite difficult to decipher coded programs even with notes and even if you yourself made the program several months ago."   It also states: "I think the answer is simple: to make it easy one must make coding comprehensible".   Well said!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Point of Constants&lt;/h2&gt;&lt;br /&gt;One area that seems to be a constant :) struggle is constants.  There are at least a couple of justifications for using constants I can think of: 1) a point of reference for tools (autocomplete with intellisense in IDEs and refactoring), 2) A common holder of value for which if it changes will be realized across the system.    The main point of a constant isn't &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt; or reuse... a common point of confusion for some reason.&lt;br /&gt;&lt;br /&gt;IMO the stronger argument is point 2.  if you were coding in VI or emacs, point 1 may not be of value, but point 2 certainly would be.   If you name the reference of a constant the same name as the value of the constant... then you lose any the value of point 2. &lt;br /&gt;It must also be said that constants, although they add value, they make code less readable (see examples below).  If your constants have no value, they don't achieve points 1 and 2, then they need to be whacked!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Examples of Losing with Constants&lt;/h2&gt;&lt;br /&gt;This is real production code... some variables changed to obscure identify.&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;&lt;br /&gt;        // example 1   Really??  where does this end?&lt;br /&gt; String EMPTY_STRING = "";&lt;br /&gt;&lt;br /&gt;        // this isn't readable... it takes minutes (instead of seconds) to understand its value&lt;br /&gt;        // example 2&lt;br /&gt; String ADVERTISE_PROPERTY_PREFIX = OUR_PROPERTY_PREFIX + "advertise.";&lt;br /&gt; String ADVERTISE_TRADER_ADDRESS_PROPERTY = ADVERTISE_PROPERTY_PREFIX + "host";&lt;br /&gt; String ADVERTISE_CONTEXT_PROPERTY = ADVERTISE_PROPERTY_PREFIX + "context";&lt;br /&gt; String ADVERTISE_TYPE_PROPERTY = ADVERTISE_PROPERTY_PREFIX + "type";&lt;br /&gt;&lt;br /&gt;       // example 3&lt;br /&gt;       // here's a common one&lt;br /&gt;static final String TABLE_NAME = "email";&lt;br /&gt;&lt;br /&gt; // Column names for all the fields in the email table&lt;br /&gt;static final String ID = TABLE_NAME + ".email_id";&lt;br /&gt;static final String CUSTOMER_ID = TABLE_NAME + ".customer_id";&lt;br /&gt;static final String ADDRESS = TABLE_NAME + ".address";&lt;br /&gt;        // ...&lt;br /&gt;static final String FIELDS = ID + ", " + CUSTOMER_ID + ", " + ADDRESS + ", " + CREATED_BY + ", " + LAST_MOD_BY&lt;br /&gt;  + ", " + CREATE_DATE + ", " + LAST_MOD_DATE + ", " + TERM_DATE + ", " + WEB_USER_ID;&lt;br /&gt;&lt;br /&gt; // List of fields names with formatting used for select statements&lt;br /&gt;static final String SELECT_FIELDS = ID + ", " + CUSTOMER_ID + ", " + ADDRESS + ", " + CREATED_BY + ", "&lt;br /&gt;  + LAST_MOD_BY + ", " + "TO_CHAR(" + CREATE_DATE + ",'" + DATE_TIME_FORMAT + "')," + "TO_CHAR("&lt;br /&gt;  + LAST_MOD_DATE + ",'" + DATE_TIME_FORMAT + "')," + "TO_CHAR(" + TERM_DATE + ",'" + DATE_TIME_FORMAT&lt;br /&gt;  + "')," + WEB_USER_ID;&lt;br /&gt;&lt;br /&gt; // SQL used to create a new EMAIL record&lt;br /&gt;static final String CREATE_SQL = "INSERT INTO " + TABLE_NAME + " (" + FIELDS&lt;br /&gt;  + ") VALUES (?,?,?,?,?,SYSDATE,SYSDATE,NULL,?)";&lt;br /&gt;&lt;br /&gt; // SQL used to retrieve an email record by id&lt;br /&gt;static final String RETRIEVE_BY_ID_SQL = "SELECT " + SELECT_FIELDS + " FROM " + TABLE_NAME + " WHERE " + TERM_DATE&lt;br /&gt;  + " IS NULL AND " + ID + "=?";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For example 1... where does it end?  would you create a constant A = "A"?   When can EMPTY_STRING not be an empty string or ""?  In this case, we get no value and less readability.&lt;br /&gt;&lt;br /&gt;Example 2 is the chaining of constants, commonly found when there are a large number of property values being retrieved from a file or sys env.  While not as bad as example 1, it is less readable.   Having a prefix constant may be of value, but rarely is the chaining of constants of value.  It isn't worth trading the potential for a company name change or something similar for readability.    Or put another way, it isn't worth trading something that is unlikely to happen for something else which is more likely to be needed (that being the readability of the code)&lt;br /&gt;&lt;br /&gt;Example 3 I see all the time... argghhhhh... please... just stop!&lt;br /&gt;&lt;br /&gt;Examples of good constants would include, urls and database connections strings or a project defined standard date format.&lt;br /&gt;&lt;br /&gt;May your constants always be final!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4384339181115730031?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4384339181115730031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4384339181115730031' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4384339181115730031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4384339181115730031'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2011/12/constant-pain-with-non-constant.html' title='Constant Pain with Non-Constant Constants'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4078999687695672358</id><published>2011-12-14T15:10:00.000-08:00</published><updated>2011-12-14T15:49:45.433-08:00</updated><title type='text'>Advanced Spock Techniques</title><content type='html'>&lt;a href="http://cdn2-b.examiner.com/sites/default/files/c8/da/c8da7f602f266072aed0b46897be8610.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 110px; height: 82px;" src="http://cdn2-b.examiner.com/sites/default/files/c8/da/c8da7f602f266072aed0b46897be8610.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In recent years there have been a couple of tools that stand out when it comes to helping me be productive.   One of those is the groovy test framework &lt;a href="http://code.google.com/p/spock/"&gt;Spock&lt;/a&gt;.   It is worthy of an introductory blog post... but that isn't this post.   One of the challenges to Spock is the documentation isn't a complete as one would hope.  The &lt;a href="http://code.google.com/p/spock/wiki/GettingStarted"&gt;Spock Basics&lt;/a&gt; is fantastic when getting started but it is what it claims to be basics.     I've been speaking with &lt;a href="http://www.nofluffjuststuff.com/home/main"&gt;NFJS&lt;/a&gt; on the subject of Spock for the last half of 2011.  On 2 occasions I've had the look our red shirted friend in the picture has when asked about controlling aspects of mocks in spock... meaning I didn't have the answer.   In this case,  google didn't discover it either... a quick email to the &lt;a href="http://www.springone2gx.com/conference/speaker/peter_niederwieser"&gt;Peter Niederwieser&lt;/a&gt; reveals the previously undocumented solution. (at least that's my understanding)... and thanks Peter!  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Here we will discuss 2 advanced aspects of mocking with spock.  If you need more details on mocking in general hit the Spock site... or wait patiently for a future post:)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Problem Setup:&lt;/h3&gt;&lt;div&gt;When mocking with Groovy we get 2 benefits from the verification of the mock.  1) order of execution, 2) failure if another method on the mock was executed but was not setup in the demand configuration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;void testDeposit() {&lt;br /&gt;&lt;br /&gt;        Account account = new Account(TEST_ACCOUNT_NO, 100)&lt;br /&gt;&lt;br /&gt;        def mock = new MockFor(AccountDao)&lt;br /&gt;        mock.demand.findAccount(TEST_ACCOUNT_NO) { account }&lt;br /&gt;        mock.demand.updateAccount(account) { assertEquals 150, account.balance  }&lt;br /&gt;&lt;br /&gt;        def dao = mock.proxyDelegateInstance()&lt;br /&gt;        def service = new AccountServiceImpl(dao)&lt;br /&gt;&lt;br /&gt;        service.deposit TEST_ACCOUNT_NO, 50&lt;br /&gt;        mock.verify dao&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Spock Cleanup&lt;/h3&gt;&lt;br /&gt;A similar solution in Spock might look like this:&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;    def "deposit into account test refactor"() {&lt;br /&gt;&lt;br /&gt;        def mock = Mock(AccountDao)&lt;br /&gt;        def service = new AccountServiceImpl(mock)&lt;br /&gt;&lt;br /&gt;        when:&lt;br /&gt;        service.deposit nmr, amt&lt;br /&gt;&lt;br /&gt;        then:&lt;br /&gt;        mock.findAccount(_) &gt;&gt; account&lt;br /&gt;        1 * mock.updateAccount(_)&lt;br /&gt;        0 * mock.createAccount(_)&lt;br /&gt;&lt;br /&gt;        and:&lt;br /&gt;        account.balance == total&lt;br /&gt;&lt;br /&gt;        where:&lt;br /&gt;        nmr   | account                 | amt | total&lt;br /&gt;        "101" | new Account("101", 100) | 50  | 150&lt;br /&gt;        "101" | new Account("101", 0)   | 50  | 50&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However this solution doesn't guarantee order nor do we want to use the 0 * mock.&lt;method&gt; on all possible methods.  &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Spock Mock Solution&lt;/h3&gt;&lt;br /&gt;It turns out that we can repeatedly use the then: dsl to determine the order of events.  So we can modify the Spock code above with the following changes.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;        then:&lt;br /&gt;        1 * mock.findAccount("1234") &gt;&gt; account&lt;br /&gt;&lt;br /&gt;        then:&lt;br /&gt;        _ * mock.updateAccount(_)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this case we are saying that the findAccount() method will be called exactly once and return the account object and "then" the updateAccount will be call any number of times with any type of argument.   The test will fail if the updateAccount is ever called prior to the findAccount being invoked first.&lt;br /&gt;&lt;br /&gt;We can use this same technique to solve the strictness concern we have as well by adding one more then: block of code as outlined below:&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;    then:&lt;br /&gt;        1 * mock.findAccount("1234") &gt;&gt; account&lt;br /&gt;&lt;br /&gt;        then:&lt;br /&gt;        _ * mock.updateAccount(_)&lt;br /&gt;&lt;br /&gt;        then:&lt;br /&gt;        0 * mock._&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this case the last 0 * mock._ says to expect nothing else.  Ahhh.. the beauties of a dynamic language:)&lt;br /&gt;&lt;br /&gt;Happy Coding... may your builds never fail and your tests always green bar!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4078999687695672358?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4078999687695672358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4078999687695672358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4078999687695672358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4078999687695672358'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2011/12/advanced-spock-techniques.html' title='Advanced Spock Techniques'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-8967771380973474090</id><published>2011-10-13T06:07:00.001-07:00</published><updated>2011-10-13T07:29:42.288-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NoSQL'/><category scheme='http://www.blogger.com/atom/ns#' term='mongo'/><category scheme='http://www.blogger.com/atom/ns#' term='scale'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>MongoDB Grails and Copying Collections</title><content type='html'>I currently find myself working on a project where Grails and MongoDB are the technology stack... in fact that in part is some of the reason for being interested in the project.   I thought I would share 2 aspects of my learning so far:&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Grails + Mongo&lt;/h2&gt;&lt;br /&gt;We spent at least 2 weeks trying to understand which approach we were going to take for our persistent tier.   The general concensus was to use the Mongo GORM.   We started down that path and ran into a bug and then a limitation on embedding.  We got amazing support on the bug followed by the next release of the GORM option which fixed our initial document embedding concerns.   We ran into more problems.&lt;br /&gt;&lt;br /&gt;We switched to the morphia driver... once again... challenges caused lots of frustration.   The challenges included getting other plugins to work with this driver, the fact that the morphia "domain" objects couldn't be in the standard grails domain folder, which further complicated mocking.  Frustrations with getting full capabilities of getting spring security to work.   It turns out that with spring security there are a number of relational assumptions (along with assumptions of objects being domain classes.. meaning they live in the grails domain package space) which cause problems when you are using NoSQL.&lt;br /&gt;&lt;br /&gt;The morphia had another limitation we couldn't live with... we wanted the ability to have different types of objects mapped to the same collection.  It appears to me that the Mongo efforts in the Grails space are bolt ons to a rational model.  You can get it to work when thinking with a RDBMS mindset.  They seem to break down with a NoSQL mindset... this certainly could be attributed to user error (meaning me).   I believe we gave it a good try... however the project is under the gun and we didn't have time to "play" with it or wait for responses.&lt;br /&gt;&lt;br /&gt;Alas we created our own solution...  one of our significant constraints was to be prepared for extremely large scale.  This had us duplicating a lot of documents not common in RDBMS solutions... along with the fact we needed to control the number of queries.   Ideally we want 1 query for a page... certainly for the main page which is high laden with dynamic content.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Mongo Copying Documents - Collection to Collection&lt;/h2&gt;&lt;br /&gt;I'm really getting to like Mongo... a lot.  One of the downsides is there is limited documentation... including limited forum comments on it.   Because of this, I've decided to post interesting solutions to problems as I discover them... time permitting.  so for todays tip.   I recently needed to duplicate a "record" in mongo speak a document in a collection.   There is so much information out there on how not to duplicate records that a google search at this point usually points you in the wrong direction.  My situation was such that we have a CMS component to our application, which sets a publish day on content.   What I needed was the ability to duplicate a record (so the BSON id would need to change and set a new publish day.&lt;br /&gt;&lt;br /&gt;The first thing to recognize for those new to Mongo is that the Mongo console (the command line client to Mongo) works with javascript... so get your javascript fu ready... no.. not your jQuery fu... your plain jane generic javascript fu:)&lt;br /&gt;&lt;br /&gt;Here is the solution I came up with:&lt;br /&gt;&lt;pre class="brush: javascript"&gt;&lt;br /&gt;db.NewsItem.find({newsType: "Blah"}).forEach( function(x){ x._id = new ObjectId(); x.publishDay=283;  db.NewsItem.insert(x)} );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So it turns out that you can pass a lambda expression to the forEach method of the collection.   The trick is to assign a new ObjectId() to the _id, make any other assignments and then insert into your collection of choice... in this case back into the same collection.   This comes in handy as well when you want to backup a collection real quick. (yea, I know you could use the mongodump and mongorestore, for a quick temp solution this just seems more convenient)&lt;br /&gt;&lt;pre class="brush: javascript"&gt;&lt;br /&gt;db.NewsItem.find({publishDay : 285}).forEach( function(x){ db.NewsItemBackup.insert(x)} );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-8967771380973474090?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/8967771380973474090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=8967771380973474090' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8967771380973474090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8967771380973474090'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2011/10/mongodb-grails-and-copying-collections.html' title='MongoDB Grails and Copying Collections'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4379207445284679082</id><published>2011-10-05T09:02:00.000-07:00</published><updated>2011-10-05T09:06:16.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaOne'/><title type='text'>JavaOne: Rocking the Gradle</title><content type='html'>Presenting Rocking the Gradle at &lt;a href="http://www.oracle.com/javaone/index.html"&gt;JavaOne&lt;/a&gt; tomorrow 12:30pm at the Parc 55... see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4379207445284679082?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4379207445284679082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4379207445284679082' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4379207445284679082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4379207445284679082'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2011/10/javaone-rocking-gradle.html' title='JavaOne: Rocking the Gradle'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-1009015604475283506</id><published>2011-01-11T14:50:00.000-08:00</published><updated>2011-01-11T14:59:43.745-08:00</updated><title type='text'>Throughput and High Velocity</title><content type='html'>Wow… has it really be 11 months since I’ve blogged.   I had many ideas for blogs half written or half thought out… but last year was extremely busy.   It’s a new year… and I’m back :)  Let’s not focus on the past, let’s get right into it.&lt;br /&gt;&lt;br /&gt;I had a client recently asking how to improve throughput.  It took me a few minutes of questioning to understand what the subject really was.  Thoughtput?  Are you having scaling issues?  It turns out, the interest is closer to developer throughput, although I don’t think they used that term and it may have been broader than that.  The interest is in the acceleration of moving an idea into a product.  Immediately coming to mind is the book &lt;a href="http://www.amazon.com/Goal-Process-Ongoing-Improvement/dp/0884270610"&gt;“The Goal”&lt;/a&gt;, whose focus it is to increase the throughput of a manufacturing plant.  Although the creation of software is nothing like an assembly line (although the analogies seem to be common place), it is however interesting to consider some of the similarities involved with the theory of constraints.  The challenge is, in my opinion, that the constraints for software development are more virtual and harder to measure than assembly line constraints.&lt;br /&gt;&lt;br /&gt;Consider what slows down the development of software.   Of all my years of software development, the issue has never been an issue of programmer to keyboard.  In other words, it isn’t how you type or how fast you type, although it certainly needs to be reasonable.  It often times isn’t how long a developer has been developing… although again there is a required threshold.   Where have there been issues?   Let’s see if you list is similar to my list:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Poorly written requirements.  The user seems to know what they want, but was unable to communicate it effectively or the BA was unable to capture it appropriately.&lt;/li&gt;&lt;li&gt;Lack of direction, mission and purpose of the entire team… either we have too much time, too much money or a total lack of leadership.  Let’s chalk this up to priorities.&lt;/li&gt;&lt;li&gt;Lack of knowing what to do next… BA or programmer… or PM&lt;/li&gt;&lt;li&gt;Lack of knowing how what a programmer is working on fits into the whole&lt;/li&gt;&lt;li&gt;Lack of team coordination&lt;/li&gt;&lt;li&gt;Large team sizes&lt;/li&gt;&lt;/ul&gt;I’m sure there are plenty more…  but what I would say is the #1 issue for teams in trying to achieve high velocity is &lt;b&gt;clarity of thought&lt;/b&gt;.  I mean the ability to see a problem as the user sees the problem.  Being able to see a solution and understand the problem in abstract terms and abstract ways; For a team to have the same thought or to hold within their minds the same mental model / picture.   This is a tough task as differing priorities, differing locations, differing experiences and differing thoughts among the team members results in a number of differing ideas to the solution.   It brings to mind to me of the scene in the last samurai, where &lt;a href="http://www.youtube.com/watch?v=u7N4UIrC8uY"&gt;Koyamada tells Tom Cruise “Too Many Mind”…  “No Mind”&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As Dr. Covey says in 7 Habits of Highly Effective People (which is what we are talking about… right?), you must start with the end in mind.  Clarity positions people to be as effective as they can be.  In the real world, a user really may not have the clarity themselves or may not understand the problem fully to articulate the desired clarity.  This is why an agile development process is so effective.  It provides an opportunity for the user to discover the clarity through regular feedback with the developers. Or in other words to detect deltas in the forming solution from the ideal or user desired solution.  It also places the developer close to the user, so that through the creation of software when the output drifts from the user mental model it is caught quickly and corrected.   Also developers are pairing with, and communicating with other developers regularly so that differences in the mental model are detected early.&lt;br /&gt;What we are seeking for efficiencies sake is the fastest mechanism to &lt;b&gt;detect&lt;/b&gt; that something is just not right.&lt;br /&gt;&lt;br /&gt;So at the time of development what are the common practices that occur in a corporate development which cause inefficiencies or put another way what are the practices that cause the error detection to be delayed, either the detection itself is delayed or the communication of the detection is delayed.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Developers are several degrees removed from the user.  So there are either 2 human “hops” for error recognition and for communication.&lt;/li&gt;&lt;li&gt;Developers are too junior.  Junior developers are just less capable of thinking and communicating in abstract software terms and are less able to detect deficiencies in the solution model.&lt;/li&gt;&lt;li&gt;Separation of the team members.  Numerous studies show the increase cost of communication of people in just 2 different rooms, its more expensive for 2 different floors and way expensive when there is an ocean between members of the team.  There is an additional cost that isn’t well documented in the fact the difference in the mental model or solution set are very difficult off-shore.&lt;/li&gt;&lt;li&gt;Communication is all facilitated through paper.  This is the worse of all the communication modalities.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So what can you do to increase throughput?  What can you do to increase team velocity?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hire highly skilled developers, developers skilled in their language who also have a proven record of quickly translating problem sets into solution sets. &lt;/li&gt;&lt;li&gt;Provide them with quick, and easy access to the user&lt;/li&gt;&lt;li&gt;Put the developers in the same work space&lt;/li&gt;&lt;li&gt;Reduce the team size, which results in less possibilities of mental model differences.&lt;/li&gt;&lt;/ol&gt;You are looking for a team with a high attention to detail and ability to detect differences in the mental model during the development process.  Then you are looking for well-lubricated spontaneous communication.&lt;br /&gt;&lt;br /&gt;This isn’t fool proof but it does solve one of the largest most common problems I see in corporate software development.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A number of ideas came to mind in the process of writing this blog... and there are some assumptions baked into the content.  Based on that, I will likely blog deeper on several of these subjects in the future.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-1009015604475283506?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/1009015604475283506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=1009015604475283506' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1009015604475283506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1009015604475283506'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2011/01/throughput-and-high-velocity.html' title='Throughput and High Velocity'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6961516311112589806</id><published>2010-02-21T19:59:00.000-08:00</published><updated>2010-02-21T20:27:00.568-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>Setting up Clojure 1.1.0 on Mac OSX</title><content type='html'>As part of the &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt;, established by Alex Miller (Thanks!!), we have started a group to study the SICP.    We just started and are going virtual... if you would like to participate, email or tweet me (@kensipe).   In the process of studying SICP and LISP, I plan on focusing on Clojure.  Clojure was previously on my machine as I was reading Stu's book &lt;a href="http://www.amazon.com/Programming-Clojure-Pragmatic-Programmers-Halloway/dp/1934356336"&gt;Programming Clojure&lt;/a&gt;, however increased usage would require some maturing of my tools.  This led to the discovery of Mark Reid's blog on &lt;a href="http://mark.reid.name/sap/setting-up-clojure.html"&gt;Setting up Clojure for Mac OS X&lt;/a&gt;, however I assume based on updates and changes over the last year, it requires some updates.&lt;br /&gt;&lt;br /&gt;Read Mark's blog first... getting clojure, the clojure-contrib and jline.  Here are the differences:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create an environment variable CLOJURE_HOME assigned to the directory for clojure&lt;/li&gt;&lt;li&gt;Create the /bin directory for the clj script included below&lt;/li&gt;&lt;li&gt;Add $CLOJURE_HOME/bin in the $PATH&lt;/li&gt;&lt;li&gt;Clojure is distributed with clojure.jar in the CLOJURE_HOME... so I maintain that.  It is expected that contrib and jline are in the same directory.&lt;/li&gt;&lt;li&gt;Mark's clj script has been updated below... The previous script invokes classes which are depreciated.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here is the updated script:&lt;br /&gt;&lt;pre class="brush: bash"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;# Runs Clojure using the classpath specified in the `.clojure` file of the&lt;br /&gt;# current directory.&lt;br /&gt;#&lt;br /&gt;# Ken Sipe &lt;http: com=""&gt;  2010-02-20&lt;br /&gt;# Inspired by Mark Reid &lt;http: name=""&gt;&lt;br /&gt;# original: http://github.com/mreid/clojure-framework/blob/e1c80cc650f448713243be8272dba1fa3c1a7cea/clj&lt;br /&gt;#&lt;br /&gt;# This scripts expects $JAVA_HOME and $CLOJURE_HOME to be defined for the system it is running on&lt;br /&gt;# The clojure.jar is standardly in the clojure_home dir (and not in the lib directory), so&lt;br /&gt;# the expectation is that clojure-contrib.jar and the jline.jar are placed in the same dir&lt;br /&gt;&lt;br /&gt;CLJ_DIR=$CLOJURE_HOME&lt;br /&gt;CLOJURE=$CLJ_DIR/clojure.jar&lt;br /&gt;CONTRIB=$CLJ_DIR/clojure-contrib.jar&lt;br /&gt;JLINE=$CLJ_DIR/jline-0_9_5.jar&lt;br /&gt;CP=$PWD:$CLOJURE:$JLINE:$CONTRIB&lt;br /&gt;&lt;br /&gt;# Add extra jars as specified by `.clojure` file&lt;br /&gt;if [ -f .clojure ]&lt;br /&gt;then&lt;br /&gt;   CP=$CP:`cat .clojure`&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ -z "$1" ]; then&lt;br /&gt;   java -server -cp $CP \&lt;br /&gt;        jline.ConsoleRunner clojure.lang.Repl&lt;br /&gt;else&lt;br /&gt;   java -server -cp $CP clojure.main -i $*&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;Love the TextMate support and the history support in JLine!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6961516311112589806?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6961516311112589806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6961516311112589806' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6961516311112589806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6961516311112589806'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2010/02/setting-up-clojure-110-on-mac-osx.html' title='Setting up Clojure 1.1.0 on Mac OSX'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3147577372058857138</id><published>2010-02-17T11:55:00.000-08:00</published><updated>2010-02-17T15:14:15.128-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='speakerconf'/><category scheme='http://www.blogger.com/atom/ns#' term='Speaking'/><title type='text'>Reporting from SpeakerConf 2010</title><content type='html'>I was able to attend&lt;a href="http://speakerconf.com/"&gt; speakerconf 2010&lt;/a&gt; this year in Aruba. It was an amazing gathering of talented leaders in the software development space. Each day of the conference started with several 15 – 30 minute talks lasting roughly 3 hours. According to the retro at the end of the conference, most people enjoyed and preferred these short talks as a primer to longer conversations in the afternoon along the pool or beach. Most talks were met with the struggle to maintain time often due to the many follow on questions generated by the subject. As far as I know the subjects were selected by the speaker and they were generally not preannounced. It is impossible to capture the essence of the conference and I make no effort to cover the most valuable part of it… the evening free form discussions. Most of the information went so fast that it was difficult to mentally be engaged and take notes. Here is a glimpse of what was discussed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Day 1&lt;/span&gt;&lt;br /&gt;&lt;a href="http://thinkrelevance.com/team"&gt;&lt;span style="font-weight: bold;"&gt;Stu Halloway&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Stu introduced the ADD development… which is alcohol driven. Stu then jumped into clojure, introducing a private testing project he is working on called circumspect. Stu offered up some advice for working in clojure:&lt;br /&gt;  * be less clever&lt;br /&gt;  * idiomatic clojure&lt;br /&gt;  * make adjectives not nouns&lt;br /&gt;&lt;br /&gt;The focus on circumspect was to provide an idiomatic testing option for functional testing in clojure. Stu mentioned that through his testing exploration that an test he created actually detected a bug in the clojure code.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://notdennisbyrne.blogspot.com/"&gt;&lt;span style="font-weight: bold;"&gt;Dennis Byrne&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Dennis is the first to discuss a topic on hardware and general process constraints in a talk titled Memory Barriers. The challenge is that virtual machines and hardware interfaces reorder code in ways most developers are not aware of. Fences or memory barriers define for the VM what can and can’t be reordered. There was some discussion on the expensive nature of these barriers.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.theagiledeveloper.com/"&gt;&lt;span style="font-weight: bold;"&gt;Matt Deiters&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Matt introduces a challenging problem that he has been working on in a story about vertex. The problem stems from social network analysis… it doesn’t work in SQL. Their previous implementation in SQL might take an hour to find all the details need for just 2 degrees of separation in a social network. Matt introduces &lt;a href="http://neo4j.org/"&gt;neo4j&lt;/a&gt; an open source nosql graph database and &lt;a href="http://github.com/mdeiters/neo4jr-simple"&gt;neo4jr-simple&lt;/a&gt;, which is a RESTful ruby API. I enjoyed the fact that Matt wasn’t a No SQL bigot… He espoused a “Not all SQL” approach, using alternatives where SQL databases fall down.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Fred George&lt;/span&gt;&lt;br /&gt;Fred displayed a triangle with management, story and programmers (or workers) at the vertexes. He wanted to focus on the relationship of the story to the programmer. Fred focuses on a Lean process and raises the question if acceptance tests are really lean? This stirred some debate. In the end, It appeared to me that what was being argued in most cases was the definition of acceptance tests vs. other types of tests. I don’t know if I agreed with Fred’s position, which we discussed at length the rest of the conference. My favorite part of his talk was a list of words or phrases that are flags that your project isn’t Agile. They include: Review, I need it in writing, write me a ticket, plan, checklist, code freeze, gant chart.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.briangoetz.com/"&gt;&lt;span style="font-weight: bold;"&gt;Brian Goetz&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Brian’s talk is on how we find ourselves in this mess with multi-cores. Brian gives a wonderful history of processors defining them in eras: CISC era, RISC era, and Multi-Core era. The big take-aways for me include:&lt;br /&gt;  * a move from explicit to implicit parallelism&lt;br /&gt;  * moore’s law favors bandwidth over latency&lt;br /&gt;  * cost of memory access&lt;br /&gt;&lt;br /&gt;With the speed of today’s processors, it takes 200-300 clock cycles to get 1 memory fetch, where it used to be 1 cycle. As latency increases we need more caches. Memory access times by clock cycle are roughly:&lt;br /&gt;  * Register ~ 1 cycle&lt;br /&gt;  * L1 ~ 3&lt;br /&gt;  * L2 ~ 15&lt;br /&gt;  * RAM ~ 200 – 300&lt;br /&gt;&lt;br /&gt;Brian states “Memory is the new disk”. Clearly memory access is the new problem to solve in computer hardware. Brian also states that there is no programming model for this new multi-core era. Based on the talk, it appears to be that the industry has a new chicken or the egg problem. Hardware is struggling to evolve, because there is no software development model. Software is struggling because there isn’t a new standard. Brian concludes with latency is the enemy and the industries need to provide development teams with new tools. There will be a growing need to understand the memory access model of a running program, which can only be determined at run-time at the chip level. It will be necessary to understand the Integer pipe and memory cache misses. At the end of Brian’s talk, Nygard mentioned Chuck Moore’s Multi-Core chip where each core runs a tiny forth program. It is something I’ve added to the list of things to look into.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.michaelfeathers.com/"&gt;&lt;span style="font-weight: bold;"&gt;Michael Feathers&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Michael discusses challenges to object oriented and functional language hybrids. There is background that I didn’t record, but one of the great observations is that functional programming is a “tell, don’t ask” model and object oriented programming is a “ask, don’t tell” model. In the FP approach, programming logic and data seem to bubble up the call tree and in the OO approach the opposite is true, logic seems to be pushed down the tree. Michael then looks at what it looks like conceptually if FP is on top of OO or OO is on top of FP. Michael then introduces the group to an algorithm used to solve &lt;a href="http://cmm.ensmp.fr/%7Ebeucher/wtshed.html"&gt;morphological watersheds&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Day 2&lt;/span&gt;&lt;br /&gt;&lt;a href="http://steve.vinoski.net/blog/"&gt;&lt;span style="font-weight: bold;"&gt;Steve Vinoski&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Steve introduced us to a product his startup company &lt;a href="http://www.verivue.com/"&gt;Verivue&lt;/a&gt;, Inc is producing for the big media companies for streaming video. The IO throughput numbers were unbelievable. The software at the core of the product… Erlang!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://obiefernandez.com/"&gt;&lt;span style="font-weight: bold;"&gt;Obie Fernadez&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Obie and Desi introduced us to the agile practices of Hashrocket, indicating that they have evolved past iterations and they question the value added by iteration activities. They develop in one-week windows and use &lt;a href="http://www.pivotaltracker.com/"&gt;Pivotal Tracker&lt;/a&gt; for tracking stories and progress. The term “Iteration” isn’t even in their vocabulary. Later in the week, I challenged Obie to see if the word “week” replaces the word “iteration” as a convenience and to see if they were doing all things an ”iteration” would entail. The short answer is No! Clearly pivotal tracker desires a good look.  Another tool Obie mentioned later in the week was &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq&lt;/a&gt;... a tool used for screen mocking.  Yet another tool to checkout.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ph7spot.com/"&gt;&lt;span style="font-weight: bold;"&gt;Phillip Hanrigou&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Phillip starts with the phrase “any sufficiently advance technology should feel like magic”. He continues with the fact that 30% of Amazon’s sales is based on recommendations. This was an interesting talk that had me flashing back to Matt’s talk on neo4j looking for synergies.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ayende.com/blog/"&gt;&lt;span style="font-weight: bold;"&gt;Oren Eini&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Oren suggests that TDD doesn’t scale… with a beautiful picture of a motorcycle with training wheels. The major point is that unit tests are bad and scenario based tests are good.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.exampler.com/"&gt;&lt;span style="font-weight: bold;"&gt;Brian Marick&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;The take away… “I don’t want to care about anything until I absolutely have to care about it”… Love it!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.davethomas.net/"&gt;&lt;span style="font-weight: bold;"&gt;Dave Thomas&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Dave introduces us to vector functional languages such as KDB and k. These specialized languages are the workhorses behind querying ½ terabyte of data in 1 second for the hedge fund industry. Dave claims this is the most interesting technology to come along in 25 years. If interested, he suggests getting started with &lt;a href="http://jsoftware.com/"&gt;j from jsoftware.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linkedin.com/in/ericyew"&gt;&lt;span style="font-weight: bold;"&gt;Eric Yew&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Eric gives us a deep dive into GPUs. He was on the NVidia team that built the technology. Eric suggests that GPUs are making the industry rethink previous assumptions that are not correct in the GPU world. How would we code differently if:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There were no costs to threads&lt;/li&gt;&lt;li&gt;And no costs to context switching&lt;/li&gt;&lt;/ol&gt;The approach suggests that memory lookup is too expensive (seems like we keep hearing this :). It is cheaper to recalculate a value on a 100 threads then to retrieve from memory.&lt;br /&gt;&lt;br /&gt;This model supports scale and throughput and not latency. Latency once again is sacrificed.&lt;br /&gt;&lt;br /&gt;The memory model is upside down as well from the traditional general processors. There are 3 memory access points:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;global - ~ 100 cycles to get to it&lt;/li&gt;&lt;li&gt;shared&lt;/li&gt;&lt;li&gt;local – stacks&lt;/li&gt;&lt;/ol&gt;It appears that the old paradigm of being abstracted from the hardware is over. The benefit is that the price of 2 Teraflops is near nothing… thank you computer gaming community!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Day 3&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.nealford.com/"&gt;&lt;span style="font-weight: bold;"&gt;Neal Ford&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Neal did a wonderful job presenting a presentation on presentation :) at a conference on conferences… it was a very meta way to start the morning. The big take away is &lt;a href="http://presentationpatterns.com/"&gt;http://presentationpatterns.com/&lt;/a&gt; a site and forth-coming book on presentation styles, techniques and anti-patterns. The biggest benefit of the book is its focus on the practical. It will include templates for good practices.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pandamonial.grahamis.com/"&gt;&lt;span style="font-weight: bold;"&gt;Amanda Laucher&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Amanda starts by defining the classifications of assholes and morons which got a lot of mileage the rest of the day. Amanda focused on educating us on terminologies in the category theory space with examples in F#. Here was what I was able to capture:&lt;br /&gt;&lt;br /&gt;  * Catamorphism - a fold&lt;br /&gt;  * Anamorphism – unfold&lt;br /&gt;  * Endomorphis – takes a type and returns the same type&lt;br /&gt;  * Homomorphism – takes a structure and returns the same structure or shape&lt;br /&gt;  * Monoid – A Functor&lt;br /&gt;  * Monad – Applied context&lt;br /&gt;  * A Monad is a monoid in the category endofunctors&lt;br /&gt;&lt;br /&gt;&lt;a href="http://redsquirrel.com/dave/"&gt;&lt;span style="font-weight: bold;"&gt;Dave Hoover&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Dave discussed the value of &lt;a href="http://github.com/defunkt/resque"&gt;Resque&lt;/a&gt; and how it help in the development of Groupon.com&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nutrun.com/"&gt;&lt;span style="font-weight: bold;"&gt;George Malamidis&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;George continues the conversation on memory access times and threads, introducing us to &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; as a high scale solution for the web.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.michaelnygard.com/blog/"&gt;&lt;span style="font-weight: bold;"&gt;Michael Nygard&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Thoughts on consistency – what a great talk! Michael introduces the concept of an observer and a super observer in a system through an object lesson. He then follows it up with the fact that with in a database there are often inconsistent states… the point is at the end of a transaction there cannot be any inconsistent states. For example, it is possible that an insert into the database would result in a violation of referential integrity… this is ok and necessary until a commit occurs.&lt;br /&gt;&lt;br /&gt;Consistency is based on time. Frozen time means no change.&lt;br /&gt;&lt;br /&gt;Another practical example:&lt;br /&gt;2 ebay users making the same query at roughly the same time get different query results. This is viewed as being ok, because from the perspective of the observer it is consistent (they have no idea). From the perspective of a super observer there are some inconsistencies. This led to some discussion in mainly of the corporate failures stemming from the complexity created when trying to maintain consistency from the perspective of a super observer (which is a fallacy and trap).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.aslakhellesoy.com/"&gt;&lt;span style="font-weight: bold;"&gt;Aslask Hellesoy&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Another agile talk… this one focused on visualization of the return on development through CFD graphs. The suggestion was that velocity is a questionable valuation.&lt;br /&gt;&lt;br /&gt;References included: &lt;a href="http://bit.ly/3bCNtZ"&gt;CFD Details&lt;/a&gt; and a &lt;a href="http://bit.ly/bBtRc2"&gt;google spreadsheet&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;&lt;span style="font-weight: bold;"&gt;Robert Martin&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;I don’t think you can summarize Uncle Bob… you have to experience him :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;I made a couple of interesting observation / assessments through the conference. The first is there was a large percentage of the speakers / attendees that had a strong EE background. I truly enjoyed revisiting challenges at this level again.&lt;br /&gt;&lt;br /&gt;Here are some of my takeaways from the conference:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We are at the beginning of a new era in field of computing. One in which we do not have a standardize model or tools&lt;/li&gt;&lt;li&gt;There is a need for programming solutions which reduce (or leak) the abstraction from the memory model that is generally preferable in the previous programming model. It will be necessary to indicate that values in memory are near, far or very far. It will be necessary to be able to measure and understand the cache miss rate.&lt;/li&gt;&lt;li&gt;We appear to be at our limits in our pursuit to improve latency. Worse…. Latency is the component that is consistently sacrificed to increase throughput.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3147577372058857138?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3147577372058857138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3147577372058857138' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3147577372058857138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3147577372058857138'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2010/02/speakerconf-2010.html' title='Reporting from SpeakerConf 2010'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3617205626492465343</id><published>2010-01-05T09:11:00.000-08:00</published><updated>2010-01-05T11:05:34.041-08:00</updated><title type='text'>IDEA 9, Gradle and Eating Your Own Dogfood</title><content type='html'>After reading the comment on a post a few weeks ago regarding &lt;a href="http://kensipe.blogspot.com/2009/12/intellij-9-and-gradle.html"&gt;Intellij 9 and Gradle&lt;/a&gt;, I had to laugh.  Having worked on open source projects for 15+ years and presenting at countless conferences and user groups, I have stated roughly the same comment countless times... "It's open source, if you don't like it or you want a change, then do it!".   Thanks to Peter for the suggestion and encouragement.   It clearly seems that my actions were a surprise as Peter's first comment in a private email exchange was "Great you're doing this!"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intellij 9 Development Experience&lt;/span&gt;&lt;br /&gt;Getting the source and setting up for the first run was fairly painless after you find the &lt;a href="http://www.jetbrains.org/pages/viewpage.action?pageId=983225"&gt;download information&lt;/a&gt;.  It was nice to see that the code repository was git.  I ran into 2 issues in getting setup:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Git clone failed with an unclear message initially.  It turned out I was trying to clone using the git protocol behind a corporate firewall which was blocking it.  As soon I was not behind the firewall, all went well.  Be prepared... it is 924 MB.&lt;/li&gt;&lt;li&gt;Setting up the run configuration wasn't complex, but it wasn't as advertised.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Here is what the &lt;span style="font-weight: bold;"&gt;Building and Running from the IDE&lt;/span&gt; from the checkout and build page should read:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open the project as a "new" directory-based project&lt;/li&gt;&lt;li&gt;Configure a JSDK named "IDEA jdk", pointing to an installation of either JDK 1.6 (recommended) or JDK 1.5.  This is on the project tab of the project structure.&lt;/li&gt;&lt;li&gt;Increase the compiler heap size... default is 128M,  it works with 512M :)&lt;/li&gt;&lt;li&gt;Use Build | Make Project to build the code&lt;/li&gt;&lt;li&gt;To run the code, use the provided shared run configuration "IDEA".&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Important notes:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You will see that there are circular dependencies between 4 of the project modules.&lt;/li&gt;&lt;li&gt;With the default compiler heap size, you will get a compilation error ( which is erroneous )&lt;/li&gt;&lt;li&gt;There are a number of deprecation warnings during compilation... this might be a great place for someone to get involved and do some clean up.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;After you have an Intellij running another instance of Intellij :) Here is a list of resources to be familiar with:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.jetbrains.org/display/IJOS/Source+Repository+Layout"&gt;Source Repository Layout&lt;/a&gt;&lt;/li&gt;&lt;li&gt;View PSI structure (under the tool menu) - PSI is an IDEA AST abstraction, which was the toughest learning curve.  Learn it!  Then look at the following clases and their usage in the code base: PsiUtilBase, PsiUtil, PsiResolveHelper, PsiResolveHelperImpl&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;End Result&lt;/span&gt;&lt;br /&gt;In the end,  I spent 4 hours adding in additional gradle task support into Intellij 9, created a patch and submitted to Peter... a few days later I was informed that it was committed to repository.  Enhanced Gradle support is on it's way!&lt;br /&gt;&lt;br /&gt;I had mixed feels when IDEA announced it was going open source, but now that it is... Let's get in there and make this an even better editor!&lt;br /&gt;&lt;br /&gt;Kudos to JetBrains and it's community!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3617205626492465343?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3617205626492465343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3617205626492465343' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3617205626492465343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3617205626492465343'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2010/01/idea-9-and-gradle-eating-your-own.html' title='IDEA 9, Gradle and Eating Your Own Dogfood'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-8459853476748913186</id><published>2009-12-31T18:40:00.000-08:00</published><updated>2010-02-21T22:00:56.861-08:00</updated><title type='text'>3 Core Principles from 1998</title><content type='html'>I was off for the holidays which gave me some time to clean out the storage area.  I ran across some notes from a conference I attended in 1998 and 3 core principles stood out that I thought I would share as we start this new year.&lt;br /&gt;&lt;br /&gt;Core Principles (as I wrote them many years ago):&lt;br /&gt;1. Smaller is better than larger&lt;br /&gt;2. Understood is better than unknown&lt;br /&gt;3. Progress is better than promises&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Smaller is better than larger&lt;/span&gt;&lt;br /&gt;There was nothing else written and I left nothing  by way of context... regardless of what it meant then, it is clear that this is a great principle when it comes to code.  Less code that does the same amount of work is better.  The paradox is that it may take a little more time to develop a smaller code solution, but it pays off.  The skill is in not being so abstract and so small as to not be readable or maintainable.   It is this balance that makes a true software craftsman.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Understood is better than unknown&lt;/span&gt;&lt;br /&gt;If there is one word that we would use to describe the issues of software development... it is the word "unknown".  Estimating the known is easy.  Estimating the unknown, is unknowable.  The skill in software development is to separate the unknowns from the knows.  Estimate the knowns and provide a SWAG estimate for the unknowns... these are estimates that you need to keep in check.  It is best to delay the estimates and work of the unknowns until ( what &lt;a href="http://en.wikipedia.org/wiki/Kevlin_Henney"&gt;Kevlin Henney&lt;/a&gt; brilliantly describes as) the last responsible moment.  Of course this only works for the known unknowns... what will get you is the unknown unknowns:)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Progress is better than promises&lt;/span&gt;&lt;br /&gt;This is why I have been a practitioner and trainer for XP and agile practices for many years.  It is all about developing business value on a regular and iterative basis.  Promises are meaningless... progress is all that matters.&lt;br /&gt;&lt;br /&gt;Happy New Year!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-8459853476748913186?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/8459853476748913186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=8459853476748913186' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8459853476748913186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8459853476748913186'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/12/3-core-principles-from-1998.html' title='3 Core Principles from 1998'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-7972919581271667965</id><published>2009-12-14T14:18:00.000-08:00</published><updated>2009-12-14T15:14:39.419-08:00</updated><title type='text'>Intellij 9 and Gradle</title><content type='html'>One of the hidden gems of the Intellij 9 release is it's support for Gradle.  Some of the information on the web is out of date and some features are not intuitive.  This post will detail some of the nuances and follow it up with a wish list for the next update :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gradle Support&lt;/span&gt;&lt;br /&gt;The &lt;a href="http://blogs.jetbrains.com/idea/2009/08/gradle-support/"&gt;information from JetBrains&lt;/a&gt; is out of date.  In order to setup gradle after the GA release, all you need to do is configure the gradle home under File -&gt; Other Settings -&gt; Template Setttings.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QF--bHkNI1A/Sya7TlLvS2I/AAAAAAAAAqc/5GB13z_THxo/s1600-h/Screen+shot+2009-12-14+at+Dec+14+-+4.24.43+PM.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 88px;" src="http://2.bp.blogspot.com/_QF--bHkNI1A/Sya7TlLvS2I/AAAAAAAAAqc/5GB13z_THxo/s320/Screen+shot+2009-12-14+at+Dec+14+-+4.24.43+PM.png" alt="" id="BLOGGER_PHOTO_ID_5415221547032857442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gradle Intellij Nuances&lt;/span&gt;&lt;br /&gt;After setting up IDEA to work with Gradle, you'll need a build file.  I didn't discover a way to create a gradle build file from IDEA.    Just create a new file and name it "build.gradle" in the root of the module directory structure.&lt;br /&gt;&lt;br /&gt;When writing the build script, Intellij expects to work with gradle in a way that is depreciated.  It will pick up on a createTask(..) method.  If the cursor is on a task such as this, and you hit ctrl+shft+F10, it will auto-discover and run that task in the script. (cool stuff)&lt;br /&gt;&lt;br /&gt;Hotkeys to know:&lt;br /&gt;ctrl+shft+F10 - runs task the cursor is on&lt;br /&gt;shft+F10 - runs the last script (or the last run)&lt;br /&gt;alt+shft+F10 - pops up a run menu (with all previously run gradle run configs)&lt;br /&gt;&lt;br /&gt;The figure below shows an alt+shft+F10 when the cursor is on a task called task2.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QF--bHkNI1A/Sya-3QKXWQI/AAAAAAAAAqs/7yybDG8sfaw/s1600-h/Screen+shot+2009-12-14+at+Dec+14+-+4.39.30+PM.png"&gt;&lt;img style="cursor: pointer; width: 194px; height: 184px;" src="http://1.bp.blogspot.com/_QF--bHkNI1A/Sya-3QKXWQI/AAAAAAAAAqs/7yybDG8sfaw/s320/Screen+shot+2009-12-14+at+Dec+14+-+4.39.30+PM.png" alt="" id="BLOGGER_PHOTO_ID_5415225458400123138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you code gradle in a non-depreciated way... then IDEA does not auto-discover the tasks.  Below is what one would expect in a gradle build file:&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;usePlugin 'java'&lt;br /&gt;&lt;br /&gt;repositories {&lt;br /&gt;mainCentral()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// from the gradle user guide&lt;br /&gt;// http://www.gradle.org/0.8/docs/userguide/tutorial_using_tasks.html&lt;br /&gt;task hello &lt;&lt; {     &lt;br /&gt; println 'Hello world'  &lt;br /&gt;}   &lt;br /&gt;task intro(dependsOn: hello) &lt;&lt; {   &lt;br /&gt; println "I'm Gradle"  &lt;br /&gt;}  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tasks would normally be created this way... It is still great that IDEA has gradle support in general regardless of this oversight.  After a run configuration is configured with a targeted task, it worlds with no pain.  Also you could add:&lt;br /&gt;&lt;pre class="brush: groovy"&gt; defaultTasks "intro"&lt;/pre&gt;and gradle runs this as the fallback when IDEA doesn't provide the required task.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intellij / Gradle features&lt;/span&gt; I'm looking forward to:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;IDEA understands proper task configuration&lt;/li&gt;&lt;li&gt;IDEA makes it easy to create new projects with a structure maven and gradle expects.&lt;/li&gt;&lt;li&gt;IDEA treats gradle as a peer with Maven and Ant.  This includes:&lt;br /&gt;a. Gradle Window (similar to the ant build and maven projects panels)&lt;br /&gt;b. Before Launch Gradle tasks in the run configurations&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-7972919581271667965?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/7972919581271667965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=7972919581271667965' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7972919581271667965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7972919581271667965'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/12/intellij-9-and-gradle.html' title='Intellij 9 and Gradle'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QF--bHkNI1A/Sya7TlLvS2I/AAAAAAAAAqc/5GB13z_THxo/s72-c/Screen+shot+2009-12-14+at+Dec+14+-+4.24.43+PM.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3845158435240136242</id><published>2009-12-05T20:04:00.000-08:00</published><updated>2009-12-05T20:21:55.073-08:00</updated><title type='text'>More Trouble with Java and Apple</title><content type='html'>Well the latest update for Java from Apple came through recently.  Destroying all in its path...&lt;br /&gt;If you followed my &lt;a href="http://kensipe.blogspot.com/2009/09/fixing-java-on-mac-snow-leopard.html"&gt;advice in the past &lt;/a&gt;on getting Java 1.5 working on a Snow Leopard, then the new Apple update destroys that with the follow error for a Java 5 java -version:&lt;br /&gt;Error occurred during initialization of VM&lt;br /&gt;Unable to load native library: libjava.jnilib&lt;br /&gt;Abort trap&lt;br /&gt;&lt;br /&gt;I didn't track down the exact issue... however it is easy to detect that the Java update converts the symbolic links for Java 1.5 to point back to Java 6... Apparently Apple is NOT sorry for their crazy choice of ignorantly doing this in the first place.  The solution is to completely go through the process out lined at &lt;a href="http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard"&gt;OneSwarm&lt;/a&gt; again and re-establish the symbolic links.  This will require you to delete the symbolic links that point to "CurrentJDK" for 1.4, 1.4.2, 1.5, and 1.5.0.&lt;br /&gt;&lt;br /&gt;After edits an ls -l in the /System/Library/Frameworks/JavaVM.framework/Versions should look like:&lt;br /&gt;&lt;pre class="brush: bash"&gt;&lt;br /&gt;drwxr-xr-x  15 root  wheel  510 Dec  5 22:18 .&lt;br /&gt;drwxr-xr-x  12 root  wheel  408 Dec  5 22:15 ..&lt;br /&gt;lrwxr-xr-x   1 root  wheel    5 Dec  5 21:35 1.3 -&gt; 1.3.1&lt;br /&gt;drwxr-xr-x   3 root  wheel  102 Jul 20 18:35 1.3.1&lt;br /&gt;lrwxr-xr-x   1 root  wheel    5 Dec  5 22:18 1.4 -&gt; 1.4.2&lt;br /&gt;lrwxr-xr-x   1 root  wheel   14 Dec  5 22:18 1.4.2 -&gt; 1.4.2-leopard/&lt;br /&gt;drwxr-xr-x@  9 root  wheel  306 Feb 12  2009 1.4.2-leopard&lt;br /&gt;lrwxr-xr-x   1 root  wheel    5 Dec  5 22:01 1.5 -&gt; 1.5.0&lt;br /&gt;lrwxr-xr-x   1 root  wheel   14 Dec  5 22:00 1.5.0 -&gt; 1.5.0-leopard/&lt;br /&gt;drwxr-xr-x@ 10 root  wheel  340 Dec  5 21:59 1.5.0-leopard&lt;br /&gt;lrwxr-xr-x   1 root  wheel    5 Dec  5 21:35 1.6 -&gt; 1.6.0&lt;br /&gt;drwxr-xr-x   8 root  wheel  272 Nov  8 14:35 1.6.0&lt;br /&gt;drwxr-xr-x   9 root  wheel  306 Dec  5 21:35 A&lt;br /&gt;lrwxr-xr-x   1 root  wheel    1 Dec  5 21:35 Current -&gt; A&lt;br /&gt;lrwxr-xr-x   1 root  wheel    3 Dec  5 21:35 CurrentJDK -&gt; 1.6&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Happy coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3845158435240136242?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3845158435240136242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3845158435240136242' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3845158435240136242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3845158435240136242'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/12/more-trouble-with-java-and-apple.html' title='More Trouble with Java and Apple'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-2047239891230151585</id><published>2009-11-27T13:03:00.000-08:00</published><updated>2009-11-27T13:20:04.955-08:00</updated><title type='text'>Syntax Highlighting on Blogspot</title><content type='html'>I've been very interested in providing some syntax highlighting in my blog posts, which I've been slow in general getting out... ( I have 6 or so queued up ).  I finally found something I like and thought I would share the love.  Special thanks to @ecounysis on twitter from whom I made this discovery.  There are no excuses for my future posts... they will all have nice highlighting and be more easily copied (via the clipboard feature).&lt;br /&gt;&lt;br /&gt;The place to start is: &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Hosting"&gt;http://alexgorbatchev.com/wiki/SyntaxHighlighter:Hosting&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From there you'll see the link to: &lt;a href="http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html"&gt;http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One important thing to note for those on blogger / blogspot.  The initial update of   the head tag didn't take for me.  The solution for me was to add the highlighting entries at the tail end of head, just prior to the closing tag.&lt;br /&gt;&lt;br /&gt;In addition to many of the bundled options... I've added F# and Objective-C from &lt;a href="http://www.undermyhat.org/blog/2009/09/list-of-brushes-syntaxhighligher/"&gt;undermyhat&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-2047239891230151585?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/2047239891230151585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=2047239891230151585' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2047239891230151585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2047239891230151585'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/11/syntax-highlighting-on-blogspot.html' title='Syntax Highlighting on Blogspot'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-2195277967020014481</id><published>2009-09-03T13:55:00.000-07:00</published><updated>2009-11-27T12:49:11.269-08:00</updated><title type='text'>Fixing Java on Mac Snow Leopard</title><content type='html'>I have long documented some of the issues and differences for a Java developer on the Mac OS X. Most of that has been on Leopard, OS X 10.5. For quick links the most significant articles are: &lt;a href="http://kensipe.blogspot.com/2009/01/java-is-2nd-class-citizon-on-mac-osx.html"&gt;Java is a 2nd Class Citizen on MAC OSX&lt;/a&gt;,  &lt;a href="http://kensipe.blogspot.com/2008/08/fixing-java-memory-tools-on-mac-os-x.html"&gt;Fixing Java Memory Tools on Mac OS X&lt;/a&gt; and &lt;a href="http://kensipe.blogspot.com/2009/02/java-7-on-mac-os-x.html"&gt;Java 7 on Mac OS X&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Monday I was faced with a new situation, Snow Leopard OS X 10.6.   There are several issues with Java on the new Mac OSX 10.6 "Snow Leopard".  This post will outline the known issues and will provide fixes for several of them (or provide links where fixes are already explained).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Known Issues:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Java 5 is not installed&lt;/li&gt;&lt;li&gt; Java 5 symbolic links are set to Java 6&lt;/li&gt;&lt;li&gt; jmap - some aspects of jmap do not function&lt;/li&gt;&lt;li&gt;javascript runtime is still missing&lt;/li&gt;&lt;/ol&gt;As a consequence, applications that used Java 5 either don't work, or provide a message as shown here from my favorite stock trading application.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QF--bHkNI1A/SqAvy9VOPAI/AAAAAAAAAqM/50RZnFqENG8/s1600-h/Screen+shot+2009-09-02+at+Sep+2+-+9.32.12+AM.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 170px;" src="http://4.bp.blogspot.com/_QF--bHkNI1A/SqAvy9VOPAI/AAAAAAAAAqM/50RZnFqENG8/s320/Screen+shot+2009-09-02+at+Sep+2+-+9.32.12+AM.png" alt="" id="BLOGGER_PHOTO_ID_5377350507583912962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* I'm still looking for more issues, so if you can add to the list, please add comments, email or twitter.&lt;br /&gt;** I have tested the latest BTrace and it works fine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java 5 on Snow Leopard&lt;/span&gt;&lt;br /&gt;Whither you agree with the removal of Java 5 or not, it is unbelievable to me that the Java 5 symbolic links are pointing to the CurrentJDK which points to 1.6.  For those new to this space the Java version live under /System/Library/Frameworks/JavaVM.framework/Versions .  I would advise you to either:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; replace Java 5 using instructions provided at &lt;a href="http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard"&gt;leopard http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard&lt;/a&gt;&lt;/li&gt;&lt;li&gt;simply delete the java 5 symbolic links&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;As a side note, I use a script for swapping between JVM versions.  I modified the &lt;a href="http://homepage.mac.com/shawnce/misc/java_functions_bashrc.txt"&gt;original script&lt;/a&gt; to just include 3  important functions when sourced in.  I'll add the script to the bottom of this post as a reference.  The 3 functions are  jvms, setJava, unsetJava.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;jvms reads through the version directory and reports what it reads of the file system.  &lt;/li&gt;&lt;li&gt;setJava allows you to type in the name of the version and switches JAVA_HOME and path to this version of the JVM.&lt;/li&gt;&lt;li&gt;unsetJava reverts the set to the original java version&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;JMap on Snow Leopard&lt;/span&gt;&lt;br /&gt;My initial execution of jmap on snow leopard failed with the following error message:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;kensipe$ jmap 3407&lt;br /&gt;Attaching to process ID 3407, please wait...&lt;br /&gt;sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "heapOopSize" in any of the known library names (-)&lt;br /&gt;  at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:399)&lt;br /&gt;  at sun.jvm.hotspot.HotSpotTypeDataBase.readVMIntConstants(HotSpotTypeDataBase.java:319)&lt;br /&gt;  at sun.jvm.hotspot.HotSpotTypeDataBase.&lt;init&gt;(HotSpotTypeDataBase.java:88)&lt;br /&gt;  at sun.jvm.hotspot.MacOSXTypeDataBase.&lt;init&gt;(MacOSXTypeDataBase.java:36)&lt;br /&gt;  at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:578)&lt;br /&gt;  at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:499)&lt;br /&gt;  at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:337)&lt;br /&gt;  at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)&lt;br /&gt;  at sun.jvm.hotspot.tools.PMap.main(PMap.java:67)&lt;br /&gt;  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;  at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt;  at sun.tools.jmap.JMap.runTool(JMap.java:179)&lt;br /&gt;  at sun.tools.jmap.JMap.main(JMap.java:110)&lt;br /&gt;Debugger attached successfully.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The good news is that the debugger attached successfully :)&lt;br /&gt;&lt;br /&gt;Information regarding this issue is scarce.  It turns out to likely be an issue with the version of Java that is distributed with snow leopard.  The JDK 1.6 rev 14 appears (based on non-confirmed web sources) to have this issue.  The latest is JDK 1.6 rev 16 should have the fix, however using the apple distro, we are left waiting for Apple for the fix.  Although jmap fails with no arguments it does succeed for certain commands such as  jmap -histo 3407.&lt;br /&gt;After replacing the JDK 5 with the leopard distro as advertised above and switching to this version with the script above, jmap works fine.  However jdk 5 jmap only works against jdk 5 running applications.  It fails against java 6.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;javascript&lt;/span&gt;&lt;br /&gt;As record in a posting from a year ago, called &lt;a href="http://kensipe.blogspot.com/2009/02/fixing-btrace-on-mac.html"&gt;Fixing Java Memory Tools on Mac OS X&lt;/a&gt;, the javascript library is still not provided by Apple as part of the Java distro.  You will need to following the instructions there to fix it.  Unfortunately the Rhino download has disappeared from the Mozilla site, so if you didn't keep a copy, ping me and I will send you want I have.  You will also need to duplicate this for each version of Java if you install the Java 5 Leopard package.&lt;br /&gt;The test to see if this is setup correctly for you is: jrunscript -q&lt;br /&gt;If that command only returns AppleScript, then you are missing the javascript engine which is need for a number of tools in the JDK.&lt;br /&gt;&lt;br /&gt;After these changes, it appears that Snow Leopard is ready for some hard core Java development.  Good Luck and Happy Coding!&lt;br /&gt;&lt;br /&gt;Java Switching Script that I use:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash"&gt;&lt;br /&gt;&lt;br /&gt;# *************************************************************************&lt;br /&gt;# Originally written by Shawn Erickson - shawn at freetimesw.com&lt;br /&gt;#&lt;br /&gt;#&lt;br /&gt;# Last Update: 2008y 08m 8d&lt;br /&gt;#&lt;br /&gt;# The following functions are meant for use with bash shell which is currently the&lt;br /&gt;# default on Mac OS X 10.4 (starting with 10.3 IIRC) unless otherwise configured.&lt;br /&gt;#  Good info on why not sym links: http://lists.apple.com/archives/Java-dev/2006/Jan/msg00290.html&lt;br /&gt;#&lt;br /&gt;#  from: http://lists.apple.com/archives/Java-dev/2005/Aug/msg00506.html&lt;br /&gt;#  http://homepage.mac.com/shawnce/misc/java_functions_bashrc.txt&lt;br /&gt;#&lt;br /&gt;# *************************************************************************&lt;br /&gt;&lt;br /&gt;### Prompt ###&lt;br /&gt;&lt;br /&gt;export CURRENT_MODE_STRING="";&lt;br /&gt;&lt;br /&gt;### Java Environment Functions ###&lt;br /&gt;&lt;br /&gt;J_VERSIONS_DIRECTORY="/System/Library/Frameworks/JavaVM.framework/Versions"&lt;br /&gt;J_COMMANDS_SUBPATH="Commands"&lt;br /&gt;J_HOME_SUBPATH="Home"&lt;br /&gt;&lt;br /&gt;function availableJVMs()&lt;br /&gt;{&lt;br /&gt;  ls -1 $J_VERSIONS_DIRECTORY | grep ^[0-9].[0-9]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function jvms()&lt;br /&gt;{&lt;br /&gt;  clear&lt;br /&gt;  echo "Available JVMs: "$jvms&lt;br /&gt;  ls -1 $J_VERSIONS_DIRECTORY | grep ^[0-9].[0-9]  # look to remove redundant call&lt;br /&gt;  echo " "&lt;br /&gt;&lt;br /&gt;  echo "Current Java:"&lt;br /&gt;  java -version&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function setJava()&lt;br /&gt;{&lt;br /&gt;  local target_jvm=""&lt;br /&gt;  local jvms=$(availableJVMs)&lt;br /&gt;&lt;br /&gt;  # Validate that the user requested an available JVM present on the system&lt;br /&gt;&lt;br /&gt;  for jvm in $jvms ; do&lt;br /&gt;      if [ "$jvm" == "$@" ]; then&lt;br /&gt;          target_jvm=$@ &lt;br /&gt;      fi&lt;br /&gt;  done&lt;br /&gt;&lt;br /&gt;  if [ "$target_jvm" == "" ]; then&lt;br /&gt;      echo "Unsupported Java version requested"&lt;br /&gt;      return;&lt;br /&gt;  fi&lt;br /&gt;&lt;br /&gt;  # If we get here the user asked for a valid JVM, so configure it&lt;br /&gt;&lt;br /&gt;  echo "Configuring Shell Environment for Java "$@&lt;br /&gt;  export JAVA_VERSION=$@&lt;br /&gt;&lt;br /&gt;  # First unset any current set java, back to default before doing configuration&lt;br /&gt;  _unsetJava&lt;br /&gt;&lt;br /&gt;  # Generate the paths needed for the JVM requested&lt;br /&gt;  local jcmd="${J_VERSIONS_DIRECTORY}/$@/${J_COMMANDS_SUBPATH}"&lt;br /&gt;  local jhome="${J_VERSIONS_DIRECTORY}/$@/${J_HOME_SUBPATH}"&lt;br /&gt;&lt;br /&gt;  # We save the original path so we can toggle back if unset&lt;br /&gt;  ORIGINAL_PATH="$PATH"&lt;br /&gt;  PATH="$jcmd:${PATH}"&lt;br /&gt;&lt;br /&gt;  # We save the original JAVA_HOME so we can toggle back if unset&lt;br /&gt;  ORIGINAL_JAVA_HOME="$JAVA_HOME"&lt;br /&gt;  JAVA_HOME="$jhome"&lt;br /&gt;&lt;br /&gt;  # Update command prompt mode tag to note JVM setting&lt;br /&gt;  CURRENT_MODE_STRING="J$@"&lt;br /&gt;&lt;br /&gt;  echo "Current Java:"&lt;br /&gt;  java -version&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function _unsetJava()&lt;br /&gt;{&lt;br /&gt;  if [ "$CURRENT_MODE_STRING" != "" ]; then&lt;br /&gt;          PATH="$ORIGINAL_PATH"&lt;br /&gt;      JAVA_HOME="$ORIGINAL_JAVA_HOME"&lt;br /&gt;      CURRENT_MODE_STRING=""&lt;br /&gt;  fi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function unsetJava()&lt;br /&gt;{&lt;br /&gt;  echo "Configuring Shell Environment for default Java"&lt;br /&gt;   _unsetJava&lt;br /&gt;&lt;br /&gt;  echo "Current Java:"&lt;br /&gt;      java -version&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/init&gt;&lt;/init&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-2195277967020014481?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/2195277967020014481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=2195277967020014481' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2195277967020014481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2195277967020014481'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/09/fixing-java-on-mac-snow-leopard.html' title='Fixing Java on Mac Snow Leopard'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QF--bHkNI1A/SqAvy9VOPAI/AAAAAAAAAqM/50RZnFqENG8/s72-c/Screen+shot+2009-09-02+at+Sep+2+-+9.32.12+AM.png' height='72' width='72'/><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6755147272108160440</id><published>2009-08-19T12:14:00.000-07:00</published><updated>2009-08-19T12:36:44.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PM'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>97 Things Every Project Manager Should Know</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QF--bHkNI1A/SoxT2_LoEtI/AAAAAAAAApk/xvf6EOVXhJs/s1600-h/Untitled1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 220px; height: 320px;" src="http://2.bp.blogspot.com/_QF--bHkNI1A/SoxT2_LoEtI/AAAAAAAAApk/xvf6EOVXhJs/s320/Untitled1.png" alt="" id="BLOGGER_PHOTO_ID_5371760659684397778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The book &lt;a href="http://www.amazon.com/Things-Every-Project-Manager-Should/dp/0596804164/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1250709164&amp;amp;sr=8-1"&gt;&lt;span style="font-style: italic;"&gt;97 Things Every Project Manager Should Know&lt;/span&gt;&lt;/a&gt; put together by Barbee Davis is out, and worth picking up... why the magical 97?  Apparently 101 was way over used... or perhaps Barbee couldn't get the last 4 in before it was time to publish :)&lt;br /&gt;&lt;br /&gt;This book has some great insights from a number of sources, which is a huge value add to any project manager or senior developer.  This is the top advice from experts in the field around team building, running a software project, and generally how to herd cats.&lt;br /&gt;&lt;br /&gt;Most books in this space are limited to the experience of the author and his/her circle of influence.  The beautiful part of this book, is the fact that Barbee has captured the most interesting and important tid bits stories of success and failures of software projects from a large sample of project managers and developers each providing a view from different industry verticals.&lt;br /&gt;&lt;br /&gt;Well done Barbee!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6755147272108160440?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6755147272108160440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6755147272108160440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6755147272108160440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6755147272108160440'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/08/97-things-every-project-manager-should.html' title='97 Things Every Project Manager Should Know'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QF--bHkNI1A/SoxT2_LoEtI/AAAAAAAAApk/xvf6EOVXhJs/s72-c/Untitled1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-2657266375678144483</id><published>2009-07-20T08:40:00.000-07:00</published><updated>2009-07-20T09:59:14.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java memory btrace'/><title type='text'>Speaking at JavaZone in Oslo</title><content type='html'>It's official... I will be heading to Oslo, Norway in September for &lt;a href="http://jz09.java.no/agenda-en/"&gt;JavaZone&lt;/a&gt;. I will be presenting Debugging your production JVM, which is talk largely focused on &lt;a href="http://kenai.com/projects/btrace/pages/Home"&gt;BTrace&lt;/a&gt;.  Also if you didn't realize it yet... BTrace has moved to the kenai site:  &lt;a href="http://kenai.com/projects/btrace/pages/Home"&gt;http://kenai.com/projects/btrace/pages/Home&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-2657266375678144483?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/2657266375678144483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=2657266375678144483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2657266375678144483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2657266375678144483'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/07/speaking-at-javazone-in-oslo.html' title='Speaking at JavaZone in Oslo'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-5966737020859035155</id><published>2009-06-22T17:30:00.000-07:00</published><updated>2009-06-22T18:20:25.015-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jps Java Groovy'/><title type='text'>If you can't be a good speaker, be a groovy speaker</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.springone2gx.com/conference/new_orleans/2009/10/home"&gt;&lt;img style="cursor: pointer; width: 126px; height: 126px;" src="http://www.springone2gx.com/images/2009/2gx_2009_125x125_speaker.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I will be speaking on groovy and grails at the up coming 2GX conference in New Orleans in October.  If you are in the groovy space or you are just looking, you don't want to miss this... all the big names will be there.   Most of the leading authors and committers in the groovy, grails and griffon space will be there!&lt;br /&gt;&lt;br /&gt;How I got to be among them is beyond me... but it sure is groovy!&lt;br /&gt;&lt;br /&gt;My topics include security, where the focus will include defense against hacking techniques such as injection flaws and XSS, followed by a walk through of the security plugin and how to secure urls and services.  The second session is on Java memory management, the memory demands of a dynamic language, along with tools on debugging Grails applications in production.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-5966737020859035155?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/5966737020859035155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=5966737020859035155' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5966737020859035155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5966737020859035155'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/06/if-you-cant-be-good-speaker-be-groovy.html' title='If you can&apos;t be a good speaker, be a groovy speaker'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6165325079648246633</id><published>2009-06-11T09:59:00.000-07:00</published><updated>2009-06-11T10:23:18.687-07:00</updated><title type='text'>Personal Career Guiding Principals</title><content type='html'>I have received a number of requests from team members and &lt;a href="http://www.nofluffjuststuff.com/home.jsp"&gt;session attendees&lt;/a&gt; for career path guidance.  Here is what I threw together... I would enjoy others comments on what makes a difference for them!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Guiding Principles&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Become an expert at what is coming...&lt;/span&gt;&lt;br /&gt;I've been lucky to live in an area of the country which is conservative when it comes to technology, which can at times be very dissatisfying. I travel to the coast (usually west) at least once per year for a technical conference. Through observation and networking, I learn the passions of the technical industry (not the vendor hype... beware the vendor hype). I make time to become well versed in these spaces. Within 1 year clients are interested and are looking for advice, within 2 they are looking for consultants. This is absolutely necessary to be a good architect anyway. &lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: No one should work in our business without reading the &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959"&gt;mythical man month&lt;/a&gt;&lt;span style="font-style: italic;"&gt;.  Also read the pragmatic programmer or the quick guide if not the book: &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.codinghorror.com/blog/files/Pragmatic%20Quick%20Reference.htm"&gt;http://www.codinghorror.com/blog/files/Pragmatic%20Quick%20Reference.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Have the final say on matters that affect you...&lt;/span&gt;&lt;br /&gt;Each of us is responsible for ourselves. If a company says no to training, or a conference or... that doesn't mean no to me... it means that this activity will not be subsidized. The next question to me is it worth the full obligation. There are plenty of training courses I've not only paid for, but took vacation time to be at. I currently have a nice large LCD screen, a wireless headset for my office phone and I don't use the corporate PC, I bought a MacBook Pro... all of which I paid for. I am generally unwilling to compromise working with the best tools. It shocks me in fact that Chefs bring their own cutlery, mechanics bring their own tools and software developers have better machines at home then they use at work, with an expectation that all their tools are provided for them by some company. In addition to the MacBook, I have invested significant dollars in software. Although I like open source, in many cases it is not the best. So I have TextMate, Intellij, MS Office, Keynote, etc. This wasn't as easy starting out, now frankly some vendors send me licenses now so that I'm showing their tool when I'm demoing. It is important to note that I do not accept licenses even for free if I can't stand behind the tool.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: Invest in you! Be a master craftsman.  Read: &lt;/span&gt;&lt;a style="font-style: italic;" href="http://blog.objectmentor.com/articles/2009/04/01/master-craftsman-teams"&gt;http://blog.objectmentor.com/articles/2009/04/01/master-craftsman-teams&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Seek out Mentors and Network...&lt;/span&gt;&lt;br /&gt;Find people who are great at what they do in an area of interest and seek them out, read their books, articles and blogs. Email them. Network with them. Obviously don't annoy them. Perhaps buy them lunch. Challenge them (for instance, "you said xyz, why would you say that?" or "why wouldn't you say yyy?"). Better yet, see what they are thinking about, what they are working on and what they might need help with. Help them! Pass them some work (if they have time), and ask their opinion.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: Go to conferences and network.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Build your brand...&lt;/span&gt;&lt;br /&gt;Create a brand for yourself. Be the Java Memory guy, the F# guy. Dive deep and market yourself. This means; a) find jobs or opportunities to work in this space, b) blog in this space, c) provide presentations in this space d) write articles or a book in this space. Your digital footprint is very important and it takes time to build out. As an example, if you search my name, the first several pages are me. This is significant. The goal here is to in a position to be hired for a gig without a resume. Those asking for you by name don't need a resume, they know what you represent. Reputation is everything! The great thing about a personal brand is it is more reasonable to change than a business brand... so 2 years as the czar of java, followed by...&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: Read &lt;a href="http://www.amazon.com/Groundswell-Winning-Transformed-Social-Technologies/dp/1422125009"&gt;Groundswell&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Know who you are and what makes you special...&lt;/span&gt;&lt;br /&gt;This takes time for most people. You have to know what your talents are and what you are not good at. When you know what you lack, find teams / team members to compensate. For instance, I am a knowledge sponge and learn very quickly, but I get bored quickly. I am not as good working with a plain piece of paper, but I can perfect and analyze the dickens out of any architecture, system or code put in front of me. Take some personality tests and understand your personality. It's worth it! In the process of learning you.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: Read &lt;a href="http://brainrules.net/"&gt;Brain Rules.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Learn and consistently work on soft skills&lt;/span&gt;&lt;br /&gt;Don't be the average developer... It is ok to be a geek, but be an alpha geek! Most developers will have one of two paths; PM or architect. Either way, the skills are completely different from what made them great as a developer. In the end, developing software is about enabling the business to a) make money or b) save money. Learn their language.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: Read &lt;a href="http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671723650"&gt;How to win friends and influence people&lt;/a&gt; and &lt;a href="http://www.amazon.com/Habits-Highly-Effective-People/dp/0671708635"&gt;seven habits of highly effective people&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Be a Leader!&lt;/span&gt;&lt;br /&gt;Leadership is earned... it isn't a title. For a technical person, It consists of having deep technical skills in at least 1 area combined with good morals. People follow people who know what the heck they are talking about and they trust. Knowledge without morals and people don't trust you. Morals without knowledge and you are a really nice guy. It has to be both.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Don't be Afraid:&lt;/span&gt;&lt;br /&gt;- to say no (especially to things that don't align with you, know what you want)&lt;br /&gt;- to have an opinion or stance on a subject (as soon as you do someone will shoot arrows at you)&lt;br /&gt;- to change your opinion when the evidence dictates... but not based on pressure or opinion&lt;br /&gt;- to make a decision (even in the absence of information)&lt;br /&gt;- to be criticized&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: Read &lt;a href="http://www.amazon.com/Who-Moved-My-Cheese-Amazing/dp/0399144463"&gt;Who moved my Cheese&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9. Eat like a Bird and poop like an elephant&lt;/span&gt;&lt;br /&gt;This is a wonderful phrase by &lt;a href="http://www.guykawasaki.com/"&gt;Guy Kawasaki&lt;/a&gt;. Birds eat half their weight in food per day... Elephats poop... well they poop a lot. The idea is to read, listen, consume knowledge... then poop... I mean share that knowledge with anyone and everyone. I have a large library (which I read), and an account with Audible and Audio-Tech Book Summaries.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Suggestion: Read &lt;a href="http://www.amazon.com/Made-Stick-Ideas-Survive-Others/dp/1400064287"&gt;made to stick&lt;/a&gt;, and &lt;a href="http://www.guykawasaki.com/books/rules.shtml"&gt;rules for revolutionaries&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10. Passion!&lt;/span&gt;&lt;br /&gt;Have some... find it! There is nothing more convincing and more contagious than someone with passion. Change you, then change the world!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;11. Have fun...&lt;/span&gt;&lt;br /&gt;Life is too short&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6165325079648246633?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6165325079648246633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6165325079648246633' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6165325079648246633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6165325079648246633'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/06/personal-career-guiding-principals.html' title='Personal Career Guiding Principals'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-8890208546701383581</id><published>2009-06-09T14:43:00.000-07:00</published><updated>2009-06-11T09:59:05.458-07:00</updated><title type='text'>BTrace and JStat</title><content type='html'>I just finished a &lt;a href="http://www28.cplan.com/cc230/sessions_catalog.jsp?ilc=230-1&amp;amp;ilg=english&amp;amp;isort=&amp;amp;isort_type=&amp;amp;is=yes&amp;amp;icriteria1=+&amp;amp;icriteria2=+&amp;amp;icriteria8=&amp;amp;icriteria3=sipe&amp;amp;icriteria9=&amp;amp;icriteria4=+&amp;amp;icriteria7=+"&gt;JavaOne presentation&lt;/a&gt; on &lt;a href="http://www.slideshare.net/kensipe/debugging-your-production-jvm"&gt;Debugging your Production JVM&lt;/a&gt;.  The killer part and climax of the presentation was on &lt;a href="https://btrace.dev.java.net/"&gt;BTrace&lt;/a&gt;.  BTrace just rocks!    As good as it is, the documentation and javadoc information is somewhat dated.  This post will explain one of my favorite tool sets working together;  that being jstat and Btrace.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;JStat&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jstat.html"&gt;Jstat&lt;/a&gt; is a tool that has been provided in the jdk bin directory since Java 5.  It has a number features, which can be examined by using the flag -options: &lt;pre&gt;jstat -options&lt;/pre&gt;  The most significant in my opinion being jstat -gcutils which provides an output of jvm memory by compartment; survivor spaces, eden, old and perm space.  Here are the steps if this is new to you:&lt;br /&gt;1. start an demo application: java -jar Java2D.jar&lt;br /&gt;2. get the pid: jps&lt;br /&gt;3. lauch jstat: jstat -gcutil 1483&lt;br /&gt;output:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT&lt;br /&gt;0.00   0.00  10.61  59.98  76.81      8    0.057     9    0.460    0.516&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;BTrace&lt;/span&gt;&lt;br /&gt;&lt;a href="https://btrace.dev.java.net/"&gt;Btrace&lt;/a&gt; is a tool that allows you to inject probes into a running java process to observe and debug an application.  I won't go into "how" to use BTrace, as I've blogged on it in the past and the BTrace document does a good job of explaining it.&lt;br /&gt;&lt;br /&gt;The area that is lacking is around the @Export annotation for BTrace scripts.  There are no details in the documentation and the sample code comments says "// create a jvmstat counter using @Export"... yeah... right... Even the internal code comments and JavaDocs are just as vague.  So if you are lost at this point, jstat use to be called jvmstat and was provided as part of the distribution of &lt;a href="http://java.sun.com/performance/jvmstat/"&gt;jvmstat&lt;/a&gt;.   Even then there is no information on how to leverage the two... until now!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Creating the Script&lt;/span&gt;&lt;br /&gt;Take a look at the ThreadCounter.java file in the sample directory of BTrace.  Any value you want to be exposed to jstat will need to be annotated with @Export.  Then you will need to assign a value to this exported value with a static method from BtraceUtils.  In the ThreadCounter example this is accomplished with perfLong("btrace.com.sun.btrace.samples.ThreadCounter.count");   The next step is to inject this code into a targeted JVM; such as:&lt;br /&gt;&lt;pre&gt;btrace 1483 ../samples/ThreadCounter.java &lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Accessing BTrace exports with jstat&lt;/span&gt;&lt;br /&gt;The undocumented trick for jstat is that you have to specify -J-Djstat.showUnsupported=true and -name with the name of the exported variable defined by the perf statement.  Here is the full command-line:&lt;br /&gt;&lt;pre&gt;jstat -J-Djstat.showUnsupported=true -name btrace.com.sun.btrace.samples.ThreadCounter.count 1483&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QF--bHkNI1A/Si7hBpiDhzI/AAAAAAAAApc/fN4nEoZt4LA/s1600-h/Picture+3.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 245px;" src="http://2.bp.blogspot.com/_QF--bHkNI1A/Si7hBpiDhzI/AAAAAAAAApc/fN4nEoZt4LA/s320/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5345457226180167474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Sundar at Sun for the enlightenment!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-8890208546701383581?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/8890208546701383581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=8890208546701383581' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8890208546701383581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8890208546701383581'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/06/btrace-and-jstat.html' title='BTrace and JStat'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QF--bHkNI1A/Si7hBpiDhzI/AAAAAAAAApc/fN4nEoZt4LA/s72-c/Picture+3.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6170546638363545976</id><published>2009-05-03T19:15:00.000-07:00</published><updated>2009-05-03T20:35:04.563-07:00</updated><title type='text'>Closure: I Don't Think That Word Means What You Think It Means</title><content type='html'>It is curious that my weakest subject in school was English,  and that I struggle so much with the miss use of certain words.   Words really do matter.   As words are misused, it starts to become commonplace which through a domino effect results in the complete lose of their meaning.&lt;br /&gt;&lt;br /&gt;The word most in jeopardy today in the domain of programming is &lt;span style="font-weight: bold;"&gt;Closure.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;WikiPedia has a good definition&lt;/a&gt; which states: a &lt;b&gt;closure&lt;/b&gt; is a &lt;a href="http://en.wikipedia.org/wiki/First-class_values" title="First-class values" class="mw-redirect"&gt;first-class&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Function_%28programming%29" title="Function (programming)" class="mw-redirect"&gt;function&lt;/a&gt; with &lt;a href="http://en.wikipedia.org/wiki/Free_variables_and_bound_variables" title="Free variables and bound variables"&gt;free variables&lt;/a&gt;.   The critical phrase is: free variables.  I realize how subtle this is... however without the free variables it is just another function... and IMO it doesn't have to be a function that is just the common mechanism.  Adding to the list of good examples is the &lt;a href="http://www.jibbering.com/faq/faq_notes/closures.html"&gt;docs on closures in Javascript&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Examples that are wrong or vague are commonplace.  First Example: &lt;a href="http://groovy.codehaus.org/Closures"&gt;Groovy, which defines it merely as a code block&lt;/a&gt;... or a second example, how about Zdeněk Troníček's blog support Closures in Java which &lt;a href="http://tronicek.blogspot.com/2007/12/closures-closure-is-form-of-anonymous_28.html"&gt;defines it as an anonymous function&lt;/a&gt;.    A Google search will provide a fairly equal number of good and bad examples.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Defining Closure&lt;/span&gt;&lt;br /&gt;The point to be made here is that if you pull the "free variables" out of the definition of a closure than all you have an anonymous function and the two words would be synonymous making one redundant to the other.  Put another way... Closures are typically anonymous methods, but not all anonymous methods are closures.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Understanding Variable Scope&lt;/span&gt;&lt;br /&gt;When defining a variable, our typical scopes are global, part of a class, parameter to a method, or local to a method.  This would be complex if we tried to discuss this for all languages, so I will focus on Java.  In Java there is no global scope, this is typically handled as a static member of a class.  In this case, it lives in memory in a space called perm space.  If the variable is part of a class, then the instance is part of heap memory for an instance of that class.  If it is a passed parameter or a local member variable, then the storage is part of the stack frame pushed on the &lt;a href="http://en.wikipedia.org/wiki/Call_stack"&gt;stack&lt;/a&gt;.  As a reminder, as a method returns the stack frame for that method is popped off the stack and the scope has ended for local variables, references, etc. What is interesting about the proposition of a closure, is we want to be able to create a method (method 1) with some "variables"  in the scope of another method (method 2).  After the return of method 2, which means everything is out of scope, we still want to be able to pass method 1 to other parts of the program with the state of local variables maintaining state.  Perhaps you can understand the issue now.  If the scope is lost, where and how is the state of the anonymous method 1 being maintained?    This is what closure is, and it is up to the language, compiler or run-time to figure that out.&lt;br /&gt;&lt;br /&gt;I prefer to consider closures as another level of scope, as oppose to just another function.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Functional Example&lt;/span&gt;&lt;br /&gt;It is easier IMO to see this with a functional language, so here is an example:&lt;br /&gt;&lt;pre&gt;Function powerFunctionFactory (int power) {&lt;br /&gt;int pwrFunction(int base) {&lt;br /&gt; return pow(base, power);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return pwrFunction;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Function sqr = powerFunctionFactory (2);&lt;br /&gt;Function cube = powerFunctionFactory (3));&lt;br /&gt;&lt;br /&gt;sqr (3);&lt;br /&gt;cube(3);&lt;br /&gt;&lt;/pre&gt;Looking at this example when the function sqr is defined by invoking powerFunctionFactory(2), the scope of the value of 2 should be lost through normal scoping rules, however due to the feature of closure it is not and this technique is possible for a number of languages.   Not only must it maintain state, but it must do it for each instance of closure.  Notice that the cube function has a power state all it's own.&lt;br /&gt;&lt;br /&gt;In closing I just ran across this great post by Neal Gafter, which is titled the &lt;a href="http://gafter.blogspot.com/2007/01/definition-of-closures.html"&gt;definition of Closures&lt;/a&gt;.   I didn't get to it in time to reference his material, which looks great.  Perhaps there will be a follow up.&lt;br /&gt;&lt;br /&gt;If we can't agree on the nature of closures containing variables... we will never understand monads :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6170546638363545976?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6170546638363545976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6170546638363545976' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6170546638363545976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6170546638363545976'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/05/closure-i-dont-think-that-word-means.html' title='Closure: I Don&apos;t Think That Word Means What You Think It Means'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6172802377950689359</id><published>2009-04-30T08:17:00.000-07:00</published><updated>2009-04-30T08:31:17.434-07:00</updated><title type='text'>Speaking at JavaOne 2009</title><content type='html'>Speaking at &lt;a href="http://java.sun.com/javaone/"&gt;JavaOne&lt;/a&gt; this year, on &lt;a href="http://www28.cplan.com/cc230/sessions_catalog.jsp?ilc=230-1&amp;amp;ilg=english&amp;amp;isort=&amp;amp;isort_type=&amp;amp;is=yes&amp;amp;icriteria1=+&amp;amp;icriteria2=+&amp;amp;icriteria8=&amp;amp;icriteria3=sipe&amp;amp;icriteria9=&amp;amp;icriteria4=+&amp;amp;icriteria7=+"&gt;Debugging Your Production JVM&lt;/a&gt;.  The session is on June 3, 2009 at 4:10 PM.   This session will cover a number of great JVM tools for debugging and managing a run JVM, with a clear focus on &lt;a href="https://btrace.dev.java.net/"&gt;BTrace&lt;/a&gt;.  This is the 3rd time speaking at JavaOne (2001 and 2003 being the times of past).  With the Oracle buyout, this could easily be the last for all of us.  Welcome to Oracle OpenWorld!   The question which remains...&lt;br /&gt;&lt;br /&gt;What will happen to Duke?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://java.sun.com/javaone/images/RockStar_DukewithGuitar_100x85.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 100px; height: 85px;" src="http://java.sun.com/javaone/images/RockStar_DukewithGuitar_100x85.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6172802377950689359?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6172802377950689359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6172802377950689359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6172802377950689359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6172802377950689359'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/04/speaking-at-javaone-2009.html' title='Speaking at JavaOne 2009'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4960790482983554295</id><published>2009-04-29T21:10:00.000-07:00</published><updated>2009-04-29T21:25:46.369-07:00</updated><title type='text'>Presentation Worst Practices</title><content type='html'>With all these "Best Practices" floating around... I was wondering.  Is anyone documenting the worst practices?  One Google search later, I discover that not only is there a number of them, but the domain name is taken by someone just parking it... boo!!  Here are a couple of my favorite:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.timethoughts.com/timemanagement/DefiningWorstPractices.htm"&gt;Defining Worst Practices&lt;/a&gt; - in summary says you are violating a principle or natural law.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/articles/scalability-worst-practices"&gt;Scalability Worst Practices&lt;/a&gt; - brilliant... a fun read.  Golden Hammer, Big Ball of Mud.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jacobian.org/writing/rest-worst-practices/"&gt;REST Worst Practices&lt;/a&gt; - Also a good read.  Summary... Rest fails with highly de-normalized systems... oh and don't hard code stuff.&lt;br /&gt;&lt;br /&gt;and my favorite worst practices for this post:&lt;br /&gt;Presentation Worst Practices&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cagxPlVqrtM&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/cagxPlVqrtM&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4960790482983554295?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4960790482983554295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4960790482983554295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4960790482983554295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4960790482983554295'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/04/presentation-worst-practices.html' title='Presentation Worst Practices'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-1509162307064331575</id><published>2009-04-27T16:02:00.000-07:00</published><updated>2009-04-27T17:05:23.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Building Spring 3 working with Git</title><content type='html'>Until today, I've been keeping up on the Spring 3 development off the svn repository with svn.  There is a &lt;a href="http://blog.springsource.com/2009/03/03/building-spring-3/"&gt;great post&lt;/a&gt; by &lt;a href="http://blog.springsource.com/author/cbeams/"&gt;Chris Beams&lt;/a&gt; from SpringSource that provides adequate detail and is a great resource to read as a precursor to this post.  In general, I'm moving all my development over to &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, and it was time to get Spring 3 inline.   It was not without pain.  For those who just want a quick reference, I will provide a quick step by step on how to achieve the end goal of setting up a git client to the spring 3 svn repository.  Following that I will provide details for those who want a deeper understanding.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quick Step-by-Step Spring 3 with Git&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In the directory you would like the spring project execute : "git svn clone --stdlayout &lt;a href="https://src.springsource.org/svn/spring-framework"&gt;https://src.springsource.org/svn/spring-framework"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;change directory to the newly created spring-framework directory&lt;br /&gt;&lt;/li&gt;&lt;li&gt;copy forked script from &lt;a href="http://github.com/kensipe/git-svn-clone-externals/tree/master"&gt;github.com/kensipe&lt;/a&gt; named git-svn-clone-externals to the current directory; make executable and run.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;run "git svn show-ignore &gt; .gitignore"&lt;/li&gt;&lt;li&gt;run "git gc"&lt;/li&gt;&lt;li&gt;from the current directory you'll need to create the following directories&lt;/li&gt;&lt;span&gt;mkdir org.springframework.instrument/src/main/resources/&lt;br /&gt;mkdir org.springframework.instrument/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.instrument.classloading/src/main/resources&lt;br /&gt;mkdir org.springframework.instrument.classloading/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.asm/src&lt;br /&gt;mkdir org.springframework.asm/src/main&lt;br /&gt;mkdir org.springframework.asm/src/main/java&lt;br /&gt;mkdir org.springframework.core/src/main/resources&lt;br /&gt;mkdir org.springframework.core/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.expression/src/main/resources&lt;br /&gt;mkdir org.springframework.expression/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.web/src/main/resources&lt;br /&gt;mkdir org.springframework.web/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.orm/src/main/resources&lt;br /&gt;mkdir org.springframework.orm/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.context.support/src/main/resources&lt;br /&gt;mkdir org.springframework.context.support/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.web.portlet/src/main/resources&lt;br /&gt;mkdir org.springframework.web.portlet/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.test/src/main/resources&lt;br /&gt;mkdir org.springframework.test/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.integration-tests/src/main&lt;br /&gt;mkdir org.springframework.integration-tests/src/main/java&lt;br /&gt;mkdir org.springframework.integration-tests/src/main/resources&lt;br /&gt;mkdir org.springframework.integration-tests/src/main/resources/META-INF&lt;br /&gt;mkdir org.springframework.instrument/src/test/java&lt;br /&gt;mkdir org.springframework.instrument.classloading/src/test/java&lt;br /&gt;mkdir org.springframework.asm/src/test&lt;br /&gt;mkdir org.springframework.asm/src/test/java&lt;br /&gt;mkdir org.springframework.aspects/src/test/java&lt;/span&gt;&lt;br /&gt;&lt;li&gt;export ANT_OPTS="-XX:MaxPermSize=256m -Xmx1024m"&lt;/li&gt;&lt;li&gt;change directory to "build-spring-framework" directory&lt;/li&gt;&lt;li&gt;run "ant"&lt;/li&gt;&lt;li&gt;wait 20 minutes :)&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;The background and detail&lt;/span&gt;&lt;br /&gt;The first line is standard git-svn to get the repository.  If you are new to Git, this will take a few minutes long then a standard svn checkout.  It is copying all the changes throughout history to your local .git repo.  Fortunately spring 3 is still young from a history standpoint.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;svn external - The first issue&lt;/span&gt;&lt;br /&gt;The first thing to note is that part of the build process for spring 3 is a project which is added to this svn project as an external, which led me to &lt;a href="http://codeintensity.blogspot.com/2008/03/svn-externals-are-evil-use-piston-or.html"&gt;this post on why svn externals are evil&lt;/a&gt; :)  evil or not we have to deal with them.  This led to a &lt;a href="http://blog.alieniloquent.com/2008/03/08/git-svn-with-svnexternals/"&gt;post by Alieniloquent&lt;/a&gt; which has some good explanations, followed by what I eventually settled on, a &lt;a href="http://algorithm.com.au/blog/files/git-svn-svn-externals.php"&gt;post by Andre Pang&lt;/a&gt;, which includes a script he created, which I forked off github.  Kudos to Andre!!  The script he created (which I can see using again the future), provides a one execution solution to what Alieniloquent blogged.  It is beautifully simple.  The script provides the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;pulls down all the svn externals (spring 3 only has one)&lt;/li&gt;&lt;li&gt;creates a symlink (mocking what svn would have done)&lt;/li&gt;&lt;li&gt;adds the symlink and the .git_externals directory to the excludes file&lt;/li&gt;&lt;/ol&gt;If you wanted to check your svn externals for other projects use the following &lt;a href="http://svnbook.red-bean.com/en/1.0/ch07s03.html"&gt;command&lt;/a&gt;: "git svn propget svn:externals ." in the root of the project directory.&lt;br /&gt;&lt;br /&gt;The next step is to get all the svn ignores into the .gitignores file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;version control directory management - the next issue&lt;/span&gt;&lt;br /&gt;The explanation behind this issue is that svn allows for and manages empty directories... git does not.  git only manages content.  There are a number of empty directories which the spring build files expects to be present for the build to succeed.  This is based on a standardize build system and a lack of error handling in the build system.  If I get some time, I'll send a patch to the springsource guys to fix this.  At this time you will have to create all the directories listed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;jvm out of memory issues - the last issue&lt;/span&gt;&lt;br /&gt;ant will run out of memory without these changes.... first you will run out of perm space, followed by heap.   You may be able to get by with less; I didn't spend much time here.  The standard defaults will fail.&lt;br /&gt;&lt;br /&gt;Also if you need to update your master branch with git... "git svn rebase" will do the job!&lt;br /&gt;&lt;br /&gt;I need to say thanks to those bloggers already noted and to fellow NFJS speaker &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/matthew_mccullough.html"&gt;Matthew McCollough&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-1509162307064331575?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/1509162307064331575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=1509162307064331575' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1509162307064331575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1509162307064331575'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/04/building-spring-3-with-git.html' title='Building Spring 3 working with Git'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-1061855228447970637</id><published>2009-02-26T13:27:00.001-08:00</published><updated>2009-02-26T14:03:29.469-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='polyglot programmer'/><title type='text'>Justification for Functional Programming</title><content type='html'>It appears that this subject has caught fire in recent years.   The interest in St. Louis has resulting in the &lt;a href="http://lambdalounge.org/"&gt;Lamdba Lounge&lt;/a&gt; started by &lt;a href="http://tech.puredanger.com/"&gt;Alex Miller&lt;/a&gt;. (Great name by the way).  I have started reading (but not finished) &lt;a href="http://www.pragprog.com/titles/shcloj/programming-clojure"&gt;Programming Clojure&lt;/a&gt; by Stuart Halloway and &lt;a href="http://www.pragprog.com/titles/vsscala/programming-scala"&gt;Programming Scala&lt;/a&gt; by Venkat Subramaniam. Additionally I just finshed writing a 10 page article on an introduction to functional programming, which includes 4-5 page on F#. The article is for &lt;a href="http://www.nofluffjuststuff.com/home.jsp"&gt;NFJS&lt;/a&gt; who holds the exclusive rights at this time, but I plan to provide a link to it or post it here in its entirity after 90 days.&lt;br /&gt;&lt;br /&gt;I should point out that I am no expert in this space, but I have been developing professional for 15+ years with a variety of languages (C, C++, Java, C#, a little Ruby, Perl, Groovy). In the last 6 months I've been "playing" with Scala, Clojure and F#.&lt;br /&gt;&lt;br /&gt;The reason for this post is this: &lt;a href="http://groovy.dzone.com/news/why-functional-programming"&gt;http://groovy.dzone.com/news/why-functional-programming&lt;/a&gt;. This article has been sent to me a couple of times and has been on twitter several. At this point I will make public comments I made in an email response regarding this subject. The first two subjects were points made via email, which make sense to maintain for this blog post.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Argument to have UI and DB Support&lt;/span&gt;&lt;br /&gt;I don't get the ui / db argument. This indicates an all or nothing mentality, which I would hope the industry could get over. A griffon front-end to a java hibernate db access and clojure rules engine make sense to me. Many of the functional languages provide the ability to produce a UI or interact with the DB, however that isn't really important to me as you will see below, but there are good solutions out there where this isn't really a concern.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Functional Notations and Code Beauty&lt;/span&gt;&lt;br /&gt;I may be in the minority... but I could care less for "beauty" of code, I'm interested in less code that adds the same or more value. FP adds several notations that provide a conciseness to code, which is a huge value add. As I was writing up an article on F#... I became frustrated with my other programming languages... for instance: why is a switch in Java/Groovy so limiting. Groovy makes it better... but it is still limiting as you compare it to discriminated unions and pattern matching F#.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Getting Functional Programming&lt;/span&gt;&lt;br /&gt;People don't get it yet (referring to the nah sayers)... they are in the battle pits and are lacking the big picture vision. This year quad core laptops are expected to be more common. That trend isn't going to stop. The last decade was all about die size and memory. This next decade is all about cores. The need for concurrency tools is a must. The language trend may be slightly ahead of its time.&lt;br /&gt;&lt;br /&gt;I'll post more on this subject in the future... I just felt it necessary to provide some response to the value of functional programming. Frankly I've barely scratch the surface of the value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-1061855228447970637?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/1061855228447970637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=1061855228447970637' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1061855228447970637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1061855228447970637'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/02/justification-for-functional.html' title='Justification for Functional Programming'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-1164876682031630</id><published>2009-02-24T15:27:00.000-08:00</published><updated>2009-02-24T15:29:16.809-08:00</updated><title type='text'>Java 7 on Mac OS X</title><content type='html'>This blog post is worthy of Retweeting:) &lt;a href="http://infernus.org/2009/02/building-java-7-on-mac-os-x/"&gt;http://infernus.org/2009/02/building-java-7-on-mac-os-x/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In 2 weeks when I hope I have time... I will be on this!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-1164876682031630?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/1164876682031630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=1164876682031630' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1164876682031630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1164876682031630'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/02/java-7-on-mac-os-x.html' title='Java 7 on Mac OS X'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-157213395266019847</id><published>2009-02-24T11:40:00.000-08:00</published><updated>2009-02-24T11:54:41.215-08:00</updated><title type='text'>BTrace Fix on the Mac</title><content type='html'>The last blog post showed a work around for getting BTrace to work on a Mac, however as explained it fails when trying to probe Grails.  I've been&lt;a href="https://btrace.dev.java.net/issues/show_bug.cgi?id=35"&gt; working with the BTrace developers&lt;/a&gt; and now have a solution.  It will likely be some time before the next release.  So for those who don't want to build from source, I put a &lt;a href="http://drop.io/h4fob2c"&gt;drop on drop.io of a build&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Side notes:&lt;br /&gt;1) It appears that all the scripts and assumptions for Java do not take in account the Mac.  Groovy, Grails and previously BTrace all have references to a tools.jar in a place which is not correct on a Mac.&lt;br /&gt;2) drop.io is new to me... and it appears worth the look.  I will likely use drop.io in the future.  Mostly for presention code drops.  I like github for source references, but sometimes it is just quick and easy to tar or zip up what you have and drop it.&lt;br /&gt;3) There is an interesting situation with BTrace which can be frustrating if you are not aware of it.  If you have a failed BTrace session... such as a connection refused on the BTrace side, then it is not possible to BTrace it again with a fixed version of BTrace.  You have to restart the application to be probed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-157213395266019847?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/157213395266019847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=157213395266019847' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/157213395266019847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/157213395266019847'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/02/btrace-fix-on-mac.html' title='BTrace Fix on the Mac'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-2183820706356517109</id><published>2009-02-22T16:05:00.000-08:00</published><updated>2009-02-22T17:32:31.049-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='tools development'/><category scheme='http://www.blogger.com/atom/ns#' term='BTrace'/><title type='text'>Fixing BTrace on the Mac</title><content type='html'>Well it is time to fix another Java issue on the Mac... again... Sorry for the sarcasm.  I love Java and Groovy and I love my MBP, but as already documented (on fixing &lt;a href="http://kensipe.blogspot.com/2008/08/fixing-java-memory-tools-on-mac-os-x.html"&gt;Java Memory Tools&lt;/a&gt; and &lt;a href="http://kensipe.blogspot.com/2009/01/java-is-2nd-class-citizon-on-mac-osx.html"&gt;Java is a 2nd Class Citizen&lt;/a&gt;), these two don't get along as often as I would like.   I thought for some crazy reason that I was the only one fighting this issue until all the comments from the fixing the tools article appeared.  Glad to know, first that this blog is helpful to others, second that there are number of great people all over the world (offer drinks no less) and third that we are not alone in this fight.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BTrace and the issue&lt;/span&gt;&lt;br /&gt;First... if you don't know what btrace is... you have to &lt;a href="https://btrace.dev.java.net/"&gt;check it out&lt;/a&gt;.  In the evolution of debugging tools for the jvm, it is the next big thing!  Active in this space is &lt;a href="http://blogs.sun.com/sundararajan/entry/btrace_a_dynamic_tracing_tool"&gt;A. Sundararajan&lt;/a&gt;, he has a couple of my favorite blogs, one on &lt;a href="http://blogs.sun.com/sundararajan/entry/scriptifying_btrace"&gt;scripting btrace&lt;/a&gt; and another on &lt;a href="http://blogs.sun.com/sundararajan/entry/btrace_class_a_jmx_bean"&gt;jmx and btrace&lt;/a&gt;. Another great tutorial blog is by &lt;a href="http://blog.igorminar.com/2008/06/btrace-dtrace-for-java.html"&gt;Igor Minar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This blog isn't as much about btrace, as it is about fixing it on the mac.  BTrace is new enough though, that it may require just a quick introduction.  BTrace is a debugging tool, which injects "probes" (my term) into a running Java process.   It is an open source option that has a high possibility of replacing &lt;a href="http://www.ca.com/us/application-management.aspx"&gt;Wily's Introscope&lt;/a&gt;.  To be fair, Introscope provides a lot of extras which BTrace doesn't at this time... but Introscope is tens of thousands of dollars and BTrace is a free open source tool.   I would be shaking in my boots if I was on the Wily team.&lt;br /&gt;&lt;br /&gt;We will need to start a Java process in order to  illustrate how it works (or in the case of the Mac... doesn't work).   For the Java process look in the demo directory, there is a  Java2D.jar.  On the Mac it is located: /Developer/Examples/Java/JFC/Java2D.   At the comand-line type: java -jar Java2D.jar.   This will start up a Java process.   To get it's pid at another command-line type: jps&lt;br /&gt;If this is the only Java process running on your box, the pid with the jar notation is the pid you are interested in.  If you want to be 100% certain type: jps -l .  You'll get something like:&lt;br /&gt;7897 sun.tools.jps.Jps&lt;br /&gt;7838 Java2D.jar&lt;br /&gt;&lt;br /&gt;Now in the btrace bin directory (I'm assuming you followed one of the referenced tutorials), for our example type:  ./btrace 7838 ../samples/ThreadCounter.java . To which you will get:&lt;br /&gt;Connection refused&lt;br /&gt;&lt;br /&gt;In the terminal of the running Java process for the jar you would likely see:&lt;br /&gt;btrace DEBUG: adding to boot classpath failed!&lt;br /&gt;btrace DEBUG: java.util.zip.ZipException: error in opening zip file&lt;br /&gt;java.util.zip.ZipException: error in opening zip file&lt;br /&gt;   at java.util.zip.ZipFile.open(Native Method)&lt;br /&gt;   at java.util.zip.ZipFile.&lt;init&gt;(ZipFile.java:114)&lt;br /&gt;   at java.util.jar.JarFile.&lt;init&gt;(JarFile.java:133)&lt;br /&gt;   at java.util.jar.JarFile.&lt;init&gt;(JarFile.java:97)&lt;br /&gt;   at com.sun.btrace.agent.Main.main(Main.java:108)&lt;br /&gt;   at com.sun.btrace.agent.Main.agentmain(Main.java:66)&lt;br /&gt;   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;   at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt;   at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)&lt;br /&gt;   at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:348)&lt;br /&gt;&lt;br /&gt;Yea... epic fail!  That is BTrace failing on the mac.  If you want more details, go to the btrace script and edit -Dcom.sun.btrace.debug=false to be true.  This will indicate the following stacktrace:&lt;br /&gt;btrace DEBUG: debugMode is true&lt;br /&gt;btrace DEBUG: dumpClasses is true&lt;br /&gt;btrace DEBUG: dumpDir is .&lt;br /&gt;btrace DEBUG: probe descriptor path is .&lt;br /&gt;btrace DEBUG: parsed command line arguments&lt;br /&gt;btrace DEBUG: System ClassPath: /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/tools.jar&lt;br /&gt;btrace DEBUG: adding to boot classpath failed!&lt;br /&gt;btrace DEBUG: java.util.zip.ZipException: error in opening zip file&lt;br /&gt;java.util.zip.ZipException: error in opening zip file&lt;br /&gt;   at java.util.zip.ZipFile.open(Native Method)&lt;br /&gt;   at java.util.zip.ZipFile.&lt;init&gt;(ZipFile.java:114)&lt;br /&gt;   at java.util.jar.JarFile.&lt;init&gt;(JarFile.java:133)&lt;br /&gt;   at java.util.jar.JarFile.&lt;init&gt;(JarFile.java:97)&lt;br /&gt;   at com.sun.btrace.agent.Main.main(Main.java:108)&lt;br /&gt;   at com.sun.btrace.agent.Main.agentmain(Main.java:66)&lt;br /&gt;   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;   at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt;   at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)&lt;br /&gt;   at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:348)&lt;br /&gt;&lt;br /&gt;The line just above the fail point... hmmm.... it is looking for a tools.jar in the $JAVA_HOME/lib directory.  As already noted, Apple likes to slice and dice the JDK...  In trying to understand the issue, I uncovered an &lt;a href="http://developer.apple.com/documentation/Java/Conceptual/Java14Development/02-JavaDevTools/JavaDevTools.html"&gt;article released by Apple&lt;/a&gt; which says there is no tools.jar file... no tools.jar file!!!  It is a classes.jar file and to make it fun it isn't in the $JAVA_HOME/lib directory... no, it isn't even under a subdirectory of $JAVA_HOME... I can't even write that without frothing at the mouth.  I could start a rant here... but I'm assuming I'm writing to the choir so to speak.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fixing the Issue&lt;/span&gt;&lt;br /&gt;I didn't spend a significant amount of time on it... but I didn't get this working by changing the btrace scripts... something is in the code.   I have another recommendation towards the end that the script change wouldn't work for as well.  So we are left currently with the following work around.&lt;br /&gt;&lt;br /&gt;Take the classes.jar and copy it to the lib directory as tools.jar (argghhh!!!)  but it works.  To be more specific... /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar to /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/tools.jar.  It is important to note that you have to be sudo to make this change and you will have to do this with each Java version you want this to work with.  Let's hope that the next version of BTrace will be Mac friendly!&lt;br /&gt;&lt;br /&gt;After you get that working... checkout &lt;a href="https://visualvm.dev.java.net/"&gt;visualvm&lt;/a&gt; with the BTrace plugin.  It is great stuff and another reason that the script change alone is not a total solution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Issues&lt;/span&gt;&lt;br /&gt;OMG... I'm frick'n shaving the yak again... just as I'm getting ready to post this... I was about to trace a grails app.  The changes described above, break Groovy and Grails.  So pick one :)  You can be Groovy or you can BTrace but you can't have both yet.   I guess I'll begin digging through code and send a patch tonight...&lt;/init&gt;&lt;/init&gt;&lt;/init&gt;&lt;/init&gt;&lt;/init&gt;&lt;/init&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-2183820706356517109?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/2183820706356517109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=2183820706356517109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2183820706356517109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2183820706356517109'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/02/fixing-btrace-on-mac.html' title='Fixing BTrace on the Mac'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-2929447717148756844</id><published>2009-02-19T12:20:00.000-08:00</published><updated>2009-02-22T15:59:45.633-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='NFJS'/><category scheme='http://www.blogger.com/atom/ns#' term='archtitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Speaking on the NFJS Tour 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QF--bHkNI1A/SZ2_V4nYcHI/AAAAAAAAAok/eG7g9Vu4O28/s1600-h/NFJS_125x125_spkr.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 125px; height: 125px;" src="http://3.bp.blogspot.com/_QF--bHkNI1A/SZ2_V4nYcHI/AAAAAAAAAok/eG7g9Vu4O28/s320/NFJS_125x125_spkr.jpg" alt="" id="BLOGGER_PHOTO_ID_5304606318808035442" border="0" /&gt;&lt;/a&gt;I will be speaking at a number of shows with NFJS this year.  Already scheduled is Milwaukee, St. Louis, Minneapolis, Boston, Seattle.  I will likely be at Omaha, Atlanta, Denver, Columbus, and Raliegh.  That's just the first several months :).&lt;br /&gt;&lt;br /&gt;It is always around this time of the year I like to revisit my goals.  Commitment comes easy around January of a new year.  Around mid to end of Feb, is a good time to check to see which goals you are seriously committed to.   One commitment, I've maintained for several years is a commitment to learning and a commitment to excellence.   This is easier when surrounded with like-minded and committed individuals who help to hold you accountable.  It isn't always easy... just worth it.  That is one of the reasons I love NFJS.   The caliber of the speakers are top notch and world class.&lt;br /&gt;&lt;br /&gt;For some the economy will be a an easy excuse to not attend.  Or perhaps an employer will not pay for it this year.  What is clear to me is those with the skills and the networks will find it easiest to find the next opportunity.   This is the time to pick up new skills.  As a local venue, no show makes it easier or less expensive than NFJS.&lt;br /&gt;&lt;br /&gt;See you there !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-2929447717148756844?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/2929447717148756844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=2929447717148756844' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2929447717148756844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2929447717148756844'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/02/speaking-on-nfjs-tour-2009.html' title='Speaking on the NFJS Tour 2009'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QF--bHkNI1A/SZ2_V4nYcHI/AAAAAAAAAok/eG7g9Vu4O28/s72-c/NFJS_125x125_spkr.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6909748397143303625</id><published>2009-02-13T11:46:00.000-08:00</published><updated>2009-02-13T13:05:54.105-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='tools development'/><title type='text'>Intellij 8.1 with Git Support</title><content type='html'>Finally... a good java editor with good git support.  I've been waiting for a long time (in internet time) for git integration in the editor.   Download Intellij 8.1 for Git support. &lt;br /&gt;&lt;br /&gt;I have a number of project demos which are already in Git.  I expected that Intellij would just pick up on this fact... and it did not.  I then created a new project, did a Git init from Intellij and all was good.&lt;br /&gt;&lt;br /&gt;To get IDEA to recognize a project already in Git, under the Version Control menu, select Enable Version Control Integration, then Git.&lt;br /&gt;&lt;component name="VcsDirectoryMappings"&gt;&lt;mapping directory="" vcs="Git"&gt;&lt;/mapping&gt;&lt;br /&gt;So far... the Git integration is fantastic!!!  Love it!  Well done JetBrains!&lt;br /&gt;Happy Coding&lt;/component&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6909748397143303625?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6909748397143303625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6909748397143303625' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6909748397143303625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6909748397143303625'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/02/intellij-81-with-git-support.html' title='Intellij 8.1 with Git Support'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-7930807257014879974</id><published>2009-02-05T07:17:00.000-08:00</published><updated>2009-02-05T07:37:24.220-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perm Space'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM memory'/><category scheme='http://www.blogger.com/atom/ns#' term='Heap Space'/><title type='text'>Java Memory Management Details</title><content type='html'>Needing to gather some details to help answer a question regarding JVM memory and the the distinctions of Perm Space.  I thought it might be helpful to post the links of what I thought were incredibly great posts from the past... It is now 2009 and the best posts on this matter appear to come from 2006.  Hmm.... perhaps there has been a JDK release in some time :)&lt;br /&gt;&lt;br /&gt;On the subject of; the reason the &lt;a href="http://blogs.sun.com/jonthecollector/entry/presenting_the_permanent_generation"&gt;permanent space exists&lt;/a&gt;.  Jon explains the details of instances of objects and their dependencies on instances of classes and the need for their order as it relates to garbage collection.  He also discussions the klassKlass... interesting stuff.&lt;br /&gt;&lt;br /&gt;On the subject of &lt;a href="http://www.thesorensens.org/2006/09/09/java-permgen-space-stringintern-xml-parsing/"&gt;String intern, XML parsing and it's effect on Perm Space&lt;/a&gt;.  &lt;small&gt;&lt;cite&gt;haakon&lt;/cite&gt;&lt;/small&gt; or what I assume to be Jenny details the effect of String.intern() and how an out of memory can occur.  She does a great job of explaining their troubleshooting approach.&lt;br /&gt;&lt;br /&gt;And my favorite book on the JVM spec is &lt;a href="http://www.amazon.com/Inside-Java-Virtual-Machine-Masters/dp/0079132480"&gt;Inside the JVM&lt;/a&gt;.  It turns out there are &lt;a href="http://www.artima.com/insidejvm/ed2/"&gt;free chapters&lt;/a&gt; of this on the web now and &lt;a href="http://www.artima.com/insidejvm/ed2/jvmP.html"&gt;chapter 5&lt;/a&gt; is the chapter detailing the taxonomy of the JVM memory space.&lt;br /&gt;&lt;br /&gt;The weakest coverage of any subject based on my searches, is the subject of root sets.  &lt;a href="http://www.briangoetz.com/"&gt;Brian Goetz's &lt;/a&gt;article on&lt;a href="http://www.ibm.com/developerworks/java/library/j-jtp11253/"&gt; Java Theory and Practice&lt;/a&gt; is rock solid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-7930807257014879974?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/7930807257014879974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=7930807257014879974' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7930807257014879974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7930807257014879974'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/02/java-memory-management-details.html' title='Java Memory Management Details'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4004935307915843279</id><published>2009-01-26T12:45:00.000-08:00</published><updated>2009-01-26T17:25:44.710-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OSX'/><title type='text'>Java is a 2nd Class Citizen on MAC OSX</title><content type='html'>Having made several comments over the last several months, and in particular over the last couple of days regarding Java on the Mac,  several people have asked me to explain myself.  So here goes.&lt;br /&gt;&lt;br /&gt;When I first moved to the MBP as my primary development machine, I was very pleased.  As a developer, I was amazed at how all my development tools were just there.   Ruby, Rails,  cvs, subversion, 2 Java JDKs,  it just worked out of the box.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;When I first discovered the difference&lt;/span&gt;&lt;br /&gt;I have a standard demo I use when show other developers some of the nifty debugging tools like visualgc or visualvm.  In order to show the tool off, I need to start another Java process.  So I standardly go to the demo directory and start the Java2d.jar.   Oh but wait... where is that on the mac.   This lead to the discovery that the jdk is in several different directories /locations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JAVA_HOME&lt;/span&gt; = /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Demos&lt;/span&gt;: /Developer/Examples/Java/&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bin&lt;/span&gt;:/usr/bin/java&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Headers/Lib&lt;/span&gt;:   /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/JavaVM.framework/Versions/xxx&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Lib&lt;/span&gt;: /Library/Java/Extensions; /usr/lib/java&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Endorsed Dirs&lt;/span&gt;:$JAVA_HOME/lib/endorsed&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;System jars&lt;/span&gt;: /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes&lt;br /&gt;&lt;br /&gt;OK... I'll live with that.   I quickly discovered a very useful scipt for switch between JDKs.  I've modified the &lt;a href="http://homepage.mac.com/shawnce/misc/java_functions_bashrc.txt"&gt;original&lt;/a&gt; if anyone interested let me know.   But since we are on the subject of being a second class citizen, If you go out to the Sun site and look for the latest jdk, the options are windows, linux, and solaris.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Issues in Jakarta&lt;/span&gt;&lt;br /&gt;Then the next issue came up...  jhat was broken.  I wrote a &lt;a href="http://kensipe.blogspot.com/2008/08/fixing-java-memory-tools-on-mac-os-x.html"&gt;lengthy blog post on how to fix this&lt;/a&gt;.  The issue... Apple didn't include the javascript libraries, which are necessary for these tools to work.&lt;br /&gt;&lt;br /&gt;So now I'm taking a serious look at btrace, which is a great tool.  Just trying to do the simple stuff, works fine on Windows... but no joy for the Mac.  I'm still looking into it, but it appears that Instrumentation..appendToSystemClassLoaderSearch()  fails on the Mac.  Could be something else... still looking.&lt;br /&gt;&lt;br /&gt;If you are doing standard Java development or Groovy and Grails... you may never notice the Mac difference.  When you venture into the debugging and instrumentation realm of Java be prepared for some frustrations.  As I get a solution for the btrace issue I will post it.&lt;br /&gt;&lt;br /&gt;On the positive side, I enjoy the development experience on the MBP better than my experiences on Windows and linux.  The memory management is better and the startup times on Java processes is fantastic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4004935307915843279?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4004935307915843279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4004935307915843279' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4004935307915843279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4004935307915843279'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/01/java-is-2nd-class-citizon-on-mac-osx.html' title='Java is a 2nd Class Citizen on MAC OSX'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-5972976375043519922</id><published>2009-01-24T13:01:00.000-08:00</published><updated>2009-01-24T13:26:58.168-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web beans'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3.1'/><category scheme='http://www.blogger.com/atom/ns#' term='JSR318'/><category scheme='http://www.blogger.com/atom/ns#' term='JSR299'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>JSR-299 Web Bean Review</title><content type='html'>As several JCP specifications are reaching there final stages, I decided to have a look at two of them.  Truth be known, I actually was going to look at one of them &lt;a href="http://jcp.org/en/jsr/detail?id=299"&gt;jsr-299&lt;/a&gt;, the specification previously known as web beans, here forth now known as Java Contexts and Dependency Inject.  There was sufficient enough mention of ejb-lite that I decided to have a look at its specification, &lt;a href="http://jcp.org/en/jsr/detail?id=318"&gt;jsr-318.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Before I get started, my position on the subject of ejbs should be known.  I actually thought that ejbs were on the way out... with the lack of testability and the extra unnecessary complexity for most projects prior to ejb3.  EJB3 greatly improved this, but IMHO was too little too late.  Spring + Tomcat already provided what folks were looking for.   Additionally the number of clients using JSF is a dying breed.  Once again, JSF 1.0 missed the boat with non-bookmarkable pages, etc.  While there are shops sticking with these Sun driven standards which are produced out of the JCP, the majority of support appears to come out of vendor interest and not developer interest.   My earlier work on projects with JSF led me to appreciate a couple of frameworks; 1. facelets, 2. a4jsf, and 3. SEAM (when working on jboss).  jsr-299 (web beans) seems to be the formal standardization of SEAM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My thoughts on jsr-299&lt;/span&gt;&lt;br /&gt;It appears that @ annotations are the new shiny toy, and there is no end to specifications going crazy with them.   jsr-299 defines 34 new annotations.  The goal of the specification as defined on the &lt;a href="http://jcp.org/en/jsr/detail?id=299"&gt;spec home page&lt;/a&gt;, &lt;span style="font-style: italic;"&gt;is to unify JSF managed bean component model with the EJB component model&lt;/span&gt;... well I've stated my position on this.  So either this specification is too little too late and a benefit mainly to jboss, or perhaps there is something to be gained beyond this spec stated goal.&lt;br /&gt;&lt;br /&gt;There were several interesting ideas out of the specification.  The first was the creation of an extensible annotation model.  So if there are not enough annotations in the world for you, you can create your own that work with the framework.  This is accomplished through the new javax.inject.@BindingType. This appears to provide fine grain autowiring qualifier.  One of the examples given defines&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;@LDAP &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;class LdapAuthenticator&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        implements Authenticator { ... }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;followed by the declared injection of an LDAP Authenticator:&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;@LDAP Authenticator authenticator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another interesting idea is producers... I really like the concept here. Page 3 and 4 illustrate an example where a @SessionScoped @Model Login class has a @Produces @LoggedIn User getCurrentUser() method. Abbreviated below:&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;@SessionScoped @Model  public class Login { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    @Current Credentials credentials; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    @PersistenceContext EntityManager userDatabase; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    private User user; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    @Produces @LoggedIn User getCurrentUser() { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    if (user==null) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        throw new NotLoggedInException();     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    }  else { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        return user; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then the getCurrentUser() method is invoked for the inject as listed below:&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;@Model &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;public class DocumentEditor { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    @Current Document document; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    @LoggedIn User user; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    @PersistenceContext EntityManager docDatabase; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    public void save() { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        document.setCreatedBy(currentUser); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        em.persist(document); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The last interesting part of the specification is the event framework.  I don't understand why this is in the specification.  There appears to be no dependency for the event framework on the other parts of the specification.  It doesn't comply with the stated goal of unification of JSF and EJB.  It would make sense for this to be separate.  Mainly to use it separate from all other aspects of web beans.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Thoughts on jsr-318&lt;/span&gt;&lt;br /&gt;I did not review the entire specification yet.  I was checking out some of the mentioned ejb-light details mentioned in jsr299.  As mentioned, outside of being required by clients to help them with ejbs or ejb light projects, I'm really not interested.  There is however one very interesting  addition to the ejb specification, that is the &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31-3"&gt;@Asynchronous annotation&lt;/a&gt;.   This is long over due.   In addition to its obvious benefits, a method annotated as asynchronous can also return a value defined as java.util.concurrent.Future&lt;v&gt; where V is the return value type.  The return of the Future object provides the ability to check status (isDone()) or to cancel the request.  Very cool.  For a quick list of EJB 3.1 changes, checkout &lt;a href="http://blogs.sun.com/kensaks/entry/ejb_3_1_early_draft"&gt;Ken Saks blog&lt;/a&gt;.&lt;br /&gt;The concept of EJB-lite is lost on me... I already have that it is Spring.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;If you are looking to stay in the world of EJBs and JSF, then these newly defined specifications are of great value to you and your shop.  jsr-299 fills a number of gaps in the jee space and provides the power of Spring in a standardized way.  Clearly jsr-299 will be part of the new jee 1.6 specification, at least in several of the &lt;a href="http://weblogs.java.net/blog/robc/archive/2008/02/profiles_in_the_1.html"&gt;profiles&lt;/a&gt;.  If you are not using either JSF or EJB or nether, then it is unclear what value this brings to the community.   It will be interesting to see if a vendor implements this specification (or a portion of it), in a world without JSF.   It appears that the jsr-299 specification helps vendors more than it helps developers.&lt;/v&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-5972976375043519922?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/5972976375043519922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=5972976375043519922' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5972976375043519922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5972976375043519922'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/01/jsr-299-web-bean-review.html' title='JSR-299 Web Bean Review'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3174459336679779116</id><published>2009-01-11T04:17:00.000-08:00</published><updated>2009-01-11T04:48:20.476-08:00</updated><title type='text'>Windows 7 Download Frustration</title><content type='html'>The danger in posting this blog entry is that I will be counted as a anti-Microsoft person... which is just not true.  I happen to like using the best tool for the job which is not all the time from Microsoft (and sometimes it is).  In 2008 I switch my primary system to an Apple Mac.  There were many factors as to why and frankly I love it!    But I'll always be a technical junkie.&lt;br /&gt;&lt;br /&gt;With a number of friends (such as &lt;a href="http://blog.dennyboynton.com/post/My-First-Twenty-Four-Hours-With-Windows-7.aspx"&gt;Denny Boynton&lt;/a&gt;  and &lt;a href="http://blogs.tedneward.com/"&gt;Ted Neward&lt;/a&gt;) posting about their experiences with Windows 7, I thought it was time to take a look.   I thought it was going to be a matter of download, get key, start up vmware fusion and I way I go... but I was wrong.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QF--bHkNI1A/SWnmXBls0uI/AAAAAAAAAmk/L7BtsE91i2M/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 102px;" src="http://4.bp.blogspot.com/_QF--bHkNI1A/SWnmXBls0uI/AAAAAAAAAmk/L7BtsE91i2M/s200/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5290012520561300194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;First I went to the public beta site:&lt;a href="http://www.microsoft.com/windows/windows-7/beta-download.aspx"&gt; http://www.microsoft.com/windows/windows-7/beta-download.aspx&lt;/a&gt; and selected the 64-bit version in english and got this.  WTF??  Repeated attempts resulted in the same.  An oops page with a pre-canned search.  Where did I go wrong?  Well as you can tell, I'm on my Mac.  So I pulled out fusion to launch Windows XP for round 2 of the attempt.&lt;br /&gt;&lt;br /&gt;I thought this is just wrong, but determined to get a look, I switch to windows and my suspicions were confirmed when I got one page further.  I got the download page with a couple of large buttons on the bottm of the page and one read "Download Now".   Hey, that's what I want... I want to download now.   I clicked the button and...  nothing.  Click... Nothing... No way... they didn't.  Round 2 was in XP, but with firefox.&lt;br /&gt;&lt;br /&gt;Round 3 as you would expect is XP with IE.  That combination was successful and I'm now 29% into my download. &lt;br /&gt;&lt;br /&gt;BTW... In the process of testing a few more times in writing up this blog, the round 1 mac failure was fixed to the point where you will get download page (nice response time msft), however the download button fails.&lt;br /&gt;&lt;br /&gt;Why is it necessary to be like this?  Why is it so hard to put up a link to a download which is platform neutral?  Wouldn't Microsoft want to attract customers from other platforms?  Does it always have to be all or nothing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3174459336679779116?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3174459336679779116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3174459336679779116' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3174459336679779116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3174459336679779116'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2009/01/windows-7-download-frustration.html' title='Windows 7 Download Frustration'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QF--bHkNI1A/SWnmXBls0uI/AAAAAAAAAmk/L7BtsE91i2M/s72-c/Picture+1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3654298409003645473</id><published>2008-12-23T09:08:00.000-08:00</published><updated>2008-12-23T09:11:08.334-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Speaking at Code Mash 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://codemash.org/images/badges/speaker1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 206px; height: 132px;" src="http://codemash.org/images/badges/speaker1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I will be speaking on Spring MVC.  The title says Spring 2.5 MVC... But I'm throwing a curve ball... it will be Spring 3.0 MVC.    See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3654298409003645473?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3654298409003645473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3654298409003645473' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3654298409003645473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3654298409003645473'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/12/speaking-at-code-mash-2009.html' title='Speaking at Code Mash 2009'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-258837488355187321</id><published>2008-12-22T12:40:00.000-08:00</published><updated>2009-01-28T13:34:32.307-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='complexity'/><category scheme='http://www.blogger.com/atom/ns#' term='archtitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='software engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='architects'/><title type='text'>Complexity and Architecture</title><content type='html'>It has been too long since I had a post... I have a number of scribbled notes of blog ideas, but little time.  I'm in the process of starting to write the spring 3 book, which may take me off grid more than normal.  I will make an effort to post a couple of times a month (more if there is something cool to document).  Currently my mind has been on 3 subjects; Spring,  Architecture and languages.  This blog is regarding one of the often forgotten concerns of architecture... complexity.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Defining Software Architecture&lt;/span&gt;&lt;br /&gt;I have been in a large number of conference BOFs this year.  When the audience is slow in starting a conversation, the question we gravitate to is: "What is a Software Architect?" or its keen "What is Software Architecture?".   I guess I shouldn't be surprised, but it is amazing how diverse the answers to these questions are.   It is a reflection of at least two things... 1) the immaturity of our industry and /or 2) the lack of standardization in this space.   The conversation spans from design decisions to application architecture to enterprise architecture.&lt;br /&gt;&lt;br /&gt;Martin Fowler defines architecture as "things that people per-ceive as hard to change".  This is a really responisble definition.&lt;br /&gt;&lt;br /&gt;I like to define it as "making decisions on all the non-funcational requirements" and "managing all the things you can't control"&lt;br /&gt;&lt;br /&gt;The area of non-functional requirements would include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;User Experience&lt;/li&gt;&lt;li&gt;Performance / Response Time&lt;/li&gt;&lt;li&gt;Scalability&lt;/li&gt;&lt;li&gt;Security&lt;/li&gt;&lt;li&gt;Frameworks&lt;/li&gt;&lt;li&gt;Complexity&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In the category of things you don't control:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;On public web: Number of Requests&lt;/li&gt;&lt;li&gt;Number of Threads / Connections&lt;/li&gt;&lt;li&gt;Number of returns from a user generated search&lt;/li&gt;&lt;li&gt;Items in a batch&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Complexity in Architecture&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The subject that is rarely vocalized and debated in architecture is that of complexity.  Neal Ford, in a couple of his talks with NFJS, talks about principles that were documented by anciet philosophers... that of essential and accidental properties.  He carries this forward into software architecture in a way that we as an industry really need to talk about.  That of software architecture decisions moving the enterprise forward in a way that has essential complexity or in a way that increases the accidental complexity.   Neal further clarifies the point with the following comments... We have a hard problem (Essential complexity) and we have made our problem hard (Accidental complexity).   Well done Neal!   Very easy to envision.&lt;br /&gt;&lt;br /&gt;Is complexity one of the non-functional requirements which your architecture team is looking at?  If not,  It seems likely that what is left is accidental.&lt;br /&gt;&lt;br /&gt;What is a concrete example of this?&lt;br /&gt;Let's say that your enterprise has just purchased a shiny new ESB.  Suppose there wasn't a project need for it... it was just the stated SOA direction of your organization.  When down from on high the edict is brought to your project that you must use the ESB in order to justify the $1M expense.   Perhaps it is a fit... but perhaps you are about to fit the square peg in the round hole... in other words accidental complexity.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where does Accidental Complexity come from?&lt;/span&gt;&lt;br /&gt;Neal would say that it comes from vendors who are the pushers of accidental complexity... however there is something deeper here.  The reason they are referred to as the pushers is that they are incented to sell you a solution.  The solution may not fit your needs exactly, but hey, if they can show you a vision of how it could help, then there is a framework to following and life should be more simplified.   So essentially we are saying that any choice which doesn't provide the best solution brings complexity.&lt;br /&gt;We could also say that the more stuff / more solutions we have brings complexity.  So by adding more frameworks and options we have added complexity.  Conversely, many organizations fall into the trap of standardizing certain aspects of development... like everything is an EJB or we don't use store procedures here.  In this situation what happens is that the architect and developers will have to come up with a more complex solution in order to be compliant with the corporate standards.&lt;br /&gt;&lt;br /&gt;I'm open to suggestions and challenges... but I think we can conclude that much of our accident complexity comes from not applying the best solution to the problem.  I would expect that most teams would not do this deliberately.  So the team is either 1) ignorant of the best option (which can be fixed through experience and training) or 2) it is forced upon them.&lt;br /&gt;&lt;br /&gt;I will close with the following challenges and questions:&lt;br /&gt;Next time you are looking at a software component... Ask yourself the following&lt;br /&gt;1) Does it simplify the problem?&lt;br /&gt;2) Is there a more simplified solution?&lt;br /&gt;3) Is it testable and verifiable?&lt;br /&gt;4) Does it add complexity upstream or downstream of the problem?&lt;br /&gt;&lt;br /&gt;When evaluating solutions... try to put a value on the level of complexity.   Here are some ideas:&lt;br /&gt;1) If it moves code or configuration into a proprietary solution then increase its complexity score.&lt;br /&gt;2) If it allows you to write less code for the same functionality then decrease its complexity score.&lt;br /&gt;3) If it enhances testability, decrease its complexity score.&lt;br /&gt;4) How easy is it to monitor and maintain?&lt;br /&gt;5) How easy is it to integrate with and is it standards compliant?&lt;br /&gt;&lt;br /&gt;Good luck and Happy Holidays!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-258837488355187321?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/258837488355187321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=258837488355187321' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/258837488355187321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/258837488355187321'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/12/complexity-and-architecture.html' title='Complexity and Architecture'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6714417587596722624</id><published>2008-11-13T07:02:00.000-08:00</published><updated>2008-11-13T07:08:56.774-08:00</updated><title type='text'>Boulder / Denver JUG Talks</title><content type='html'>It seems I can't escape Denver.  I was there last month at the JUG meeting.  Matthew McCullough has some commentary on &lt;a href="http://denverdev.blogspot.com/2008/10/djug-october-ken-sipe-on-jmx-spring.html"&gt;his blog&lt;/a&gt;.  It seems Matt did a presentation on iPhone development this month.  I will be speaking at NFJS this weekend in Denver.  My topics include:&lt;br /&gt;&lt;br /&gt;- Java Memory Management and GC&lt;br /&gt;- Hacking - The Dark Arts&lt;br /&gt;- Security Code Review&lt;br /&gt;- Spring / JPA&lt;br /&gt;- Spring 2.5 - Spring without XML&lt;br /&gt;- Architecture and Scaling&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6714417587596722624?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6714417587596722624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6714417587596722624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6714417587596722624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6714417587596722624'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/11/boulder-denver-jug-talks.html' title='Boulder / Denver JUG Talks'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-7545396895229678178</id><published>2008-10-20T20:18:00.000-07:00</published><updated>2008-10-20T20:36:42.243-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools development'/><title type='text'>Favorite Development Tools of 2008</title><content type='html'>&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.apple.com/macbookpro/specs.html"&gt;Mac&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; - What a great tool!  Reason enough to own a Mac.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jetbrains.com/idea/"&gt;Intellij&lt;/a&gt; - Version 8 is looking good.&lt;/li&gt;&lt;li&gt;&lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; - This is becoming my favorite tool. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://grails.org/"&gt;Grails&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Git_%28software%29"&gt;git&lt;/a&gt; - It is replacing cvs and subversion.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gradle.org"&gt;gradle&lt;/a&gt; - replacing ant and maven&lt;/li&gt;&lt;li&gt;&lt;a href="https://hudson.dev.java.net/"&gt;hudson&lt;/a&gt; - looking to see if it replaces cruise control.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.vmware.com/products/fusion/"&gt;Fusion&lt;/a&gt; - developing C# is more fun on a Mac.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.springframework.org/"&gt;Spring 2.5 MVC&lt;/a&gt; - If you can't do Grails... this is the way to do it.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Tools I'm looking forward to in 2009&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; - Interesting Language... I know very little at this point.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://research.microsoft.com/fsharp/fsharp.aspx"&gt;F#&lt;/a&gt; - Probably the most interesting language on the .Net platform.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.springframework.org/"&gt;Spring 3&lt;/a&gt;  and what I call ADD or Annotated Driven Development :)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Tools That need some TLC&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I would like to see a refresh on &lt;a href="http://xplanner.org/"&gt;xplanner&lt;/a&gt; - This would be a great candidate for Grails.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-7545396895229678178?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/7545396895229678178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=7545396895229678178' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7545396895229678178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7545396895229678178'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/10/favorite-development-tools-of-2008.html' title='Favorite Development Tools of 2008'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6888702700707307894</id><published>2008-10-20T10:41:00.000-07:00</published><updated>2008-10-20T11:00:19.782-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jps Java Groovy'/><title type='text'>jps - The Java way when you need to kill something Groovy</title><content type='html'>As a speaker, I'm often showing "how" to do something and often requested for "When" / "Why".  I just experienced a great example of this with jps.  jps is of course is the Java ps tool that is included with JDK5 and 6.  So it is already on a Java developer's machine.  It is the platform independent way to get PIDs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;How it Started&lt;/span&gt;&lt;br /&gt;The Yak-Shaving started when I decided to run a groovy script from TextMate.  I conventiently hit &lt;command&gt;+R.  Everything ran the way I wanted it to.  Except... There wasn't an end to the program script... idiot!  So, I closed TextMate... Still Running....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1&lt;/span&gt;&lt;br /&gt;First I went to the command line and did a ps... which didn't result in much.  I followed this up with a ps -ef.  Way too much info... so I ended with a ps -ef | grep JavaVM.  Things just got worst.  That is a lot of information!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;Along comes jps.  A simple jps (no args) and here are the results&lt;br /&gt;9382&lt;br /&gt;10620 GroovyStarter&lt;br /&gt;10314 JConsole&lt;br /&gt;10761 Jps&lt;br /&gt;&lt;br /&gt;There it is GroovyStarter... kill 10620. &lt;br /&gt;&lt;br /&gt;... and what if you had multiple GroovyStarter scripts running.  Well, jps -m will give you the command-line of the script, which includes the groovy script name.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6888702700707307894?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6888702700707307894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6888702700707307894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6888702700707307894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6888702700707307894'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/10/jps-java-way-when-you-need-to-kill.html' title='jps - The Java way when you need to kill something Groovy'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-2000877996537864286</id><published>2008-10-19T14:15:00.000-07:00</published><updated>2008-10-19T14:19:49.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails plugin jmx'/><title type='text'>Grails JMX Plugin</title><content type='html'>I just created and released version 0.3 of the Grails JMX Plugin.   The code is at github; &lt;a href="git://github.com/kensipe/jmx-grails-plugin.git"&gt;git://github.com/kensipe/jmx-grails-plugin.git&lt;/a&gt; .   The documentation is at grails; &lt;a href="http://grails.org/JMX+Plugin"&gt;http://grails.org/JMX+Plugin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sometime this week, I'll post some tips and tricks for using the JMX Plugin with Grails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-2000877996537864286?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/2000877996537864286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=2000877996537864286' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2000877996537864286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2000877996537864286'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/10/grails-jmx-plugin.html' title='Grails JMX Plugin'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4266453441742999131</id><published>2008-10-18T11:23:00.000-07:00</published><updated>2009-02-26T13:59:29.069-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='polyglot programmer'/><title type='text'>Cooking Chef vs. Polygot Programmer</title><content type='html'>Occasionally crazy analogies pop up in my head.  Sometimes these ideas don't make sense to anyone but me.  Let me know if I've gone off the deep end.&lt;br /&gt;&lt;br /&gt;So I was thinking what it was like growing up when I didn't have a microwave and how useful that tool is.   Then it occurred to me that as useful as it is, there are things I would never put in the microwave.  Take for instance a turkey.  Perhaps it is possible to cook a turkey in a microwave, but why?   You can cook toast on a gas stove as well, but a toaster just seems more appropriate.  When playing chef, each tool provides a specific value.  Turkey in the oven, toast in the toaster, and butter melting in the microwave.&lt;br /&gt;&lt;br /&gt;Stretching this thought into a conversation on technology, I'm reminded of a term &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/neal_ford.html"&gt;Neal Ford&lt;/a&gt; is credited with:  The polygot programmer.&lt;br /&gt;&lt;br /&gt;Why is it that developers and programmers pick camps?  Why does an organization limit their technology choices to one or a small handful?   When an organization says they are a "Java Shop"  or a ".Net Shop", what I hear is "We only use microwaves to cook here".   In many of these shops they are doing with code what can be  equivalent to cooking a turkey in a microwave.  They can get it to work,  but it doesn't taste so good!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4266453441742999131?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4266453441742999131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4266453441742999131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4266453441742999131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4266453441742999131'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/10/cooking-chef-vs-polygot-programmer.html' title='Cooking Chef vs. Polygot Programmer'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3942806347275134772</id><published>2008-10-03T07:15:00.000-07:00</published><updated>2008-10-03T07:39:29.930-07:00</updated><title type='text'>Writing a Spring 3 Book</title><content type='html'>I'm looking at writing a book on Spring 3.  Yes... I know, it doesn't exist yet.   My expectation is it should have a likeness to Spring 2.5, which is also lacking in good printed materials.   With this assumption, I'm looking to get a head start now and refactor based on actual delivery of product.&lt;br /&gt;&lt;br /&gt;If you have some ideas or thoughts... please share.  At this point, My goal is not to cover what is already out there.  I'm focused on the new approach of annotated development.&lt;br /&gt;&lt;br /&gt;I'm also thinking of taking this book and writing a Spring.Net book to follow... Perhaps I will change my mind as I go through the new experience of the first book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3942806347275134772?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3942806347275134772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3942806347275134772' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3942806347275134772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3942806347275134772'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/10/writing-spring-3-book.html' title='Writing a Spring 3 Book'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6070242399771598576</id><published>2008-10-03T07:08:00.000-07:00</published><updated>2008-10-03T07:10:40.709-07:00</updated><title type='text'>Speaking at October IASA Meeting in St. Louis</title><content type='html'>I will be speaking on Architecture and Scale at the &lt;a href="http://www.iasahome.org/web/saintlouis/home"&gt;Oct 6 Meeting of IASA&lt;/a&gt; in St. Louis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6070242399771598576?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6070242399771598576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6070242399771598576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6070242399771598576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6070242399771598576'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/10/speaking-at-october-iasa-meeting-in-st.html' title='Speaking at October IASA Meeting in St. Louis'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4398192986044420880</id><published>2008-08-28T09:33:00.000-07:00</published><updated>2008-08-28T10:24:45.411-07:00</updated><title type='text'>The Need for Better Interfaces (Human to Computer)</title><content type='html'>I can't help but believe that there has to be a better way.  There has to be more options...&lt;br /&gt;&lt;br /&gt;I talking about the I/O options to my computer.  Here are a couple of recent stories that will hopefully bring context to what I mean.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Gestures on the Mac&lt;/span&gt;&lt;br /&gt;Recently  I purchased a new MacBook Pro.  You know, one of the new Macs with the multi-touch capabilities.  The idea is that if you use one finger you move the mouse, if you use 2 fingers it scrolls (and not just up and down), if you use 3 fingers then it depends somewhat on what application you are using, but generally it means go back or go forward depending on the wave of the hand.  This is just awesome stuff and here is what happened to me. &lt;br /&gt;First, the back and forth action of 3 fingers worked in Safari and in finder.... but not in Firefox.  I was a little more than dismayed.  Generally preferring Firefox, I found myself using Safari more in order to use the gestures.   I really wanted this new feature in all applications.  Eventually the shiny new toy lost some luster and I mostly use Firefox again.  The consequence... sometimes I forget the gestures work in the finder... and I know that I would use it all the time if it always worked.  In other words if the bell always rings and I can trust it, I will salivate.  And I want to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A PC with No Gestures&lt;/span&gt;&lt;br /&gt;So eventually I found myself working again on another laptop.  Man did I look like an idiot for a few minutes.  I come to a page that needs scrolling, naturally I reach up to the touchpad with 2 fingers... moving it back and forth to get a scroll thinking for a moment damn computer is locked up or slow... only to discover that I was the component with the issue.  It didn't help that my daughter was staring at me funny wondering what I was doing.  She was still laughing even after I explained myself.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iTouch as a Birthday Gift&lt;/span&gt;&lt;br /&gt;So last week was the same daughters birthday.   I bought here a new iTouch.  She loves it when I let it leave my hands for her to use.  The first couple of days were great.  She asked me "how do you turn it on?".   I said, "It has one button... push it!".   She would ask, "How do I get back out of this application?".  I would say, "It has one button... push it!".   And of course, she quickly gain the necessary skills and probably has surpassed my abilities on the thing within a few days.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PC is Not an iTouch&lt;/span&gt;&lt;br /&gt;So last night she was asking me for some sync help between the laptop and iTouch.  After a little conversation, she understands what she needs to do... she needs to hit the sync button on the laptop.  What does she do?  She taps the screen on the laptop... not once, but a couple of times and then begins to laugh.  It was funny.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MacBook as a Fish Tank&lt;/span&gt;&lt;br /&gt;Last example.  I love to scuba and I love the ocean.  When I saw the &lt;a href="http://www.apple.com/downloads/macosx/icons_screensavers/3ddesktopaquariumscreensaver.html"&gt;aquarium screen saver&lt;/a&gt; for the mac, it was an obvious purchase.   So there is a setting on the screen saver, which reads "Enable Motion Sensor Water Tilting".  First you have to turn this on!  It uses the motion sensor on the mac so that if you tilt the laptop it appears that physics has applied forces on the water in your laptop the way you would expect.  The water tilts!  Here's the deal:  The optical illusion is so good that even really savvy software developers are impressed and want to know: How?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Call to Action:  Better Human Interfaces&lt;/span&gt;&lt;br /&gt;If you combine the above stories with the fact that I just finished reading "Dreaming in Code", which outlines how far we haven't come in software development for the last half of a century, I'm left restless.  There has to be more... there has to be better... Meaning more we can do and better ways of interfacing with computers.  We are just beginning to see it.  When you look at &lt;a href="http://www.microsoft.com/surface/index.html"&gt;Microsoft Surface&lt;/a&gt;,  Apple's iPhone and the promise of RFID, you begin to see it.  It isn't what the general software developer is being train on or developing... They are still working on Dialogs.&lt;br /&gt;Those who claim to be on the cutting edge, they are working on web 2.0 with javascript and cool new frameworks (they are cool).  But that isn't what the future demands.  The future demands seamless integration computer to human... where the human gestures to something and the machine understands.  Where the computer knows what is expected and provides recommendation and choice.  In this world, the interface isn't always a screen... and the input isn't a keyboard or a mouse!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4398192986044420880?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4398192986044420880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4398192986044420880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4398192986044420880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4398192986044420880'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/08/need-for-better-interfaces-human-to.html' title='The Need for Better Interfaces (Human to Computer)'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-2553038863940141889</id><published>2008-08-28T09:25:00.000-07:00</published><updated>2008-08-28T09:33:45.157-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Speaking at Websphere Portal Techincal Conference</title><content type='html'>I will be introducing the world of Spring to the world of Portlet development at the &lt;a href="http://sourceforge.net/project/memberlist.php?group_id=46485"&gt;IBM WebSphere Portal Technical Conference. &lt;/a&gt;  The conference is in Nashville, TN between Oct 13-16.  The topic of the session is Annotated Portal Development with RAD and Spring; session D19.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-2553038863940141889?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/2553038863940141889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=2553038863940141889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2553038863940141889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/2553038863940141889'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/08/speaking-at-websphere-portal-techincal.html' title='Speaking at Websphere Portal Techincal Conference'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3899904528846918012</id><published>2008-08-24T12:25:00.000-07:00</published><updated>2008-08-24T12:48:20.154-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Spring JavaScript</title><content type='html'>I'm sitting in &lt;a href="http://blog.springsource.com/main/author/keithd/"&gt;Keith&lt;/a&gt;'s Talk @ &lt;a href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=11352&amp;amp;showId=136"&gt;NFJS Orlando on Spring JavaScript&lt;/a&gt; .  I've worked with a lot of the spring framework on varies projects over time.  I have not until now had a chance to look at what SpringSource was doing with JavaScript.  This is great technology which desires some blog time in the future.&lt;br /&gt;&lt;br /&gt;There is an underlying theme in the approach Keith is describing which I really like.  The concept is a design approach where ajax provides value-add to a client which allows for javascript.  Yet the application still functions without it.&lt;br /&gt;&lt;br /&gt;Impressions from a one hour guided tour.  Things I liked:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Choice of dojo as the underlying framework&lt;/li&gt;&lt;li&gt;Design approach&lt;/li&gt;&lt;li&gt;Use of Tiles&lt;/li&gt;&lt;li&gt;Leveraging of yahoo performance rules for script compression and optimization&lt;/li&gt;&lt;/ol&gt;Things to look forward to:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Binding of multiple decorations to the same html element&lt;/li&gt;&lt;li&gt;Closer look at Spring's &lt;a href="http://contentwithstyle.co.uk/resources/css-framework/1.1/"&gt;CSS Framework&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;Great example application was demo to show off spring capabilites... but it is actually a very useful application reporting dependencies of osgi bundles.  Take a look: &lt;a href="http://springsource.com/repository/"&gt;http://springsource.com/repository/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3899904528846918012?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3899904528846918012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3899904528846918012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3899904528846918012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3899904528846918012'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/08/spring-javascript.html' title='Spring JavaScript'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4755509269363839180</id><published>2008-08-21T14:59:00.000-07:00</published><updated>2008-08-21T15:07:26.252-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java memory jmap jhat'/><title type='text'>Fixing Java Memory Tools on Mac OS X</title><content type='html'>A number of the Java memory management tools with the default distribution on Mac OS X Leopard are broken.  The information to repair the situation seems to be hard to come by.  This post will detail the steps necessary to get jmap and jhat to work on a Mac for Java 6.  I assume that Java 5 has the same issue but haven't checked.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setting up a test Java process to profile.&lt;/span&gt;&lt;br /&gt;1. From the terminal: cd /Developer/Examples/Java/JFC/Java2D/&lt;br /&gt;2. From the terminal: java -jar Java2D.jar &amp;amp;&lt;br /&gt;3. After the process starts it should indicate the pid (in this example it is 5510)&lt;br /&gt;4. You can also use jps to discover the pid: jps -l  (then look for the Java2D.jar)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fixing jmap&lt;/span&gt;&lt;br /&gt;If you type jmap &lt;pid&gt;, you would expect to get a high-level memory dump... instead you get a message like:&lt;br /&gt;attach: task_for_pid(5510) failed (5)&lt;br /&gt;Error attaching to process: Error attaching to process, or no such process&lt;br /&gt;&lt;br /&gt;To fix this, do a sudo, such as sudo jmap &lt;pid&gt;.&lt;br /&gt;Debugger attached successfully.&lt;br /&gt;Server compiler detected.&lt;br /&gt;JVM version is 1.6.0_05-b13-52&lt;br /&gt;&lt;br /&gt;using thread-local object allocation.&lt;br /&gt;Mark Sweep Compact GC&lt;br /&gt;&lt;br /&gt;Heap Configuration:&lt;br /&gt;   MinHeapFreeRatio = 40&lt;br /&gt;   MaxHeapFreeRatio = 70&lt;br /&gt;   MaxHeapSize      = 88080384 (84.0MB)&lt;br /&gt;   NewSize          = 2686976 (2.5625MB)&lt;br /&gt;   MaxNewSize       = -65536 (-0.0625MB)&lt;br /&gt;   OldSize          = 5439488 (5.1875MB)&lt;br /&gt;   NewRatio         = 2&lt;br /&gt;   SurvivorRatio    = 6&lt;br /&gt;   PermSize         = 21757952 (20.75MB)&lt;br /&gt;   MaxPermSize      = 88080384 (84.0MB)&lt;br /&gt;&lt;br /&gt;Heap Usage:&lt;br /&gt;New Generation (Eden + 1 Survivor Space):&lt;br /&gt;   capacity = 10551296 (10.0625MB)&lt;br /&gt;   used     = 4592152 (4.379417419433594MB)&lt;br /&gt;   free     = 5959144 (5.683082580566406MB)&lt;br /&gt;   43.52216069002329% used&lt;br /&gt;&lt;br /&gt;At this point it looks like it is working, however the file dump doesn't work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fixing jhat&lt;/span&gt;&lt;br /&gt;When running jhat on the hump dump, you get the following error:&lt;br /&gt;Eliminating duplicate references.....................&lt;br /&gt;Snapshot resolved.&lt;br /&gt;Exception in thread "main" java.lang.RuntimeException: java.lang.NullPointerException&lt;br /&gt;    at com.sun.tools.hat.internal.oql.OQLEngine.init(OQLEngine.java:277)&lt;br /&gt;    at com.sun.tools.hat.internal.oql.OQLEngine.&lt;init&gt;(OQLEngine.java:51)&lt;br /&gt;    at com.sun.tools.hat.internal.server.QueryListener.setModel(QueryListener.java:59)&lt;br /&gt;    at com.sun.tools.hat.Main.main(Main.java:189)&lt;br /&gt;Caused by: java.lang.NullPointerException&lt;br /&gt;    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;    at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt;    at com.sun.tools.hat.internal.oql.OQLEngine.init(OQLEngine.java:256)&lt;br /&gt;    ... 3 more&lt;br /&gt;&lt;br /&gt;It took me a little hunting to uncover the issue.  It turns out that jhat uses the Java 6 js engine.  If you go to the terminal again and run: jrunscript , it indicates that the script engine for language js can not be found.  On the mac, if you execute: jrunscript -q, which provides a listing of script engines you'll see:&lt;br /&gt;Language AppleScript 2.0.1 implemention "AppleScriptEngine" 1.0&lt;br /&gt;Thank you apple!&lt;br /&gt;&lt;br /&gt;As a side note if you actually wanted to run AppleScript as a shell, type jrunscript -l AppleScript&lt;br /&gt;&lt;br /&gt;Let's get to fixing the issue&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download JSR-223's engines https://scripting.dev.java.net/files/documents/4957/37593/jsr223-engines.zip&lt;/li&gt;&lt;li&gt;Download Rhino http://www.mozilla.org/rhino/download.html&lt;/li&gt;&lt;li&gt;Copy jsr223-engines/javascript/build/js-engine.jar to /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/ext/&lt;/li&gt;&lt;li&gt;Copy rhino1_7R1/js.jar to /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/ext/&lt;/li&gt;&lt;/ol&gt;** you have to be sudo to do steps 3 and 4.&lt;br /&gt;&lt;br /&gt;now jrunscript -q should look like this:&lt;br /&gt;Language EmbeddedECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2&lt;br /&gt;Language AppleScript 2.0.1 implemention "AppleScriptEngine" 1.0&lt;br /&gt;Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6R7&lt;br /&gt;&lt;br /&gt;... and jrunscript will put you in a js shell.&lt;br /&gt;... and jhat heap.out now works!  Point your browser at http://localhost:7000 and object browse!&lt;br /&gt;&lt;br /&gt;Also something I didn't realize until I was preparing for this post... jmap worked for the console dump if I sudo'd the command.  However it would not do a file dump.  I did the file dump using jconsole and jmx.  Now that the scripting issue is fixed, jmap is improved in the following manner:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;if you type jmap &lt;pid&gt;, it now prompts you for your admin password (instead of just failing)&lt;/li&gt;&lt;li&gt;jmap -dump:live,format=b.file=heap.out 5510 now works&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;It makes me wonder what else wasn't working!  Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4755509269363839180?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4755509269363839180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4755509269363839180' title='48 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4755509269363839180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4755509269363839180'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/08/fixing-java-memory-tools-on-mac-os-x.html' title='Fixing Java Memory Tools on Mac OS X'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>48</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-7159477334262398432</id><published>2008-05-14T20:21:00.000-07:00</published><updated>2008-05-14T20:56:17.435-07:00</updated><title type='text'>Portal 2  JSR-268</title><content type='html'>&lt;a href="http://jcp.org/aboutJava/communityprocess/pfd/jsr286/index.html"&gt;JSR-286&lt;/a&gt; has been signed off!  Here comes Portal 2.  I don't know of any implementations yet... so we are still waiting to play with it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Portal 1 Challenges&lt;/span&gt;&lt;br /&gt;There are a number of pain points of portal development which include:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Accessing resources... this is an issue with security mainly&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Portlet to portlet communication through the server framework&lt;/li&gt;&lt;li&gt;Ajax communication. &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Much of these issues have been addressed through the specification...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What's new in Portal 2&lt;/span&gt;&lt;br /&gt;First, Portlet to portlet communication is not as cumbersome and isn't limited to some session hacking.  The specification provides 2 mechanisms for communication at the server tier.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Events&lt;/li&gt;&lt;li&gt;Public Parameters&lt;/li&gt;&lt;/ol&gt;Events that are provided by an event producing portlet are described in it's XML file.  Event consuming portlets describe what events they can consume, then at deploy time or run time the portlets are wired together through an event channel. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Second,  resources are finally part of the picture.  In the portal 1 days,  you would often need to access a resource outside the portlet... well this request didn't have any portlet details, such as window state or portlet perferences and worse... it didn't run under the security of the portal.&lt;br /&gt;Now resources are obtainable within the context of the portal.   To a certain extent this provides us now with the ability to do ajax style development which wasn't possible before.&lt;br /&gt;&lt;br /&gt;Next, there is the standard web page needs which have been addressed.  For instance, because a portlet doesn't own the page, it really can't participate in provide header information... until now.  There are multiple respond phases now... one for the header and one for markup.  This provides the ability for a portlet to participate in the creation of the page header.  Additionally access to cookies and other web oriented needs have been opened up.&lt;br /&gt;&lt;br /&gt;On top of this their are portlet filters and portlet url listeners...&lt;br /&gt;&lt;br /&gt;If it is not too late... the portal world is about to get a breath of fresh air.  Take a look at the specification, it is worth a look if you are in this space.  Perhaps when the &lt;a href="http://portals.apache.org/pluto/"&gt;reference implementation&lt;/a&gt; is out... and I have time I'll create a demo of a few things... of course I'll need to include some of the latest spring stuff in the mix.   It looks like Spring 3.0 intends to have &lt;a href="http://opensource.atlassian.com/confluence/spring/display/JSR168/2008/04/18/Plans+for+JSR+286+Support"&gt;Portal 2.0 support&lt;/a&gt;.    As I scan around on the web... it looks like &lt;a href="http://www.liferay.com/web/guest/products/new_features"&gt;liferay &lt;/a&gt;is portal 2 ready... maybe it is time to switch back :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-7159477334262398432?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/7159477334262398432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=7159477334262398432' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7159477334262398432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/7159477334262398432'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/05/portal-2-jsr-268.html' title='Portal 2  JSR-268'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4111499962386901172</id><published>2008-05-14T19:58:00.000-07:00</published><updated>2008-05-14T20:19:25.655-07:00</updated><title type='text'>You don't even know  you don't even know</title><content type='html'>My daughters and I have a phrase we've picked up from some where... probably a movie, but I don't remember which one, which is "you don't even know, you don't even know".  We use it liberally to describe a situation where people are talking about stuff they clearly know nothing about, yet they are sharing their opinion about it anyway.  It seems strange that this happens... and frankly it happens all the time.&lt;br /&gt;&lt;br /&gt;So while &lt;a href="http://www.nofluffjuststuff.com/conference/denver/2008/05/index.html"&gt;speaking in Denver&lt;/a&gt; between sessions I attended a great session by &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/jared_richardson.html"&gt;Jared Richardson&lt;/a&gt;.  We got into a discussion on developer perceptions on agile practices such as pair programming, etc.   When it occurred to me that this was it... so often developers dislike pairing when they haven't practiced it.  They claim they don't have time to write unit test or integration tests... but they haven't attempted it.&lt;br /&gt;&lt;br /&gt;It appears that Agile in some circles is getting a bad name... but most of the time it is based on the opinions of someone who thinks they know what the outcome will be... they have thought it through in their head and have come to a conclusion, which has become their opinion on the matter.  Sometimes this is further justified through their comments "well I heard that so and so had issues... blah...blah".  Sometimes it comes in the early onslaught of pain... either it is new, or their some affect of team storming.  The reality is that often new agile teams run a little slower upfront, but end up significantly ahead of non-agile teams.  The pain is worth it! (at least from my experience)&lt;br /&gt;&lt;br /&gt;So as a community let's make an agreement.  If you ain't done it, you can have an opinion... but it doesn't count :)  If you think it won't work or if you heard it won't work... you don't even know what you don't even know!&lt;br /&gt;&lt;br /&gt;Knowing comes through experience! and as &lt;a href="http://en.wikipedia.org/wiki/G.I._Joe"&gt;GI Joe&lt;/a&gt; says "Knowing is half the battle".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4111499962386901172?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4111499962386901172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4111499962386901172' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4111499962386901172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4111499962386901172'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/05/you-dont-even-know-you-dont-even-know.html' title='You don&apos;t even know  you don&apos;t even know'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-5861281358357447191</id><published>2008-05-14T19:53:00.000-07:00</published><updated>2008-05-14T19:57:44.915-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Speaking'/><title type='text'>Speaking at OSCON</title><content type='html'>Well I will be &lt;a href="http://en.oreilly.com/oscon2008/public/schedule/speaker/5096"&gt;speak &lt;/a&gt;this year at &lt;a href="http://en.oreilly.com/oscon2008/public/content/home"&gt;OSCON &lt;/a&gt;on July 25, 2008 speaking on &lt;a href="http://en.oreilly.com/oscon2008/public/schedule/detail/2511"&gt;Spring 2.5&lt;/a&gt; .   It will be fun to see how I take my 1:30 hour talk which I usually run over time on and deliver it in :45 mins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-5861281358357447191?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/5861281358357447191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=5861281358357447191' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5861281358357447191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5861281358357447191'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/05/speaking-at-oscon.html' title='Speaking at OSCON'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-1667582633003440453</id><published>2008-04-24T12:28:00.000-07:00</published><updated>2008-04-25T12:37:28.198-07:00</updated><title type='text'>Welcome to Viet Nam! in Bangalore</title><content type='html'>I mentioned earlier that I would blog on this subject from my India trip.  So I had a very unusual situation in Bangalore.  One of the attendees (Madhu)  who attended the &lt;a href="http://www.sda-india.com/conferences/2008/JAX-INDIA/"&gt;Jax &lt;/a&gt;conference requested that I visit his company during my stay in Bangalore.  This became difficult based on a number of reasons, which resulted in Madhu and 10 of his co-workers coming to my hotel.  The lobby was too noisy, so we ended up upstairs in my hotel room.  The picture below is just half of us that are sitting around a bed talking tech.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QF--bHkNI1A/SBDjSD0sEXI/AAAAAAAAAJA/J76_nAHAMTQ/s1600-h/IMG_7624.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_QF--bHkNI1A/SBDjSD0sEXI/AAAAAAAAAJA/J76_nAHAMTQ/s320/IMG_7624.jpg" alt="" id="BLOGGER_PHOTO_ID_5192900269761630578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We discussed a number of technical details... it started with a discussion around ORM tools and the problem they had mapping to a complex and highly normalized data store.  They were creating a web admin tool which for simplicity sake I'll characterize as a content management system (CMS).  In this space they don't know all the "columns" of data to store.  The columns or metadata is stored in a row of a table, then there is an association table which associates the column to a 3rd table, the table of values.   They didn't have to get to far in the description for me to know exactly what they were talking about.  I have seen it before a number of times... it is the kind of thing a really out of touch architect, or a green DBA would suggest.  I shared some horror stories of my past to try to sway them from this approach.   I then discussed all the negatives to this approach.. such as:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;No indexing&lt;/li&gt;&lt;li&gt;No join capabilities&lt;/li&gt;&lt;li&gt;Very complex queries&lt;/li&gt;&lt;li&gt;Did I mention no indices?  This data structure just isn't tunable.&lt;/li&gt;&lt;/ol&gt;The conversation led to putting an ORM tool on top of this :)   If anyone knows of ORM tool that does this kind of mapping I would love to know.  I explained that I was unaware of a ORM that would handle this situation. &lt;br /&gt;&lt;br /&gt;While I was speaking at JAX on the topic of Spring and JPA, an attendee reflected on Ted Newark's &lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;article &lt;/a&gt;relating ORM to Viet Nam.  I was amazed!!   People around the world are reading Ted's Blog...  &lt;br /&gt;&lt;br /&gt;So as we were sitting around the bed discussing alternatives, I mention Ted's article which I just re-read that week ... of course I had to explain a little history regarding the meaning that Viet Nam has for most Americans.   We got to the point were I was describing how a project gets so far done the road and the team has invested so much, that when anyone suggests that we are tapped out and need to rethink the projects technical approach management comes in with statements like "Come on guys, we have so much invested.  Can't you just get it to work".   At this point they were all smiling, looking at each other and someone spoke up and says that is exactly where we are at... to which I said "Welcome to Viet Nam" :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-1667582633003440453?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/1667582633003440453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=1667582633003440453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1667582633003440453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/1667582633003440453'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/04/welcome-to-viet-nam-in-bangalore.html' title='Welcome to Viet Nam! in Bangalore'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QF--bHkNI1A/SBDjSD0sEXI/AAAAAAAAAJA/J76_nAHAMTQ/s72-c/IMG_7624.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-6173637384530111232</id><published>2008-04-17T14:18:00.000-07:00</published><updated>2008-04-17T14:21:36.282-07:00</updated><title type='text'>Speaking at OSCON 2008</title><content type='html'>&lt;a href="http://en.oreilly.com/oscon2008/public/schedule/detail/2511"&gt;I will be speaking&lt;/a&gt; on Spring 2.5 at &lt;a href="http://en.oreilly.com/oscon2008/public/content/home"&gt;OSCON 2008 &lt;/a&gt;this year!  The next tid bit of fun will be fitting my 1 1/2 hour talk into a :45 minute talk... should be fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6173637384530111232?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/6173637384530111232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=6173637384530111232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6173637384530111232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/6173637384530111232'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/04/speaking-at-oscon-2008.html' title='Speaking at OSCON 2008'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-8586255266394725440</id><published>2008-04-17T14:12:00.000-07:00</published><updated>2008-04-17T14:18:42.734-07:00</updated><title type='text'>Speaking in India at JAX</title><content type='html'>Just finished speaking in Bangalore at the &lt;a href="http://www.sda-india.com/conferences/2008/JAX-INDIA/"&gt;JAX &lt;/a&gt;conference.   The experience was very unique.  I'll hit some highlights on a later post.   There are 2 remember experiences from the trip.  First is the driving there.  A friend of mine from a previous trip &lt;a href="http://www.youtube.com/watch?v=tXSAcvbzTWA"&gt;capture what I'm talking about&lt;/a&gt;.  Second,  my last day I had 10 indians from a local company sitting around my hotel bed talking tech... the statement which capped the conversation was "welcome to vietnam"... I'll explain later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-8586255266394725440?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/8586255266394725440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=8586255266394725440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8586255266394725440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/8586255266394725440'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/04/speaking-in-india-at-jax.html' title='Speaking in India at JAX'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-5516168568893466323</id><published>2008-03-08T12:21:00.000-08:00</published><updated>2008-03-08T12:29:28.357-08:00</updated><title type='text'>Speaking References and Links</title><content type='html'>Speaking at a number of conferences specifically&lt;br /&gt;&lt;a href="http://www.nofluffjuststuff.com/"&gt;&lt;br /&gt;&lt;img src="http://www.nofluffjuststuff.com/images/nfjs_logo200.gif" alt="No Fluff Just Stuff" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Folks generally are asking for resources, references and rss feeds for material.  I've started leveraging this blog more, as well as &lt;a href="http://del.icio.us/kensipe"&gt;http://del.icio.us/kensipe&lt;/a&gt; . So if you are looking for supporting information for my 7 habits talk then look at &lt;a href="http://del.icio.us/kensipe/7habits"&gt;http://del.icio.us/kensipe/7habits&lt;/a&gt; or click on the tag.&lt;br /&gt;&lt;a href="http://www.nofluffjuststuff.com/"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-5516168568893466323?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/5516168568893466323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=5516168568893466323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5516168568893466323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5516168568893466323'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/03/speaking-references-and-links.html' title='Speaking References and Links'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3883858371887039744</id><published>2008-02-29T09:50:00.000-08:00</published><updated>2008-02-29T10:20:04.619-08:00</updated><title type='text'>It is All About the Approach</title><content type='html'>Being a pilot this video makes me chuckle a little.  But at the  same time , I don't know a pilot who hasn't had a rough landing during training or high cross winds or... This video reminds us that it still happen to the professionals.&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-c16e06a7d9805731" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v4.nonxt4.googlevideo.com/videoplayback?id%3Dc16e06a7d9805731%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330289049%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D46ECE8CBEC9DBE14915D5B40E80981F0247AA9BC.5A973EFFA489A000A6E744E657F4A875D737D0E%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dc16e06a7d9805731%26offsetms%3D5000%26itag%3Dw160%26sigh%3D6LUzFSKiHPwP_rl4Zn2IW2srm80&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v4.nonxt4.googlevideo.com/videoplayback?id%3Dc16e06a7d9805731%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330289049%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D46ECE8CBEC9DBE14915D5B40E80981F0247AA9BC.5A973EFFA489A000A6E744E657F4A875D737D0E%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dc16e06a7d9805731%26offsetms%3D5000%26itag%3Dw160%26sigh%3D6LUzFSKiHPwP_rl4Zn2IW2srm80&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;While I'm not sure how this pilot found himself in this position.  Experience tells me that it is all about the setup and approach on final which results in a well executed landing.&lt;br /&gt;&lt;br /&gt;Working with software solutions it is the same... a well finished project is based on the approach.  If you have early and often feedback, if you have tests which run often you will land safely.  Iteration X is dependent on Iteration 0.   Make sure you get Iteration 0 right!  Then follow the check list!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3883858371887039744?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=c16e06a7d9805731&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3883858371887039744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3883858371887039744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3883858371887039744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3883858371887039744'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/02/it-is-all-about-approach.html' title='It is All About the Approach'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-4561925252441884333</id><published>2008-02-28T09:37:00.000-08:00</published><updated>2008-02-28T12:44:03.388-08:00</updated><title type='text'>Paired Teachers (K-8)</title><content type='html'>&lt;span style="font-weight: bold; font-style: italic;"&gt;Agile in the Classroom&lt;/span&gt;&lt;br /&gt;Being involved in the community, I was at a school board meeting last night (for way too long, but that is another story).  There was an interesting presentation.   The school last year started a program referred to as "Teacher Leaders".   It was a great presentation detailing the outcome of this program which is essentially highly skilled teachers which "pair" (my word not theirs) with other teachers on specific subjects to meet 2 objectives:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Increase student learning&lt;/li&gt;&lt;li&gt;Increase teacher teaching capability&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Results of Agile in the Classroom&lt;/span&gt;&lt;br /&gt;The results of the presentation were amazing and the whole room seem to get it.  It was great that they brought empirical evidence to the table.  They defined 4 levels of support for coaching a teacher on a new program, which are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Theory&lt;/li&gt;&lt;li&gt;Demonstration&lt;/li&gt;&lt;li&gt;Practice&lt;/li&gt;&lt;li&gt;Peered Coaching&lt;/li&gt;&lt;/ol&gt;They took 2 teachers; Teacher A went through levels 1-3 which is the standard approach, while teacher B had all 4 levels, which included in classroom pair teacher sessions through peer coaching.   What was great was the measuring stick... it wasn't the teachers it was the students.  In classrooms with &lt;span style="font-weight: bold;"&gt;teacher A&lt;/span&gt;, students had a &lt;span style="font-weight: bold;"&gt;35% proficiency&lt;/span&gt; on the subject matter.  In classrooms with&lt;span style="font-weight: bold;"&gt; teacher B&lt;/span&gt;, students had a &lt;span style="font-weight: bold;"&gt;95% proficiency&lt;/span&gt; rating.  This was consistent with other studies in the field, but they wanted to test it themselves.  Additional benefits included an increase in motivation and spirit of the teachers.  There was an obvious excitement in the air when several teachers involved in the program shared their experiences.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Agile Converts&lt;/span&gt;&lt;br /&gt;Members of the board shared their reluctance in approving the program, which mirrored that of software stakeholders hedging on paired programming.  One board member was significantly against it.   Now she is a total convert and is looking to see how to expand the program.  The reason... The quality of the result.  It turns out that pairing produces higher quality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-4561925252441884333?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/4561925252441884333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=4561925252441884333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4561925252441884333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/4561925252441884333'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/02/paired-teachers-k-8.html' title='Paired Teachers (K-8)'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-9016758307807472182</id><published>2008-02-25T16:10:00.001-08:00</published><updated>2008-02-25T17:22:46.608-08:00</updated><title type='text'>What is a calendar?</title><content type='html'>It is my intention to write a few posts on the need to focus IT on business solutions.  I've got several posts in my head... All I need now is time.    A situation today spurred me to post a comment on words and the meaning of words, which is critical for one person to understand another person in order to clearly provide a business solution.&lt;br /&gt;&lt;em&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:130%;" &gt;&lt;span style="font-style: italic;"&gt;It is 10pm... Do you know where your data is?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;I have been a heavy user of google and it's products for some time.  This is very interesting on its own since when Microsoft came out with Passport and HailStorm years ago... My response was... "heck NO!"  you're not keeping all my data.  It is interest, as they had some services but nothing significantly compelling to me.  Yet, over the years google hasn't asked to store all my stuff... they didn't have a huge marketing campaign, yet some how they have all my data.  I now use they're gmail, calendar, I use and share notebooks, I've used their payment capabilities, I blog on their site, I use their phone services through GrandCentral... they know everything about me.   I came to this comparison and realization recently and well... I'm not sure if I am scared yet or not, but that is a subject for another post.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;"What's in a name? That which we call a rose By any other name would smell as sweet."&lt;/span&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;- Shakespeare&lt;br /&gt;&lt;/em&gt;So on to the main point of this post.   I have convinced several other partners to switch from yahoo group calendar to the google calendar.  One of them was lost in how to get to this shared calendar so I proceeded to explain via email how the google calendar is used.  This resulted in the following statement by me: &lt;blockquote&gt;It is a little complicated to write about because there needs to be a distinction between a "calendar" of time and a "calendar" which represents a thread of interest through time :)&lt;/blockquote&gt;It made me reflect on how many every day terms we use in English are so abstract.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;The essences of Chairness&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If you ever read Plato, you know what I mean... The word chair means what you usually think it means.  However as Plato puts it, what do you think of when someone says chair.  Does it have 4 legs, or 3?  Does it have a back to it?   If you started picking it apart (remove a leg, etc.), at what point does it cease to be a chair?   This isn't made to be too philosophical.   The point is some times it is difficult for us to use an abstract term and worse, sometimes words are more abstract then we think they are.  Where a chair could paint the same mental picture for 2 people, the concept of what is core to the essences of chairness is likely different.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-style: italic;"&gt;The trouble with Users&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Here in lies the trouble with users.  There really isn't an issue with users.  They mean what they said and they are paying the bills.  However often they say calendar and they mean calendar of time and often a developer sees the bigger picture and sees the need for a calendar to represent a thread of interest.  There are a number of issues at this point:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The user and developer understand the words of the domain to have different meanings.&lt;/li&gt;&lt;li&gt;Even, as often is the case,  the developer is astute enough to realize that their is a disconnect, words do not exist to delineate between the concepts.  This leads to:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Lengthy discussions where the user is dumbfounded, where both parties are asking themselves why doesn't he get it!&lt;/li&gt;&lt;li&gt;Frustration&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;It is all about context, context, context&lt;/span&gt;&lt;br /&gt;It is just interesting  how often this situation happens.   Often the issue is context. Where context provides the meaning or at least a deeper meaning. But sometimes not. In the example of the calendar, it is tough to say that context would provide greater meaning.   This issue is further exacerbated with specific domains where context does matter.&lt;br /&gt;&lt;br /&gt;Several years ago, I worked on a life science project working with a lab on &lt;a href="http://en.wikipedia.org/wiki/Gene_expression"&gt;transcription profiling&lt;/a&gt;.  During this engagement a couple of us worked with several top Ph.D.s in the field to help automate the process.  It was necessary to understand the word "&lt;a href="http://en.wikipedia.org/wiki/Allele"&gt;Allele&lt;/a&gt;" and its domain.  Although there are aspects about an Allele which were easy to agree upon.  The other aspects were dependent on who you talked to and on which day... it didn't take long to realize that it was really a matter of context which provided its mean.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;Clarity of Thought&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If there is a point to this current blog it would be this:   In order to write software... even flexible software (in this case meaning software which can understand context of the user), then it is first necessary to understand concretely what is meant, as well as what are the other contexts of meaning.   This may mean more in depth investigation on the part of the BA or developer, but it will pay off in dividends!&lt;br /&gt;&lt;br /&gt;This provides some context around the value of Agile development.  Closer and frequent communication with the user increases the likelihood of understanding what the user meant.  Regular feedback by the user provides the opportunity to discover word meaning differences.   The greater the number of users involved increases the likelihood of discovering more contexts.  Often this is the reason for a number of "discovered" stories along the Agile path of development.&lt;br /&gt;&lt;br /&gt;-- Happy Coding!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-9016758307807472182?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/9016758307807472182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=9016758307807472182' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/9016758307807472182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/9016758307807472182'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/02/what-is-calendar.html' title='What is a calendar?'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-5684393914108418725</id><published>2008-02-11T12:45:00.000-08:00</published><updated>2008-02-11T13:31:43.722-08:00</updated><title type='text'>2008 Technology Predictions</title><content type='html'>So after a month of reading a number of articles making there 2008 predictions,  I feel compelled to share my predictions.  I have the added advantage which comes to those who procrastinate... however there isn't much new over the last month.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Larger portion of the Java community will move towards Java 5 /6, taking advantage of more of the language changes.&lt;/li&gt;&lt;li&gt;Increased adoption of groovy users&lt;/li&gt;&lt;li&gt;Spring framework increases in use... leaving in their dust SEAM and Guice.&lt;/li&gt;&lt;li&gt;Spring MVC and Webflow becomes the new Struts (from a popularity standpoint)&lt;/li&gt;&lt;ol&gt;&lt;li&gt;It will come down to WebFlow and JSF&lt;/li&gt;&lt;li&gt;It will be interesting to see what grails does to this prediction&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Late 2008 will have a number of negative news feeds on SOA.&lt;/li&gt;&lt;ol&gt;&lt;li&gt;This will be geared around failure of large initiatives.&lt;/li&gt;&lt;li&gt;It may be 2009... depends on the economy&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Flex use increases&lt;/li&gt;&lt;ol&gt;&lt;li&gt;MSFT will start the get the RIA facts in an effort to take over this space.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Vista will continue to have trouble&lt;/li&gt;&lt;ol&gt;&lt;li&gt;It will be interesting to see what MSFT does when the XP &lt;a href="http://www.microsoft.com/windows/lifecycle/default.mspx"&gt;isn't available for purchase&lt;/a&gt; any more. &lt;/li&gt;&lt;ol&gt;&lt;li&gt;with the OEM ending in June 2008, I expect that MSFT will extend it... after a period of pain :)&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;li&gt;JBoss and OSS in general will increase in use.&lt;/li&gt;&lt;ol&gt;&lt;li&gt;The economy will be the driver for this.&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-5684393914108418725?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/5684393914108418725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=5684393914108418725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5684393914108418725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/5684393914108418725'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/02/2008-technology-predictions.html' title='2008 Technology Predictions'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7461275049781191261.post-3978458641060571098</id><published>2008-02-05T12:23:00.000-08:00</published><updated>2008-02-05T12:39:31.053-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><title type='text'>Java 6 Web Service Security Alert</title><content type='html'>This isn't how I envisioned starting this new blog...&lt;br /&gt;&lt;br /&gt;It appears that there is a fresh security warning from Sun regarding security issues with xml parsing in Java 6 (update 3 or earlier).  It does not affect Java 5 or eariler.&lt;br /&gt;&lt;br /&gt;Details from Sun:&lt;br /&gt;&lt;a href="http://sunsolve.sun.com/search/document.do?assetkey=1-66-231246-1"&gt;http://sunsolve.sun.com/search/document.do?assetkey=1-66-231246-1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Details from SecLists:&lt;br /&gt;&lt;a href="http://seclists.org/bugtraq/2008/Feb/0007.html"&gt;http://seclists.org/bugtraq/2008/Feb/0007.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3978458641060571098?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kensipe.blogspot.com/feeds/3978458641060571098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7461275049781191261&amp;postID=3978458641060571098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3978458641060571098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7461275049781191261/posts/default/3978458641060571098'/><link rel='alternate' type='text/html' href='http://kensipe.blogspot.com/2008/02/java-6-web-service-security-alert.html' title='Java 6 Web Service Security Alert'/><author><name>Ken Sipe</name><uri>http://www.blogger.com/profile/16182435829804225570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/-qo574yps4vg/TX_3RfYGm5I/AAAAAAAAArw/JhnL2mDsUkg/s220/DSC_0056.jpg'/></author><thr:total>0</thr:total></entry></feed>
