Category Filtering: 'Development'

Remove Filter

Why use a framework?

Posted by Luis Majano
16 Jun 2010 11:27 AM

Catchy title huh?? Well, I was doing some digging around today and found some fantastic things I would like to share and open for discussion.

Why are frameworks like ColdBox, Model-Glue, Mach-II, etc, important? In all reality, they are extremely important, because if they did not exist we would end up rewriting them in some shape or form.  Software is all about reusability and adapting to change.  Nowadays it is also about adapting faster and faster.  How many developers working on tight deadlines have the time to ponder and think about all the “magical” ways they can make their components be reused in the future? Or how to really build that SES engine better than anything out there.  These are great things to have, but they don’t happen often in reality.  We are tasked and need to get things going fast and deliver our business.  I like this quote:

And let's face it, business requirements change so quickly that by the time someone else comes along to reuse your stuff, it probably needs to be re-written anyway. By Elastic Path

I can honestly say that every project I worked before using a framework started very simple and with simple architecture.  Then as requirements change and grow, more features are needed, and I get cornered into some areas of resolution:

1. I can rewrite what I have in a “get it DONE” fashion just in time for a release.  This could result in buggy or hard to test code.  I still have not really adapted but just expanded.

2. Download that super duper library I found and just squish into my simple architecture.  Again, I am introducing things that are hard to test and could result also in new bugs of introducing a library into my environment.  I have not really adapted myself to change, again, just expanded.

3. I can begin to modularize what I have, apply OO analysis and design and create a pseudo-framework that can accept new components more easily without breaking what I already have and expand it.  Ok, now I start to adapt, but at what costs?

I might like number 3 but I end up creating a framework of my own or home grown frameworks tested in one environment only, by a small subset of applications and only being able to adapt to a small arena of evolution.  This is where proven libraries and frameworks come into play.  There is a wealth of value in these libraries as they are used world-wide, different loads, different requirements and their number one priority is how to adapt to change and make our development more efficient.  Now, I won’t go into how one is better than the other, etc.  Each framework delivers their own feature sets, implementations, etc, but that does not REMOVE the benefits of reusing these libraries.

I am a big proponent of reuse and open source (couldn’t you tell), and I truly believe in avoiding building anything from scratch if I can.  I know there are cases when things that I need do not exist or are not built yet, and then I would consider building them.  If not, reusing libraries such as ColdBox, just empower me to deliver my business needs faster, gives me a great platform to develop on, I can get help around the world, I can extend its functionality to adapt for change, and so much more.

I strongly believe in community reuse and collaboration, why reinvent the wheel so many times for so many projects just because I don’t want to use something that somebody else wrote, or because I think frameworks are just too complex to work with.  This is not a good business decision that could potentially bite you in the future.  Writing open source frameworks and libraries is hard work and it takes immense number of hours on research, testability, adaptability, modularity, reusability, etc.  The work of framework authors is something to be valued upon and certain trust on them has to be developed.  I truly admire my colleagues like Dan Wilson, Mark Mandel, Matt Woodward, Peter Ferrell, Sean Corfield, etc.  I know their devotion to helping our community and at the end of the day make our community business needs better.  Relying on open source professional frameworks is something engrained in so many communities like python, java, ruby, etc.  The benefits really outweigh the cons.

In conclusion, this commentary arises out of certain discussions of late with some developers on why the need of reusable frameworks.  I hope this can give insight into why use a framework or open source library.  Again, I welcome your thoughts and opinions.

Need an eclipse ftp synchronizer, help!

Posted by Luis Majano
21 May 2010 10:11 AM

I just wanted to open a topic of discussion to see what are your recommendations for an FTP synchronization plugin for Eclipse.  I know Aptana has one and CFBuilder also, which is pretty sweet.  However, what if you don’t want any of those two IDEs for some reason.  What would you use?  Comments? Suggestions?  By the way, I use CFBuilder and it is fantastic.

SQL splitting a varchar list argument to row of data

Posted by Luis Majano
14 May 2010 10:35 AM

I got into yet another issue with my SQL optimizations this week at work and one of them was that I needed to pass a list of IDs to a function that would be then used in a SQL statement via an “in” clause.  The problem is that the list argument is a varchar:

   1: @docTypeIds varchar(500) = '0',


Then I needed to use it in my SQL statement like this:

   1: SELECT *

   2: FROM table

   3: WHERE (

   4:   (@docTypeIds = '0' OR @docTypeIds = '')

   5:   OR

   6:   docType in (@docTypeIds)  

   7: )

The problem with this approach is that the datatype for the docType column was tinyint and then the argument is a varchar list, so it would fail as it cannot cast it. Bummer!  So what to do?  Well, after some searching and searching, the best idea so far (brought up by our local dev guru Sanjib Panda), was to break the list into a simple table with one column of type tinyint, but how?  Here is the simple logic which could easily be created as a UDF:

   1: declare @testString as varchar(20)

   2: set @testString = '1,2,3,4,5,6,7,8,9'


   4: declare @tempTable table

   5: (

   6: docType tinyint

   7: )


   9: while charindex(',',@testString) > 0

  10: begin

  11:   INSERT INTO @tempTable select substring(@testString,1,1)

  12:   SET @testString = substring(@testString,3,len(@testString))

  13: end


  15: select * from @tempTable

So if you run the above, that will give you our temp table with one docType column with all the values we needed.  Man, sometimes I wish SQL could have some ColdFusion goodness and create a cool function like: listToTable() or something.  Anyways, after splitting the list into a table then I can change my SQL to something like this:

   1: AND(

   2:   (@docTypeIds = '0' OR @docTypeIds = '')

   3:   OR

   4:   d.docType in ( select docType from @tempTable )  

   5: )

There you go! The solution is working really fast and given us a nice little split to rows function that can be used on any variable.  Hope this helps.



After much trying out and pains, what I had did not work fully :(  So here is an updated function:

   1: -- Temp tables for lists

   2: DECLARE @docTypes TABLE( docType tinyint )

   3: DECLARE @docTypeIds varchar(300)

   4: DECLARE @delimIndex int


   6: set @docTypeIds = '11,1,3,54'


   8: -- If docTypes sent in, then convert to table rows

   9: IF LEN(@docTypeIds) > 0 AND @docTypeIds <> '0'

  10: BEGIN

  11:     -- Get Delimiter index

  12:     SET @delimIndex = CHARINDEX(',',@docTypeIds)

  13:     -- We have at least one delimiter, start on it

  14:     WHILE @delimIndex > 0

  15:     BEGIN

  16:         INSERT INTO @docTypes SELECT SUBSTRING(@docTypeIds,1,@delimIndex-1)

  17:         SET @docTypeIds = SUBSTRING(@docTypeIds,@delimIndex+1,LEN(@docTypeIds))

  18:         SET @delimIndex = CHARINDEX(',',@docTypeIds)

  19:     END

  20:     -- Insert the last entry or the first single no delim entry

  21:     INSERT INTO @docTypes SELECT @docTypeIds

  22: END


  24: select * from @docTypes

SQL Conditional Where

Posted by Luis Majano
13 May 2010 05:01 PM

Today I needed to create a conditional where statement in MSSQL and I had no idea how?  It was an incoming variable to a stored procedure and I needed to ignore it in my SQL if the value was 0, if it was not 0 then I needed to do a where statement as a list.  The solution was so simple and elegant I was like WOW!! I like that.

My first thought was to do a if-else split on the SQL with the incoming variable like this:

   1: if @i = 1

   2:     select * from mytable where mycol = 1

   3: else

   4:     select * from mytable where mycol = 2


However, this does not hold true to DRY principles, so the solution I ended up using was the following with a simple OR statement!

   1: AND(

   2:   @docType = 0 

   3: OR

   4:   d.docType in (@docType)  

   5: )

A simple OR statement made my life much easier, so there you go, simple conditional statements when you at least expect certain values on incoming variables.

Regex Negative Lookahead, so powerful!

Posted by Luis Majano
11 May 2010 12:21 PM

I am a big fan of regular expressions.  They are so mysterious and elegant, I love them and hate them, cherish them and despise them.  In other words they are both beautiful and nasty, but they can really get the job done.  I was intrigued today when a colleague of mine was asking how to match a string but if it started with a specific sequence then do not match.  In my regex coolness I said “Sure, that’s easy man!”, whipped out QuickREx in Eclipse, wrote down a quick jolt of brilliance and BAMM!! I hit the brick wall at 90! Nothing I was trying would work, characters where matched not the word:

   1: ^([^search].*)dev\.domain

Basically match any incoming domain that ends with dev.domain but it should not be preceded by the word search.  I really thought I nailed it with that regex, but NOOO, it matches character classes not full words.  So I had to revert my humble ego and go back to the books and voila: Positive and Negative LookAhead!

Granted, some regex engines do not support look behinds, but thankfully java does.  Here is a cool definition:


Zero-width negative lookahead. Identical to positive lookahead, except that the overall match will only succeed if the regex inside the lookahead fails to match.

And finally and AHA!! moment.  I can use the lookahead:

   1: ^(?!search|training).*dev\.domain

AND BUYAAA!!!  I think this can help somebody out there. It helped me!

10 Concepts that every software engineer should know about!

Posted by Luis Majano
24 Jul 2008 12:00 AM
I just found this incredible article via digg and had lots of fun reading it. I really recommend for you to read it and get some good concepts in your toolbelt.

The top 10 concepts are:

  1. Interfaces
  2. Conventions and Templates
  3. Layering
  4. Algorithmic Complexity
  5. Hashing
  6. Caching
  7. Concurrency
  8. Cloud Computing
  9. Security
  10. Relational Databases

ColdBox and MVC Demystified.

Posted by Luis Majano
21 May 2008 12:00 AM
I just updated the ColdBox MVC Guide to help newbies to the whole framework and object oriented approaches get an understanding of how to apply its uses. I am starting a whole set of newbie guides on the wiki to not only guide on Coldbox, but also on basic object oriented principles and guidelines. Your input is much appreciated and also resource links are much appreciated.

Book Review: Managing Software Development with Trac & Subversion

Posted by Luis Majano
02 Mar 2008 12:00 AM

I have just started to read this book from Packt Publishing and I am really impressed by it. The book is called "Managing Software Development with Trac & Subversion", I still have not finished it, but the text is phenomenal. I was able to setup another local copy of svn, webdav and trac on my laptop with super ease. No more looking for instructions, the book basically takes you step by step in the entire process. It also gives you insight of how to manage your software development using these tools. I will be posting a follow up on what else was covered and what really hit home.

So far, the book has been super easy to read and the instructions are dead on!

Site Updates

Entries Search